From 9ba8f53ec7e505735bf056b345e14c1f6c2313fe Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Wed, 15 Jun 2016 15:03:17 +0000
Subject: [PATCH] Translate: Add method to set language in standalone app
 context i2psnark: - add form to set language in standalone context - add
 Ukrainian and Japanese translations

---
 .tx/config                                    |    2 +
 apps/i2psnark/java/build.xml                  |    3 +
 .../src/org/klomp/snark/SnarkManager.java     |   45 +-
 .../snark/standalone/ConfigUIHelper.java      |  122 ++
 .../org/klomp/snark/web/I2PSnarkServlet.java  |   21 +-
 apps/i2psnark/locale/messages_ja.po           | 1393 ++++++++++++++++
 apps/i2psnark/locale/messages_uk.po           | 1408 +++++++++++++++++
 build.xml                                     |    3 +-
 core/java/src/net/i2p/util/Translate.java     |   33 +-
 9 files changed, 3021 insertions(+), 9 deletions(-)
 create mode 100644 apps/i2psnark/java/src/org/klomp/snark/standalone/ConfigUIHelper.java
 create mode 100644 apps/i2psnark/locale/messages_ja.po
 create mode 100644 apps/i2psnark/locale/messages_uk.po

diff --git a/.tx/config b/.tx/config
index 2e0c8650ae..5d3b2f7042 100644
--- a/.tx/config
+++ b/.tx/config
@@ -156,6 +156,7 @@ trans.fi = apps/i2psnark/locale/messages_fi.po
 trans.fr = apps/i2psnark/locale/messages_fr.po
 trans.hu = apps/i2psnark/locale/messages_hu.po
 trans.it = apps/i2psnark/locale/messages_it.po
+trans.ja = apps/i2psnark/locale/messages_ja.po
 trans.nb = apps/i2psnark/locale/messages_nb.po
 trans.nl = apps/i2psnark/locale/messages_nl.po
 trans.pl = apps/i2psnark/locale/messages_pl.po
@@ -166,6 +167,7 @@ trans.ru_RU = apps/i2psnark/locale/messages_ru.po
 trans.sk = apps/i2psnark/locale/messages_sk.po
 trans.sv_SE = apps/i2psnark/locale/messages_sv.po
 trans.tr_TR = apps/i2psnark/locale/messages_tr.po
+trans.uk_UA = apps/i2psnark/locale/messages_uk.po
 trans.vi = apps/i2psnark/locale/messages_vi.po
 trans.zh_CN = apps/i2psnark/locale/messages_zh.po
 
diff --git a/apps/i2psnark/java/build.xml b/apps/i2psnark/java/build.xml
index 214ffa2375..7d80438e4a 100644
--- a/apps/i2psnark/java/build.xml
+++ b/apps/i2psnark/java/build.xml
@@ -211,6 +211,9 @@
         <zipfileset src="../../ministreaming/java/build/mstreaming.jar" />
         <zipfileset src="../../streaming/java/build/streaming.jar" />
         <zipfileset src="../../systray/java/build/systray.jar" />
+        <!-- Countries translations. The i2psnark translations are in the war but it's easier to put these here -->
+        <!-- 300KB just to translate "Brazil", but why not... -->
+        <fileset dir="../../routerconsole/java/build/obj" includes="net/i2p/router/countries/*.class" />
         <manifest>
             <attribute name="Main-Class" value="org.klomp.snark.standalone.RunStandalone"/>
             <attribute name="Implementation-Version" value="${full.version}" />
diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java
index e9736fab87..b249f72966 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java
@@ -42,6 +42,7 @@ import net.i2p.util.SecureDirectory;
 import net.i2p.util.SecureFileOutputStream;
 import net.i2p.util.SimpleTimer;
 import net.i2p.util.SimpleTimer2;
+import net.i2p.util.Translate;
 
 import org.klomp.snark.dht.DHT;
 import org.klomp.snark.dht.KRPC;
@@ -127,6 +128,8 @@ public class SnarkManager implements CompleteListener {
     public static final String PROP_PRIVATETRACKERS = "i2psnark.privatetrackers";
     private static final String PROP_USE_DHT = "i2psnark.enableDHT";
     private static final String PROP_SMART_SORT = "i2psnark.smartSort";
+    private static final String PROP_LANG = "i2psnark.lang";
+    private static final String PROP_COUNTRY = "i2psnark.country";
 
     public static final int MIN_UP_BW = 10;
     public static final int DEFAULT_MAX_UP_BW = 25;
@@ -254,6 +257,13 @@ public class SnarkManager implements CompleteListener {
         //_context.addShutdownTask(new SnarkManagerShutdown());
         _idleChecker = new IdleChecker(this, _peerCoordinatorSet);
         _idleChecker.schedule(5*60*1000);
+        if (!_context.isRouterContext()) {
+            String lang = _config.getProperty(PROP_LANG);
+            if (lang != null) {
+                String country = _config.getProperty(PROP_COUNTRY, "");
+                Translate.setLanguage(lang, country);
+            }
+        }
     }
 
     /**
@@ -774,19 +784,22 @@ public class SnarkManager implements CompleteListener {
     public void updateConfig(String dataDir, boolean filesPublic, boolean autoStart, boolean smartSort, String refreshDelay,
                              String startDelay, String pageSize, String seedPct, String eepHost, 
                              String eepPort, String i2cpHost, String i2cpPort, String i2cpOpts,
-                             String upLimit, String upBW, boolean useOpenTrackers, boolean useDHT, String theme) {
+                             String upLimit, String upBW, boolean useOpenTrackers, boolean useDHT, String theme,
+                             String lang) {
         synchronized(_configLock) {
             locked_updateConfig(dataDir, filesPublic, autoStart, smartSort,refreshDelay,
                                 startDelay,  pageSize,  seedPct,  eepHost, 
                                 eepPort,  i2cpHost,  i2cpPort,  i2cpOpts,
-                                upLimit,  upBW, useOpenTrackers, useDHT,  theme);
+                                upLimit,  upBW, useOpenTrackers, useDHT,  theme,
+                                lang);
         }
     }
 
     private void locked_updateConfig(String dataDir, boolean filesPublic, boolean autoStart, boolean smartSort, String refreshDelay,
                              String startDelay, String pageSize, String seedPct, String eepHost, 
                              String eepPort, String i2cpHost, String i2cpPort, String i2cpOpts,
-                             String upLimit, String upBW, boolean useOpenTrackers, boolean useDHT, String theme) {
+                             String upLimit, String upBW, boolean useOpenTrackers, boolean useDHT, String theme,
+                             String lang) {
         boolean changed = false;
         boolean interruptMonitor = false;
         //if (eepHost != null) {
@@ -893,6 +906,32 @@ public class SnarkManager implements CompleteListener {
 
         }
 
+	// Standalone (app context) language.
+	// lang will generally be null since it is hidden from the form if in router context.
+
+        if (lang != null && !_context.isRouterContext() &&
+            lang.length() >= 2 && lang.length() <= 6) {
+            int under = lang.indexOf('_');
+            String nlang, ncountry;
+            if (under > 0 && lang.length() > under + 1) {
+                nlang = lang.substring(0, under);
+                ncountry = lang.substring(under + 1);
+            } else {
+                nlang = lang;
+                ncountry = "";
+            }
+            String olang = _config.getProperty(PROP_LANG);
+            String ocountry = _config.getProperty(PROP_COUNTRY);
+            if (!nlang.equals(olang) || !ncountry.equals(ocountry)) {
+                changed = true;
+                _config.setProperty(PROP_LANG, nlang);
+                _config.setProperty(PROP_COUNTRY, ncountry);
+                Translate.setLanguage(nlang, ncountry);
+            }
+        }
+
+
+
 	// Start of I2CP stuff.
 	// i2cpHost will generally be null since it is hidden from the form if in router context.
 
diff --git a/apps/i2psnark/java/src/org/klomp/snark/standalone/ConfigUIHelper.java b/apps/i2psnark/java/src/org/klomp/snark/standalone/ConfigUIHelper.java
new file mode 100644
index 0000000000..59f9662725
--- /dev/null
+++ b/apps/i2psnark/java/src/org/klomp/snark/standalone/ConfigUIHelper.java
@@ -0,0 +1,122 @@
+package org.klomp.snark.standalone;
+
+import net.i2p.I2PAppContext;
+import net.i2p.util.Translate;
+
+/**
+ * Standalone (app context) only.
+ * Copied from ConfigUIHelper.
+ * @since 0.9.27
+ */
+public class ConfigUIHelper {
+
+    private static final String CHECKED = " selected=\"selected\" ";
+    private static final String BUNDLE_NAME = "org.klomp.snark.web.messages";
+    private static final String COUNTRY_BUNDLE_NAME = "net.i2p.router.countries.messages";
+
+    /**
+     *  Each language has the ISO code, the flag, the name, and the optional country name.
+     *  Alphabetical by the ISO code please.
+     *  See http://en.wikipedia.org/wiki/ISO_639-1 .
+     *  Any language-specific flag added to the icon set must be
+     *  added to the top-level build.xml for the updater.
+     *  As of 0.9.12, ISO 639-2 three-letter codes are supported also.
+     *
+     *  Note: we don't currently _x the language strings,
+     *  we'll just rely on the JVM's translations for now.
+     *  Country flag unused.
+     */
+    private static final String langs[][] = {
+        { "ar", "lang_ar", "Arabic", null },
+        { "cs", "cz", "Czech", null },
+        //{ "da", "dk", "Danish", null },
+        { "de", "de", "German", null },
+        //{ "et", "ee", "Estonian", null },
+        //{ "el", "gr", "Greek", null },
+        { "en", "us", "English", null },
+        { "es", "es", "Spanish", null },
+        { "fi", "fi", "Finnish", null },
+        { "fr", "fr", "French", null },
+        { "hu", "hu", "Hungarian", null },
+        { "it", "it", "Italian", null },
+        { "ja", "jp", "Japanese", null },
+        //{ "mg", "mg", "Malagasy", null },
+        { "nl", "nl", "Dutch", null },
+        { "nb", "no", "Norwegian Bokmaal", null },
+        { "pl", "pl", "Polish", null },
+        { "pt", "pt", "Portuguese", null },
+        { "pt_BR", "br", "Portuguese", "Brazil" },
+        { "ro", "ro", "Romanian", null },
+        { "ru", "ru", "Russian", null },
+        { "sk", "sk", "Slovak", null },
+        { "sv", "se", "Swedish", null },
+        { "tr", "tr", "Turkish", null },
+        { "uk", "ua", "Ukrainian", null },
+        { "vi", "vn", "Vietnamese", null },
+        { "zh", "cn", "Chinese", null },
+        //{ "zh_TW", "tw", "Chinese", "Taiwan" },
+        { "xx", "a1", "Debug: Find untagged strings", null },
+    };
+
+    /**
+     * Standalone (app context) only.
+     * Copied from ConfigUIHelper.
+     * @return HTML
+     * @since 0.9.27
+     */
+    public static String getLangSettings(I2PAppContext ctx) {
+        String clang = Translate.getLanguage(ctx);
+        String current = clang;
+        String country = Translate.getCountry(ctx);
+        if (country != null && country.length() > 0)
+            current += '_' + country;
+        // find best match
+        boolean found = false;
+        for (int i = 0; i < langs.length; i++) {
+            if (langs[i][0].equals(current)) {
+                found = true;
+                break;
+            }
+        }
+        if (!found) {
+            if (country != null && country.length() > 0) {
+                current = clang;
+                for (int i = 0; i < langs.length; i++) {
+                    if (langs[i][0].equals(current)) {
+                        found = true;
+                        break;
+                    }
+                }
+            }
+            if (!found)
+                current = "en";
+        }
+        StringBuilder buf = new StringBuilder(512);
+        buf.append("<select name=\"lang\">\n");
+        for (int i = 0; i < langs.length; i++) {
+            String lang = langs[i][0];
+            if (lang.equals("xx") && !isAdvanced())
+                continue;
+            buf.append("<option ");
+            if (lang.equals(current))
+                buf.append(CHECKED);
+            buf.append("value=\"").append(lang).append("\">");
+            int under = lang.indexOf('_');
+            String slang = (under > 0) ? lang.substring(0, under) : lang;
+            // we don't actually have translations for these, see above
+            buf.append(Translate.getDisplayLanguage(slang, langs[i][2], ctx, BUNDLE_NAME));
+            String name = langs[i][3];
+            if (name != null) {
+                buf.append(" (")
+                   .append(Translate.getString(name, ctx, COUNTRY_BUNDLE_NAME))
+                   .append(')');
+            }
+            buf.append("</option>\n");
+        }
+        buf.append("</select>\n");
+        return buf.toString();
+    }
+
+    /** if necessary */
+    private static boolean isAdvanced() { return false; }
+}
diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
index fd914e27bc..d2eb393bcb 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
@@ -44,6 +44,7 @@ import org.klomp.snark.Storage;
 import org.klomp.snark.Tracker;
 import org.klomp.snark.TrackerClient;
 import org.klomp.snark.dht.DHT;
+import org.klomp.snark.standalone.ConfigUIHelper;
 
 /**
  *  Refactored to eliminate Jetty dependencies.
@@ -954,6 +955,7 @@ public class I2PSnarkServlet extends BasicServlet {
             } else
           *****/
             if (newURL != null) {
+                newURL = newURL.trim();
                 String newDir = req.getParameter("nofilter_newDir");
                 File dir = null;
                 if (newDir != null) {
@@ -1141,9 +1143,10 @@ public class I2PSnarkServlet extends BasicServlet {
             boolean useDHT = req.getParameter("useDHT") != null;
             //String openTrackers = req.getParameter("openTrackers");
             String theme = req.getParameter("theme");
+            String lang = req.getParameter("lang");
             _manager.updateConfig(dataDir, filesPublic, autoStart, smartSort, refreshDel, startupDel, pageSize,
                                   seedPct, eepHost, eepPort, i2cpHost, i2cpPort, i2cpOpts,
-                                  upLimit, upBW, useOpenTrackers, useDHT, theme);
+                                  upLimit, upBW, useOpenTrackers, useDHT, theme, lang);
             // update servlet
             try {
                 setResourceBase(_manager.getDataDir());
@@ -2198,9 +2201,19 @@ public class I2PSnarkServlet extends BasicServlet {
                   + (smartSort ? "checked " : "") 
                   + "title=\"");
         out.write(_t("If checked, ignore words such as 'the' when sorting"));
-        out.write("\" >" +
+        out.write("\" >");
 
-                  "<tr><td>");
+        if (!_context.isRouterContext()) {
+            try {
+                out.write("<tr><td>");
+                out.write(_t("Language"));
+                out.write(": <td>");
+                // class only in standalone builds
+                out.write(ConfigUIHelper.getLangSettings(_context));
+            } catch (Throwable t) {}
+        }
+
+        out.write("<tr><td>");
         out.write(_t("Theme"));
         out.write(": <td><select name='theme'>");
         String theme = _manager.getTheme();
@@ -2358,7 +2371,7 @@ public class I2PSnarkServlet extends BasicServlet {
                   "<tr><td colspan=\"2\">&nbsp;\n" +  // spacer
                   "</table></div></div></form>");
     }
-    
+
     /** @since 0.9 */
     private void writeTrackerForm(PrintWriter out, HttpServletRequest req) throws IOException {
         StringBuilder buf = new StringBuilder(1024);
diff --git a/apps/i2psnark/locale/messages_ja.po b/apps/i2psnark/locale/messages_ja.po
new file mode 100644
index 0000000000..35848e954d
--- /dev/null
+++ b/apps/i2psnark/locale/messages_ja.po
@@ -0,0 +1,1393 @@
+# I2P
+# Copyright (C) 2009 The I2P Project
+# This file is distributed under the same license as the i2psnark package.
+# To contribute translations, see http://www.i2p2.de/newdevelopers
+# 
+# Translators:
+# a1678991 <nfgantanku@yahoo.co.jp>, 2014-2015
+msgid ""
+msgstr ""
+"Project-Id-Version: I2P\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-05-25 12:28+0000\n"
+"PO-Revision-Date: 2016-05-25 12:33+0000\n"
+"Last-Translator: zzzi2p\n"
+"Language-Team: Japanese (http://www.transifex.com/otf/I2P/language/ja/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ja\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../java/src/org/klomp/snark/IdleChecker.java:75
+msgid "No more torrents running."
+msgstr "これ以上のtorrentを実行しないでください。"
+
+#: ../java/src/org/klomp/snark/IdleChecker.java:76
+#: ../java/src/org/klomp/snark/SnarkManager.java:2542
+#: ../java/src/org/klomp/snark/SnarkManager.java:2553
+msgid "I2P tunnel closed."
+msgstr "I2Pトンネルは閉じています。"
+
+#: ../java/src/org/klomp/snark/MagnetURI.java:42
+#: ../java/src/org/klomp/snark/MagnetURI.java:52
+#: ../java/src/org/klomp/snark/SnarkManager.java:2224
+msgid "Magnet"
+msgstr "マグネット"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:794
+#, java-format
+msgid "Total uploaders limit changed to {0}"
+msgstr "最大アップロード制限は{0}に変更されました"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:796
+#, java-format
+msgid "Minimum total uploaders limit is {0}"
+msgstr "最低アップロードリミットは{0}に変更されました"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:808
+#, java-format
+msgid "Up BW limit changed to {0}KBps"
+msgstr "アップロード帯域制限は{0}Kbpsに変更されました"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:810
+#, java-format
+msgid "Minimum up bandwidth limit is {0}KBps"
+msgstr "最低アップロード帯域は{0}KBpsです"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:822
+#, java-format
+msgid "Startup delay changed to {0}"
+msgstr "起動延滞時間は{0}に変更されました"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:833
+#, java-format
+msgid "Refresh time changed to {0}"
+msgstr "更新時間は{0}に変更されました"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:835
+msgid "Refresh disabled"
+msgstr "更新は無効です"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:851
+#, java-format
+msgid "Page size changed to {0}"
+msgstr "ページサイズは{0}に変更されました"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:860
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:960
+msgid "Data directory must be an absolute path"
+msgstr "フォルダは絶対パスでなければいけません。"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:862
+msgid "Data directory does not exist"
+msgstr "そのフォルダは存在しません"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:864
+msgid "Not a directory"
+msgstr "フォルダではありません"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:866
+msgid "Unreadable"
+msgstr "読み取り不可です"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:871
+#, java-format
+msgid "Data directory changed to {0}"
+msgstr "フォルダは{0}に変更されました"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:926
+msgid "I2CP and tunnel changes will take effect after stopping all torrents"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:930
+#, java-format
+msgid "I2CP options changed to {0}"
+msgstr "I2CPオプションは{0}に変更されました"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:936
+msgid "Disconnecting old I2CP destination"
+msgstr "古いI2CP送信先を切断しています"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:938
+#, java-format
+msgid "I2CP settings changed to {0}"
+msgstr "I2CP設定は{0}に変更されました"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:943
+msgid ""
+"Unable to connect with the new settings, reverting to the old I2CP settings"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:947
+msgid "Unable to reconnect with the old settings!"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:949
+msgid "Reconnected on the new I2CP destination"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:956
+#, java-format
+msgid "I2CP listener restarted for \"{0}\""
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:970
+msgid "New files will be publicly readable"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:972
+msgid "New files will not be publicly readable"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:979
+msgid "Enabled autostart"
+msgstr "自動開始を有効化"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:981
+msgid "Disabled autostart"
+msgstr "自動開始を無効化"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:988
+msgid "Enabled smart sort"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:990
+msgid "Disabled smart sort"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:997
+msgid "Enabled open trackers - torrent restart required to take effect."
+msgstr "オープントラッカーを有効化 - このオプションは再起動が必要です。"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:999
+msgid "Disabled open trackers - torrent restart required to take effect."
+msgstr "オープントラッカーを無効化 - このオプションは再起動が必要です。"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1006
+msgid "Enabled DHT."
+msgstr "DHTを有効化"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1008
+msgid "Disabled DHT."
+msgstr "DHTを無効化"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1010
+msgid "DHT change requires tunnel shutdown and reopen"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1017
+#, java-format
+msgid "{0} theme loaded, return to main i2psnark page to view."
+msgstr "{0} テーマが読み込まれました。I2psnarkのトップページに戻ってください"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1027
+msgid "Configuration unchanged."
+msgstr "設定は変更されませんでした。"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1059
+msgid "Open Tracker list changed - torrent restart required to take effect."
+msgstr "オープントラッカーリストが変更されました - このオプションは再起動が必要です。"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1069
+msgid "Private tracker list changed - affects newly created torrents only."
+msgstr "プライベートトラッカーリストが変更されました - 新しく作成されたtorrentのみに影響します"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1115
+#, java-format
+msgid "Unable to save the config to {0}"
+msgstr "{0} の設定を保存できません"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1196
+msgid "Connecting to I2P"
+msgstr "I2Pに接続しています"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1199
+msgid "Error connecting to I2P - check your I2CP settings!"
+msgstr "I2P接続でエラーが発生しました - I2CP設定を確認して下さい!"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1208
+#: ../java/src/org/klomp/snark/SnarkManager.java:2273
+#, java-format
+msgid "Error: Could not add the torrent {0}"
+msgstr "エラー:{0} は追加されませんでした"
+
+#. catch this here so we don't try do delete it below
+#: ../java/src/org/klomp/snark/SnarkManager.java:1231
+#, java-format
+msgid "Cannot open \"{0}\""
+msgstr "\"{0}\" を開けません"
+
+#. TODO - if the existing one is a magnet, delete it and add the metainfo
+#. instead?
+#: ../java/src/org/klomp/snark/SnarkManager.java:1250
+#: ../java/src/org/klomp/snark/SnarkManager.java:1391
+#: ../java/src/org/klomp/snark/SnarkManager.java:1479
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:166
+#, java-format
+msgid "Torrent with this info hash is already running: {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1256
+#, java-format
+msgid "ERROR - No I2P trackers in private torrent \"{0}\""
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1258
+#, java-format
+msgid ""
+"Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and"
+" DHT only."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1261
+#, java-format
+msgid ""
+"Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will "
+"announce to DHT only."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1263
+#, java-format
+msgid ""
+"Warning - No I2P trackers in \"{0}\", and DHT and open trackers are "
+"disabled, you should enable open trackers or DHT before starting the "
+"torrent."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1289
+#, java-format
+msgid "Torrent in \"{0}\" is invalid"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1295
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1044
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1071
+#, java-format
+msgid "Torrent file deleted: {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1298
+#, java-format
+msgid "Torrent file moved from {0} to {1}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1302
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:193
+#, java-format
+msgid "ERROR - Out of memory, cannot create torrent from {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1324
+#, java-format
+msgid "Torrent added and started: {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1326
+#, java-format
+msgid "Torrent added: {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1402
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:93
+#, java-format
+msgid "Fetching {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1408
+#, java-format
+msgid ""
+"Open trackers are disabled and we have no DHT peers. Fetch of {0} may not "
+"succeed until you start another torrent, enable open trackers, or enable "
+"DHT."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1412
+#, java-format
+msgid "Adding {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1445
+#, java-format
+msgid "Download already running: {0}"
+msgstr "すでにダウンロードされています {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1490
+#: ../java/src/org/klomp/snark/SnarkManager.java:1516
+#: ../java/src/org/klomp/snark/SnarkManager.java:2154
+#, java-format
+msgid "Failed to copy torrent file to {0}"
+msgstr "{0} へのtorrentファイルのコピーに失敗しました。"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1930
+#, java-format
+msgid "Too many files in \"{0}\" ({1})!"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1932
+#, java-format
+msgid "Torrent file \"{0}\" cannot end in \".torrent\"!"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1934
+#, java-format
+msgid "No pieces in \"{0}\"!"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1936
+#, java-format
+msgid "Too many pieces in \"{0}\", limit is {1}!"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1938
+#, java-format
+msgid "Pieces are too large in \"{0}\" ({1}B)!"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1939
+#, java-format
+msgid "Limit is {0}B"
+msgstr "制限は {0}B です"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1941
+#, java-format
+msgid "Torrent \"{0}\" has no data!"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1949
+#, java-format
+msgid "Torrents larger than {0}B are not supported yet \"{1}\"!"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1966
+#, java-format
+msgid "Error: Could not remove the torrent {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1989
+#: ../java/src/org/klomp/snark/SnarkManager.java:2008
+#, java-format
+msgid "Torrent stopped: {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:2028
+#, java-format
+msgid "Torrent removed: \"{0}\""
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:2036
+#, java-format
+msgid "Adding torrents in {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:2070
+#, java-format
+msgid "Up bandwidth limit is {0} KBps"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:2095
+#, java-format
+msgid "Download finished: {0}"
+msgstr ""
+
+#. addMessage(_t("Metainfo received for {0}", snark.getName()));
+#: ../java/src/org/klomp/snark/SnarkManager.java:2151
+#: ../java/src/org/klomp/snark/SnarkManager.java:2434
+#, java-format
+msgid "Starting up torrent {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:2166
+#, java-format
+msgid "Error on torrent {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:2267
+msgid "Unable to connect to I2P!"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:2433
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:130
+msgid "Opening the I2P tunnel"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:2453
+msgid "Opening the I2P tunnel and starting all torrents."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:2516
+msgid "Stopping all torrents and closing the I2P tunnel."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:2535
+msgid "Closing I2P tunnel after notifying trackers."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:2597
+#, java-format
+msgid "Finished recheck of torrent {0}, now {1} complete"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:2599
+#, java-format
+msgid "Finished recheck of torrent {0}, unchanged"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:2603
+#, java-format
+msgid "Error checking the torrent {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/TrackerClient.java:245
+#, java-format
+msgid "No valid trackers for {0} - enable opentrackers or DHT?"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/UpdateHandler.java:49
+#: ../java/src/org/klomp/snark/UpdateRunner.java:228
+msgid "Updating"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/UpdateRunner.java:115
+#, java-format
+msgid "Updating from {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:80
+#, java-format
+msgid "Download torrent file from {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:103
+#, java-format
+msgid "Torrent was not retrieved from {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:157
+#, java-format
+msgid "Torrent fetched from {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:178
+#, java-format
+msgid "Torrent already running: {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:180
+#, java-format
+msgid "Torrent already in the queue: {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:191
+#, java-format
+msgid "Torrent at {0} was not valid"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:270
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1780
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2702
+msgid "I2PSnark"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2167
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2450
+msgid "Configuration"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:277
+msgid "Anonymous BitTorrent Client"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:291
+msgid "Router is down"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:308
+msgid "Torrents"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:319
+msgid "Refresh page"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:328
+msgid "Forum"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:343
+msgid "Click \"Add torrent\" button to fetch torrent"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:397
+msgid "clear messages"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:452
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3084
+msgid "Status"
+msgstr "状態"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:454
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:496
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:514
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:540
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:586
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:601
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3057
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3086
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3098
+#, java-format
+msgid "Sort by {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:465
+msgid "Hide Peers"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:471
+msgid "Show Peers"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:494
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2688
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2722
+msgid "Torrent"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:496
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3057
+msgid "File type"
+msgstr ""
+
+#. Translators: Please keep short or translate as " "
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:512
+msgid "ETA"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:514
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:515
+msgid "Estimated time remaining"
+msgstr ""
+
+#. Translators: Please keep short or translate as " "
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:538
+msgid "RX"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:540
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:541
+msgid "Downloaded"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:540
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2882
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3072
+msgid "Size"
+msgstr ""
+
+#. Translators: Please keep short or translate as " "
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:569
+msgid "TX"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2900
+msgid "Upload ratio"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:572
+msgid "Uploaded"
+msgstr ""
+
+#. Translators: Please keep short or translate as " "
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:584
+msgid "RX Rate"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:586
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:587
+msgid "Down Rate"
+msgstr ""
+
+#. Translators: Please keep short or translate as " "
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:599
+msgid "TX Rate"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:601
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:602
+msgid "Up Rate"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:618
+msgid "Stop all torrents and the I2P tunnel"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:620
+msgid "Stop All"
+msgstr "全て停止"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:632
+msgid "Start all stopped torrents"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:634
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:648
+msgid "Start All"
+msgstr "全て開始"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:646
+msgid "Start all torrents and the I2P tunnel"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:671
+msgid "No torrents loaded."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:677
+msgid "Totals"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:679
+#, java-format
+msgid "1 torrent"
+msgid_plural "{0} torrents"
+msgstr[0] ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:684
+#, java-format
+msgid "1 connected peer"
+msgid_plural "{0} connected peers"
+msgstr[0] ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:691
+#, java-format
+msgid "1 DHT peer"
+msgid_plural "{0} DHT peers"
+msgstr[0] ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:698
+msgid "Dest"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:826
+msgid "First"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:826
+msgid "First page"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:836
+msgid "Prev"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:836
+msgid "Previous page"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:869
+msgid "Next"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:869
+msgid "Next page"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:877
+msgid "Last"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:877
+msgid "Last page"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:964
+msgid "Data directory cannot be created"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:974
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1187
+#, java-format
+msgid "Cannot add torrent {0} inside another torrent: {1}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:995
+#, java-format
+msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\""
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1036
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1065
+#, java-format
+msgid "Magnet deleted: {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1063
+#, java-format
+msgid "Download deleted: {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1080
+#, java-format
+msgid "Data file deleted: {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1082
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1091
+#, java-format
+msgid "Data file could not be deleted: {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1107
+#, java-format
+msgid "Directory could not be deleted: {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1114
+#, java-format
+msgid "Directory deleted: {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1166
+#, java-format
+msgid "Cannot add a torrent ending in \".torrent\": {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1171
+#, java-format
+msgid "Torrent with this name is already running: {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1177
+#, java-format
+msgid "Cannot add a torrent including an I2P directory: {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1192
+#, java-format
+msgid "Cannot add torrent {0} including another torrent: {1}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1218
+msgid "Error - Cannot include alternate trackers without a primary tracker"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1231
+msgid "Error - Cannot mix private and public trackers in a torrent"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1253
+#, java-format
+msgid "Torrent created for \"{0}\""
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1255
+#, java-format
+msgid ""
+"Many I2P trackers require you to register new torrents before seeding - "
+"please do so before starting \"{0}\""
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1257
+#, java-format
+msgid "Error creating a torrent for \"{0}\""
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1261
+#, java-format
+msgid "Cannot create a torrent for the nonexistent data: {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1264
+msgid "Error creating torrent - you must enter a file or directory"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1295
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434
+msgid "Delete selected"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1295
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2436
+msgid "Save tracker configuration"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1312
+msgid "Removed"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1344
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2433
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2435
+msgid "Add tracker"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1367
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1370
+msgid "Enter valid tracker name and URLs"
+msgstr ""
+
+#. "<input type=\"reset\" class=\"cancel\"
+#. value=\"").append(_t("Cancel")).append("\">\n" +
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1372
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2438
+msgid "Restore defaults"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1375
+msgid "Restored default trackers"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1487
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1488
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2961
+msgid "Checking"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1491
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1492
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2968
+msgid "Allocating"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1507
+msgid "Tracker Error"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1509
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1539
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1555
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1560
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1566
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1571
+#, java-format
+msgid "1 peer"
+msgid_plural "{0} peers"
+msgstr[0] ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1519
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1520
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2966
+msgid "Starting"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1528
+msgid "Seeding"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1532
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1546
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1547
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2895
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3151
+msgid "Complete"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1551
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1552
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1557
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1558
+msgid "OK"
+msgstr "OK"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1562
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1563
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1568
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1569
+msgid "Stalled"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1573
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1574
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1577
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1578
+msgid "No Peers"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1580
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1581
+msgid "Stopped"
+msgstr "停止しました"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1610
+msgid "Torrent details"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1645
+msgid "View files"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1647
+msgid "Open file"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699
+msgid "Stop the torrent"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1701
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2973
+msgid "Stop"
+msgstr "停止"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714
+msgid "Start the torrent"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1716
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2975
+msgid "Start"
+msgstr "開始"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1729
+msgid "Remove the torrent from the active list, deleting the .torrent file"
+msgstr ""
+
+#. Can't figure out how to escape double quotes inside the onclick string.
+#. Single quotes in translate strings with parameters must be doubled.
+#. Then the remaining single quote must be escaped
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1734
+#, java-format
+msgid ""
+"Are you sure you want to delete the file \\''{0}\\'' (downloaded data will "
+"not be deleted) ?"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1738
+msgid "Remove"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1751
+msgid "Delete the .torrent file and the associated data file(s)"
+msgstr ""
+
+#. Can't figure out how to escape double quotes inside the onclick string.
+#. Single quotes in translate strings with parameters must be doubled.
+#. Then the remaining single quote must be escaped
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1756
+#, java-format
+msgid ""
+"Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded "
+"data?"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1760
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2392
+msgid "Delete"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1796
+msgid "Unknown"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1808
+msgid "Seed"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1831
+msgid "Uninteresting (The peer has no pieces we need)"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1833
+msgid "Choked (The peer is not allowing us to request pieces)"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1853
+msgid "Uninterested (We have no pieces the peer needs)"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1855
+msgid "Choking (We are not allowing the peer to request pieces)"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1971
+#, java-format
+msgid "Details at {0} tracker"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1988
+msgid "Info"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2061
+msgid "Add Torrent"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2064
+msgid "From URL"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2067
+msgid ""
+"Enter the torrent file download URL (I2P only), magnet link, maggot link, or"
+" info hash"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2072
+msgid "Add torrent"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2076
+msgid "Data dir"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2079
+#, java-format
+msgid "Enter the directory to save the data in (default {0})"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2083
+#, java-format
+msgid "You can also copy .torrent files to: {0}."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2085
+msgid "Removing a .torrent will cause it to stop."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2098
+msgid "Create Torrent"
+msgstr ""
+
+#. out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\"
+#. value=\"" + newFile + "\" /><br>\n");
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2101
+msgid "Data to seed"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2105
+#, java-format
+msgid "File or directory to seed (full path or within the directory {0} )"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2108
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2365
+msgid "Trackers"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2110
+msgid "Primary"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2112
+msgid "Alternates"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2115
+msgid "Create torrent"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2133
+msgid "none"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2171
+msgid "Data directory"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2176
+msgid "Files readable by all"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2180
+msgid "If checked, other users may access the downloaded files"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2184
+msgid "Auto start torrents"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2188
+msgid "If checked, automatically start torrents that are added"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2192
+msgid "Smart torrent sorting"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2196
+msgid "If checked, ignore words such as 'the' when sorting"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2200
+msgid "Theme"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2214
+msgid "Refresh time"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2227
+msgid "Never"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2233
+msgid "Startup delay"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2235
+msgid "minutes"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2239
+msgid "Page size"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2241
+msgid "torrents"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2265
+msgid "Total uploader limit"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2268
+msgid "peers"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2272
+msgid "Up bandwidth limit"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2275
+msgid "Half available bandwidth recommended."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2277
+msgid "View or change router bandwidth"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2281
+msgid "Use open trackers also"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2285
+msgid ""
+"If checked, announce torrents to open trackers as well as the tracker listed"
+" in the torrent file"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2289
+msgid "Enable DHT"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2293
+msgid "If checked, use DHT"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2309
+msgid "Inbound Settings"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2316
+msgid "Outbound Settings"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2325
+msgid "I2CP host"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2330
+msgid "I2CP port"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2345
+msgid "I2CP options"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2350
+msgid "Save configuration"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2370
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3057
+msgid "Name"
+msgstr "名前"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2372
+msgid "Website URL"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2374
+msgid "Standard"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2376
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3184
+msgid "Open"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2378
+msgid "Private"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2380
+msgid "Announce URL"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2424
+msgid "Add"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2467
+#, java-format
+msgid "Invalid magnet URL {0}"
+msgstr ""
+
+#. * dummies for translation
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2475
+#, java-format
+msgid "1 hop"
+msgid_plural "{0} hops"
+msgstr[0] ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2476
+#, java-format
+msgid "1 tunnel"
+msgid_plural "{0} tunnels"
+msgstr[0] ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2732
+msgid "Torrent file"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2740
+msgid "Data location"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2749
+msgid "Info hash"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2768
+msgid "Primary Tracker"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2777
+msgid "Tracker List"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2802
+msgid "Comment"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2814
+msgid "Created"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2825
+msgid "Created By"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2835
+msgid "Added"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2844
+msgid "Completed"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2856
+msgid "Magnet link"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2871
+msgid "Private torrent"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2891
+msgid "Completion"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2920
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3086
+msgid "Remaining"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2929
+msgid "Skipped"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939
+msgid "Files"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2946
+msgid "Pieces"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2952
+msgid "Piece size"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2964
+msgid "Refresh page for results"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2976
+msgid "Force Recheck"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3037
+msgid "Directory"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3096
+msgid "Priority"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3108
+msgid "Up to higher level directory"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3142
+msgid "Torrent not found?"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3148
+msgid "File not found in torrent?"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3161
+msgid "complete"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3162
+msgid "remaining"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3208
+msgid "High"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3213
+msgid "Normal"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3218
+msgid "Skip"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3228
+msgid "Set all high"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3230
+msgid "Set all normal"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3232
+msgid "Skip all"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3233
+msgid "Save priorities"
+msgstr ""
diff --git a/apps/i2psnark/locale/messages_uk.po b/apps/i2psnark/locale/messages_uk.po
new file mode 100644
index 0000000000..bb0d8046d8
--- /dev/null
+++ b/apps/i2psnark/locale/messages_uk.po
@@ -0,0 +1,1408 @@
+# I2P
+# Copyright (C) 2009 The I2P Project
+# This file is distributed under the same license as the i2psnark package.
+# To contribute translations, see http://www.i2p2.de/newdevelopers
+# 
+# Translators:
+# Denis Lysenko <gribua@gmail.com>, 2015
+# madjong <madjong@i2pmail.org>, 2014
+# puxud <puxud@alivance.com>, 2014
+# zzzi2p, 2016
+msgid ""
+msgstr ""
+"Project-Id-Version: I2P\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-05-25 12:28+0000\n"
+"PO-Revision-Date: 2016-06-15 14:40+0000\n"
+"Last-Translator: zzzi2p\n"
+"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/otf/I2P/language/uk_UA/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: uk_UA\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: ../java/src/org/klomp/snark/IdleChecker.java:75
+msgid "No more torrents running."
+msgstr "Більше немає запущених торрентів."
+
+#: ../java/src/org/klomp/snark/IdleChecker.java:76
+#: ../java/src/org/klomp/snark/SnarkManager.java:2542
+#: ../java/src/org/klomp/snark/SnarkManager.java:2553
+msgid "I2P tunnel closed."
+msgstr "I2P-тунель закритий."
+
+#: ../java/src/org/klomp/snark/MagnetURI.java:42
+#: ../java/src/org/klomp/snark/MagnetURI.java:52
+#: ../java/src/org/klomp/snark/SnarkManager.java:2224
+msgid "Magnet"
+msgstr "Magnet"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:794
+#, java-format
+msgid "Total uploaders limit changed to {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:796
+#, java-format
+msgid "Minimum total uploaders limit is {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:808
+#, java-format
+msgid "Up BW limit changed to {0}KBps"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:810
+#, java-format
+msgid "Minimum up bandwidth limit is {0}KBps"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:822
+#, java-format
+msgid "Startup delay changed to {0}"
+msgstr "Затримка запуску змінена на {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:833
+#, java-format
+msgid "Refresh time changed to {0}"
+msgstr "Час оновлення змінено на {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:835
+msgid "Refresh disabled"
+msgstr "Оновлення вимкнено"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:851
+#, java-format
+msgid "Page size changed to {0}"
+msgstr "Новий розмір сторінки: {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:860
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:960
+msgid "Data directory must be an absolute path"
+msgstr "Директорія даних повинна бути абсолютним шляхом"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:862
+msgid "Data directory does not exist"
+msgstr "Директорія даних не існує"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:864
+msgid "Not a directory"
+msgstr "Не директорія"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:866
+msgid "Unreadable"
+msgstr "Неможливо прочитати"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:871
+#, java-format
+msgid "Data directory changed to {0}"
+msgstr "Директорія даних змінена на {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:926
+msgid "I2CP and tunnel changes will take effect after stopping all torrents"
+msgstr "Зміни налаштувать I2CP і тунелів застосуються після зупинки всіх торрентів"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:930
+#, java-format
+msgid "I2CP options changed to {0}"
+msgstr "Параметри I2CP змінені на {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:936
+msgid "Disconnecting old I2CP destination"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:938
+#, java-format
+msgid "I2CP settings changed to {0}"
+msgstr "Нові налаштування I2CP: {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:943
+msgid ""
+"Unable to connect with the new settings, reverting to the old I2CP settings"
+msgstr "Не вдалося з’єднатися з використанням нових налаштувань I2CP, повернення до попередніх налаштувань"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:947
+msgid "Unable to reconnect with the old settings!"
+msgstr "Неможливо перез’єднатись із старими налаштуваннями!"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:949
+msgid "Reconnected on the new I2CP destination"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:956
+#, java-format
+msgid "I2CP listener restarted for \"{0}\""
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:970
+msgid "New files will be publicly readable"
+msgstr "Нові файли будуть публічно доступні для читання"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:972
+msgid "New files will not be publicly readable"
+msgstr "Нові файли не будуть доступні для читання публічно"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:979
+msgid "Enabled autostart"
+msgstr "Автозапуск увімкнено"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:981
+msgid "Disabled autostart"
+msgstr "Автозапуск вимкнено"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:988
+msgid "Enabled smart sort"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:990
+msgid "Disabled smart sort"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:997
+msgid "Enabled open trackers - torrent restart required to take effect."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:999
+msgid "Disabled open trackers - torrent restart required to take effect."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1006
+msgid "Enabled DHT."
+msgstr "DHT увімкнено."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1008
+msgid "Disabled DHT."
+msgstr "DHT вимкнено."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1010
+msgid "DHT change requires tunnel shutdown and reopen"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1017
+#, java-format
+msgid "{0} theme loaded, return to main i2psnark page to view."
+msgstr "Тема {0} завантажена, поверніться до головної сторінки I2PSnark щоб переглянути."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1027
+msgid "Configuration unchanged."
+msgstr "Налаштування не змінені."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1059
+msgid "Open Tracker list changed - torrent restart required to take effect."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1069
+msgid "Private tracker list changed - affects newly created torrents only."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1115
+#, java-format
+msgid "Unable to save the config to {0}"
+msgstr "Неможливо зберегти налаштування до {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1196
+msgid "Connecting to I2P"
+msgstr "З’єднання з I2P"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1199
+msgid "Error connecting to I2P - check your I2CP settings!"
+msgstr "Помилка з’єднання з I2P - перевірте ваші налаштування I2CP!"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1208
+#: ../java/src/org/klomp/snark/SnarkManager.java:2273
+#, java-format
+msgid "Error: Could not add the torrent {0}"
+msgstr "Помилка: неможливо додати торрент {0}"
+
+#. catch this here so we don't try do delete it below
+#: ../java/src/org/klomp/snark/SnarkManager.java:1231
+#, java-format
+msgid "Cannot open \"{0}\""
+msgstr "Неможливо відкрити \"{0}\""
+
+#. TODO - if the existing one is a magnet, delete it and add the metainfo
+#. instead?
+#: ../java/src/org/klomp/snark/SnarkManager.java:1250
+#: ../java/src/org/klomp/snark/SnarkManager.java:1391
+#: ../java/src/org/klomp/snark/SnarkManager.java:1479
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:166
+#, java-format
+msgid "Torrent with this info hash is already running: {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1256
+#, java-format
+msgid "ERROR - No I2P trackers in private torrent \"{0}\""
+msgstr "ПОМИЛКА: Немає I2P трекерів у особистому торренті \"{0}\""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1258
+#, java-format
+msgid ""
+"Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and"
+" DHT only."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1261
+#, java-format
+msgid ""
+"Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will "
+"announce to DHT only."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1263
+#, java-format
+msgid ""
+"Warning - No I2P trackers in \"{0}\", and DHT and open trackers are "
+"disabled, you should enable open trackers or DHT before starting the "
+"torrent."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1289
+#, java-format
+msgid "Torrent in \"{0}\" is invalid"
+msgstr "Торрент у \"{0}\" неправильний/пошкоджений"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1295
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1044
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1071
+#, java-format
+msgid "Torrent file deleted: {0}"
+msgstr "Торрент файл видалено: {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1298
+#, java-format
+msgid "Torrent file moved from {0} to {1}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1302
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:193
+#, java-format
+msgid "ERROR - Out of memory, cannot create torrent from {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1324
+#, java-format
+msgid "Torrent added and started: {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1326
+#, java-format
+msgid "Torrent added: {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1402
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:93
+#, java-format
+msgid "Fetching {0}"
+msgstr "Отримання торренту: {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1408
+#, java-format
+msgid ""
+"Open trackers are disabled and we have no DHT peers. Fetch of {0} may not "
+"succeed until you start another torrent, enable open trackers, or enable "
+"DHT."
+msgstr "Використання відкритих трекерів заборонено і немає DHT пірів. Передавання {0} не може бути завершено. Запустіть інший торрент або дозвольте використання відкритих трекерів і/або DHT."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1412
+#, java-format
+msgid "Adding {0}"
+msgstr "Додавання {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1445
+#, java-format
+msgid "Download already running: {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1490
+#: ../java/src/org/klomp/snark/SnarkManager.java:1516
+#: ../java/src/org/klomp/snark/SnarkManager.java:2154
+#, java-format
+msgid "Failed to copy torrent file to {0}"
+msgstr "Неможливо скопіювати торрент файл до {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1930
+#, java-format
+msgid "Too many files in \"{0}\" ({1})!"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1932
+#, java-format
+msgid "Torrent file \"{0}\" cannot end in \".torrent\"!"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1934
+#, java-format
+msgid "No pieces in \"{0}\"!"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1936
+#, java-format
+msgid "Too many pieces in \"{0}\", limit is {1}!"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1938
+#, java-format
+msgid "Pieces are too large in \"{0}\" ({1}B)!"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1939
+#, java-format
+msgid "Limit is {0}B"
+msgstr "Ліміт: {0}Б"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1941
+#, java-format
+msgid "Torrent \"{0}\" has no data!"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1949
+#, java-format
+msgid "Torrents larger than {0}B are not supported yet \"{1}\"!"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1966
+#, java-format
+msgid "Error: Could not remove the torrent {0}"
+msgstr "Помилка: неможливо видалити торрент {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1989
+#: ../java/src/org/klomp/snark/SnarkManager.java:2008
+#, java-format
+msgid "Torrent stopped: {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:2028
+#, java-format
+msgid "Torrent removed: \"{0}\""
+msgstr "Торрент вилучено: {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:2036
+#, java-format
+msgid "Adding torrents in {0}"
+msgstr "Додавання торрентів у {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:2070
+#, java-format
+msgid "Up bandwidth limit is {0} KBps"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:2095
+#, java-format
+msgid "Download finished: {0}"
+msgstr "Завантаження завершено: {0}"
+
+#. addMessage(_t("Metainfo received for {0}", snark.getName()));
+#: ../java/src/org/klomp/snark/SnarkManager.java:2151
+#: ../java/src/org/klomp/snark/SnarkManager.java:2434
+#, java-format
+msgid "Starting up torrent {0}"
+msgstr "Запуск торренту {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:2166
+#, java-format
+msgid "Error on torrent {0}"
+msgstr "Помилка торренту {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:2267
+msgid "Unable to connect to I2P!"
+msgstr "Неможливо з’єднатися з I2P!"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:2433
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:130
+msgid "Opening the I2P tunnel"
+msgstr "Відкриття тунелю I2P"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:2453
+msgid "Opening the I2P tunnel and starting all torrents."
+msgstr "Відкриття тунелю I2P і запуск всіх торрентів."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:2516
+msgid "Stopping all torrents and closing the I2P tunnel."
+msgstr "Зупинення всіх торрентів і закриття тунелю I2P."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:2535
+msgid "Closing I2P tunnel after notifying trackers."
+msgstr "Виключення тунелю I2P після попередження трекерів."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:2597
+#, java-format
+msgid "Finished recheck of torrent {0}, now {1} complete"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:2599
+#, java-format
+msgid "Finished recheck of torrent {0}, unchanged"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:2603
+#, java-format
+msgid "Error checking the torrent {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/TrackerClient.java:245
+#, java-format
+msgid "No valid trackers for {0} - enable opentrackers or DHT?"
+msgstr "Для {0} немає трекерів - включити відкриті трекери або DHT?"
+
+#: ../java/src/org/klomp/snark/UpdateHandler.java:49
+#: ../java/src/org/klomp/snark/UpdateRunner.java:228
+msgid "Updating"
+msgstr "Оновлення"
+
+#: ../java/src/org/klomp/snark/UpdateRunner.java:115
+#, java-format
+msgid "Updating from {0}"
+msgstr "Оновлення з {0}"
+
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:80
+#, java-format
+msgid "Download torrent file from {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:103
+#, java-format
+msgid "Torrent was not retrieved from {0}"
+msgstr "Торрент не було отримано з {0}"
+
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:157
+#, java-format
+msgid "Torrent fetched from {0}"
+msgstr "Отримано торрент із {0}"
+
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:178
+#, java-format
+msgid "Torrent already running: {0}"
+msgstr "Торрент вже запущений: {0}"
+
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:180
+#, java-format
+msgid "Torrent already in the queue: {0}"
+msgstr "Торрент вже в черзі: {0}"
+
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:191
+#, java-format
+msgid "Torrent at {0} was not valid"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:270
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1780
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2702
+msgid "I2PSnark"
+msgstr "I2PSnark"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2167
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2450
+msgid "Configuration"
+msgstr "Налаштування"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:277
+msgid "Anonymous BitTorrent Client"
+msgstr "Анонімний BitTorrent клієнт"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:291
+msgid "Router is down"
+msgstr "Роутер не працює"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:308
+msgid "Torrents"
+msgstr "Торренти"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:319
+msgid "Refresh page"
+msgstr "Оновити сторінку"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:328
+msgid "Forum"
+msgstr "Форум"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:343
+msgid "Click \"Add torrent\" button to fetch torrent"
+msgstr "Натисніть \"Додати торрент\" щоб отримати торрент"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:397
+msgid "clear messages"
+msgstr "очистити повідомлення"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:452
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3084
+msgid "Status"
+msgstr "Статус"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:454
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:496
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:514
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:540
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:586
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:601
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3057
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3086
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3098
+#, java-format
+msgid "Sort by {0}"
+msgstr "Сортувати по {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:465
+msgid "Hide Peers"
+msgstr "Приховати піри"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:471
+msgid "Show Peers"
+msgstr "Показати піри"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:494
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2688
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2722
+msgid "Torrent"
+msgstr "Торрент"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:496
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3057
+msgid "File type"
+msgstr "Тип файлу"
+
+#. Translators: Please keep short or translate as " "
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:512
+msgid "ETA"
+msgstr "Залишилось"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:514
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:515
+msgid "Estimated time remaining"
+msgstr "Приблизно залишилось"
+
+#. Translators: Please keep short or translate as " "
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:538
+msgid "RX"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:540
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:541
+msgid "Downloaded"
+msgstr "Завантажено"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:540
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2882
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3072
+msgid "Size"
+msgstr "Розмір"
+
+#. Translators: Please keep short or translate as " "
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:569
+msgid "TX"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2900
+msgid "Upload ratio"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:572
+msgid "Uploaded"
+msgstr "Вивантажено"
+
+#. Translators: Please keep short or translate as " "
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:584
+msgid "RX Rate"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:586
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:587
+msgid "Down Rate"
+msgstr ""
+
+#. Translators: Please keep short or translate as " "
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:599
+msgid "TX Rate"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:601
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:602
+msgid "Up Rate"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:618
+msgid "Stop all torrents and the I2P tunnel"
+msgstr "Зупинити всі торренти і I2P тунель"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:620
+msgid "Stop All"
+msgstr "Зупинити всі"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:632
+msgid "Start all stopped torrents"
+msgstr "Запустити всі зупинені торренти"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:634
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:648
+msgid "Start All"
+msgstr "Запустити всі"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:646
+msgid "Start all torrents and the I2P tunnel"
+msgstr "Запустити всі торренти і I2P тунель"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:671
+msgid "No torrents loaded."
+msgstr "Немає завантажених торрентів."
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:677
+msgid "Totals"
+msgstr "Загалом"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:679
+#, java-format
+msgid "1 torrent"
+msgid_plural "{0} torrents"
+msgstr[0] "{0} торрент"
+msgstr[1] "{0} торрентів"
+msgstr[2] "{0} торрентів"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:684
+#, java-format
+msgid "1 connected peer"
+msgid_plural "{0} connected peers"
+msgstr[0] "{0} приєднаний пір"
+msgstr[1] "{0} приєднаних пірів"
+msgstr[2] "{0} приєднаних пірів"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:691
+#, java-format
+msgid "1 DHT peer"
+msgid_plural "{0} DHT peers"
+msgstr[0] "{0} DHT пір"
+msgstr[1] "{0} DHT пірів"
+msgstr[2] "{0} DHT пірів"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:698
+msgid "Dest"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:826
+msgid "First"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:826
+msgid "First page"
+msgstr "Перша сторінка"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:836
+msgid "Prev"
+msgstr "Попередня"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:836
+msgid "Previous page"
+msgstr "Попередня сторінка"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:869
+msgid "Next"
+msgstr "Наступна"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:869
+msgid "Next page"
+msgstr "Наступна сторінка"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:877
+msgid "Last"
+msgstr "Остання"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:877
+msgid "Last page"
+msgstr "Остання сторінка"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:964
+msgid "Data directory cannot be created"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:974
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1187
+#, java-format
+msgid "Cannot add torrent {0} inside another torrent: {1}"
+msgstr "Неможливо додати торрент {0} всередині іншого торренту: {1}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:995
+#, java-format
+msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\""
+msgstr "Хибний URL: Повинен починатися з \"http://\", \"{0}\" або \"{1}\""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1036
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1065
+#, java-format
+msgid "Magnet deleted: {0}"
+msgstr "Magnet видалено: {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1063
+#, java-format
+msgid "Download deleted: {0}"
+msgstr "Завантаження видалено: {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1080
+#, java-format
+msgid "Data file deleted: {0}"
+msgstr "Файл з даними видалений: {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1082
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1091
+#, java-format
+msgid "Data file could not be deleted: {0}"
+msgstr "Неможливо видалити файл з даними: {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1107
+#, java-format
+msgid "Directory could not be deleted: {0}"
+msgstr "Неможливо вилучити директорію: {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1114
+#, java-format
+msgid "Directory deleted: {0}"
+msgstr "Директорію видалено: {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1166
+#, java-format
+msgid "Cannot add a torrent ending in \".torrent\": {0}"
+msgstr "Неможливо додати торрент, який закінчується на \".torrent\": {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1171
+#, java-format
+msgid "Torrent with this name is already running: {0}"
+msgstr "Торрент з цією назвою вже запущений: {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1177
+#, java-format
+msgid "Cannot add a torrent including an I2P directory: {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1192
+#, java-format
+msgid "Cannot add torrent {0} including another torrent: {1}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1218
+msgid "Error - Cannot include alternate trackers without a primary tracker"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1231
+msgid "Error - Cannot mix private and public trackers in a torrent"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1253
+#, java-format
+msgid "Torrent created for \"{0}\""
+msgstr "Торрент створений для \"{0}\""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1255
+#, java-format
+msgid ""
+"Many I2P trackers require you to register new torrents before seeding - "
+"please do so before starting \"{0}\""
+msgstr "Багато I2P трекерів вимагають зареєструвати торренти перед їх роздачою - будь ласка зробіть це перед запуском \"{0}\""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1257
+#, java-format
+msgid "Error creating a torrent for \"{0}\""
+msgstr "Неможливо створити торрент для \"{0}\""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1261
+#, java-format
+msgid "Cannot create a torrent for the nonexistent data: {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1264
+msgid "Error creating torrent - you must enter a file or directory"
+msgstr "Неможливо створити торрент: необхідно вибрати файл або директорію"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1295
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434
+msgid "Delete selected"
+msgstr "Видалити вибране"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1295
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2436
+msgid "Save tracker configuration"
+msgstr "Зберегти налаштування трекера"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1312
+msgid "Removed"
+msgstr "Видалено"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1344
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2433
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2435
+msgid "Add tracker"
+msgstr "Додати трекер"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1367
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1370
+msgid "Enter valid tracker name and URLs"
+msgstr ""
+
+#. "<input type=\"reset\" class=\"cancel\"
+#. value=\"").append(_t("Cancel")).append("\">\n" +
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1372
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2438
+msgid "Restore defaults"
+msgstr "Відновити стандартні"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1375
+msgid "Restored default trackers"
+msgstr "Відновлено стандартні трекери"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1487
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1488
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2961
+msgid "Checking"
+msgstr "Перевірка"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1491
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1492
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2968
+msgid "Allocating"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1507
+msgid "Tracker Error"
+msgstr "Помилка трекеру"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1509
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1539
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1555
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1560
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1566
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1571
+#, java-format
+msgid "1 peer"
+msgid_plural "{0} peers"
+msgstr[0] "{0} пір"
+msgstr[1] "{0} пірів"
+msgstr[2] "{0} пірів"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1519
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1520
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2966
+msgid "Starting"
+msgstr "Запуск"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1528
+msgid "Seeding"
+msgstr "Роздаю"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1532
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1546
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1547
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2895
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3151
+msgid "Complete"
+msgstr "Готово"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1551
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1552
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1557
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1558
+msgid "OK"
+msgstr "ОК"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1562
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1563
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1568
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1569
+msgid "Stalled"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1573
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1574
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1577
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1578
+msgid "No Peers"
+msgstr "Немає пірів"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1580
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1581
+msgid "Stopped"
+msgstr "Зупинено"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1610
+msgid "Torrent details"
+msgstr "Деталі торрента"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1645
+msgid "View files"
+msgstr "Переглянути файли"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1647
+msgid "Open file"
+msgstr "Відкрити файл"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699
+msgid "Stop the torrent"
+msgstr "Зупинити торрент"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1701
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2973
+msgid "Stop"
+msgstr "Зупинити"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714
+msgid "Start the torrent"
+msgstr "Запустити торрент"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1716
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2975
+msgid "Start"
+msgstr "Запустити"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1729
+msgid "Remove the torrent from the active list, deleting the .torrent file"
+msgstr "Видалити торрент з активного спику, видалення файлу .torrent"
+
+#. Can't figure out how to escape double quotes inside the onclick string.
+#. Single quotes in translate strings with parameters must be doubled.
+#. Then the remaining single quote must be escaped
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1734
+#, java-format
+msgid ""
+"Are you sure you want to delete the file \\''{0}\\'' (downloaded data will "
+"not be deleted) ?"
+msgstr "Ви дійсно хочете видалити файл \\\"{0}\\\" (завантажені дані не буде видалено)?"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1738
+msgid "Remove"
+msgstr "Вилучити"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1751
+msgid "Delete the .torrent file and the associated data file(s)"
+msgstr "Видалити .torrent файл і всі пов’язані з ним дані"
+
+#. Can't figure out how to escape double quotes inside the onclick string.
+#. Single quotes in translate strings with parameters must be doubled.
+#. Then the remaining single quote must be escaped
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1756
+#, java-format
+msgid ""
+"Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded "
+"data?"
+msgstr "Ви дійсно хочете видалити торрент \\''{0}\\'' і всі завантажені дані?"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1760
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2392
+msgid "Delete"
+msgstr "Видалити"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1796
+msgid "Unknown"
+msgstr "Невідомо"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1808
+msgid "Seed"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1831
+msgid "Uninteresting (The peer has no pieces we need)"
+msgstr "Uninteresting (Пір не має потрібних нам частин)"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1833
+msgid "Choked (The peer is not allowing us to request pieces)"
+msgstr "Choked (Пір не дозволяє нам запитувати частини)"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1853
+msgid "Uninterested (We have no pieces the peer needs)"
+msgstr "Uninterested (Ми не маємо потрібних піру частин)"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1855
+msgid "Choking (We are not allowing the peer to request pieces)"
+msgstr "Choking (Ми не дозволяємо піру запитувати частини)"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1971
+#, java-format
+msgid "Details at {0} tracker"
+msgstr "Деталі на трекері {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1988
+msgid "Info"
+msgstr "Інформація"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2061
+msgid "Add Torrent"
+msgstr "Додати торрент"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2064
+msgid "From URL"
+msgstr "З URL"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2067
+msgid ""
+"Enter the torrent file download URL (I2P only), magnet link, maggot link, or"
+" info hash"
+msgstr "Введіть URL-адресу торрент файлу (тільки I2P), посилання Magnet або інфо хеш"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2072
+msgid "Add torrent"
+msgstr "Додати торрент"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2076
+msgid "Data dir"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2079
+#, java-format
+msgid "Enter the directory to save the data in (default {0})"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2083
+#, java-format
+msgid "You can also copy .torrent files to: {0}."
+msgstr "Ви також можете скопіювати .torrent файли до: {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2085
+msgid "Removing a .torrent will cause it to stop."
+msgstr "Видалення .torrent файлу спричинить його зупинку."
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2098
+msgid "Create Torrent"
+msgstr "Створити торрент"
+
+#. out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\"
+#. value=\"" + newFile + "\" /><br>\n");
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2101
+msgid "Data to seed"
+msgstr "Дані для роздачі"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2105
+#, java-format
+msgid "File or directory to seed (full path or within the directory {0} )"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2108
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2365
+msgid "Trackers"
+msgstr "Трекери"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2110
+msgid "Primary"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2112
+msgid "Alternates"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2115
+msgid "Create torrent"
+msgstr "Створити торрент"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2133
+msgid "none"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2171
+msgid "Data directory"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2176
+msgid "Files readable by all"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2180
+msgid "If checked, other users may access the downloaded files"
+msgstr "Якщо вибрано, інші користувачі можуть мати доступ до завантажених файлів"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2184
+msgid "Auto start torrents"
+msgstr "Автоматично запускати торренти"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2188
+msgid "If checked, automatically start torrents that are added"
+msgstr "Якщо вибрано, автоматично запускатиме торренти які були додані"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2192
+msgid "Smart torrent sorting"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2196
+msgid "If checked, ignore words such as 'the' when sorting"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2200
+msgid "Theme"
+msgstr "Тема"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2214
+msgid "Refresh time"
+msgstr "Оновити час"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2227
+msgid "Never"
+msgstr "Ніколи"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2233
+msgid "Startup delay"
+msgstr "Затримка перез автозапуском"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2235
+msgid "minutes"
+msgstr "хвилин"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2239
+msgid "Page size"
+msgstr "Розмір сторінки"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2241
+msgid "torrents"
+msgstr "торрентів"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2265
+msgid "Total uploader limit"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2268
+msgid "peers"
+msgstr "піри"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2272
+msgid "Up bandwidth limit"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2275
+msgid "Half available bandwidth recommended."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2277
+msgid "View or change router bandwidth"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2281
+msgid "Use open trackers also"
+msgstr "Використовувати також відкриті трекери"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2285
+msgid ""
+"If checked, announce torrents to open trackers as well as the tracker listed"
+" in the torrent file"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2289
+msgid "Enable DHT"
+msgstr "Увімкнути DHT"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2293
+msgid "If checked, use DHT"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2309
+msgid "Inbound Settings"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2316
+msgid "Outbound Settings"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2325
+msgid "I2CP host"
+msgstr "I2CP хост"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2330
+msgid "I2CP port"
+msgstr "I2CP порт"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2345
+msgid "I2CP options"
+msgstr "Параметри I2CP"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2350
+msgid "Save configuration"
+msgstr "Зберегти налаштування"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2370
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3057
+msgid "Name"
+msgstr "Назва"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2372
+msgid "Website URL"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2374
+msgid "Standard"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2376
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3184
+msgid "Open"
+msgstr "Відкрити"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2378
+msgid "Private"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2380
+msgid "Announce URL"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2424
+msgid "Add"
+msgstr "Додати"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2467
+#, java-format
+msgid "Invalid magnet URL {0}"
+msgstr ""
+
+#. * dummies for translation
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2475
+#, java-format
+msgid "1 hop"
+msgid_plural "{0} hops"
+msgstr[0] "{0} хоп"
+msgstr[1] "{0} хопів"
+msgstr[2] "{0} хопів"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2476
+#, java-format
+msgid "1 tunnel"
+msgid_plural "{0} tunnels"
+msgstr[0] "{0} тунель"
+msgstr[1] "{0} тунеля"
+msgstr[2] "{0} тунелів"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2732
+msgid "Torrent file"
+msgstr "Торрент файл"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2740
+msgid "Data location"
+msgstr "Розміщення даних"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2749
+msgid "Info hash"
+msgstr "Інфо хеш"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2768
+msgid "Primary Tracker"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2777
+msgid "Tracker List"
+msgstr "Список трекерів"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2802
+msgid "Comment"
+msgstr "Коментар"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2814
+msgid "Created"
+msgstr "Створено"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2825
+msgid "Created By"
+msgstr "Створено"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2835
+msgid "Added"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2844
+msgid "Completed"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2856
+msgid "Magnet link"
+msgstr "Посилання Magnet"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2871
+msgid "Private torrent"
+msgstr "Особистий торрент"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2891
+msgid "Completion"
+msgstr "Завершення"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2920
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3086
+msgid "Remaining"
+msgstr "Залишилось"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2929
+msgid "Skipped"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939
+msgid "Files"
+msgstr "Файли"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2946
+msgid "Pieces"
+msgstr "Частин"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2952
+msgid "Piece size"
+msgstr "Розмір частин"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2964
+msgid "Refresh page for results"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2976
+msgid "Force Recheck"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3037
+msgid "Directory"
+msgstr "Директорія"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3096
+msgid "Priority"
+msgstr "Пріоритет"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3108
+msgid "Up to higher level directory"
+msgstr "На рівень вище"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3142
+msgid "Torrent not found?"
+msgstr "Торрент не знайдено?"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3148
+msgid "File not found in torrent?"
+msgstr "Файл не знайдено у торренті?"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3161
+msgid "complete"
+msgstr "готово"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3162
+msgid "remaining"
+msgstr "залишилось"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3208
+msgid "High"
+msgstr "Високий"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3213
+msgid "Normal"
+msgstr "Нормальний"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3218
+msgid "Skip"
+msgstr "Пропустити"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3228
+msgid "Set all high"
+msgstr "Високий пріоритет всім"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3230
+msgid "Set all normal"
+msgstr "Нормальний пріоритет всім"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3232
+msgid "Skip all"
+msgstr "Пропустити всі"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3233
+msgid "Save priorities"
+msgstr "Зберегти пріоритети"
diff --git a/build.xml b/build.xml
index 90e8a1fac5..52598f9acf 100644
--- a/build.xml
+++ b/build.xml
@@ -1834,7 +1834,8 @@
     </target> -->
 
     <!-- standalone i2psnark zip -->
-    <target name="i2psnark" depends="buildStreaming, buildJetty, buildSystray" >
+    <!-- console dependency for countries bundle -->
+    <target name="i2psnark" depends="buildStreaming, buildJetty, buildSystray, buildRouterConsole" >
         <ant dir="apps/i2psnark/java" target="standalone" />
         <copy file="apps/i2psnark/java/i2psnark-standalone.zip" todir="." />
     </target>
diff --git a/core/java/src/net/i2p/util/Translate.java b/core/java/src/net/i2p/util/Translate.java
index e76121c8a2..cf64a52802 100644
--- a/core/java/src/net/i2p/util/Translate.java
+++ b/core/java/src/net/i2p/util/Translate.java
@@ -27,10 +27,14 @@ public abstract class Translate {
     public static final String PROP_LANG = "routerconsole.lang";
     /** @since 0.9.10 */
     public static final String PROP_COUNTRY = "routerconsole.country";
-    /** non-null, two-letter lower case, may be "" */
+    /** non-null, two- or three-letter lower case, may be "" */
     private static final String _localeLang = Locale.getDefault().getLanguage();
     /** non-null, two-letter upper case, may be "" */
     private static final String _localeCountry = Locale.getDefault().getCountry();
+    /** App context only, two- or three-letter lower case, may be null */
+    private static String _overrideLang = null;
+    /** App context only, two-letter upper case, may be "" or null */
+    private static String _overrideCountry = null;
     private static final Map<String, ResourceBundle> _bundles = new ConcurrentHashMap<String, ResourceBundle>(16);
     private static final Set<String> _missing = new ConcurrentHashSet<String>(16);
     /** use to look for untagged strings */
@@ -139,6 +143,12 @@ public abstract class Translate {
      *  @return lang in routerconsole.lang property, else current locale
      */
     public static String getLanguage(I2PAppContext ctx) {
+        if (!ctx.isRouterContext()) {
+            synchronized(Translate.class) {
+                if (_overrideLang != null)
+                    return _overrideLang;
+            }
+        }
         String lang = ctx.getProperty(PROP_LANG);
         if (lang == null || lang.length() <= 0)
             lang = _localeLang;
@@ -151,11 +161,32 @@ public abstract class Translate {
      *  @since 0.9.10
      */
     public static String getCountry(I2PAppContext ctx) {
+        if (!ctx.isRouterContext()) {
+            synchronized(Translate.class) {
+                if (_overrideCountry != null)
+                    return _overrideCountry;
+            }
+        }
         // property may be empty so we don't have a non-default
         // language and a default country
         return ctx.getProperty(PROP_COUNTRY, _localeCountry);
     }
 
+    /**
+     *  Only for use by standalone apps in App Context.
+     *  NOT for use in Router Context.
+     *  Does not persist, apps must implement their own persistence.
+     *  Overrides in all contexts.
+     *
+     *  @param lang Two- or three-letter lower case, or null for default
+     *  @param country Two-letter upper case, or null for default, or "" for none
+     *  @since 0.9.27
+     */
+    public synchronized static void setLanguage(String lang, String country) {
+        _overrideLang = lang;
+        _overrideCountry = country;
+    }
+
     /**
      * cache both found and not found for speed
      * @param lang non-null, if "" returns null
-- 
GitLab