diff --git a/INSTALL.txt b/INSTALL.txt
index 15a962df2aa38a7dcf475348843e93e0b821b993..adbbc5ad51fd29939ed951953970b3c828b03013 100644
--- a/INSTALL.txt
+++ b/INSTALL.txt
@@ -1,10 +1,17 @@
 I2P source installation instructions
 
+Prerequisites to build from source:
+	Java SDK (preferably Sun) 1.5.0 or higher (1.6 recommended)
+	Apache Ant 1.7.0 or higher
+	Optional, For multilanguage support: The xgettext, msgfmt, and msgmerge tools installed
+	from the GNU gettext package http://www.gnu.org/software/gettext/
+
 To build and install I2P from source, you must first build
 and package up the appropriate installer by running:
 
   ant pkg
 
+
 This will produce a few key files:
 * install.jar:    the GUI and console installer
 * i2pinstall.exe: the GUI and console installer wrapped for cross-platform execution
@@ -18,9 +25,6 @@ Or run the GUI installer:
 
 Or move the update file into an existing installation directory and restart.
 
-You will need to have ant installed from http://ant.apache.org/
-(1.7.0 or newer)
-
 Supported JVMs:
   Windows: Latest available from http://java.sun.com/ (1.5+ supported)
   Linux:   Latest available from http://java.sun.com/ (1.5+ supported)
diff --git a/README.txt b/README.txt
index 3aa2141bb475542b5c49b3a1586c3eb7560ba7da..c5ddc12bd89a529fe40e30534ee200446f824b73 100644
--- a/README.txt
+++ b/README.txt
@@ -1,11 +1,13 @@
 Prerequisites to build from source:
 	Java SDK (preferably Sun) 1.5.0 or higher (1.6 recommended)
 	Apache Ant 1.7.0 or higher
+	Optional, For multilanguage support: The xgettext, msgfmt, and msgmerge tools installed
+	from the GNU gettext package http://www.gnu.org/software/gettext/
 
 To build:
 	ant pkg
 	Run 'ant' with no arguments to see other build options.
-	See http://www.i2p2.de/download.html for installation instructions.
+	See INSTALL.txt or http://www.i2p2.de/download.html for installation instructions.
 
 Documentation:
 	http://www.i2p2.de/
diff --git a/apps/BOB/build.xml b/apps/BOB/build.xml
index 0d2a66eaa3c4c312324e01a9b329de2104894b88..aa22e12eefde80ba4bc2aa4d6b4bd67047588c05 100644
--- a/apps/BOB/build.xml
+++ b/apps/BOB/build.xml
@@ -71,4 +71,44 @@
     nbproject/build-impl.xml file. 
 
     -->
+    <target depends="jar" description="Build BOB into a SINGLE JAR." name="onejar">
+	<!-- Make needed working dirs -->
+	<mkdir dir="${dist.dir}/lib" />
+	<mkdir dir="${dist.dir}/classes" />
+
+	<!-- Copy jars -->
+	<copy todir="${dist.dir}/lib" flatten="true" >
+	    <path>
+	        <pathelement path="${javac.classpath}" />
+	    </path>
+	</copy>
+	<copy todir="${dist.dir}/lib" file="../../installer/lib/jbigi/jbigi.jar" />
+
+	<!-- Extract the classes inside the jar files -->
+	<unjar dest="${dist.dir}/classes" >
+            <fileset dir="${dist.dir}/lib" >
+                <include name="**/*.jar" />
+            </fileset>
+        </unjar>
+
+        <!-- Recombine the classes into a new jar file -->
+	<jar jarfile="${dist.dir}/lib/all-in-one.jar" >
+	    <fileset dir="${dist.dir}/classes" />
+        </jar>
+
+        <!-- Clean up work area -->        
+        <delete dir="${dist.dir}/classes" followsymlinks="false" includeemptydirs="true"/>
+
+        <!-- Make the single jar file -->
+        <jar jarfile="dist/BOB-one.jar" >
+            <zipfileset src="${dist.jar}" excludes="META-INF/*" />
+            <zipfileset src="${dist.dir}/lib/all-in-one.jar" excludes="**/META-INF/*" />
+            <manifest>
+                <attribute name="Main-Class" value="net.i2p.BOB.Main" />
+            </manifest>
+        </jar>
+
+        <!-- Clean up the fake jar file -->
+        <delete file="${dist.dir}/lib/all-in-one.jar" />
+    </target>
 </project>
diff --git a/apps/BOB/nbproject/private/private.properties b/apps/BOB/nbproject/private/private.properties
index 416ecb6b164c96363ca82d50579393c144f0adfc..9010904cd0f3a82e0d6522a2497923611e4f50cd 100644
--- a/apps/BOB/nbproject/private/private.properties
+++ b/apps/BOB/nbproject/private/private.properties
@@ -3,5 +3,6 @@ do.depend=false
 do.jar=true
 javac.debug=true
 javadoc.preview=true
+jaxbwiz.endorsed.dirs=/usr/local/netbeans-6.8/ide12/modules/ext/jaxb/api
 jaxws.endorsed.dir=/usr/local/netbeans-6.5/java2/modules/ext/jaxws21/api:/usr/local/netbeans-6.5/ide10/modules/ext/jaxb/api
 user.properties.file=/root/.netbeans/6.5/build.properties
diff --git a/apps/BOB/nbproject/private/private.xml b/apps/BOB/nbproject/private/private.xml
index 653e554c3dac0382e31937d8cfa172863c61c78c..c1f155a782bd6f432a8846f3d3b308ba6fa6856c 100644
--- a/apps/BOB/nbproject/private/private.xml
+++ b/apps/BOB/nbproject/private/private.xml
@@ -1,7 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project-private xmlns="http://www.netbeans.org/ns/project-private/1">
     <editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/1"/>
-    <open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/1">
-        <file>file:/usblv/NetBeansProjects/i2p.i2p/apps/BOB/src/net/i2p/BOB/TCPio.java</file>
-    </open-files>
 </project-private>
diff --git a/apps/BOB/nbproject/project.properties b/apps/BOB/nbproject/project.properties
index 9eeffd29f1470219c12f805941a06cf5f7347ad8..44a617388d938c4dcc20be1a687145e676cd960e 100644
--- a/apps/BOB/nbproject/project.properties
+++ b/apps/BOB/nbproject/project.properties
@@ -1,5 +1,6 @@
+application.homepage=http://bob.i2p/
 application.title=BOB
-application.vendor=root
+application.vendor=Sponge
 auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.expand-tabs=false
 auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.indent-shift-width=8
 auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.spaces-per-tab=8
@@ -11,6 +12,7 @@ build.classes.excludes=**/*.java,**/*.form
 # This directory is removed when the project is cleaned:
 build.dir=build
 build.generated.dir=${build.dir}/generated
+build.generated.sources.dir=${build.dir}/generated-sources
 # Only compile against the classpath explicitly listed here:
 build.sysclasspath=ignore
 build.test.classes.dir=${build.dir}/test/classes
@@ -23,6 +25,7 @@ debug.test.classpath=\
 dist.dir=dist
 dist.jar=${dist.dir}/BOB.jar
 dist.javadoc.dir=${dist.dir}/javadoc
+endorsed.classpath=
 excludes=
 file.reference.build-javadoc=../../i2p.i2p/build/javadoc
 file.reference.i2p.jar=../../core/java/build/i2p.jar
@@ -33,7 +36,7 @@ file.reference.router.jar=../../router/java/build/router.jar
 file.reference.streaming.jar=../streaming/java/build/streaming.jar
 file.reference.wrapper.jar=../../installer/lib/wrapper/linux/wrapper.jar
 includes=**
-jar.compress=false
+jar.compress=true
 javac.classpath=\
     ${file.reference.router.jar}:\
     ${file.reference.i2ptunnel.jar}:\
@@ -63,8 +66,9 @@ javadoc.splitindex=true
 javadoc.use=true
 javadoc.version=false
 javadoc.windowtitle=
+jaxbwiz.endorsed.dirs="${netbeans.home}/../ide12/modules/ext/jaxb/api"
 jnlp.codebase.type=local
-jnlp.codebase.url=file:/root/NetBeansProjects/i2p.i2p/apps/BOB/dist/
+jnlp.codebase.url=file:/usblv/NetBeansProjects/i2p.i2p/apps/BOB/dist
 jnlp.descriptor=application
 jnlp.enabled=false
 jnlp.offline-allowed=false
diff --git a/apps/BOB/src/net/i2p/BOB/COPYING b/apps/BOB/src/net/i2p/BOB/license-WTFPL.txt
similarity index 100%
rename from apps/BOB/src/net/i2p/BOB/COPYING
rename to apps/BOB/src/net/i2p/BOB/license-WTFPL.txt
diff --git a/apps/i2psnark/java/bundle-messages.sh b/apps/i2psnark/java/bundle-messages.sh
index ad8c0ab84e7553cca2856468da78fbeaa3ede802..01aa5b1c7446f84fe3f2f7d7758c3b6e133fa1ce 100755
--- a/apps/i2psnark/java/bundle-messages.sh
+++ b/apps/i2psnark/java/bundle-messages.sh
@@ -73,7 +73,7 @@ do
 	echo "Generating ${CLASS}_$LG ResourceBundle..."
 
 	# convert to class files in build/obj
-	msgfmt --java -r $CLASS -l $LG -d build/obj $i
+	msgfmt --java --statistics -r $CLASS -l $LG -d build/obj $i
 	if [ $? -ne 0 ]
 	then
 		echo 'Warning - msgfmt failed, not updating translations'
diff --git a/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java b/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java
index 46952d14a79d8b0a3c703913bef41d27bb53d6dc..b9c6ec25227f950a233669def75b05f19eccbdca 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java
@@ -370,8 +370,13 @@ public class TrackerClient extends I2PAppThread
   }
 
   /**
-   * Very lazy byte[] to URL encoder.  Just encodes everything, even
-   * "normal" chars.
+   * Very lazy byte[] to URL encoder.  Just encodes almost everything, even
+   * some "normal" chars.
+   * By not encoding about 1/4 of the chars, we make random data like hashes about 16% smaller.
+   *
+   * RFC1738: 0-9a-zA-Z$-_.+!*'(),
+   * Us:      0-9a-zA-Z
+   *
    */
   public static String urlencode(byte[] bs)
   {
@@ -379,10 +384,16 @@ public class TrackerClient extends I2PAppThread
     for (int i = 0; i < bs.length; i++)
       {
         int c = bs[i] & 0xFF;
-        sb.append('%');
-        if (c < 16)
-          sb.append('0');
-        sb.append(Integer.toHexString(c));
+        if ((c >= '0' && c <= '9') ||
+            (c >= 'A' && c <= 'Z') ||
+            (c >= 'a' && c <= 'z')) {
+            sb.append((char)c);
+        } else {
+            sb.append('%');
+            if (c < 16)
+              sb.append('0');
+            sb.append(Integer.toHexString(c));
+        }
       }
          
     return sb.toString();
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 305a9eb0629540c87d7973a5a2b8d991b0f18faf..2fbf10462e17ead696f1c168397d6fbce144a8f6 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
@@ -185,7 +185,7 @@ public class I2PSnarkServlet extends HttpServlet {
             out.write("<tfoot><tr>\n" +
                       "    <th align=\"left\" colspan=\"2\">");
             out.write(_("Totals"));
-            out.write(" {");
+            out.write(" (");
             out.write(_("{0} torrents", snarks.size()));
             out.write(", ");
             out.write(DataHelper.formatSize(stats[5]) + "B, ");
@@ -216,7 +216,7 @@ public class I2PSnarkServlet extends HttpServlet {
         String action = req.getParameter("action");
         if (action == null) {
             // noop
-        } else if (_("Add torrent").equals(action)) {
+        } else if ("Add".equals(action)) {
             String newFile = req.getParameter("newFile");
             String newURL = req.getParameter("newURL");
             // NOTE - newFile currently disabled in HTML form - see below
@@ -260,7 +260,7 @@ public class I2PSnarkServlet extends HttpServlet {
             } else {
                 // no file or URL specified
             }
-        } else if (_("Stop").equals(action)) {
+        } else if ("Stop".equals(action)) {
             String torrent = req.getParameter("torrent");
             if (torrent != null) {
                 byte infoHash[] = Base64.decode(torrent);
@@ -275,7 +275,7 @@ public class I2PSnarkServlet extends HttpServlet {
                     }
                 }
             }
-        } else if (_("Start").equals(action)) {
+        } else if ("Start".equals(action)) {
             String torrent = req.getParameter("torrent");
             if (torrent != null) {
                 byte infoHash[] = Base64.decode(torrent);
@@ -357,7 +357,7 @@ public class I2PSnarkServlet extends HttpServlet {
                     }
                 }
             }
-        } else if (_("Save configuration").equals(action)) {
+        } else if ("Save".equals(action)) {
             String dataDir = req.getParameter("dataDir");
             boolean autoStart = req.getParameter("autoStart") != null;
             String seedPct = req.getParameter("seedPct");
@@ -371,7 +371,7 @@ public class I2PSnarkServlet extends HttpServlet {
             boolean useOpenTrackers = req.getParameter("useOpenTrackers") != null;
             String openTrackers = req.getParameter("openTrackers");
             _manager.updateConfig(dataDir, autoStart, seedPct, eepHost, eepPort, i2cpHost, i2cpPort, i2cpOpts, upLimit, upBW, useOpenTrackers, openTrackers);
-        } else if (_("Create torrent").equals(action)) {
+        } else if ("Create".equals(action)) {
             String baseData = req.getParameter("baseFile");
             if (baseData != null && baseData.trim().length() > 0) {
                 File baseFile = new File(_manager.getDataDir(), baseData);
@@ -518,7 +518,7 @@ public class I2PSnarkServlet extends HttpServlet {
                                curPeers + '/' + knownPeers +
                                " <a href=\"" + uri + "?p=" + Base64.encode(snark.meta.getInfoHash()) + "\">" + _("peers") + "</a>)";
             else if (isRunning)
-                statusString = _("Seeding") + " (" + curPeers + "/" + knownPeers + ' ' + ("peers") + ')';
+                statusString = _("Seeding") + " (" + curPeers + "/" + knownPeers + ' ' + _("peers") + ')';
             else
                 statusString = _("Complete");
         } else {
@@ -695,9 +695,9 @@ public class I2PSnarkServlet extends HttpServlet {
                     } else {
                         out.write("<font color=#a00000><a title=\"");
                         if (!peer.isInteresting())
-                            out.write(_("Uninteresting"));
+                            out.write(_("Uninteresting (The peer has no pieces we need)"));
                         else
-                            out.write(_("Choked"));
+                            out.write(_("Choked (The peer is not allowing us to request pieces)"));
                         out.write("\">");
                         out.write(formatSize(peer.getDownloadRate()) + "ps</a></font>");
                     }
@@ -711,9 +711,9 @@ public class I2PSnarkServlet extends HttpServlet {
                     } else {
                         out.write("<font color=#a00000><a title=\"");
                         if (!peer.isInterested())
-                            out.write(_("Uninterested"));
+                            out.write(_("Uninterested (We have no pieces the peer needs)"));
                         else
-                            out.write(_("Choking"));
+                            out.write(_("Choking (We are not allowing the peer to request pieces)"));
                         out.write("\">");
                         out.write(formatSize(peer.getUploadRate()) + "ps</a></font>");
                     }
@@ -738,6 +738,7 @@ public class I2PSnarkServlet extends HttpServlet {
         // *not* enctype="multipart/form-data", so that the input type=file sends the filename, not the file
         out.write("<form action=\"" + uri + "\" method=\"POST\">\n");
         out.write("<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" >\n");
+        out.write("<input type=\"hidden\" name=\"action\" value=\"Add\" >\n");
         out.write("<div class=\"addtorrentsection\"><span class=\"snarkConfigTitle\">");
         out.write(_("Add Torrent"));
         out.write("</span><br>\n<table border=\"0\"><tr><td>");
@@ -747,7 +748,7 @@ public class I2PSnarkServlet extends HttpServlet {
         //out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br>\n");
         out.write("<tr><td>&nbsp;<td><input type=\"submit\" value=\"");
         out.write(_("Add torrent"));
-        out.write("\" name=\"action\" ><br>\n");
+        out.write("\" name=\"foo\" ><br>\n");
         out.write("<tr><td>&nbsp;<td><span class=\"snarkAddInfo\">");
         out.write(_("Alternately, you can copy .torrent files to the directory {0}.", _manager.getDataDir().getAbsolutePath()));
         out.write("\n");
@@ -766,6 +767,7 @@ public class I2PSnarkServlet extends HttpServlet {
         // *not* enctype="multipart/form-data", so that the input type=file sends the filename, not the file
         out.write("<form action=\"" + uri + "\" method=\"POST\">\n");
         out.write("<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" >\n");
+        out.write("<input type=\"hidden\" name=\"action\" value=\"Create\" >\n");
         out.write("<span class=\"snarkConfigTitle\">");
         out.write(_("Create Torrent"));
         out.write("</span><br>\n<table border=\"0\"><tr><td>");
@@ -798,7 +800,7 @@ public class I2PSnarkServlet extends HttpServlet {
         out.write("\" > ");
         out.write("<tr><td>&nbsp;<td><input type=\"submit\" value=\"");
         out.write(_("Create torrent"));
-        out.write("\" name=\"action\" ></table>\n");
+        out.write("\" name=\"foo\" ></table>\n");
         out.write("</form>\n</span></div>");        
     }
     
@@ -813,6 +815,7 @@ public class I2PSnarkServlet extends HttpServlet {
         out.write("<form action=\"" + uri + "\" method=\"POST\">\n");
         out.write("<div class=\"configsection\"><span class=\"snarkConfig\">\n");
         out.write("<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" >\n");
+        out.write("<input type=\"hidden\" name=\"action\" value=\"Save\" >\n");
         out.write("<span class=\"snarkConfigTitle\">");
         out.write(_("Configuration"));
         out.write("</span><br>\n");
@@ -912,7 +915,7 @@ public class I2PSnarkServlet extends HttpServlet {
 
         out.write("<tr><td>&nbsp;<td><input type=\"submit\" value=\"");
         out.write(_("Save configuration"));
-        out.write("\" name=\"action\" >\n");
+        out.write("\" name=\"foo\" >\n");
         out.write("</table></span>\n");
         out.write("</form></div>");
     }
@@ -970,6 +973,7 @@ private static class FetchAndAdd implements Runnable {
                     in = new FileInputStream(file);
                     MetaInfo info = new MetaInfo(in);
                     String name = info.getName();
+                    name = DataHelper.stripHTML(name);  // XSS
                     name = name.replace('/', '_');
                     name = name.replace('\\', '_');
                     name = name.replace('&', '+');
diff --git a/apps/i2psnark/locale/messages_ru.po b/apps/i2psnark/locale/messages_ru.po
new file mode 100644
index 0000000000000000000000000000000000000000..3e7ab41b1157dd9acfdeaf515fbec5a1a4b053a9
--- /dev/null
+++ b/apps/i2psnark/locale/messages_ru.po
@@ -0,0 +1,648 @@
+# 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
+# foo <foo@bar>, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: I2P i2psnark\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-12-14 03:19+0000\n"
+"PO-Revision-Date: 2009-12-20 07:03+0000\n"
+"Last-Translator: 4get <forget@mail.i2p>\n"
+"Language-Team: foo <foo@bar>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Russian\n"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:84
+#, java-format
+msgid "Adding torrents in {0} minutes"
+msgstr "Торренты будут подгружены через {0} минут(ы)"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:241
+#, java-format
+msgid "Total uploaders limit changed to {0}"
+msgstr "Новое значение лимита количества слотов отдачи: {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:243
+#, java-format
+msgid "Minimum total uploaders limit is {0}"
+msgstr "Минимально допустимое значение для количества слотов: {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:255
+#, java-format
+msgid "Up BW limit changed to {0}KBps"
+msgstr "Новое значение лимита скорости отдачи: {0} KBps"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:257
+#, java-format
+msgid "Minimum up bandwidth limit is {0}KBps"
+msgstr "Минимально допустимое значение для лимита скорости отдачи: {0} KBps"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:301
+msgid "Cannot change the I2CP settings while torrents are active"
+msgstr "Невозможно изменить настройки I2CP пока есть активные торренты"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:307
+msgid "Disconnecting old I2CP destination"
+msgstr "Рассоединяемся по старому адресу I2CP"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:311
+#, java-format
+msgid "I2CP settings changed to {0}"
+msgstr "Новые параметры I2CP: {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:315
+msgid "Unable to connect with the new settings, reverting to the old I2CP settings"
+msgstr "Не удалось соединиться с использованием новых настроек I2CP, возвращаемся к старым настройкам"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:319
+msgid "Unable to reconnect with the old settings!"
+msgstr "Не удалось пересоединиться с использованием старых настроек I2CP!"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:321
+msgid "Reconnected on the new I2CP destination"
+msgstr "Пересоединились по новому адресу I2CP"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:332
+#, java-format
+msgid "I2CP listener restarted for \"{0}\""
+msgstr "I2CP-приёмник перезапущен для \"{0}\""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:343
+msgid "Enabled autostart"
+msgstr "Автостарт включен"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:345
+msgid "Disabled autostart"
+msgstr "Автостарт выключен"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:351
+msgid "Enabled open trackers - torrent restart required to take effect."
+msgstr "Включено использование открытых трекеров. Требуется перезапуск торрента, чтобы изменения вступили в силу."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:353
+msgid "Disabled open trackers - torrent restart required to take effect."
+msgstr "Отключено использование открытых трекеров. Требуется перезапуск торрента, чтобы изменения вступили в силу."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:360
+msgid "Open Tracker list changed - torrent restart required to take effect."
+msgstr "Изменен список открытых трекеров. Требуется перезапуск торрента, чтобы изменения вступили в силу."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:367
+msgid "Configuration unchanged."
+msgstr "Настройки не изменились."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:377
+#, java-format
+msgid "Unable to save the config to {0}"
+msgstr "Не удалось сохранить настройки в {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:395
+msgid "Connecting to I2P"
+msgstr "Устанавливается соединение с I2P"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:398
+msgid "Error connecting to I2P - check your I2CP settings!"
+msgstr "Ошибка соединения с I2P, проверьте настройки I2CP!"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:407
+#, java-format
+msgid "Error: Could not add the torrent {0}"
+msgstr "Ошибка: Не удалось добавить торрент {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:446
+#, java-format
+msgid "Torrent in \"{0}\" is invalid"
+msgstr "Торрент в \"{0}\" некорректен"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:461
+#, java-format
+msgid "Torrent added and started: \"{0}\""
+msgstr "Торрент добавлен и запущен: \"{0}\""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:463
+#, java-format
+msgid "Torrent added: \"{0}\""
+msgstr "Торрент добавлен: \"{0}\""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:559
+#, java-format
+msgid "Non-i2p tracker in \"{0}\", deleting it from our list of trackers!"
+msgstr "Обнаружен не-I2P трекер в торренте \"{0}\", удаляем его из нашего списка трекеров!"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:562
+#, java-format
+msgid "Too many files in \"{0}\" ({1}), deleting it!"
+msgstr "Слишком много файлов в торренте \"{0}\" ({1}), удаляем его!"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:564
+#, java-format
+msgid "Torrent file \"{0}\" cannot end in '.torrent', deleting it!"
+msgstr "Торрент \"{0}\" содержит единственный файл заканчивающийся на '.torrent', удаляем его!"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:566
+#, java-format
+msgid "No pieces in \"{0}\",  deleting it!"
+msgstr "В торренте \"{0}\" не оказалось ни одной части, удаляем его!"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:568
+#, java-format
+msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!"
+msgstr "Слишком много частей в торренте \"{0}\" (наш предел {1}), удаляем его!"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:570
+#, java-format
+msgid "Pieces are too large in \"{0}\" ({1}B), deleting it."
+msgstr "Слишком крупные части в торренте \"{0}\" ({1}B), удаляем его."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:571
+#, java-format
+msgid "Limit is {0}B"
+msgstr "Наш предел {0}B"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:579
+#, java-format
+msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\""
+msgstr "Торренты крупнее чем {0}B пока не поддерживается, удаляем \"{1}\""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:595
+#, java-format
+msgid "Error: Could not remove the torrent {0}"
+msgstr "Ошибка: Невозможно удалить торрент {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:616
+#, java-format
+msgid "Torrent stopped: \"{0}\""
+msgstr "Торрент остановлен: \"{0}\""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:631
+#, java-format
+msgid "Torrent removed: \"{0}\""
+msgstr "Торрент удален: \"{0}\""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:664
+#, java-format
+msgid "Download finished: \"{0}\""
+msgstr "Завершена загрузка: \"{0}\""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:664
+#, java-format
+msgid "size: {0}B"
+msgstr "размер: {0}B"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:692
+msgid "Unable to connect to I2P!"
+msgstr "Не удалось установить соединение с I2P!"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:86
+msgid "I2PSnark - Anonymous BitTorrent Client"
+msgstr "I2PSnark — Анонимный  BitTorrent Клиент"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:95
+msgid "Refresh page"
+msgstr "Обновить страницу"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:97
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:656
+msgid "I2PSnark"
+msgstr "I2PSnark"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:99
+msgid "Forum"
+msgstr "Форум"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:125
+msgid "Status"
+msgstr "Статус"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:131
+msgid "Hide Peers"
+msgstr "спрятать список пиров"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:134
+msgid "Show Peers"
+msgstr "показать список пиров"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:139
+msgid "Torrent"
+msgstr "Торрент"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:141
+msgid "ETA"
+msgstr "Осталось"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:143
+msgid "Downloaded"
+msgstr "Получено"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:145
+msgid "Uploaded"
+msgstr "Отдано"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:147
+msgid "Down Rate"
+msgstr "Скорость загрузки"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:149
+msgid "Up Rate"
+msgstr "Скорость отдачи"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:156
+msgid "Stop all torrents and the I2P tunnel"
+msgstr "Остановить все торренты и закрыть соединение с I2P"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:158
+msgid "Stop All"
+msgstr "Остановить все"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:163
+msgid "Start all torrents and the I2P tunnel"
+msgstr "Запустить все торренты и открыть соединение с I2P"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:165
+msgid "Start All"
+msgstr "Запустить все"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:182
+msgid "No torrents loaded."
+msgstr "Нет загруженных торрентов."
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:187
+msgid "Totals"
+msgstr "Всего"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:189
+#, java-format
+msgid "{0} torrents"
+msgstr "{0} торрентов"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:192
+#, java-format
+msgid "{0} connected peers"
+msgstr "{0} подсоединенных пиров"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:227
+#, java-format
+msgid "Torrent file {0} does not exist"
+msgstr "Торрент {0} не существует"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:237
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:986
+#, java-format
+msgid "Torrent already running: {0}"
+msgstr "Торрент уже запущен: {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:239
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:988
+#, java-format
+msgid "Torrent already in the queue: {0}"
+msgstr "Торрент уже в очереди: {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:243
+#, java-format
+msgid "Copying torrent to {0}"
+msgstr "Копируем торрент в: {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:246
+#, java-format
+msgid "Unable to copy the torrent to {0}"
+msgstr "Не удалось скопировать торрент в: {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:246
+#, java-format
+msgid "from {0}"
+msgstr "из: {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:254
+#, java-format
+msgid "Fetching {0}"
+msgstr "Получение торрента: {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:258
+msgid "Invalid URL - must start with http://"
+msgstr "Некорректный URL, должен начинаться с http://"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:288
+#, java-format
+msgid "Starting up torrent {0}"
+msgstr "Запускаем торрент: {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:308
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326
+#, java-format
+msgid "Torrent file deleted: {0}"
+msgstr "Удален торрент: {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:332
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:342
+#, java-format
+msgid "Data file deleted: {0}"
+msgstr "Файл удален: {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:334
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:344
+#, java-format
+msgid "Data file could not be deleted: {0}"
+msgstr "Не удалось удалить файл: {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:353
+#, java-format
+msgid "Data dir deleted: {0}"
+msgstr "Директория удалена: {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:384
+msgid "Error creating torrent - you must select a tracker"
+msgstr "Торрент не создан — вы должны указать трекер"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:399
+#, java-format
+msgid "Torrent created for \"{0}\""
+msgstr "Создан торрент для \"{0}\""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:402
+#, 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:404
+#, java-format
+msgid "Error creating a torrent for \"{0}\""
+msgstr "Ошибка при создании торрента для: \"{0}\""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:407
+#, java-format
+msgid "Cannot create a torrent for the nonexistent data: {0}"
+msgstr "Невозможно создать торрент для несуществующего файла или директории: {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:410
+msgid "Error creating torrent - you must enter a file or directory"
+msgstr "Торрент не создан — вы должны указать файл или директорию"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:413
+msgid "Stopping all torrents and closing the I2P tunnel."
+msgstr "Останавливаем все торренты и закрываем соединение с I2P"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:422
+msgid "I2P tunnel closed."
+msgstr "Соединение с I2P закрыто."
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:425
+msgid "Opening the I2P tunnel and starting all torrents."
+msgstr "Соединяемся с I2P и запускаем все торренты."
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:502
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:670
+msgid "Unknown"
+msgstr "Неизвестный"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:505
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:509
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513
+msgid "TrackerErr"
+msgstr "ОшибкаТрекера"
+
+# TODO should replace "uploader limit NN peers" with "global number of upload slots: NN"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:507
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:509
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:519
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:521
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:528
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:530
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:534
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:859
+msgid "peers"
+msgstr "пир."
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:517
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:521
+msgid "Seeding"
+msgstr "Раздается"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:523
+msgid "Complete"
+msgstr "Завершен"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:526
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:530
+msgid "OK"
+msgstr "Загружается"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:532
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536
+msgid "Stalled"
+msgstr "Простаивает"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:538
+msgid "No Peers"
+msgstr "Нет Пиров"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:540
+msgid "Stopped"
+msgstr "Остановлен"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:553
+msgid "View files"
+msgstr "Открыть директорию"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:555
+msgid "Open file"
+msgstr "Открыть файл"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:579
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:779
+msgid "Tracker"
+msgstr "Трекер"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:580
+msgid "Details"
+msgstr "Подробнее"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:614
+msgid "Stop the torrent"
+msgstr "Остановить торрент"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:616
+msgid "Stop"
+msgstr "Остановить"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:622
+msgid "Start the torrent"
+msgstr "Запустить торрент"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:624
+msgid "Start"
+msgstr "Запустить"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:629
+msgid "Remove the torrent from the active list, deleting the .torrent file"
+msgstr "Удалить торрент из списка и с диска"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:631
+msgid "Remove"
+msgstr "Удалить"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:635
+msgid "Delete the .torrent file and the associated data file(s)"
+msgstr "Удалить торрент и стереть загруженные файлы"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:637
+msgid "Delete"
+msgstr "Стереть"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680
+msgid "Seed"
+msgstr "Сид"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:698
+msgid "Uninteresting (The peer has no pieces we need)"
+msgstr "Uninteresting (У пира нет нужных нам частей торрента)"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:700
+msgid "Choked (The peer is not allowing us to request pieces)"
+msgstr "Choked (Этот пир не позволяет нам запрашивать части торрента)"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:714
+msgid "Uninterested (We have no pieces the peer needs)"
+msgstr "Uninterested (У нас нужных этому пиру частей торрента)"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:716
+msgid "Choking (We are not allowing the peer to request pieces)"
+msgstr "Choking (Мы не позволяем этому пиру запрашивать у нас части торрента)"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:742
+msgid "Add Torrent"
+msgstr "Добавить Торрент"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:744
+msgid "From URL"
+msgstr "Из URL"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:749
+msgid "Add torrent"
+msgstr "Добавить торрент"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:752
+#, java-format
+msgid "Alternately, you can copy .torrent files to the directory {0}."
+msgstr "Ну или вы можете скопировать .torrent-файлы в директорию {0}."
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:754
+msgid "Removing a .torrent file will cause the torrent to stop."
+msgstr "Удаление .torrent-файла приведет к остановке торрента."
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:770
+msgid "Create Torrent"
+msgstr "Создать Торрент"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:773
+msgid "Data to seed"
+msgstr "Файлы для раздачи"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:777
+msgid "File or directory to seed (must be within the specified path)"
+msgstr "Файл или директория для раздачи (вводите только название файла или директории, указание абсолютных путей не поддерживается)"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:781
+msgid "Select a tracker"
+msgstr "Выбрать трекер"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:794
+msgid "or"
+msgstr "или"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:797
+msgid "Specify custom tracker announce URL"
+msgstr "Задать URL анонсера вручную"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:800
+msgid "Create torrent"
+msgstr "Создать торрент"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:817
+msgid "Configuration"
+msgstr "Настройки"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:820
+msgid "Data directory"
+msgstr "Директория для файлов"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:823
+msgid "Directory to store torrents and data"
+msgstr "Директория, где будут храниться торренты и загружаемые файлы"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825
+msgid "Edit i2psnark.config and restart to change"
+msgstr "Для изменения отредактируйте файл i2psnark.config и перезагрузите I2PSnark"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:829
+msgid "Auto start"
+msgstr "Автозапуск"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:833
+msgid "If checked, automatically start torrents that are added"
+msgstr "Автоматически запускать торренты после добавления"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:856
+msgid "Total uploader limit"
+msgstr "Ограничение количества слотов отдачи"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:863
+msgid "Up bandwidth limit"
+msgstr "Ограничение скорости отдачи"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:866
+msgid "Half available bandwidth recommended."
+msgstr "Рекомендуется использовать половину от доступной пропускной способности."
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868
+msgid "View or change router bandwidth"
+msgstr "Посмотреть/настроить ограничения скорости в маршрутизаторе I2P"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:872
+msgid "Use open trackers also"
+msgstr "Дополнительно использовать открытые трекеры"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876
+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:880
+msgid "Open tracker announce URLs"
+msgstr "URL открытых трекеров"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:891
+msgid "I2CP host"
+msgstr "Адрес I2CP"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:896
+msgid "I2CP port"
+msgstr "Порт I2CP"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:909
+msgid "I2CP options"
+msgstr "Параметры I2CP"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:914
+msgid "Save configuration"
+msgstr "Сохранить настройки"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:967
+#, java-format
+msgid "Torrent fetched from {0}"
+msgstr "Получен торрент из: {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:994
+#, java-format
+msgid "Torrent at {0} was not valid"
+msgstr "Торрент полученный из {0} некорректен"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:999
+#, java-format
+msgid "Torrent was not retrieved from {0}"
+msgstr "Не удалось получить торрент из: {0}"
+
diff --git a/apps/i2psnark/locale/messages_zh.po b/apps/i2psnark/locale/messages_zh.po
new file mode 100644
index 0000000000000000000000000000000000000000..54759f568585b7ca5e08c691fc423a55970f6800
--- /dev/null
+++ b/apps/i2psnark/locale/messages_zh.po
@@ -0,0 +1,652 @@
+# 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
+# foo <foo@bar>, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: I2P i2psnark\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-12-18 06:45+0000\n"
+"PO-Revision-Date: 2009-12-27 10:47+0800\n"
+"Last-Translator: walking <zhazhenzhong@gmail.com>\n"
+"Language-Team: foo <foo@bar>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Chinese\n"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:84
+#, java-format
+msgid "Adding torrents in {0} minutes"
+msgstr "{0}分钟内完成添加"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:241
+#, java-format
+msgid "Total uploaders limit changed to {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:243
+#, java-format
+msgid "Minimum total uploaders limit is {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:255
+#, java-format
+msgid "Up BW limit changed to {0}KBps"
+msgstr "上传带宽限制改为 {0} KBps"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:257
+#, java-format
+msgid "Minimum up bandwidth limit is {0}KBps"
+msgstr "最小上传带宽限制为 {0} KBps"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:301
+msgid "Cannot change the I2CP settings while torrents are active"
+msgstr "正在下载/上传,无法更改I2CP设置"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:307
+msgid "Disconnecting old I2CP destination"
+msgstr "正在断开旧的I2CP目标"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:311
+#, java-format
+msgid "I2CP settings changed to {0}"
+msgstr "I2CP设置改为{0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:315
+msgid "Unable to connect with the new settings, reverting to the old I2CP settings"
+msgstr "无法通过新设置连接,恢复I2CP的旧设置"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:319
+msgid "Unable to reconnect with the old settings!"
+msgstr "旧设置也无法连接!"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:321
+msgid "Reconnected on the new I2CP destination"
+msgstr "重新连接新I2CP目标"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:332
+#, java-format
+msgid "I2CP listener restarted for \"{0}\""
+msgstr "\"{0}\"的I2CP监听端口已启动"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:343
+msgid "Enabled autostart"
+msgstr "启用自动启动"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:345
+msgid "Disabled autostart"
+msgstr "禁用自动启动"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:351
+msgid "Enabled open trackers - torrent restart required to take effect."
+msgstr "启用OpenTracker-重新启动种子后生效"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:353
+msgid "Disabled open trackers - torrent restart required to take effect."
+msgstr "禁用OpenTracker - 重新启动种子后生效"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:360
+msgid "Open Tracker list changed - torrent restart required to take effect."
+msgstr "OpenTracker列表已改变 - 重新启动种子后生效"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:367
+msgid "Configuration unchanged."
+msgstr "设置未改变"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:377
+#, java-format
+msgid "Unable to save the config to {0}"
+msgstr "无法保存设置到{0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:395
+msgid "Connecting to I2P"
+msgstr "正在连接到I2P"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:398
+msgid "Error connecting to I2P - check your I2CP settings!"
+msgstr "连接I2P时发生错误 - 请检查I2CP设置!"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:407
+#, java-format
+msgid "Error: Could not add the torrent {0}"
+msgstr "错误:无法添加种子{0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:446
+#, java-format
+msgid "Torrent in \"{0}\" is invalid"
+msgstr "无效种子 \"{0}\" "
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:461
+#, java-format
+msgid "Torrent added and started: \"{0}\""
+msgstr "已添加并启动种子:\"{0}\""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:463
+#, java-format
+msgid "Torrent added: \"{0}\""
+msgstr "已添加种子:\"{0}\""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:559
+#, java-format
+msgid "Non-i2p tracker in \"{0}\", deleting it from our list of trackers!"
+msgstr "【匿名性警告】\"{0}\" 中含有非I2P Tracker,程序将从Tracker列表中将其删除。"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:562
+#, java-format
+msgid "Too many files in \"{0}\" ({1}), deleting it!"
+msgstr "\"{0}\" ({1}) 含有太多文件,删除之!"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:564
+#, java-format
+msgid "Torrent file \"{0}\" cannot end in '.torrent', deleting it!"
+msgstr "种子文件 \"{0}\" 不以 \".torrent\"结尾,删除之!"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:566
+#, java-format
+msgid "No pieces in \"{0}\",  deleting it!"
+msgstr "\"{0}\" 中没有数据片,删除之!"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:568
+#, java-format
+msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!"
+msgstr "\"{0}\" 中文件分片太多,限额为{1},删除之!"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:570
+#, java-format
+msgid "Pieces are too large in \"{0}\" ({1}B), deleting it."
+msgstr "\"{0}\" ({1}B) 中文件分片过大,删除之。"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:571
+#, java-format
+msgid "Limit is {0}B"
+msgstr "限额为 {0}B"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:579
+#, java-format
+msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\""
+msgstr "目前不支持大于{0}B 的种子,正在删除\"{1}\""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:595
+#, java-format
+msgid "Error: Could not remove the torrent {0}"
+msgstr "错误:无法删除种子{0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:616
+#, java-format
+msgid "Torrent stopped: \"{0}\""
+msgstr "种子已停止:\"{0}\""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:631
+#, java-format
+msgid "Torrent removed: \"{0}\""
+msgstr "种子已删除:\"{0}\""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:664
+#, java-format
+msgid "Download finished: \"{0}\""
+msgstr "下载已完成:\"{0}\""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:664
+#, java-format
+msgid "size: {0}B"
+msgstr "大小:{0}B"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:692
+msgid "Unable to connect to I2P!"
+msgstr "无法连接至I2P!"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:86
+msgid "I2PSnark - Anonymous BitTorrent Client"
+msgstr "I2PSnark - 匿名BitTorrent客户端"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:95
+msgid "Refresh page"
+msgstr "刷新页面"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:97
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:656
+msgid "I2PSnark"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:99
+msgid "Forum"
+msgstr "论坛"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:125
+msgid "Status"
+msgstr "状态"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:131
+msgid "Hide Peers"
+msgstr "隐藏用户"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:134
+msgid "Show Peers"
+msgstr "显示用户"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:139
+msgid "Torrent"
+msgstr "种子"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:141
+msgid "ETA"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:143
+msgid "Downloaded"
+msgstr "已下载"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:145
+msgid "Uploaded"
+msgstr "已上传"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:147
+msgid "Down Rate"
+msgstr "下载速度"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:149
+msgid "Up Rate"
+msgstr "上传速度"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:156
+msgid "Stop all torrents and the I2P tunnel"
+msgstr "停止全部种子及I2P隧道"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:158
+msgid "Stop All"
+msgstr "停止全部"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:163
+msgid "Start all torrents and the I2P tunnel"
+msgstr "启动全部种子及I2P隧道"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:165
+msgid "Start All"
+msgstr "启动全部"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:182
+msgid "No torrents loaded."
+msgstr "未载入任何种子"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:187
+msgid "Totals"
+msgstr "总计"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:189
+#, java-format
+msgid "{0} torrents"
+msgstr "{0} 个种子"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:192
+#, java-format
+msgid "{0} connected peers"
+msgstr "{0} 已连接用户"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:227
+#, java-format
+msgid "Torrent file {0} does not exist"
+msgstr "种子文件{0}不存在"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:237
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:990
+#, java-format
+msgid "Torrent already running: {0}"
+msgstr "种子已启动:{0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:239
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:992
+#, java-format
+msgid "Torrent already in the queue: {0}"
+msgstr "种子排队中:{0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:243
+#, java-format
+msgid "Copying torrent to {0}"
+msgstr "正在复制种子到{0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:246
+#, java-format
+msgid "Unable to copy the torrent to {0}"
+msgstr "无法复制种子文件到{0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:246
+#, java-format
+msgid "from {0}"
+msgstr "来源{0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:254
+#, java-format
+msgid "Fetching {0}"
+msgstr "正在获取{0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:258
+msgid "Invalid URL - must start with http://"
+msgstr "无效链接 - 必须以http:// 开头"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:288
+#, java-format
+msgid "Starting up torrent {0}"
+msgstr "正在启动种子{0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:308
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326
+#, java-format
+msgid "Torrent file deleted: {0}"
+msgstr "种子文件已删除:{0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:332
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:342
+#, java-format
+msgid "Data file deleted: {0}"
+msgstr "数据文件已删除:{0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:334
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:344
+#, java-format
+msgid "Data file could not be deleted: {0}"
+msgstr "无法删除数据文件:{0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:353
+#, java-format
+msgid "Data dir deleted: {0}"
+msgstr "数据文件夹已删除:{0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:384
+msgid "Error creating torrent - you must select a tracker"
+msgstr "创建种子时发生错误 - 您必须选择一个Tracker"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:399
+#, java-format
+msgid "Torrent created for \"{0}\""
+msgstr "种子创建成功\"{0}\""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:402
+#, java-format
+msgid "Many I2P trackers require you to register new torrents before seeding - please do so before starting \"{0}\""
+msgstr "多数I2PTracker需要用户在做种前注册新种子 - 请在启动 \"{0}\"前到所使用的Tracker进行注册。"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:404
+#, java-format
+msgid "Error creating a torrent for \"{0}\""
+msgstr "创建种子时发生错误 \"{0}\""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:407
+#, java-format
+msgid "Cannot create a torrent for the nonexistent data: {0}"
+msgstr "无法为不存在的数据文件创建种子:{0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:410
+msgid "Error creating torrent - you must enter a file or directory"
+msgstr "创建种子时发生错误 - 必须指定文件或文件夹"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:413
+msgid "Stopping all torrents and closing the I2P tunnel."
+msgstr "正在停用所有种子并关闭I2P隧道。"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:422
+msgid "I2P tunnel closed."
+msgstr "I2P隧道已关闭"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:425
+msgid "Opening the I2P tunnel and starting all torrents."
+msgstr "正在打开I2P隧道并启动所有种子"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:502
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:670
+msgid "Unknown"
+msgstr "未知"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:505
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:509
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513
+msgid "TrackerErr"
+msgstr "Tracker错误"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:507
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:509
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:519
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:521
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:528
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:530
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:534
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862
+msgid "peers"
+msgstr "用户"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:517
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:521
+msgid "Seeding"
+msgstr "正做种"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:523
+msgid "Complete"
+msgstr "完成"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:526
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:530
+msgid "OK"
+msgstr "确定"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:532
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536
+msgid "Stalled"
+msgstr "等待"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:538
+msgid "No Peers"
+msgstr "没有用户"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:540
+msgid "Stopped"
+msgstr "已停用"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:553
+msgid "View files"
+msgstr "浏览文件"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:555
+msgid "Open file"
+msgstr "打开文件"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:579
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:781
+msgid "Tracker"
+msgstr "Tracker服务器"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:580
+msgid "Details"
+msgstr "详情"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:614
+msgid "Stop the torrent"
+msgstr "停止种子"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:616
+msgid "Stop"
+msgstr "停止"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:622
+msgid "Start the torrent"
+msgstr "启动种子"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:624
+msgid "Start"
+msgstr "启动"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:629
+msgid "Remove the torrent from the active list, deleting the .torrent file"
+msgstr "取消下载任务并删除对应种子文件。"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:631
+msgid "Remove"
+msgstr "移除"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:635
+msgid "Delete the .torrent file and the associated data file(s)"
+msgstr "删除种子及所下载的文件"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:637
+msgid "Delete"
+msgstr "删除"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680
+msgid "Seed"
+msgstr "种子"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:698
+msgid "Uninteresting (The peer has no pieces we need)"
+msgstr "无需要部分"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:700
+msgid "Choked (The peer is not allowing us to request pieces)"
+msgstr "拒绝请求"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:714
+msgid "Uninterested (We have no pieces the peer needs)"
+msgstr "无需要部分"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:716
+msgid "Choking (We are not allowing the peer to request pieces)"
+msgstr "拒绝请求"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:743
+msgid "Add Torrent"
+msgstr "添加种子"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:745
+msgid "From URL"
+msgstr "从URL"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:750
+msgid "Add torrent"
+msgstr "添加种子"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:753
+#, java-format
+msgid "Alternately, you can copy .torrent files to the directory {0}."
+msgstr "或者您可以将.torrent文件复制到以下目录{0}."
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:755
+msgid "Removing a .torrent file will cause the torrent to stop."
+msgstr "删除种子文件将导致中止该下载任务。"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:772
+msgid "Create Torrent"
+msgstr "创建种子"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:775
+msgid "Data to seed"
+msgstr "做种数据"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:779
+msgid "File or directory to seed (must be within the specified path)"
+msgstr "做种文件或文件夹(必须下面为Snark指定的文件夹中)"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:783
+msgid "Select a tracker"
+msgstr "选择一个Tracker"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:796
+msgid "or"
+msgstr "或"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:799
+msgid "Specify custom tracker announce URL"
+msgstr "指定Open Tracker发布链接"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:802
+msgid "Create torrent"
+msgstr "创建种子"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:820
+msgid "Configuration"
+msgstr "设置"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:823
+msgid "Data directory"
+msgstr "数据文件夹"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:826
+msgid "Directory to store torrents and data"
+msgstr "种子及被做种文件的保存位置。"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:828
+msgid "Edit i2psnark.config and restart to change"
+msgstr "编辑 i2psnark.config 并重启Snark后生效"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:832
+msgid "Auto start"
+msgstr "自动启动"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:836
+msgid "If checked, automatically start torrents that are added"
+msgstr "选中后Snark将自动启动已添加的所有种子。"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:859
+msgid "Total uploader limit"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:866
+msgid "Up bandwidth limit"
+msgstr "上传带宽限制"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:869
+msgid "Half available bandwidth recommended."
+msgstr "推荐设置为可用带宽的一半。"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:871
+msgid "View or change router bandwidth"
+msgstr "浏览或修改路由器带宽"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:875
+msgid "Use open trackers also"
+msgstr "同时使用OpenTracker"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:879
+msgid "If checked, announce torrents to open trackers as well as the tracker listed in the torrent file"
+msgstr "选择后在OpenTracker及种子文件中的Tracker上同时发布。"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:883
+msgid "Open tracker announce URLs"
+msgstr "Open Tracker发布链接"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:894
+msgid "I2CP host"
+msgstr "I2CP主机"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:899
+msgid "I2CP port"
+msgstr "I2CP端口"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:912
+msgid "I2CP options"
+msgstr "I2CP选项"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:917
+msgid "Save configuration"
+msgstr "保存设置"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:970
+#, java-format
+msgid "Torrent fetched from {0}"
+msgstr "从{0}获取种子成功"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:998
+#, java-format
+msgid "Torrent at {0} was not valid"
+msgstr "{0}的种子中有错误"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1003
+#, java-format
+msgid "Torrent was not retrieved from {0}"
+msgstr "从{0}获得种子失败"
+
+#~ msgid "Custom tracker URL"
+#~ msgstr "自定义TrackerURL"
+#~ msgid "Configure"
+#~ msgstr "设置"
+
diff --git a/apps/i2ptunnel/java/build.xml b/apps/i2ptunnel/java/build.xml
index fa3e5d677f2d39cbd5194d7f08ad52230c151576..9647fa8d1ab892631b3f95f525483b89d4eb2bc0 100644
--- a/apps/i2ptunnel/java/build.xml
+++ b/apps/i2ptunnel/java/build.xml
@@ -41,10 +41,8 @@
                 <attribute name="Class-Path" value="i2p.jar mstreaming.jar" />
             </manifest>
         </jar>
-        <ant target="war" />
         <ant target="bundle" />
-        <!-- jar again to get the latest messages_*.class files -->
-        <jar destfile="./build/i2ptunnel.jar" basedir="./build/obj" includes="**/*.class" update="true" />
+        <ant target="war" />
     </target>
 
     <target name="bundle" depends="compile, precompilejsp">
diff --git a/apps/i2ptunnel/java/bundle-messages.sh b/apps/i2ptunnel/java/bundle-messages.sh
index aa98a316776f3a79fa04b0687044aaf0f18ba9bb..8e9375d209f0b1241c65a7c3c425bc4d738ba032 100755
--- a/apps/i2ptunnel/java/bundle-messages.sh
+++ b/apps/i2ptunnel/java/bundle-messages.sh
@@ -31,9 +31,8 @@ do
 		# make list of java files newer than the .po file
 		find $JPATHS -name *.java -newer $i > $TMPFILE
 	fi
-
-	if [ -s build/obj/net/i2p/i2ptunnel/web/messages_$LG.class -a \
-	     build/obj/net/i2p/i2ptunnel/web/messages_$LG.class -nt $i -a \
+	if [ -s ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/web/messages_$LG.class -a \
+	     ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/web/messages_$LG.class -nt $i -a \
 	     ! -s $TMPFILE ]
 	then
 		continue
@@ -76,7 +75,7 @@ do
 	echo "Generating ${CLASS}_$LG ResourceBundle..."
 
 	# convert to class files in build/obj
-	msgfmt --java -r $CLASS -l $LG -d build/obj $i
+	msgfmt --java --statistics -r $CLASS -l $LG -d ../jsp/WEB-INF/classes $i
 	if [ $? -ne 0 ]
 	then
 		echo 'Warning - msgfmt failed, not updating translations'
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java
index df0d7501913c3b3bbd28dd580de56d8b34600945..3598ac05c5123b672db4fbf62b3a698fedb2e789 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java
@@ -32,6 +32,8 @@ import net.i2p.util.EventDispatcher;
 import net.i2p.util.FileUtil;
 import net.i2p.util.Log;
 
+import net.i2p.util.Translate;
+
 /**
  * Act as a mini HTTP proxy, handling various different types of requests,
  * forwarding them through I2P appropriately, and displaying the reply.  Supported
@@ -41,7 +43,7 @@ import net.i2p.util.Log;
  *   $method $path $protocolVersion\nHost: $site
  * or
  *   $method http://i2p/$b64key/$path $protocolVersion
- * or 
+ * or
  *   $method /$site/$path $protocolVersion
  * </pre>
  *
@@ -70,7 +72,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
          "<html><body><H1>I2P ERROR: REQUEST DENIED</H1>"+
          "You attempted to connect to a non-I2P website or location.<BR>")
         .getBytes();
-    
+
     private final static byte[] ERR_DESTINATION_UNKNOWN =
         ("HTTP/1.1 503 Service Unavailable\r\n"+
          "Content-Type: text/html; charset=iso-8859-1\r\n"+
@@ -80,10 +82,10 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
          "That I2P Destination was not found. Perhaps you pasted in the "+
          "wrong BASE64 I2P Destination or the link you are following is "+
          "bad. The host (or the WWW proxy, if you're using one) could also "+
-	 "be temporarily offline.  You may want to <b>retry</b>.  "+
+     "be temporarily offline.  You may want to <b>retry</b>.  "+
          "Could not find the following Destination:<BR><BR><div>")
         .getBytes();
-    
+
 /*****
     private final static byte[] ERR_TIMEOUT =
         ("HTTP/1.1 504 Gateway Timeout\r\n"+
@@ -107,7 +109,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
          "Your request was for a site outside of I2P, but you have no "+
          "HTTP outproxy configured.  Please configure an outproxy in I2PTunnel")
          .getBytes();
-    
+
     private final static byte[] ERR_AHELPER_CONFLICT =
         ("HTTP/1.1 409 Conflict\r\n"+
          "Content-Type: text/html; charset=iso-8859-1\r\n"+
@@ -123,7 +125,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
          "discarding the host entry from your host database, "+
          "or naming one of them differently.<p>")
          .getBytes();
-    
+
     private final static byte[] ERR_BAD_PROTOCOL =
         ("HTTP/1.1 403 Bad Protocol\r\n"+
          "Content-Type: text/html; charset=iso-8859-1\r\n"+
@@ -133,7 +135,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
          "The request uses a bad protocol. "+
          "The I2P HTTP Proxy supports http:// requests ONLY. Other protocols such as https:// and ftp:// are not allowed.<BR>")
         .getBytes();
-    
+
     private final static byte[] ERR_LOCALHOST =
         ("HTTP/1.1 403 Access Denied\r\n"+
          "Content-Type: text/html; charset=iso-8859-1\r\n"+
@@ -142,7 +144,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
          "<html><body><H1>I2P ERROR: REQUEST DENIED</H1>"+
          "Your browser is misconfigured. Do not use the proxy to access the router console or other localhost destinations.<BR>")
         .getBytes();
-    
+
     /** used to assign unique IDs to the threads / clients.  no logic or functionality */
     private static volatile long __clientId = 0;
 
@@ -153,8 +155,8 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
      * @throws IllegalArgumentException if the I2PTunnel does not contain
      *                                  valid config to contact the router
      */
-    public I2PTunnelHTTPClient(int localPort, Logging l, boolean ownDest, 
-                               String wwwProxy, EventDispatcher notifyThis, 
+    public I2PTunnelHTTPClient(int localPort, Logging l, boolean ownDest,
+                               String wwwProxy, EventDispatcher notifyThis,
                                I2PTunnel tunnel) throws IllegalArgumentException {
         super(localPort, ownDest, l, notifyThis, "HTTPHandler " + (++__clientId), tunnel);
 
@@ -178,7 +180,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
     }
 
     private String getPrefix(long requestId) { return "Client[" + _clientId + "/" + requestId + "]: "; }
-    
+
     private String selectProxy() {
         synchronized (proxyList) {
             int size = proxyList.size();
@@ -195,8 +197,8 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
     }
 
     private static final int DEFAULT_READ_TIMEOUT = 60*1000;
-    
-    /** 
+
+    /**
      * create the default options (using the default timeout, etc)
      * unused?
      */
@@ -212,8 +214,8 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
             opts.setConnectTimeout(DEFAULT_CONNECT_TIMEOUT);
         return opts;
     }
-    
-    /** 
+
+    /**
      * create the default options (using the default timeout, etc)
      *
      */
@@ -261,7 +263,8 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
     public static final String PROP_REFERER = "i2ptunnel.httpclient.sendReferer";
     public static final String PROP_USER_AGENT = "i2ptunnel.httpclient.sendUserAgent";
     public static final String PROP_VIA = "i2ptunnel.httpclient.sendVia";
-    
+    public static final String PROP_JUMP_SERVERS = "i2ptunnel.httpclient.jumpServers";
+
     private static long __requestId = 0;
     protected void clientConnectionRun(Socket s) {
         InputStream in = null;
@@ -281,17 +284,17 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
                 line = line.trim();
                 if (_log.shouldLog(Log.DEBUG))
                     _log.debug(getPrefix(requestId) + "Line=[" + line + "]");
-                
+
                 String lowercaseLine = line.toLowerCase();
-                if (lowercaseLine.startsWith("connection: ") || 
-                    lowercaseLine.startsWith("keep-alive: ") || 
+                if (lowercaseLine.startsWith("connection: ") ||
+                    lowercaseLine.startsWith("keep-alive: ") ||
                     lowercaseLine.startsWith("proxy-connection: "))
                     continue;
-                
+
                 if (method == null) { // first line (GET /base64/realaddr)
                     if (_log.shouldLog(Log.DEBUG))
                         _log.debug(getPrefix(requestId) + "Method is null for [" + line + "]");
-                    
+
                     int pos = line.indexOf(" ");
                     if (pos == -1) break;
                     method = line.substring(0, pos);
@@ -327,7 +330,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
                         break;
                     }
                     host = request.substring(0, pos);
-                    
+
                     // parse port
                     int posPort = host.indexOf(":");
                     int port = 80;
@@ -340,7 +343,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
                             // TODO: log this
                         }
                     }
-                    
+
                     if (host.toLowerCase().equals("proxy.i2p")) {
                         // so we don't do any naming service lookups
                         destination = "proxy.i2p";
@@ -357,7 +360,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
                             // and split the request into it's component parts for rebuilding later
                             String ahelperKey = null;
                             boolean ahelperConflict = false;
-                            
+
                             String fragments = request.substring(pos2 + 1);
                             String uriPath = request.substring(0, pos2);
                             pos2 = fragments.indexOf(" ");
@@ -371,15 +374,15 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
                                 pos2 = fragments.indexOf("&");
                                 fragment = fragments.substring(0, pos2);
                                 fragments = fragments.substring(pos2 + 1);
-                                
+
                                 // Fragment looks like addresshelper key
                                 if (fragment.startsWith("i2paddresshelper=")) {
                                     pos2 = fragment.indexOf("=");
                                     ahelperKey = fragment.substring(pos2 + 1);
-                                    
+
                                     // Key contains data, lets not ignore it
                                     if (ahelperKey != null) {
-                                        
+
                                         // Host resolvable only with addresshelper
                                         if ( (host == null) || ("i2p".equals(host)) )
                                         {
@@ -403,25 +406,25 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
                                     if ("".equals(urlEncoding)) {
                                         urlEncoding = "?" + fragment;
                                     } else {
-                                        urlEncoding = urlEncoding + "&" + fragment; 
+                                        urlEncoding = urlEncoding + "&" + fragment;
                                     }
                                 }
                             }
                             // Reconstruct the request minus the i2paddresshelper GET var
                             request = uriPath + urlEncoding + " " + protocolVersion;
-                            
+
                             // Did addresshelper key conflict?
                             if (ahelperConflict)
                             {
 
                                 if (out != null) {
-                                    // Fixme untranslated
                                     long alias = I2PAppContext.getGlobalContext().random().nextLong();
                                     String trustedURL = protocol + uriPath + urlEncoding;
                                     String conflictURL = protocol + alias + ".i2p/?" + initialFragments;
                                     byte[] header = getErrorPage("ahelper-conflict", ERR_AHELPER_CONFLICT);
                                     out.write(header);
-                                    out.write(("To visit the destination in your host database, click <a href=\"" + trustedURL + "\">here</a>. To visit the conflicting addresshelper link by temporarily giving it a random alias, click <a href=\"" + conflictURL + "\">here</a>.<p></div>").getBytes());
+                                    out.write(_("To visit the destination in your host database, click <a href=\"{0}\">here</a>. To visit the conflicting addresshelper link by temporarily giving it a random alias, click <a href=\"{1}\">here</a>.", trustedURL, conflictURL).getBytes("UTF-8"));
+                                    out.write(("<p></div>").getBytes());
                                     writeFooter(out);
                                 }
                                 s.close();
@@ -435,7 +438,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
                             host = getHostName(destination);
                             ahelper = 1;
                         }
-                        
+
                         line = method + " " + request.substring(pos);
                     } else if (host.toLowerCase().equals("localhost") || host.equals("127.0.0.1")) {
                         if (out != null) {
@@ -507,7 +510,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
                 } else {
                     if (lowercaseLine.startsWith("host: ") && !usingWWWProxy) {
                         line = "Host: " + host;
-                        if (_log.shouldLog(Log.INFO)) 
+                        if (_log.shouldLog(Log.INFO))
                             _log.info(getPrefix(requestId) + "Setting host = " + host);
                     } else if (lowercaseLine.startsWith("user-agent: ") &&
                                !Boolean.valueOf(getTunnel().getClientOptions().getProperty(PROP_USER_AGENT)).booleanValue()) {
@@ -537,7 +540,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
                 }
 
                 if (line.length() == 0) {
-                    
+
                     String ok = getTunnel().getClientOptions().getProperty("i2ptunnel.gzip");
                     boolean gzip = DEFAULT_GZIP;
                     if (ok != null)
@@ -573,10 +576,10 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
                 s.close();
                 return;
             }
-            
+
             if (_log.shouldLog(Log.DEBUG))
                 _log.debug(getPrefix(requestId) + "Destination: " + destination);
-            
+
             // Serve local proxy files (images, css linked from error pages)
             // Ignore all the headers
             if (usingInternalServer) {
@@ -591,7 +594,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
                 if (_log.shouldLog(Log.WARN))
                     _log.warn("Unable to resolve " + destination + " (proxy? " + usingWWWProxy + ", request: " + targetRequest);
                 byte[] header;
-                boolean showAddrHelper = false;
+                String jumpServers = null;
                 if (usingWWWProxy)
                     header = getErrorPage("dnfp", ERR_DESTINATION_UNKNOWN);
                 else if(ahelper != 0)
@@ -600,14 +603,16 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
                     header = getErrorPage("dnf", ERR_DESTINATION_UNKNOWN);
                 else {
                     header = getErrorPage("dnfh", ERR_DESTINATION_UNKNOWN);
-                    showAddrHelper = true;
+                    jumpServers = getTunnel().getClientOptions().getProperty(PROP_JUMP_SERVERS);
+                    if (jumpServers == null)
+                        jumpServers = DEFAULT_JUMP_SERVERS;
                 }
-                writeErrorMessage(header, out, targetRequest, usingWWWProxy, destination, showAddrHelper);
+                writeErrorMessage(header, out, targetRequest, usingWWWProxy, destination, jumpServers);
                 s.close();
                 return;
             }
             String remoteID;
-            
+
             Properties opts = new Properties();
             //opts.setProperty("i2p.streaming.inactivityTimeout", ""+120*1000);
             // 1 == disconnect.  see ConnectionOptions in the new streaming lib, which i
@@ -751,21 +756,22 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
         public void run() {
             if (_log.shouldLog(Log.DEBUG))
                 _log.debug("Timeout occured requesting " + _target);
-            handleHTTPClientException(new RuntimeException("Timeout"), _out, 
+            handleHTTPClientException(new RuntimeException("Timeout"), _out,
                                       _target, _usingProxy, _wwwProxy, _requestId);
             closeSocket(_socket);
         }
     }
-    
-    private static String jumpServers[] = {
-                                           "http://i2host.i2p/cgi-bin/i2hostjump?",
-                                           // "http://orion.i2p/jump/",
-                                           "http://stats.i2p/cgi-bin/jump.cgi?a=",
-                                           // "http://trevorreznik.i2p/cgi-bin/jump.php?hostname=",
-                                           "http://i2jump.i2p/"
-                                          };
+
+    private static String DEFAULT_JUMP_SERVERS =
+                                           "http://i2host.i2p/cgi-bin/i2hostjump?," +
+                                           "http://stats.i2p/cgi-bin/jump.cgi?a=," +
+                                           "http://i2jump.i2p/";
+
+    /**
+     *  @param jumpServers comma- or space-separated list, or null
+     */
     private static void writeErrorMessage(byte[] errMessage, OutputStream out, String targetRequest,
-                                          boolean usingWWWProxy, String wwwProxy, boolean showAddrHelper) throws IOException {
+                                          boolean usingWWWProxy, String wwwProxy, String jumpServers) throws IOException {
         if (out != null) {
             out.write(errMessage);
             if (targetRequest != null) {
@@ -781,12 +787,18 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
                 out.write(uri.getBytes());
                 out.write("</a>".getBytes());
                 if (usingWWWProxy) out.write(("<br>WWW proxy: " + wwwProxy).getBytes());
-                if (showAddrHelper) {
-                    // Fixme untranslated
-                    out.write("<br><br>Click a link below to look for an address helper by using a \"jump\" service:<br>".getBytes());
-                    for (int i = 0; i < jumpServers.length; i++) {
+                if (jumpServers != null && jumpServers.length() > 0) {
+                    out.write("<br><br>".getBytes());
+                    out.write(_("Click a link below to look for an address helper by using a \"jump\" service:").getBytes("UTF-8"));
+                    out.write("<br>".getBytes());
+
+                    StringTokenizer tok = new StringTokenizer(jumpServers, ", ");
+                    while (tok.hasMoreTokens()) {
+                        String jurl = tok.nextToken();
+                        if (!jurl.startsWith("http://"))
+                            continue;
                         // Skip jump servers we don't know
-                        String jumphost = jumpServers[i].substring(7);  // "http://"
+                        String jumphost = jurl.substring(7);  // "http://"
                         jumphost = jumphost.substring(0, jumphost.indexOf('/'));
                         try {
                             Destination dest = I2PTunnel.destFromName(jumphost);
@@ -796,10 +808,10 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
                         }
 
                         out.write("<br><a href=\"".getBytes());
-                        out.write(jumpServers[i].getBytes());
+                        out.write(jurl.getBytes());
                         out.write(uri.getBytes());
                         out.write("\">".getBytes());
-                        out.write(jumpServers[i].getBytes());
+                        out.write(jurl.getBytes());
                         out.write(uri.getBytes());
                         out.write("</a>".getBytes());
                     }
@@ -812,7 +824,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
 
     private static void handleHTTPClientException(Exception ex, OutputStream out, String targetRequest,
                                                   boolean usingWWWProxy, String wwwProxy, long requestId) {
-                                                      
+
         // static
         //if (_log.shouldLog(Log.WARN))
         //    _log.warn(getPrefix(requestId) + "Error sending to " + wwwProxy + " (proxy? " + usingWWWProxy + ", request: " + targetRequest, ex);
@@ -823,7 +835,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
                     header = getErrorPage(I2PAppContext.getGlobalContext(), "dnfp", ERR_DESTINATION_UNKNOWN);
                 else
                     header = getErrorPage(I2PAppContext.getGlobalContext(), "dnf", ERR_DESTINATION_UNKNOWN);
-                writeErrorMessage(header, out, targetRequest, usingWWWProxy, wwwProxy, false);
+                writeErrorMessage(header, out, targetRequest, usingWWWProxy, wwwProxy, null);
             } catch (IOException ioe) {
                 // static
                 //_log.warn(getPrefix(requestId) + "Error writing out the 'destination was unknown' " + "message", ioe);
@@ -933,4 +945,18 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
             out.flush();
         } catch (IOException ioe) {}
     }
+
+
+    private static final String BUNDLE_NAME = "net.i2p.i2ptunnel.web.messages";
+
+    /** lang in routerconsole.lang property, else current locale */
+    public static String _(String key) {
+        return Translate.getString(key, I2PAppContext.getGlobalContext(), BUNDLE_NAME);
+    }
+
+    /** {0} and {1} */
+    public static String _(String key, Object o, Object o2) {
+        return Translate.getString(key, o, o2, I2PAppContext.getGlobalContext(), BUNDLE_NAME);
+    }
+
 }
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/InternalSocketRunner.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/InternalSocketRunner.java
index 5e3eefd4f52ee2057c039590a4ff288021b5726d..d6f4dcc394a0b992ed078f836fe0ff9c118ef074 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/InternalSocketRunner.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/InternalSocketRunner.java
@@ -12,6 +12,7 @@ import net.i2p.util.Log;
  * Listen for in-JVM connections on the internal "socket"
  *
  * @author zzz
+ * @since 0.7.9
  */
 class InternalSocketRunner implements Runnable {
     private I2PTunnelClientBase client;
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java
index 53ed8274940eb51abc44d36d9ad3728f295c4aba..6951286dc77791145628330d20cb71a6220b9966 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java
@@ -359,7 +359,7 @@ public class IndexBean {
         if (tun != null && tun.getName() != null)
             return tun.getName();
         else
-            return "New Tunnel";
+            return _("New Tunnel");
     }
     
     public String getClientPort(int tunnel) {
@@ -379,16 +379,16 @@ public class IndexBean {
     }
     
     public String getTypeName(String internalType) {
-        if ("client".equals(internalType)) return "Standard client";
-        else if ("httpclient".equals(internalType)) return "HTTP client";
-        else if ("ircclient".equals(internalType)) return "IRC client";
-        else if ("server".equals(internalType)) return "Standard server";
-        else if ("httpserver".equals(internalType)) return "HTTP server";
-        else if ("sockstunnel".equals(internalType)) return "SOCKS 4/4a/5 proxy";
-        else if ("connectclient".equals(internalType)) return "CONNECT/SSL/HTTPS proxy";
-        else if ("ircserver".equals(internalType)) return "IRC server";
-        else if ("streamrclient".equals(internalType)) return "Streamr client";
-        else if ("streamrserver".equals(internalType)) return "Streamr server";
+        if ("client".equals(internalType)) return _("Standard client");
+        else if ("httpclient".equals(internalType)) return _("HTTP client");
+        else if ("ircclient".equals(internalType)) return _("IRC client");
+        else if ("server".equals(internalType)) return _("Standard server");
+        else if ("httpserver".equals(internalType)) return _("HTTP server");
+        else if ("sockstunnel".equals(internalType)) return _("SOCKS 4/4a/5 proxy");
+        else if ("connectclient".equals(internalType)) return _("CONNECT/SSL/HTTPS proxy");
+        else if ("ircserver".equals(internalType)) return _("IRC server");
+        else if ("streamrclient".equals(internalType)) return _("Streamr client");
+        else if ("streamrserver".equals(internalType)) return _("Streamr server");
         else return internalType;
     }
     
@@ -935,4 +935,8 @@ public class IndexBean {
             buf.append((String)msgs.get(i)).append("\n");
         }
     }
+
+    private String _(String key) {
+        return Messages._(key, _context);
+    }
 }
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/Messages.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/Messages.java
index fa38392320441697dee18e6afde12f13e92fc1a7..071123a2ec1f8b7eb0c7957020474c0524298dc6 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/Messages.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/Messages.java
@@ -5,9 +5,10 @@ import net.i2p.util.Translate;
 
 /**
  * Translate strings for this package.
+ * @since 0.7.9
  */
 public class Messages {
-    private static final String BUNDLE_NAME = "net.i2p.i2ptunnel.messages";
+    private static final String BUNDLE_NAME = "net.i2p.i2ptunnel.web.messages";
     private final I2PAppContext _context;
 
     public Messages() {
@@ -19,6 +20,10 @@ public class Messages {
         return Translate.getString(key, _context, BUNDLE_NAME);
     }
 
+    public static String _(String key, I2PAppContext ctx) {
+        return Translate.getString(key, ctx, BUNDLE_NAME);
+    }
+
     /**
      *  translate a string with a parameter
      *  This is a lot more expensive than getString(s, ctx), so use sparingly.
diff --git a/apps/i2ptunnel/jsp/editClient.jsp b/apps/i2ptunnel/jsp/editClient.jsp
index 40d1028b03dd43af2c48f70008898a83e96d2fe1..a51dead90165a7ab4df1a6c05016cb68858e783a 100644
--- a/apps/i2ptunnel/jsp/editClient.jsp
+++ b/apps/i2ptunnel/jsp/editClient.jsp
@@ -39,11 +39,11 @@
                 if (curTunnel >= 0) {
                     tunnelTypeName = editBean.getTunnelType(curTunnel);
                     tunnelType = editBean.getInternalType(curTunnel);
-                  %><h4>Edit proxy settings</h4><% 
+                  %><h4><%=intl._("Edit proxy settings")%></h4><% 
                 } else {
                     tunnelTypeName = editBean.getTypeName(request.getParameter("type"));
                     tunnelType = request.getParameter("type");
-                  %><h4>New proxy settings</h4><% 
+                  %><h4><%=intl._("New proxy settings")%></h4><% 
                 } %>
                 <input type="hidden" name="tunnel" value="<%=request.getParameter("tunnel")%>" />
                 <input type="hidden" name="nonce" value="<%=editBean.getNextNonce()%>" />
@@ -56,17 +56,17 @@
 
             <div id="nameField" class="rowItem">
                 <label for="name" accesskey="N">
-                    <span class="accessKey">N</span>ame:
+                    <%=intl._("Name")%>:(<span class="accessKey">N</span>)
                 </label>
                 <input type="text" size="30" maxlength="50" name="name" id="name" title="Tunnel Name" value="<%=editBean.getTunnelName(curTunnel)%>" class="freetext" />               
             </div>
             <div id="typeField" class="rowItem">
-                <label>Type:</label>
+                <label><%=intl._("Type")%>:</label>
                 <span class="text"><%=tunnelTypeName%></span>
             </div>
             <div id="descriptionField" class="rowItem">
                 <label for="description" accesskey="e">
-                    D<span class="accessKey">e</span>scription:
+                    <%=intl._("Description")%>:(<span class="accessKey">E</span>)
                 </label>
                 <input type="text" size="60" maxlength="80" name="description"  id="description" title="Tunnel Description" value="<%=editBean.getTunnelDescription(curTunnel)%>" class="freetext" />                
             </div>
@@ -77,17 +77,20 @@
                  
             <div id="accessField" class="rowItem">
          <% if ("streamrclient".equals(tunnelType)) { %>
-                <label>Target:</label>
+                <label><%=intl._("Target")%>:</label>
          <% } else { %>
-                <label>Access Point:</label>
+                <label><%=intl._("Access Point")%>:</label>
          <% } %>
             </div>
             <div id="portField" class="rowItem">
                 <label for="port" accesskey="P">
                     <span class="accessKey">P</span>ort:
                     <% String value = editBean.getClientPort(curTunnel);
-                       if (value == null || "".equals(value.trim()))
-                           out.write(" <font color=\"red\">(required)</font>");
+                       if (value == null || "".equals(value.trim())) {
+                           out.write(" <font color=\"red\">(");
+                           out.write(intl._("required"));
+                           out.write(")</font>");
+                       }
                      %>
                 </label>
                 <input type="text" size="6" maxlength="5" id="port" name="port" title="Access Port Number" value="<%=editBean.getClientPort(curTunnel)%>" class="freetext" />               
@@ -99,7 +102,7 @@
             } else { %>
             <div id="reachField" class="rowItem">
                 <label for="reachableBy" accesskey="r">
-                    <span class="accessKey">R</span>eachable by:
+                    <%=intl._("Reachable by")%>(<span class="accessKey">R</span>):
                 </label>
                 <select id="reachableBy" name="reachableBy" title="Valid IP for Client Access" class="selectbox">
                   <%   if (!("127.0.0.1".equals(clientInterface)) &&
@@ -108,9 +111,9 @@
                             (clientInterface.trim().length() > 0)) {
                             otherInterface = clientInterface;
                        }
-                  %><option value="127.0.0.1"<%=("127.0.0.1".equals(clientInterface) ? " selected=\"selected\"" : "")%>>Locally (127.0.0.1)</option>
-                    <option value="0.0.0.0"<%=("0.0.0.0".equals(clientInterface) ? " selected=\"selected\"" : "")%>>Everyone (0.0.0.0)</option>
-                    <option value="other"<%=(!("".equals(otherInterface))    ? " selected=\"selected\"" : "")%>>LAN Hosts (Please specify your LAN address)</option>
+                  %><option value="127.0.0.1"<%=("127.0.0.1".equals(clientInterface) ? " selected=\"selected\"" : "")%>><%=intl._("Locally (127.0.0.1)")%></option>
+                    <option value="0.0.0.0"<%=("0.0.0.0".equals(clientInterface) ? " selected=\"selected\"" : "")%>><%=intl._("Everyone (0.0.0.0)")%></option>
+                    <option value="other"<%=(!("".equals(otherInterface))    ? " selected=\"selected\"" : "")%>><%=intl._("LAN Hosts (Please specify your LAN address)")%></option>
                 </select>                
             </div> 
          <% } // streamrclient %>
@@ -119,11 +122,14 @@
          <% if ("streamrclient".equals(tunnelType)) { %>
                     Host:
                     <% String vvv = otherInterface;
-                       if (vvv == null || "".equals(vvv.trim()))
-                           out.write(" <font color=\"red\">(required)</font>");
+                       if (vvv == null || "".equals(vvv.trim())) {
+                           out.write(" <font color=\"red\">(");
+                           out.write(intl._("required"));
+                           out.write(")</font>");
+                       }   
                      %>
          <% } else { %>
-                    <span class="accessKey">O</span>ther:
+                    <%=intl._("Other")%>(<span class="accessKey">O</span>):
          <% } %>
                 </label>
                 <input type="text" size="20" id="reachableByOther" name="reachableByOther" title="Alternative IP for Client Access" value="<%=otherInterface%>" class="freetext" />                
@@ -136,55 +142,58 @@
             <% if ("httpclient".equals(tunnelType) || "connectclient".equals(tunnelType)) {
           %><div id="destinationField" class="rowItem">
                 <label for="proxyList" accesskey="x">
-                    Outpro<span class="accessKey">x</span>ies:
+                    <%=intl._("Outproxies")%>(<span class="accessKey">x</span>):
                 </label>
                 <input type="text" size="30" id="proxyList" name="proxyList" title="List of Outproxy I2P destinations" value="<%=editBean.getClientDestination(curTunnel)%>" class="freetext" />                
             </div>
             <% } else if ("client".equals(tunnelType) || "ircclient".equals(tunnelType) || "streamrclient".equals(tunnelType)) {
           %><div id="destinationField" class="rowItem">
                 <label for="targetDestination" accesskey="T">
-                    <span class="accessKey">T</span>unnel Destination:
+                    <%=intl._("Tunnel Destination")%>(<span class="accessKey">T</span>):
                     <% String value2 = editBean.getClientDestination(curTunnel);
-                       if (value2 == null || "".equals(value2.trim()))
-                           out.write(" <font color=\"red\">(required)</font>");
+                       if (value2 == null || "".equals(value2.trim())) {
+                           out.write(" <font color=\"red\">(");
+                           out.write(intl._("required"));
+                           out.write(")</font>");
+                       }   
                      %>
                 </label>
                 <input type="text" size="30" id="targetDestination" name="targetDestination" title="Destination of the Tunnel" value="<%=editBean.getClientDestination(curTunnel)%>" class="freetext" />                
-                <span class="comment">(name or destination)</span>
+                <span class="comment">(<%=intl._("name or destination")%>)</span>
             </div>
          <% } %>
          <% if (!"streamrclient".equals(tunnelType)) { %>
             <div id="profileField" class="rowItem">
                 <label for="profile" accesskey="f">
-                    Pro<span class="accessKey">f</span>ile:
+                    <%=intl._("Profile")%>(<span class="accessKey">f</span>):
                 </label>
                 <select id="profile" name="profile" title="Connection Profile" class="selectbox">
                     <% boolean interactiveProfile = editBean.isInteractive(curTunnel);
-                  %><option <%=(interactiveProfile == true  ? "selected=\"selected\" " : "")%>value="interactive">interactive connection </option>
-                    <option <%=(interactiveProfile == false ? "selected=\"selected\" " : "")%>value="bulk">bulk connection (downloads/websites/BT) </option>
+                  %><option <%=(interactiveProfile == true  ? "selected=\"selected\" " : "")%>value="interactive"><%=intl._("interactive connection")%> </option>
+                    <option <%=(interactiveProfile == false ? "selected=\"selected\" " : "")%>value="bulk"><%=intl._("bulk connection (downloads/websites/BT)")%> </option>
                 </select>                
             </div>
             <div id="delayConnectField" class="rowItem">
                 <label for="connectDelay" accesskey="y">
-                    Dela<span class="accessKey">y</span> Connect:
+                    <%=intl._("Delay Connect")%>(<span class="accessKey">y</span>):
                 </label>
                 <input value="1000" type="checkbox" id="connectDelay" name="connectDelay" title="Delay Connection"<%=(editBean.shouldDelay(curTunnel) ? " checked=\"checked\"" : "")%> class="tickbox" />                
-                <span class="comment">(for request/response connections)</span>
+                <span class="comment">(<%=intl._("for request/response connections")%>)</span>
             </div>
             <div id="sharedtField" class="rowItem">
                 <label for="shared" accesskey="h">
-                    S<span class="accessKey">h</span>ared Client:
+                    <%=intl._("Shared Client")%>(<span class="accessKey">h</span>):
                 </label>
                 <input value="true" type="checkbox" id="shared" name="shared" title="Share tunnels with other clients"<%=(editBean.isSharedClient(curTunnel) ? " checked=\"checked\"" : "")%> class="tickbox" />                
-                <span class="comment">(Share tunnels with other clients and irc/httpclients? Change requires restart of client proxy)</span>
+                <span class="comment"><%=intl._("(Share tunnels with other clients and irc/httpclients? Change requires restart of client proxy)")%></span>
             </div>
          <% } // !streamrclient %>
             <div id="startupField" class="rowItem">
                 <label for="startOnLoad" accesskey="a">
-                    <span class="accessKey">A</span>uto Start:
+                    <%=intl._("Auto Start")%>(<span class="accessKey">A</span>):
                 </label>
                 <input value="1" type="checkbox" id="startOnLoad" name="startOnLoad" title="Start Tunnel Automatically"<%=(editBean.startAutomatically(curTunnel) ? " checked=\"checked\"" : "")%> class="tickbox" />                
-                <span class="comment">(Check the Box for 'YES')</span>
+                <span class="comment"><%=intl._("(Check the Box for 'YES')")%></span>
             </div>
             
             <div class="footer">
@@ -193,8 +202,8 @@
 
         <div id="tunnelAdvancedNetworking" class="panel">
             <div class="header">
-                <h4>Advanced networking options</h4><br />
-                <span class="comment">(NOTE: when this client proxy is configured to share tunnels, then these options are for all the shared proxy clients!)</span>
+                <h4><%=intl._("Advanced networking options")%></h4><br />
+                <span class="comment"><%=intl._("(NOTE: when this client proxy is configured to share tunnels, then these options are for all the shared proxy clients!)")%></span>
             </div>
 
             <div class="separator">
@@ -202,65 +211,65 @@
             </div>
             
             <div id="tunnelOptionsField" class="rowItem">
-                <label>Tunnel Options:</label>
+                <label><%=intl._("Tunnel Options")%>:</label>
             </div>
             <div id="depthField" class="rowItem">
                 <label for="tunnelDepth" accesskey="t">
-                    Leng<span class="accessKey">t</span>h:
+                    <%=intl._("Length")%>(<span class="accessKey">t</span>):
                 </label>
                 <select id="tunnelDepth" name="tunnelDepth" title="Length of each Tunnel" class="selectbox">
                     <% int tunnelDepth = editBean.getTunnelDepth(curTunnel, 2);
-                  %><option value="0"<%=(tunnelDepth == 0 ? " selected=\"selected\"" : "") %>>0 hop tunnel (low anonymity, low latency)</option>
-                    <option value="1"<%=(tunnelDepth == 1 ? " selected=\"selected\"" : "") %>>1 hop tunnel (medium anonymity, medium latency)</option>
-                    <option value="2"<%=(tunnelDepth == 2 ? " selected=\"selected\"" : "") %>>2 hop tunnel (high anonymity, high latency)</option>
-                    <option value="3"<%=(tunnelDepth == 3 ? " selected=\"selected\"" : "") %>>3 hop tunnel (very high anonymity, poor performance)</option>
+                  %><option value="0"<%=(tunnelDepth == 0 ? " selected=\"selected\"" : "") %>><%=intl._("0 hop tunnel (low anonymity, low latency)")%></option>
+                    <option value="1"<%=(tunnelDepth == 1 ? " selected=\"selected\"" : "") %>><%=intl._("1 hop tunnel (medium anonymity, medium latency)")%></option>
+                    <option value="2"<%=(tunnelDepth == 2 ? " selected=\"selected\"" : "") %>><%=intl._("2 hop tunnel (high anonymity, high latency)")%></option>
+                    <option value="3"<%=(tunnelDepth == 3 ? " selected=\"selected\"" : "") %>><%=intl._("3 hop tunnel (very high anonymity, poor performance)")%></option>
                 <% if (tunnelDepth > 3) { 
-                %>    <option value="<%=tunnelDepth%>" selected="selected"><%=tunnelDepth%> hop tunnel (very poor performance)</option>
+                %>    <option value="<%=tunnelDepth%>" selected="selected"><%=tunnelDepth%> <%=intl._("hop tunnel (very poor performance)")%></option>
                 <% }
               %></select>
             </div>
             <div id="varianceField" class="rowItem">
                 <label for="tunnelVariance" accesskey="v">
-                    <span class="accessKey">V</span>ariance:
+                    <%=intl._("Variance")%>(<span class="accessKey">V</span>):
                 </label>
                 <select id="tunnelVariance" name="tunnelVariance" title="Level of Randomization for Tunnel Length" class="selectbox">
                     <% int tunnelVariance = editBean.getTunnelVariance(curTunnel, 0);
-                  %><option value="0"<%=(tunnelVariance  ==  0 ? " selected=\"selected\"" : "") %>>0 hop variance (no randomisation, consistant performance)</option>
-                    <option value="1"<%=(tunnelVariance  ==  1 ? " selected=\"selected\"" : "") %>>+ 0-1 hop variance (medium additive randomisation, subtractive performance)</option>
-                    <option value="2"<%=(tunnelVariance  ==  2 ? " selected=\"selected\"" : "") %>>+ 0-2 hop variance (high additive randomisation, subtractive performance)</option>
-                    <option value="-1"<%=(tunnelVariance == -1 ? " selected=\"selected\"" : "") %>>+/- 0-1 hop variance (standard randomisation, standard performance)</option>
-                    <option value="-2"<%=(tunnelVariance == -2 ? " selected=\"selected\"" : "") %>>+/- 0-2 hop variance (not recommended)</option>
+                  %><option value="0"<%=(tunnelVariance  ==  0 ? " selected=\"selected\"" : "") %>><%=intl._("0 hop variance (no randomisation, consistant performance)")%></option>
+                    <option value="1"<%=(tunnelVariance  ==  1 ? " selected=\"selected\"" : "") %>><%=intl._("+ 0-1 hop variance (medium additive randomisation, subtractive performance)")%></option>
+                    <option value="2"<%=(tunnelVariance  ==  2 ? " selected=\"selected\"" : "") %>><%=intl._("+ 0-2 hop variance (high additive randomisation, subtractive performance)")%></option>
+                    <option value="-1"<%=(tunnelVariance == -1 ? " selected=\"selected\"" : "") %>><%=intl._("+/- 0-1 hop variance (standard randomisation, standard performance)")%></option>
+                    <option value="-2"<%=(tunnelVariance == -2 ? " selected=\"selected\"" : "") %>><%=intl._("+/- 0-2 hop variance (not recommended)")%></option>
                 <% if (tunnelVariance > 2 || tunnelVariance < -2) {
-                %>    <option value="<%=tunnelVariance%>" selected="selected"><%= (tunnelVariance > 2 ? "+ " : "+/- ") %>0-<%=tunnelVariance%> hop variance</option>
+                %>    <option value="<%=tunnelVariance%>" selected="selected"><%= (tunnelVariance > 2 ? "+ " : "+/- ") %>0-<%=tunnelVariance%> <%=intl._("hop variance")%></option>
                 <% }
               %></select>                
             </div>                
             <div id="countField" class="rowItem">
                 <label for="tunnelQuantity" accesskey="C">
-                    <span class="accessKey">C</span>ount:
+                    <%=intl._("Count")%>(<span class="accessKey">C</span>):
                 </label>
                 <select id="tunnelQuantity" name="tunnelQuantity" title="Number of Tunnels in Group" class="selectbox">
                     <% int tunnelQuantity = editBean.getTunnelQuantity(curTunnel, 2);
-                  %><option value="1"<%=(tunnelQuantity == 1 ? " selected=\"selected\"" : "") %>>1 inbound, 1 outbound tunnel  (low bandwidth usage, less reliability)</option>
-                    <option value="2"<%=(tunnelQuantity == 2 ? " selected=\"selected\"" : "") %>>2 inbound, 2 outbound tunnels (standard bandwidth usage, standard reliability)</option>
-                    <option value="3"<%=(tunnelQuantity == 3 ? " selected=\"selected\"" : "") %>>3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)</option>
+                  %><option value="1"<%=(tunnelQuantity == 1 ? " selected=\"selected\"" : "") %>><%=intl._("1 inbound, 1 outbound tunnel  (low bandwidth usage, less reliability)")%></option>
+                    <option value="2"<%=(tunnelQuantity == 2 ? " selected=\"selected\"" : "") %>><%=intl._("2 inbound, 2 outbound tunnels (standard bandwidth usage, standard reliability)")%></option>
+                    <option value="3"<%=(tunnelQuantity == 3 ? " selected=\"selected\"" : "") %>><%=intl._("3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)")%></option>
                 <% if (tunnelQuantity > 3) {
-                %>    <option value="<%=tunnelQuantity%>" selected="selected"><%=tunnelQuantity%> tunnels</option>
+                %>    <option value="<%=tunnelQuantity%>" selected="selected"><%=tunnelQuantity%> <%=intl._("tunnels")%></option>
                 <% }
               %></select>                
             </div>
             <div id="backupField" class="rowItem">
                 <label for="tunnelBackupQuantity" accesskey="b">
-                    <span class="accessKey">B</span>ackup Count:
+                    <%=intl._("Backup Count")%>(<span class="accessKey">B</span>):
                 </label>
                 <select id="tunnelBackupQuantity" name="tunnelBackupQuantity" title="Number of Reserve Tunnels" class="selectbox">
                     <% int tunnelBackupQuantity = editBean.getTunnelBackupQuantity(curTunnel, 0);
-                  %><option value="0"<%=(tunnelBackupQuantity == 0 ? " selected=\"selected\"" : "") %>>0 backup tunnels (0 redundancy, no added resource usage)</option>
-                    <option value="1"<%=(tunnelBackupQuantity == 1 ? " selected=\"selected\"" : "") %>>1 backup tunnel each direction (low redundancy, low resource usage)</option>
-                    <option value="2"<%=(tunnelBackupQuantity == 2 ? " selected=\"selected\"" : "") %>>2 backup tunnels each direction (medium redundancy, medium resource usage)</option>
-                    <option value="3"<%=(tunnelBackupQuantity == 3 ? " selected=\"selected\"" : "") %>>3 backup tunnels each direction (high redundancy, high resource usage)</option>
+                  %><option value="0"<%=(tunnelBackupQuantity == 0 ? " selected=\"selected\"" : "") %>><%=intl._("0 backup tunnels (0 redundancy, no added resource usage)")%></option>
+                    <option value="1"<%=(tunnelBackupQuantity == 1 ? " selected=\"selected\"" : "") %>><%=intl._("1 backup tunnel each direction (low redundancy, low resource usage)")%></option>
+                    <option value="2"<%=(tunnelBackupQuantity == 2 ? " selected=\"selected\"" : "") %>><%=intl._("2 backup tunnels each direction (medium redundancy, medium resource usage)")%></option>
+                    <option value="3"<%=(tunnelBackupQuantity == 3 ? " selected=\"selected\"" : "") %>><%=intl._("3 backup tunnels each direction (high redundancy, high resource usage)")%></option>
                 <% if (tunnelBackupQuantity > 3) {
-                %>    <option value="<%=tunnelBackupQuantity%>" selected="selected"><%=tunnelBackupQuantity%> backup tunnels</option>
+                %>    <option value="<%=tunnelBackupQuantity%>" selected="selected"><%=tunnelBackupQuantity%> <%=intl._("backup tunnels")%></option>
                 <% }
               %></select>                
             </div>
@@ -270,17 +279,17 @@
             </div>
             
             <div id="optionsField" class="rowItem">
-                <label>I2CP Options:</label>
+                <label><%=intl._("I2CP Options")%>:</label>
             </div>
             <div id="optionsHostField" class="rowItem">
                 <label for="clientHost" accesskey="o">
-                    H<span class="accessKey">o</span>st:
+                    <%=intl._("Host")%>(<span class="accessKey">o</span>):
                 </label>
                 <input type="text" id="clientHost" name="clientHost" size="20" title="I2CP Hostname or IP" value="<%=editBean.getI2CPHost(curTunnel)%>" class="freetext" />                
             </div>
             <div id="optionsPortField" class="rowItem">
                 <label for="clientPort" accesskey="r">
-                    Po<span class="accessKey">r</span>t:
+                    <%=intl._("Port")%>(<span class="accessKey">r</span>):
                 </label>
                 <input type="text" id="clientPort" name="clientport" size="20" title="I2CP Port Number" value="<%=editBean.getI2CPPort(curTunnel)%>" class="freetext" />                
             </div>
@@ -292,24 +301,24 @@
            
             <div id="optionsField" class="rowItem">
                 <label for="reduce" accesskey="d">
-                    Re<span class="accessKey">d</span>uce tunnel quantity when idle:
+                    <%=intl._("Reduce tunnel quantity when idle")%>(<span class="accessKey">d</span>):
                 </label>
             </div>
             <div id="portField" class="rowItem">
                 <label for="access" accesskey="d">
-                    Enable:
+                    <%=intl._("Enable")%>:
                 </label>
                 <input value="1" type="checkbox" id="startOnLoad" name="reduce" title="Reduce Tunnels"<%=(editBean.getReduce(curTunnel) ? " checked=\"checked\"" : "")%> class="tickbox" />                
             </div>
             <div id="portField" class="rowItem">
                 <label for="reduceCount" accesskey="d">
-                    Reduced tunnel count:
+                    <%=intl._("Reduced tunnel count")%>:
                 </label>
                 <input type="text" id="port" name="reduceCount" size="1" maxlength="1" title="Reduced Tunnel Count" value="<%=editBean.getReduceCount(curTunnel)%>" class="freetext" />                
             </div>
             <div id="portField" class="rowItem">
                 <label for="reduceTime" accesskey="d">
-                    Idle minutes:
+                    <%=intl._("Idle minutes")%>:
                 </label>
                 <input type="text" id="port" name="reduceTime" size="4" maxlength="4" title="Reduced Tunnel Idle Time" value="<%=editBean.getReduceTime(curTunnel)%>" class="freetext" />                
             </div>
@@ -320,31 +329,31 @@
            
             <div id="optionsField" class="rowItem">
                 <label for="reduce" accesskey="c">
-                    <span class="accessKey">C</span>lose tunnels when idle:
+                    <%=intl._("Close tunnels when idle")%>(<span class="accessKey">C</span>):
                 </label>
             </div>
             <div id="portField" class="rowItem">
                 <label for="access" accesskey="c">
-                    Enable:
+                    <%=intl._("Enable")%>:
                 </label>
                 <input value="1" type="checkbox" id="startOnLoad" name="close" title="Close Tunnels"<%=(editBean.getClose(curTunnel) ? " checked=\"checked\"" : "")%> class="tickbox" />                
             </div>
             <div id="portField" class="rowItem">
                 <label for="access" accesskey="c">
-                    New Keys on Reopen:
+                    <%=intl._("New Keys on Reopen")%>:
                 </label>
                 <table border="0"><tr><!-- I give up -->
                 <td><input value="1" type="radio" id="startOnLoad" name="newDest" title="New Destination"
                      <%=(editBean.getNewDest(curTunnel) ? " checked=\"checked\"" : "")%> class="tickbox" />                
-                <td>Enable
+                <td><%=intl._("Enable")%>
                 <td><input value="0" type="radio" id="startOnLoad" name="newDest" title="New Destination"
                      <%=(editBean.getNewDest(curTunnel) || editBean.getPersistentClientKey(curTunnel) ? "" : " checked=\"checked\"")%> class="tickbox" />                
-                <td>Disable
+                <td><%=intl._("Disable")%>
                 </table>
             </div>
             <div id="portField" class="rowItem">
                 <label for="reduceTime" accesskey="c">
-                    Idle minutes:
+                    <%=intl._("Idle minutes")%>:
                 </label>
                 <input type="text" id="port" name="closeTime" size="4" maxlength="4" title="Close Tunnel Idle Time" value="<%=editBean.getCloseTime(curTunnel)%>" class="freetext" />                
             </div>
@@ -355,12 +364,12 @@
 
             <div id="optionsField" class="rowItem">
                 <label for="reduce" accesskey="c">
-                    <span class="accessKey">D</span>elay tunnel open until required:
+                    <%=intl._("Delay tunnel open until required")%>(<span class="accessKey">D</span>):
                 </label>
             </div>
             <div id="portField" class="rowItem">
                 <label for="access" accesskey="c">
-                    Enable:
+                    <%=intl._("Enable")%>:
                 </label>
                 <input value="1" type="checkbox" id="startOnLoad" name="delayOpen" title="Delay Tunnel Open"<%=(editBean.getDelayOpen(curTunnel) ? " checked=\"checked\"" : "")%> class="tickbox" />                
             </div>
@@ -373,24 +382,24 @@
          <% if ("client".equals(tunnelType) || "ircclient".equals(tunnelType)) { %>
             <div id="optionsField" class="rowItem">
                 <label for="privKeyFile" accesskey="k">
-                    Persistent private <span class="accessKey">k</span>ey:
+                    <%=intl._("Persistent private key")%>(<span class="accessKey">k</span>):
                 </label>
             </div>
             <div id="portField" class="rowItem">
-                <label>Enable:</label>
+                <label><%=intl._("Enable")%>:</label>
                 <input value="2" type="radio" id="startOnLoad" name="newDest" title="New Destination"
                      <%=(editBean.getPersistentClientKey(curTunnel) ? " checked=\"checked\"" : "")%> class="tickbox" />                
             </div>
             <div id="reachField" class="rowItem">
-                <label>File:</label>
+                <label><%=intl._("File")%>:</label>
                 <input type="text" size="30" id="clientHost" name="privKeyFile" title="Path to Private Key File" value="<%=editBean.getPrivateKeyFile(curTunnel)%>" class="freetext" />               
             </div>
             <div id="destinationField" class="rowItem">
                 <label for="localDestination" accesskey="L">
-                    <span class="accessKey">L</span>ocal destination:
+                    <%=intl._("Local destination")%>(<span class="accessKey">L</span>):
                 </label>
                 <textarea rows="1" style="height: 3em;" cols="60" readonly="readonly" id="localDestination" title="Read Only: Local Destination (if known)" wrap="off"><%=editBean.getDestinationBase64(curTunnel)%></textarea>               
-                <span class="comment">(if known)</span>
+                <span class="comment"><%=intl._("(if known)")%></span>
             </div>
 
             <div class="subdivider">
@@ -400,7 +409,7 @@
            
             <div id="customOptionsField" class="rowItem">
                 <label for="customOptions" accesskey="u">
-                    C<span class="accessKey">u</span>stom options:
+                    <%=intl._("Custom options")%>(<span class="accessKey">u</span>):
                 </label>
                 <input type="text" id="customOptions" name="customOptions" size="60" title="Custom Options" value="<%=editBean.getCustomOptions(curTunnel)%>" class="freetext" />                
             </div>
@@ -412,12 +421,12 @@
             <div class="header"></div>
             <div class="footer">
                 <div class="toolbox">
-                    <span class="comment">NOTE: If tunnel is currently running, most changes will not take effect until tunnel is stopped and restarted.</span>
+                    <span class="comment"><%=intl._("NOTE: If tunnel is currently running, most changes will not take effect until tunnel is stopped and restarted.")%></span>
                      <div class="separator"><hr /></div>
                     <input type="hidden" value="true" name="removeConfirm" />
-                    <button id="controlSave" accesskey="S" class="control" type="submit" name="action" value="Save changes" title="Save Changes"><span class="accessKey">S</span>ave</button>
-                    <button id="controlDelete" <%=(editBean.allowJS() ? "onclick=\"if (!confirm('Are you sure you want to delete?')) { return false; }\" " : "")%>accesskey="D" class="control" type="submit" name="action" value="Delete this proxy" title="Delete this Proxy"><span class="accessKey">D</span>elete</button>
-                    <button id="controlCancel" class="control" type="submit" name="action" value="" title="Cancel">Cancel</button>
+                    <button id="controlSave" accesskey="S" class="control" type="submit" name="action" value="Save changes" title="Save Changes"><%=intl._("Save")%>(<span class="accessKey">S</span>)</button>
+                    <button id="controlDelete" <%=(editBean.allowJS() ? "onclick=\"if (!confirm('Are you sure you want to delete?')) { return false; }\" " : "")%>accesskey="D" class="control" type="submit" name="action" value="Delete this proxy" title="Delete this Proxy"><%=intl._("Delete")%>(<span class="accessKey">D</span>)</button>
+                    <button id="controlCancel" class="control" type="submit" name="action" value="" title="Cancel"><%=intl._("Cancel")%></button>
                 </div>
             </div> 
         </div>
diff --git a/apps/i2ptunnel/jsp/editServer.jsp b/apps/i2ptunnel/jsp/editServer.jsp
index da98470f760c677db6e89a1f8a81a7d1ebec8303..24f6b0d03ef2463f5383e413c360255889c9f0c0 100644
--- a/apps/i2ptunnel/jsp/editServer.jsp
+++ b/apps/i2ptunnel/jsp/editServer.jsp
@@ -39,11 +39,11 @@
                 if (curTunnel >= 0) {
                     tunnelTypeName = editBean.getTunnelType(curTunnel);
                     tunnelType = editBean.getInternalType(curTunnel);
-                  %><h4>Edit server settings</h4><% 
+                  %><h4><%=intl._("Edit server settings")%></h4><% 
                 } else {
                     tunnelTypeName = editBean.getTypeName(request.getParameter("type"));
                     tunnelType = request.getParameter("type");
-                  %><h4>New server settings</h4><% 
+                  %><h4><%=intl._("New server settings")%></h4><% 
                 } %>
                 <input type="hidden" name="tunnel" value="<%=request.getParameter("tunnel")%>" />
                 <input type="hidden" name="nonce" value="<%=editBean.getNextNonce()%>" />
@@ -56,26 +56,26 @@
 
             <div id="nameField" class="rowItem">
                 <label for="name" accesskey="N">
-                    <span class="accessKey">N</span>ame:
+                    <%=intl._("Name")%>(<span class="accessKey">N</span>):
                 </label>
                 <input type="text" size="30" maxlength="50" name="name" id="name" title="Tunnel Name" value="<%=editBean.getTunnelName(curTunnel)%>" class="freetext" />               
             </div>
             <div id="typeField" class="rowItem">
-                <label>Type:</label>
+                <label><%=intl._("Type")%>:</label>
                 <span class="text"><%=tunnelTypeName%></span>
             </div>
             <div id="descriptionField" class="rowItem">
                 <label for="description" accesskey="e">
-                    D<span class="accessKey">e</span>scription:
+                    <%=intl._("Description")%>(<span class="accessKey">e</span>):
                 </label>
                 <input type="text" size="60" maxlength="80" name="description"  id="description" title="Tunnel Description" value="<%=editBean.getTunnelDescription(curTunnel)%>" class="freetext" />                
             </div>
             <div id="startupField" class="rowItem">
                 <label for="startOnLoad" accesskey="a">
-                    <span class="accessKey">A</span>uto Start:
+                    <%=intl._("Auto Start")%>(<span class="accessKey">A</span>):
                 </label>
                 <input value="1" type="checkbox" id="startOnLoad" name="startOnLoad" title="Start Tunnel Automatically"<%=(editBean.startAutomatically(curTunnel) ? " checked=\"checked\"" : "")%> class="tickbox" />                
-                <span class="comment">(Check the Box for 'YES')</span>
+                <span class="comment"><%=intl._("(Check the Box for 'YES')")%></span>
             </div>
                  
             <div class="subdivider">
@@ -84,27 +84,30 @@
                  
             <div id="targetField" class="rowItem">
          <% if ("streamrserver".equals(tunnelType)) { %>
-                <label>Access Point:</label>
+                <label><%=intl._("Access Point")%>:</label>
          <% } else { %>
-                <label>Target:</label>
+                <label><%=intl._("Target")%>:</label>
          <% } %>
             </div>
             <div id="hostField" class="rowItem">
                 <label for="targetHost" accesskey="H">
          <% if ("streamrserver".equals(tunnelType)) { %>
-                    <span class="accessKey">R</span>eachable by:
+                    <%=intl._("Reachable by")%>(<span class="accessKey">R</span>):
          <% } else { %>
-                    <span class="accessKey">H</span>ost:
+                    <%=intl._("Host")%>(<span class="accessKey">H</span>):
          <% } %>
                 </label>
                 <input type="text" size="20" id="targetHost" name="targetHost" title="Target Hostname or IP" value="<%=editBean.getTargetHost(curTunnel)%>" class="freetext" />                
             </div>
             <div id="portField" class="rowItem">
                 <label for="targetPort" accesskey="P">
-                    <span class="accessKey">P</span>ort:
+                    <%=intl._("Port")%>(<span class="accessKey">P</span>):
                     <% String value = editBean.getTargetPort(curTunnel);
-                       if (value == null || "".equals(value.trim()))
-                           out.write(" <font color=\"red\">(required)</font>");
+                       if (value == null || "".equals(value.trim())) {
+                           out.write(" <font color=\"red\">(");
+                           out.write(intl._("required"));
+                           out.write(")</font>");
+                       }   
                      %>
                 </label>
                 <input type="text" size="6" maxlength="5" id="targetPort" name="targetPort" title="Target Port Number" value="<%=editBean.getTargetPort(curTunnel)%>" class="freetext" />               
@@ -117,18 +120,21 @@
             <% if ("httpserver".equals(tunnelType)) {
           %><div id="websiteField" class="rowItem">
                 <label for="spoofedHost" accesskey="W">
-                    <span class="accessKey">W</span>ebsite name:
+                    <%=intl._("Website name")%>(<span class="accessKey">W</span>):
                 </label>
                 <input type="text" size="20" id="targetHost" name="spoofedHost" title="Website Host Name" value="<%=editBean.getSpoofedHost(curTunnel)%>" class="freetext" />                
-                <span class="comment">(leave blank for outproxies)</span>
+                <span class="comment"><%=intl._("(leave blank for outproxies)")%></span>
             </div>
             <% }
           %><div id="privKeyField" class="rowItem">
                 <label for="privKeyFile" accesskey="k">
-                    Private <span class="accessKey">k</span>ey file:
+                    <%=intl._("Private key file")%>(<span class="accessKey">k</span>):
                     <% String value2 = editBean.getPrivateKeyFile(curTunnel);
-                       if (value2 == null || "".equals(value2.trim()))
-                           out.write(" <font color=\"red\">(required)</font>");
+                       if (value2 == null || "".equals(value2.trim())) {
+                           out.write(" <font color=\"red\">(");
+                           out.write(intl._("required"));
+                           out.write(")</font>");
+                       }
                      %>
                 </label>
                 <input type="text" size="30" id="privKeyFile" name="privKeyFile" title="Path to Private Key File" value="<%=editBean.getPrivateKeyFile(curTunnel)%>" class="freetext" />               
@@ -136,22 +142,22 @@
          <% if (!"streamrserver".equals(tunnelType)) { %>
             <div id="profileField" class="rowItem">
                 <label for="profile" accesskey="f">
-                    Pro<span class="accessKey">f</span>ile:
+                    <%=intl._("Profile")%>(<span class="accessKey">f</span>):
                 </label>
                 <select id="profile" name="profile" title="Connection Profile" class="selectbox">
                     <% boolean interactiveProfile = editBean.isInteractive(curTunnel);
-                  %><option <%=(interactiveProfile == true  ? "selected=\"selected\" " : "")%>value="interactive">interactive connection </option>
-                    <option <%=(interactiveProfile == false ? "selected=\"selected\" " : "")%>value="bulk">bulk connection (downloads/websites/BT) </option>
+                  %><option <%=(interactiveProfile == true  ? "selected=\"selected\" " : "")%>value="interactive"><%=intl._("interactive connection")%> </option>
+                    <option <%=(interactiveProfile == false ? "selected=\"selected\" " : "")%>value="bulk"><%=intl._("bulk connection (downloads/websites/BT)")%> </option>
                 </select>                
             </div> 
          <% } // !streamrserver %>
             <div id="destinationField" class="rowItem">
                 <label for="localDestination" accesskey="L">
-                    <span class="accessKey">L</span>ocal destination:
+                    <%=intl._("Local destination")%>(<span class="accessKey">L</span>):
                 </label>
                 <textarea rows="1" style="height: 3em;" cols="60" readonly="readonly" id="localDestination" title="Read Only: Local Destination (if known)" wrap="off"><%=editBean.getDestinationBase64(curTunnel)%></textarea>               
          <% if (!"".equals(editBean.getDestinationBase64(curTunnel))) { %>    
-            <a href="/susidns/addressbook.jsp?book=private&hostname=<%=editBean.getTunnelName(curTunnel)%>&destination=<%=editBean.getDestinationBase64(curTunnel)%>#add">Add to local addressbook</a>    
+            <a href="/susidns/addressbook.jsp?book=private&hostname=<%=editBean.getTunnelName(curTunnel)%>&destination=<%=editBean.getDestinationBase64(curTunnel)%>#add"><%=intl._("Add to local addressbook")%></a>    
          <% } %>
             </div>
             
@@ -161,7 +167,7 @@
 
         <div id="tunnelAdvancedNetworking" class="panel">
             <div class="header">
-                <h4>Advanced networking options</h4>
+                <h4><%=intl._("Advanced networking options")%></h4>
             </div>
 
             <div class="separator">
@@ -169,65 +175,65 @@
             </div>
             
             <div id="tunnelOptionsField" class="rowItem">
-                <label>Tunnel Options:</label>
+                <label><%=intl._("Tunnel Options")%>:</label>
             </div>
             <div id="depthField" class="rowItem">
                 <label for="tunnelDepth" accesskey="t">
-                    Leng<span class="accessKey">t</span>h:
+                    <%=intl._("Length")%>(<span class="accessKey">t</span>):
                 </label>
                 <select id="tunnelDepth" name="tunnelDepth" title="Length of each Tunnel" class="selectbox">
                     <% int tunnelDepth = editBean.getTunnelDepth(curTunnel, 2);
-                  %><option value="0"<%=(tunnelDepth == 0 ? " selected=\"selected\"" : "") %>>0 hop tunnel (low anonymity, low latency)</option>
-                    <option value="1"<%=(tunnelDepth == 1 ? " selected=\"selected\"" : "") %>>1 hop tunnel (medium anonymity, medium latency)</option>
-                    <option value="2"<%=(tunnelDepth == 2 ? " selected=\"selected\"" : "") %>>2 hop tunnel (high anonymity, high latency)</option>
-                    <option value="3"<%=(tunnelDepth == 3 ? " selected=\"selected\"" : "") %>>3 hop tunnel (very high anonymity, poor performance)</option>
+                  %><option value="0"<%=(tunnelDepth == 0 ? " selected=\"selected\"" : "") %>><%=intl._("0 hop tunnel (low anonymity, low latency)")%></option>
+                    <option value="1"<%=(tunnelDepth == 1 ? " selected=\"selected\"" : "") %>><%=intl._("1 hop tunnel (medium anonymity, medium latency)")%></option>
+                    <option value="2"<%=(tunnelDepth == 2 ? " selected=\"selected\"" : "") %>><%=intl._("2 hop tunnel (high anonymity, high latency)")%></option>
+                    <option value="3"<%=(tunnelDepth == 3 ? " selected=\"selected\"" : "") %>><%=intl._("3 hop tunnel (very high anonymity, poor performance)")%></option>
                 <% if (tunnelDepth > 3) { 
-                %>    <option value="<%=tunnelDepth%>" selected="selected"><%=tunnelDepth%> hop tunnel (very poor performance)</option>
+                %>    <option value="<%=tunnelDepth%>" selected="selected"><%=tunnelDepth%> <%=intl._("hop tunnel (very poor performance)")%></option>
                 <% }
               %></select>
             </div>
             <div id="varianceField" class="rowItem">
                 <label for="tunnelVariance" accesskey="v">
-                    <span class="accessKey">V</span>ariance:
+                    <%=intl._("Variance")%>(<span class="accessKey">V</span>):
                 </label>
                 <select id="tunnelVariance" name="tunnelVariance" title="Level of Randomization for Tunnel Depth" class="selectbox">
                     <% int tunnelVariance = editBean.getTunnelVariance(curTunnel, 0);
-                  %><option value="0"<%=(tunnelVariance  ==  0 ? " selected=\"selected\"" : "") %>>0 hop variance          (no randomisation, consistant performance)</option>
-                    <option value="1"<%=(tunnelVariance  ==  1 ? " selected=\"selected\"" : "") %>>+ 0-1 hop variance      (medium additive randomisation, subtractive performance)</option>
-                    <option value="2"<%=(tunnelVariance  ==  2 ? " selected=\"selected\"" : "") %>>+ 0-2 hop variance      (high additive randomisation, subtractive performance)</option>
-                    <option value="-1"<%=(tunnelVariance == -1 ? " selected=\"selected\"" : "") %>>+/- 0-1 hop variance    (standard randomisation, standard performance)</option>
-                    <option value="-2"<%=(tunnelVariance == -2 ? " selected=\"selected\"" : "") %>>+/- 0-2 hop variance    (not recommended)</option>
+                  %><option value="0"<%=(tunnelVariance  ==  0 ? " selected=\"selected\"" : "") %>><%=intl._("0 hop variance (no randomisation, consistant performance)")%></option>
+                    <option value="1"<%=(tunnelVariance  ==  1 ? " selected=\"selected\"" : "") %>><%=intl._("+ 0-1 hop variance (medium additive randomisation, subtractive performance)")%></option>
+                    <option value="2"<%=(tunnelVariance  ==  2 ? " selected=\"selected\"" : "") %>><%=intl._("+ 0-2 hop variance (high additive randomisation, subtractive performance)")%></option>
+                    <option value="-1"<%=(tunnelVariance == -1 ? " selected=\"selected\"" : "") %>><%=intl._("+/- 0-1 hop variance (standard randomisation, standard performance)")%></option>
+                    <option value="-2"<%=(tunnelVariance == -2 ? " selected=\"selected\"" : "") %>><%=intl._("+/- 0-2 hop variance (not recommended)")%></option>
                 <% if (tunnelVariance > 2 || tunnelVariance < -2) {
-                %>    <option value="<%=tunnelVariance%>" selected="selected"><%= (tunnelVariance > 2 ? "+ " : "+/- ") %>0-<%=tunnelVariance%> hop variance</option>
+                %>    <option value="<%=tunnelVariance%>" selected="selected"><%= (tunnelVariance > 2 ? "+ " : "+/- ") %>0-<%=tunnelVariance%> <%=intl._("hop variance")%></option>
                 <% }
               %></select>                
             </div>
             <div id="countField" class="rowItem">
                 <label for="tunnelQuantity" accesskey="C">
-                    <span class="accessKey">C</span>ount:
+                    <%=intl._("Count")%>(<span class="accessKey">C</span>):
                 </label>
                 <select id="tunnelQuantity" name="tunnelQuantity" title="Number of Tunnels in Group" class="selectbox">
                     <% int tunnelQuantity = editBean.getTunnelQuantity(curTunnel, 2);
-                  %><option value="1"<%=(tunnelQuantity == 1 ? " selected=\"selected\"" : "") %>>1 inbound, 1 outbound tunnel  (low bandwidth usage, less reliability)</option>
-                    <option value="2"<%=(tunnelQuantity == 2 ? " selected=\"selected\"" : "") %>>2 inbound, 2 outbound tunnels (standard bandwidth usage, standard reliability)</option>
-                    <option value="3"<%=(tunnelQuantity == 3 ? " selected=\"selected\"" : "") %>>3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)</option>
+                  %><option value="1"<%=(tunnelQuantity == 1 ? " selected=\"selected\"" : "") %>><%=intl._("1 inbound, 1 outbound tunnel  (low bandwidth usage, less reliability)")%></option>
+                    <option value="2"<%=(tunnelQuantity == 2 ? " selected=\"selected\"" : "") %>><%=intl._("2 inbound, 2 outbound tunnels (standard bandwidth usage, standard reliability)")%></option>
+                    <option value="3"<%=(tunnelQuantity == 3 ? " selected=\"selected\"" : "") %>><%=intl._("3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)")%></option>
                 <% if (tunnelQuantity > 3) {
-                %>    <option value="<%=tunnelQuantity%>" selected="selected"><%=tunnelQuantity%> tunnels</option>
+                %>    <option value="<%=tunnelQuantity%>" selected="selected"><%=tunnelQuantity%> <%=intl._("tunnels")%></option>
                 <% }
               %></select>                
             </div>
             <div id="backupField" class="rowItem">
                 <label for="tunnelBackupQuantity" accesskey="b">
-                    <span class="accessKey">B</span>ackup Count:
+                    <%=intl._("Backup Count")%>(<span class="accessKey">B</span>):
                 </label>
                 <select id="tunnelBackupQuantity" name="tunnelBackupQuantity" title="Number of Reserve Tunnels" class="selectbox">
                     <% int tunnelBackupQuantity = editBean.getTunnelBackupQuantity(curTunnel, 0);
-                  %><option value="0"<%=(tunnelBackupQuantity == 0 ? " selected=\"selected\"" : "") %>>0 backup tunnels      (0 redundancy, no added resource usage)</option>
-                    <option value="1"<%=(tunnelBackupQuantity == 1 ? " selected=\"selected\"" : "") %>>1 backup tunnel each direction (low redundancy, low resource usage)</option>
-                    <option value="2"<%=(tunnelBackupQuantity == 2 ? " selected=\"selected\"" : "") %>>2 backup tunnels each direction (medium redundancy, medium resource usage)</option>
-                    <option value="3"<%=(tunnelBackupQuantity == 3 ? " selected=\"selected\"" : "") %>>3 backup tunnels each direction (high redundancy, high resource usage)</option>
+                  %><option value="0"<%=(tunnelBackupQuantity == 0 ? " selected=\"selected\"" : "") %>><%=intl._("0 backup tunnels (0 redundancy, no added resource usage)")%></option>
+                    <option value="1"<%=(tunnelBackupQuantity == 1 ? " selected=\"selected\"" : "") %>><%=intl._("1 backup tunnel each direction (low redundancy, low resource usage)")%></option>
+                    <option value="2"<%=(tunnelBackupQuantity == 2 ? " selected=\"selected\"" : "") %>><%=intl._("2 backup tunnels each direction (medium redundancy, medium resource usage)")%></option>
+                    <option value="3"<%=(tunnelBackupQuantity == 3 ? " selected=\"selected\"" : "") %>><%=intl._("3 backup tunnels each direction (high redundancy, high resource usage)")%></option>
                 <% if (tunnelBackupQuantity > 3) {
-                %>    <option value="<%=tunnelBackupQuantity%>" selected="selected"><%=tunnelBackupQuantity%> backup tunnels</option>
+                %>    <option value="<%=tunnelBackupQuantity%>" selected="selected"><%=tunnelBackupQuantity%> <%=intl._("backup tunnels")%></option>
                 <% }
               %></select>                
             </div>
@@ -237,17 +243,17 @@
             </div>
             
             <div id="optionsField" class="rowItem">
-                <label>I2CP Options:</label>
+                <label><%=intl._("I2CP Options")%>:</label>
             </div>
             <div id="optionsHostField" class="rowItem">
                 <label for="clientHost" accesskey="o">
-                    H<span class="accessKey">o</span>st:
+                    <%=intl._("Host")%>(<span class="accessKey">o</span>):
                 </label>
                 <input type="text" id="clientHost" name="clientHost" size="20" title="I2CP Hostname or IP" value="<%=editBean.getI2CPHost(curTunnel)%>" class="freetext" />                
             </div>
             <div id="optionsPortField" class="rowItem">
                 <label for="clientPort" accesskey="r">
-                    Po<span class="accessKey">r</span>t:
+                    <%=intl._("Port")%>(<span class="accessKey">r</span>):
                 </label>
                 <input type="text" id="clientPort" name="clientport" size="20" title="I2CP Port Number" value="<%=editBean.getI2CPPort(curTunnel)%>" class="freetext" />                
             </div>
@@ -258,27 +264,27 @@
            
             <div id="optionsField" class="rowItem">
                 <label for="encrypt" accesskey="e">
-                    <span class="accessKey">E</span>ncrypt Leaseset:
+                    <%=intl._("Encrypt Leaseset")%>(<span class="accessKey">E</span>):
                 </label>
             </div>
             <div id="portField" class="rowItem">
                 <label for="encrypt" accesskey="e">
-                    Enable:
+                    <%=intl._("Enable")%>:
                 </label>
                 <input value="1" type="checkbox" id="startOnLoad" name="encrypt" title="Encrypt LeaseSet"<%=(editBean.getEncrypt(curTunnel) ? " checked=\"checked\"" : "")%> class="tickbox" />                
             </div>
             <div id="portField" class="rowItem">
                 <label for="encrypt" accesskey="e">
-                    Encryption Key:
+                    <%=intl._("Encryption Key")%>:
                 </label>
                 <textarea rows="1" style="height: 3em;" cols="44" id="portField" name="encryptKey" title="Encrypt Key" wrap="off"><%=editBean.getEncryptKey(curTunnel)%></textarea>               
             </div>
             <div id="portField" class="rowItem">
                 <label for="force" accesskey="c">
-                    Generate New Key:
+                    <%=intl._("Generate New Key")%>:
                 </label>
-                <button id="controlSave" accesskey="S" class="control" type="submit" name="action" value="Generate" title="Generate New Key Now">Generate</button>
-                <span class="comment">(Tunnel must be stopped first)</span>
+                <button id="controlSave" accesskey="S" class="control" type="submit" name="action" value="Generate" title="Generate New Key Now"><%=intl._("Generate")%></button>
+                <span class="comment"><%=intl._("(Tunnel must be stopped first)")%></span>
             </div>
                  
             <div class="subdivider">
@@ -287,21 +293,21 @@
            
             <div id="optionsField" class="rowItem">
                 <label for="access" accesskey="s">
-                    Restricted Acce<span class="accessKey">s</span>s List: <i>Unimplemented</i>
+                    <%=intl._("Restricted Access List")%>(<span class="accessKey">s</span>): <i><%=intl._("Unimplemented")%></i>
                 </label>
             </div>
             <div id="portField" class="rowItem">
                 <label for="access" accesskey="s">
-                    Enable:
+                    <%=intl._("Enable")%>:
                 </label>
                 <input value="1" type="checkbox" id="startOnLoad" name="access" title="Enable Access List"<%=(editBean.getAccess(curTunnel) ? " checked=\"checked\"" : "")%> class="tickbox" />                
             </div>
             <div id="hostField" class="rowItem">
                 <label for="accessList" accesskey="s">
-                    Access List:
+                    <%=intl._("Access List")%>:
                 </label>
                 <textarea rows="2" style="height: 4em;" cols="60" id="hostField" name="accessList" title="Access List" wrap="off"><%=editBean.getAccessList(curTunnel)%></textarea>               
-                <span class="comment">(Restrict to these clients only)</span>
+                <span class="comment"><%=intl._("(Restrict to these clients only)")%></span>
             </div>
                  
             <div class="subdivider">
@@ -310,24 +316,24 @@
            
             <div id="optionsField" class="rowItem">
                 <label for="reduce" accesskey="d">
-                    Re<span class="accessKey">d</span>uce tunnel quantity when idle:
+                    <%=intl._("Reduce tunnel quantity when idle")%>(<span class="accessKey">d</span>):
                 </label>
             </div>
             <div id="portField" class="rowItem">
                 <label for="access" accesskey="d">
-                    Enable:
+                    <%=intl._("Enable")%>:
                 </label>
                 <input value="1" type="checkbox" id="startOnLoad" name="reduce" title="Reduce Tunnels"<%=(editBean.getReduce(curTunnel) ? " checked=\"checked\"" : "")%> class="tickbox" />                
             </div>
             <div id="portField" class="rowItem">
                 <label for="reduceCount" accesskey="d">
-                    Reduced tunnel count:
+                    <%=intl._("Reduced tunnel count")%>:
                 </label>
                 <input type="text" id="port" name="reduceCount" size="1" maxlength="1" title="Reduced Tunnel Count" value="<%=editBean.getReduceCount(curTunnel)%>" class="freetext" />                
             </div>
             <div id="portField" class="rowItem">
                 <label for="reduceTime" accesskey="d">
-                    Idle minutes:
+                    <%=intl._("Idle minutes")%>:
                 </label>
                 <input type="text" id="port" name="reduceTime" size="4" maxlength="4" title="Reduced Tunnel Idle Time" value="<%=editBean.getReduceTime(curTunnel)%>" class="freetext" />                
             </div>
@@ -338,36 +344,36 @@
            
             <div id="tunnelOptionsField" class="rowItem">
                 <label for="cert" accesskey="c">
-                    New <span class="accessKey">C</span>ertificate type:
+                    <%=intl._("New Certificate type")%>(<span class="accessKey">C</span>):
                 </label>
             </div>
             <div id="hostField" class="rowItem">
               <div id="portField" class="rowItem">
-                <label>None</label>
+                <label><%=intl._("None")%></label>
                 <input value="0" type="radio" id="startOnLoad" name="cert" title="No Certificate"<%=(editBean.getCert(curTunnel)==0 ? " checked=\"checked\"" : "")%> class="tickbox" />                
                 <span class="comment"></span>
               </div>
               <div id="portField" class="rowItem">
-                <label>Hashcash (effort)</label>
+                <label><%=intl._("Hashcash (effort)")%></label>
                 <input value="1" type="radio" id="startOnLoad" name="cert" title="Hashcash Certificate"<%=(editBean.getCert(curTunnel)==1 ? " checked=\"checked\"" : "")%> class="tickbox" />                
                 <input type="text" id="port" name="effort" size="2" maxlength="2" title="Hashcash Effort" value="<%=editBean.getEffort(curTunnel)%>" class="freetext" />                
               </div>
             </div>
             <div id="portField" class="rowItem">
                 <label for="force" accesskey="c">
-                    Hashcash Calc Time:
+                    <%=intl._("Hashcash Calc Time")%>:
                 </label>
-                <button id="controlSave" accesskey="S" class="control" type="submit" name="action" value="Estimate" title="Estimate Calculation Time">Estimate</button>
+                <button id="controlSave" accesskey="S" class="control" type="submit" name="action" value="Estimate" title="Estimate Calculation Time"><%=intl._("Estimate")%></button>
             </div>
             <div id="hostField" class="rowItem">
               <div id="portField" class="rowItem">
-                <label>Hidden</label>
+                <label><%=intl._("Hidden")%></label>
                 <input value="2" type="radio" id="startOnLoad" name="cert" title="Hidden Certificate"<%=(editBean.getCert(curTunnel)==2 ? " checked=\"checked\"" : "")%> class="tickbox" />                
                 <span class="comment"></span>
               </div>
               <div id="portField" class="rowItem">
                 <label for="signer" accesskey="c">
-                    Signed (signed by):
+                    <%=intl._("Signed (signed by)")%>:
                 </label>
                 <input value="3" type="radio" id="startOnLoad" name="cert" title="Signed Certificate"<%=(editBean.getCert(curTunnel)==3 ? " checked=\"checked\"" : "")%> class="tickbox" />                
                 <input type="text" id="port" name="signer" size="50" title="Cert Signer" value="<%=editBean.getSigner(curTunnel)%>" class="freetext" />                
@@ -376,10 +382,10 @@
             </div>
             <div id="portField" class="rowItem">
                 <label for="force" accesskey="c">
-                    Modify Certificate:
+                    <%=intl._("Modify Certificate")%>:
                 </label>
-                <button id="controlSave" accesskey="S" class="control" type="submit" name="action" value="Modify" title="Force New Cert Now">Modify</button>
-                <span class="comment">(Tunnel must be stopped first)</span>
+                <button id="controlSave" accesskey="S" class="control" type="submit" name="action" value="Modify" title="Force New Cert Now"><%=intl._("Modify")%></button>
+                <span class="comment"><%=intl._("(Tunnel must be stopped first)")%></span>
             </div>
                  
             <div class="subdivider">
@@ -388,7 +394,7 @@
                  
             <div id="customOptionsField" class="rowItem">
                 <label for="customOptions" accesskey="u">
-                    C<span class="accessKey">u</span>stom options:
+                    <%=intl._("Custom options")%>(<span class="accessKey">u</span>):
                 </label>
                 <input type="text" id="customOptions" name="customOptions" size="60" title="Custom Options" value="<%=editBean.getCustomOptions(curTunnel)%>" class="freetext" />                
             </div>
@@ -400,12 +406,12 @@
             <div class="header"></div>
             <div class="footer">
                 <div class="toolbox">
-                    <span class="comment">NOTE: If tunnel is currently running, most changes will not take effect until tunnel is stopped and restarted.</span>
+                    <span class="comment"><%=intl._("NOTE: If tunnel is currently running, most changes will not take effect until tunnel is stopped and restarted.")%></span>
                     <div class="separator"><hr /></div>
                     <input type="hidden" value="true" name="removeConfirm" />
-                    <button id="controlSave" accesskey="S" class="control" type="submit" name="action" value="Save changes" title="Save Changes"><span class="accessKey">S</span>ave</button>
-                    <button id="controlDelete" <%=(editBean.allowJS() ? "onclick=\"if (!confirm('Are you sure you want to delete?')) { return false; }\" " : "")%>accesskey="D" class="control" type="submit" name="action" value="Delete this proxy" title="Delete this Proxy"><span class="accessKey">D</span>elete</button>
-                    <button id="controlCancel" class="control" type="submit" name="action" value="" title="Cancel">Cancel</button>
+                    <button id="controlSave" accesskey="S" class="control" type="submit" name="action" value="Save changes" title="Save Changes"><%=intl._("Save")%>(<span class="accessKey">S</span>)</button>
+                    <button id="controlDelete" <%=(editBean.allowJS() ? "onclick=\"if (!confirm('Are you sure you want to delete?')) { return false; }\" " : "")%>accesskey="D" class="control" type="submit" name="action" value="Delete this proxy" title="Delete this Proxy"><%=intl._("Delete")%>(<span class="accessKey">D</span>)</button>
+                    <button id="controlCancel" class="control" type="submit" name="action" value="" title="Cancel"><%=intl._("Cancel")%></button>
                 </div>
             </div> 
         </div>
diff --git a/apps/i2ptunnel/jsp/index.jsp b/apps/i2ptunnel/jsp/index.jsp
index 6c2f7f73e4b216485be31cb5aa777d0516fd0c0e..6dcad017b545ba0e824a7e212101e02dcbaa470c 100644
--- a/apps/i2ptunnel/jsp/index.jsp
+++ b/apps/i2ptunnel/jsp/index.jsp
@@ -29,7 +29,7 @@
 
     <div id="statusMessagePanel" class="panel">
         <div class="header">
-            <h4>Status Messages</h4>
+            <h4><%=intl._("Status Messages")%></h4>
         </div>
 
         <div class="separator">
@@ -44,7 +44,7 @@
 
         <div class="footer">
             <div class="toolbox">
-                <a class="control" href="index.jsp">Refresh</a>
+                <a class="control" href="index.jsp"><%=intl._("Refresh")%></a>
             </div>
         </div>    
     </div>
@@ -53,7 +53,7 @@
         <div class="header"></div>
         <div class="footer">
             <div class="toolbox">
-                <a class="control" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=Stop%20all">Stop All</a> <a class="control" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=Start%20all">Start All</a> <a class="control" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=Restart%20all">Restart All</a> <a class="control" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=Reload%20configuration">Reload Config</a>
+                <a class="control" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=Stop%20all"><%=intl._("Stop All")%></a> <a class="control" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=Start%20all"><%=intl._("Start All")%></a> <a class="control" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=Restart%20all"><%=intl._("Restart All")%></a> <a class="control" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=Reload%20configuration"><%=intl._("Reload Config")%></a>
             </div>
         </div> 
     </div>
@@ -63,23 +63,23 @@
     <div id="localServerTunnelList" class="panel">
         <div class="header">
             
-    <h4>I2P Server Tunnels</h4>
+    <h4><%=intl._("I2P Server Tunnels")%></h4>
         </div>
 
         
   <div class="separator"> </div>
 
         <div class="nameHeaderField rowItem">
-            <label>Name:</label>
+            <label><%=intl._("Name")%>:</label>
         </div>
         <div class="previewHeaderField rowItem">
-            <label>Points at:</label>
+            <label><%=intl._("Points at")%>:</label>
         </div>
         <div class="targetHeaderField rowItem">
-            <label>Preview:</label>
+            <label><%=intl._("Preview")%>:</label>
         </div>
         <div class="statusHeaderField rowItem">
-            <label>Status:</label>
+            <label><%=intl._("Status")%>:</label>
 <hr />        </div>
         
         <%
@@ -88,11 +88,11 @@
             
       %>
         <div class="nameField rowItem">
-            <label>Name:</label>
+            <label><%=intl._("Name")%>:</label>
             <span class="text"><a href="edit.jsp?tunnel=<%=curServer%>" title="Edit Server Tunnel Settings for <%=indexBean.getTunnelName(curServer)%>"><%=indexBean.getTunnelName(curServer)%></a></span>
         </div>
         <div class="previewField rowItem">
-            <label>Points at:</label>
+            <label><%=intl._("Points at")%>:</label>
             <span class="text">
         <%
             if ("httpserver".equals(indexBean.getInternalType(curServer))) {
@@ -108,41 +108,41 @@
         <div class="targetField rowItem">
             <%
             if ("httpserver".equals(indexBean.getInternalType(curServer)) && indexBean.getTunnelStatus(curServer) == IndexBean.RUNNING) {
-          %><label>Preview:</label>    
-            <a class="control" title="Test HTTP server through I2P" href="http://<%=indexBean.getDestHashBase32(curServer)%>.b32.i2p">Preview</a>     
+          %><label><%=intl._("Preview")%>:</label>    
+            <a class="control" title="Test HTTP server through I2P" href="http://<%=indexBean.getDestHashBase32(curServer)%>.b32.i2p"><%=intl._("Preview")%></a>     
             <%
             } else if (indexBean.getTunnelStatus(curServer) == IndexBean.RUNNING) {
-          %><span class="text">Base32 Address:<br /><%=indexBean.getDestHashBase32(curServer)%>.b32.i2p</span>
+          %><span class="text"><%=intl._("Base32 Address")%>:<br /><%=indexBean.getDestHashBase32(curServer)%>.b32.i2p</span>
         <%
             } else {
-          %><span class="comment">No Preview</span>
+          %><span class="comment"><%=intl._("No Preview")%></span>
         <%
             }
       %></div>
         <div class="statusField rowItem">
-            <label>Status:</label>
+            <label><%=intl._("Status")%>:</label>
             <%
             switch (indexBean.getTunnelStatus(curServer)) {
                 case IndexBean.STARTING:
-          %><div class="statusStarting text">Starting...</div>    
-            <a class="control" title="Stop this Tunnel" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=stop&amp;tunnel=<%=curServer%>">Stop</a>
+          %><div class="statusStarting text"><%=intl._("Starting...")%></div>    
+            <a class="control" title="Stop this Tunnel" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=stop&amp;tunnel=<%=curServer%>"><%=intl._("Stop")%></a>
         <%
                 break;
                 case IndexBean.RUNNING:
-          %><div class="statusRunning text">Running</div>    
-            <a class="control" title="Stop this Tunnel" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=stop&amp;tunnel=<%=curServer%>">Stop</a>
+          %><div class="statusRunning text"><%=intl._("Running")%></div>    
+            <a class="control" title="Stop this Tunnel" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=stop&amp;tunnel=<%=curServer%>"><%=intl._("Stop")%></a>
         <%
                 break;
                 case IndexBean.NOT_RUNNING:
-          %><div class="statusNotRunning text">Stopped</div>    
-            <a class="control" title="Start this Tunnel" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=start&amp;tunnel=<%=curServer%>">Start</a>
+          %><div class="statusNotRunning text"><%=intl._("Stopped")%></div>    
+            <a class="control" title="Start this Tunnel" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=start&amp;tunnel=<%=curServer%>"><%=intl._("Start")%></a>
         <%
                 break;
             }
       %></div>
 
         <div class="descriptionField rowItem">
-            <label>Description:</label>
+            <label><%=intl._("Description")%>:</label>
             <div class="text"><%=indexBean.getTunnelDescription(curServer)%></div>
         </div>
 
@@ -160,14 +160,14 @@
             <form id="addNewServerTunnelForm" action="edit.jsp"> 
             <div class="toolbox">
                     
-        <label>New server tunnel:</label>
+        <label><%=intl._("New server tunnel")%>:</label>
                     <select name="type">
-                        <option value="server">Standard</option>
+                        <option value="server"><%=intl._("Standard")%></option>
                         <option value="httpserver">HTTP</option>
                         <option value="ircserver">IRC</option>
                         <option value="streamrserver">Streamr</option>
                     </select>
-                    <input class="control" type="submit" value="Create" />
+                    <input class="control" type="submit" value="<%=intl._("Create")%>" />
                 </div>
             </form>
         </div>
@@ -177,26 +177,26 @@
     <div id="localClientTunnelList" class="panel">
         <div class="header">
             
-    <h4>I2P Client Tunnels</h4>
+    <h4><%=intl._("I2P Client Tunnels")%></h4>
         </div>
 
         
   <div class="separator"> </div>
         
         <div class="nameHeaderField rowItem">
-            <label>Name:</label>
+            <label><%=intl._("Name")%>:</label>
         </div>
         <div class="portHeaderField rowItem">
-            <label>Port:</label>
+            <label><%=intl._("Port")%>:</label>
         </div>
         <div class="typeHeaderField rowItem">
-            <label>Type:</label>
+            <label><%=intl._("Type")%>:</label>
         </div>
         <div class="interfaceHeaderField rowItem">
-            <label>Interface:</label>
+            <label><%=intl._("Interface")%>:</label>
         </div>
         <div class="statusHeaderField rowItem">
-            <label>Status:</label>
+            <label><%=intl._("Status")%>:</label>
         </div>
 
         <div class="separator">
@@ -207,43 +207,43 @@
             if (!indexBean.isClient(curClient)) continue;
       %>
         <div class="nameField rowItem">
-            <label>Name:</label>
+            <label><%=intl._("Name")%>:</label>
             <span class="text"><a href="edit.jsp?tunnel=<%=curClient%>" title="Edit Tunnel Settings for <%=indexBean.getTunnelName(curClient)%>"><%=indexBean.getTunnelName(curClient)%></a></span>
         </div>
         <div class="portField rowItem">
-            <label>Port:</label>
+            <label><%=intl._("Port")%>:</label>
             <span class="text"><%=indexBean.getClientPort(curClient)%></span>
         </div>
         <div class="typeField rowItem">
-            <label>Type:</label>
+            <label><%=intl._("Type")%>:</label>
             <span class="text"><%=indexBean.getTunnelType(curClient)%></span>
         </div>
         <div class="interfaceField rowItem">
-            <label>Interface:</label>
+            <label><%=intl._("Interface")%>:</label>
             <span class="text"><%=indexBean.getClientInterface(curClient)%></span>
         </div>
         <div class="statusField rowItem">
-            <label>Status:</label>
+            <label><%=intl._("Status")%>:</label>
             <%
             switch (indexBean.getTunnelStatus(curClient)) {
                 case IndexBean.STARTING:
-          %><div class="statusStarting text">Starting...</div>
-            <a class="control" title="Stop this Tunnel" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=stop&amp;tunnel=<%=curClient%>">Stop</a>
+          %><div class="statusStarting text"><%=intl._("Starting...")%></div>
+            <a class="control" title="Stop this Tunnel" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=stop&amp;tunnel=<%=curClient%>"><%=intl._("Stop")%></a>
         <%
                 break;
                 case IndexBean.STANDBY:
-          %><div class="statusStarting text">Standby</div>
-            <a class="control" title="Stop this Tunnel" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=stop&amp;tunnel=<%=curClient%>">Stop</a>
+          %><div class="statusStarting text"><%=intl._("Standby")%></div>
+            <a class="control" title="Stop this Tunnel" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=stop&amp;tunnel=<%=curClient%>"><%=intl._("Stop")%></a>
         <%
                 break;
                 case IndexBean.RUNNING:
-          %><div class="statusRunning text">Running</div>
-            <a class="control" title="Stop this Tunnel" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=stop&amp;tunnel=<%=curClient%>">Stop</a>
+          %><div class="statusRunning text"><%=intl._("Running")%></div>
+            <a class="control" title="Stop this Tunnel" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=stop&amp;tunnel=<%=curClient%>"><%=intl._("Stop")%></a>
         <%
                 break;
                 case IndexBean.NOT_RUNNING:
-          %><div class="statusNotRunning text">Stopped</div>
-            <a class="control" title="Start this Tunnel" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=start&amp;tunnel=<%=curClient%>">Start</a>
+          %><div class="statusNotRunning text"><%=intl._("Stopped")%></div>
+            <a class="control" title="Start this Tunnel" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=start&amp;tunnel=<%=curClient%>"><%=intl._("Start")%></a>
         <%
                 break;
             }
@@ -253,9 +253,9 @@
         <div class="destinationField rowItem">
             <label>
             <% if ("httpclient".equals(indexBean.getInternalType(curClient)) || "connectclient".equals(indexBean.getInternalType(curClient))) { %>
-                Outproxy:
+                <%=intl._("Outproxy")%>:
             <% } else { %>
-                Destination:
+                <%=intl._("Destination")%>:
             <% } %>
             </label>
             <input class="freetext" size="40" readonly="readonly" value="<%=indexBean.getClientDestination(curClient)%>" />
@@ -263,7 +263,7 @@
       <% } %>
 
         <div class="descriptionField rowItem">
-            <label>Description:</label>
+            <label><%=intl._("Description")%>:</label>
             <div class="text"><%=indexBean.getTunnelDescription(curClient)%></div>
         </div>
 
@@ -281,16 +281,16 @@
             <form id="addNewClientTunnelForm" action="edit.jsp">
                 <div class="toolbox">
                     
-        <label>New client tunnel:</label>
+        <label><%=intl._("New client tunnel")%>:</label>
                     <select name="type">
-                        <option value="client">Standard</option>
+                        <option value="client"><%=intl._("Standard")%></option>
                         <option value="httpclient">HTTP</option>
                         <option value="ircclient">IRC</option>
                         <option value="sockstunnel">SOCKS 4/4a/5</option>
                         <option value="connectclient">CONNECT</option>
                         <option value="streamrclient">Streamr</option>
                     </select>
-                    <input class="control" type="submit" value="Create" />
+                    <input class="control" type="submit" value="<%=intl._("Create")%>" />
                 </div>
             </form>
         </div>
diff --git a/apps/i2ptunnel/locale/messages_ru.po b/apps/i2ptunnel/locale/messages_ru.po
new file mode 100644
index 0000000000000000000000000000000000000000..593f7aa37e64c98e32cbf2f2a3cd13a01aa6a067
--- /dev/null
+++ b/apps/i2ptunnel/locale/messages_ru.po
@@ -0,0 +1,664 @@
+# I2P
+# Copyright (C) 2009 The I2P Project
+# This file is distributed under the same license as the i2ptunnel package.
+# To contribute translations, see http://www.i2p2.de/newdevelopers
+# foo <foo@bar>, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: I2P i2ptunnel\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-01-02 04:59+0000\n"
+"PO-Revision-Date: 2010-01-02 07:05+0000\n"
+"Last-Translator: 4get <forget@mail.i2p>\n"
+"Language-Team: foo <foo@bar>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Russian\n"
+
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:430
+#, java-format
+msgid "To visit the destination in your host database, click <a href=\"{0}\">here</a>. To visit the conflicting addresshelper link by temporarily giving it a random alias, click <a href=\"{1}\">here</a>."
+msgstr "Для перехода по ссылке из локальной адресной книги, нажмите <a href=\"{0}\">здесь</a>. Для перехода по новой addresshelper-ссылке с временным присвоением ей случайного имени, нажмите <a href=\"{1}\">здесь</a>."
+
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:800
+msgid "Click a link below to look for an address helper by using a \"jump\" service:"
+msgstr "Jump-сервисы, которые, возможно, знают нужную Вам addresshelper-ссылку:"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:362
+msgid "New Tunnel"
+msgstr "Новый туннель"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:382
+msgid "Standard client"
+msgstr "Обычный клиент"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:383
+msgid "HTTP client"
+msgstr "HTTP-клиент"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:384
+msgid "IRC client"
+msgstr "IRC-клиент"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:385
+msgid "Standard server"
+msgstr "Обычный сервер"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:386
+msgid "HTTP server"
+msgstr "HTTP-сервер"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:387
+msgid "SOCKS 4/4a/5 proxy"
+msgstr "SOCKS 4/4a/5 прокси"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:388
+msgid "CONNECT/SSL/HTTPS proxy"
+msgstr "CONNECT/SSL/HTTPS прокси"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:389
+msgid "IRC server"
+msgstr "IRC-сервер"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:390
+msgid "Streamr client"
+msgstr "Streamr-клиент"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:391
+msgid "Streamr server"
+msgstr "Streamr-сервер"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:73
+msgid "I2P Tunnel Manager - Edit Client Tunnel"
+msgstr "Менеджер Туннелей I2P — Редактирование Клиентского Туннеля"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:93
+msgid "Edit proxy settings"
+msgstr "Редактирование настроек клиентского туннеля"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:101
+msgid "New proxy settings"
+msgstr "Настройки нового клиентского туннеля"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:112
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:112
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:107
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:121
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:242
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:257
+msgid "Name"
+msgstr "Название"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:116
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:116
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:246
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:270
+msgid "Type"
+msgstr "Тип"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:120
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:120
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:357
+msgid "Description"
+msgstr "Описание"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:126
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:136
+msgid "Target"
+msgstr "Точка доступа"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:130
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:132
+msgid "Access Point"
+msgstr "Точка доступа"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:137
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:179
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:207
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:157
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:181
+msgid "required"
+msgstr "*"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:150
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142
+msgid "Reachable by"
+msgstr "Кому будет доступно (Сетевой интерфейс)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:162
+msgid "Locally (127.0.0.1)"
+msgstr "Только в пределах этого компьютера (127.0.0.1)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:166
+msgid "Everyone (0.0.0.0)"
+msgstr "Всем (0.0.0.0)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:170
+msgid "LAN Hosts (Please specify your LAN address)"
+msgstr "Только из локальной сети (Введите свой LAN-адрес)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:186
+msgid "Other"
+msgstr "Адрес сетевого интерфейса"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:195
+msgid "Outproxies"
+msgstr "Список outproxy"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:202
+msgid "Tunnel Destination"
+msgstr "Адрес назначения туннеля"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:214
+msgid "name or destination"
+msgstr "имя или адрес"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:190
+msgid "Profile"
+msgstr "Режим"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:197
+msgid "interactive connection"
+msgstr "оптимизировать для малых задержек (irc)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:231
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:201
+msgid "bulk connection (downloads/websites/BT)"
+msgstr "оптимизировать для большого обьема (www/bittorrent)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:233
+msgid "Delay Connect"
+msgstr "Задержка соединения"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:237
+msgid "for request/response connections"
+msgstr "оптимизация для соединений, начинающихся с запроса клиента/ответа сервера"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:239
+msgid "Shared Client"
+msgstr "Коллективный клиент"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:243
+msgid "(Share tunnels with other clients and irc/httpclients? Change requires restart of client proxy)"
+msgstr "(Использовать туннели коллективно/совместно с другими прокси-клиентами? Изменение настройки потребует перезапуска туннеля)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:247
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:124
+msgid "Auto Start"
+msgstr "Автозапуск"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:251
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:128
+msgid "(Check the Box for 'YES')"
+msgstr "(поставьте галочку для включения)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:253
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:219
+msgid "Advanced networking options"
+msgstr "Расширенные сетевые настройки"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:255
+msgid "(NOTE: when this client proxy is configured to share tunnels, then these options are for all the shared proxy clients!)"
+msgstr "(ПРИМЕЧАНИЕ: при коллективном использовании туннелей  эти опции будут применяться ко всем коллективным прокси-клиентам!)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:257
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:221
+msgid "Tunnel Options"
+msgstr "Параметры туннеля"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:259
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:223
+msgid "Length"
+msgstr "Длина"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:266
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:230
+msgid "0 hop tunnel (low anonymity, low latency)"
+msgstr "0 хопов (низкая анонимность, малые задержки)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:270
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:234
+msgid "1 hop tunnel (medium anonymity, medium latency)"
+msgstr "1 хоп (умеренная анонимность, умеренные задержки)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:274
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:238
+msgid "2 hop tunnel (high anonymity, high latency)"
+msgstr "2 хопа (высокая анонимность, высокие задержки)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:278
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:242
+msgid "3 hop tunnel (very high anonymity, poor performance)"
+msgstr "3 хопа (очень высокая анонимность, низкая производительность)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:287
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:251
+msgid "hop tunnel (very poor performance)"
+msgstr "хопов (очень низкая производительность)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:292
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:256
+msgid "Variance"
+msgstr "Разброс"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:299
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:263
+msgid "0 hop variance (no randomisation, consistant performance)"
+msgstr "нулевой разброс (без рандомизации, фиксированная производительность)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:303
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:267
+msgid "+ 0-1 hop variance (medium additive randomisation, subtractive performance)"
+msgstr "+ 0-1 разброс (умеренно повышенная рандомизация, пониженная производительность)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:307
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:271
+msgid "+ 0-2 hop variance (high additive randomisation, subtractive performance)"
+msgstr "+ 0-2 разброс (сильно повышенная рандомизация, пониженная производительность)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:311
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:275
+msgid "+/- 0-1 hop variance (standard randomisation, standard performance)"
+msgstr "+/- 0-1 разброс (стандартная рандомизация, стандартная производительность)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:315
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:279
+msgid "+/- 0-2 hop variance (not recommended)"
+msgstr "+/- 0-2 разброс (не рекомендуется)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:327
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:291
+msgid "hop variance"
+msgstr "разброс"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:332
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:296
+msgid "Count"
+msgstr "Количество"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:339
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:303
+msgid "1 inbound, 1 outbound tunnel  (low bandwidth usage, less reliability)"
+msgstr "1 входящий, 1 исходящий туннель (низкая пропускная способность, низкая надежность) "
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:343
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:307
+msgid "2 inbound, 2 outbound tunnels (standard bandwidth usage, standard reliability)"
+msgstr "2 входящих, 2 исходящих туннеля (стандартная пропускная способность, стандартная надежность)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:347
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:311
+msgid "3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)"
+msgstr "3 входящих, 3 исходящих туннеля (высокая пропускная способность, высокая надежность)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:356
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:320
+msgid "tunnels"
+msgstr "туннелей"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:361
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:325
+msgid "Backup Count"
+msgstr "Резервное количество"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:368
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:332
+msgid "0 backup tunnels (0 redundancy, no added resource usage)"
+msgstr "без резервных туннелей (отсутствие избыточности, отсутствие дополнительной нагрузки на систему)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:372
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:336
+msgid "1 backup tunnel each direction (low redundancy, low resource usage)"
+msgstr "1 резервный туннель в каждом направлении (низкая избыточность, низкая нагрузка на систему)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:376
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:340
+msgid "2 backup tunnels each direction (medium redundancy, medium resource usage)"
+msgstr "2 резервных туннеля в каждом направлении (умеренная избыточность, умеренная нагрузка на систему)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:380
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:344
+msgid "3 backup tunnels each direction (high redundancy, high resource usage)"
+msgstr "3 резервных туннеля в каждом направлении (высокая избыточность, высокая нагрузка на систему)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:389
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:353
+msgid "backup tunnels"
+msgstr "резервных туннелей"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:394
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:358
+msgid "I2CP Options"
+msgstr "Параметры I2CP"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:396
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:146
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:360
+msgid "Host"
+msgstr "Адрес"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:400
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:152
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:244
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:266
+msgid "Port"
+msgstr "Порт"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:406
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:398
+msgid "Reduce tunnel quantity when idle"
+msgstr "Снижать количество туннелей при простое"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:408
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:422
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:430
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:442
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:452
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:370
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:388
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:400
+msgid "Enable"
+msgstr "Включить"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:412
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:404
+msgid "Reduced tunnel count"
+msgstr "Количество туннелей"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:416
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:436
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:408
+msgid "Idle minutes"
+msgstr "Минут простоя"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:420
+msgid "Close tunnels when idle"
+msgstr "Закрыть туннели при простое"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:426
+msgid "New Keys on Reopen"
+msgstr "Генерировать новый ключ при переоткрытии"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:434
+msgid "Disable"
+msgstr "Выключить"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:440
+msgid "Delay tunnel open until required"
+msgstr "Отложить запуск до первого запроса"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:450
+msgid "Persistent private key"
+msgstr "Постоянный секретный ключ"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:456
+msgid "File"
+msgstr "Файл"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:460
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:205
+msgid "Local destination"
+msgstr "Локальный адрес назначения"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:464
+msgid "(if known)"
+msgstr "(если известен)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:468
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:444
+msgid "Custom options"
+msgstr "Дополнительные параметры"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:472
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:448
+msgid "NOTE: If tunnel is currently running, most changes will not take effect until tunnel is stopped and restarted."
+msgstr "ПРИМЕЧАНИЕ: для вступления в силу измененных настроек потребуется остановка и перезапуск туннеля"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:474
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:450
+msgid "Save"
+msgstr "Сохранить"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:478
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:454
+msgid "Delete"
+msgstr "Удалить"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:480
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:456
+msgid "Cancel"
+msgstr "Отмена"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:73
+msgid "I2P Tunnel Manager - Edit Server Tunnel"
+msgstr "Менеджер Туннелей I2P — Редактирование Серверного Туннеля"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:93
+msgid "Edit server settings"
+msgstr "Редактирование настроек серверного туннеля"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:101
+msgid "New server settings"
+msgstr "Настройки нового серверного туннеля"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:167
+msgid "Website name"
+msgstr "Имя веб-сайта"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:171
+msgid "(leave blank for outproxies)"
+msgstr "(не заполнять для outproxy)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:176
+msgid "Private key file"
+msgstr "Файл секретного ключа"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:215
+msgid "Add to local addressbook"
+msgstr "Добавить в локальную адресную книгу"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:368
+msgid "Encrypt Leaseset"
+msgstr "Шифровать LeaseSet"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:374
+msgid "Encryption Key"
+msgstr "Ключ шифрования"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:378
+msgid "Generate New Key"
+msgstr "Сгенерировать новый ключ"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:380
+msgid "Generate"
+msgstr "Сгенерировать"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:382
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:442
+msgid "(Tunnel must be stopped first)"
+msgstr "(Туннель перед этим следует остановить)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:384
+msgid "Restricted Access List"
+msgstr "Ограниченный доступ"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:386
+msgid "Unimplemented"
+msgstr "не реализовано"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:392
+msgid "Access List"
+msgstr "Список доступа"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:396
+msgid "(Restrict to these clients only)"
+msgstr "(Разрешить доступ только перечисленным клиентам)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:412
+msgid "New Certificate type"
+msgstr "Создать новый сертификат. Тип"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:414
+msgid "None"
+msgstr "Без"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:418
+msgid "Hashcash (effort)"
+msgstr "Hashcash (экспериментальный)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:424
+msgid "Hashcash Calc Time"
+msgstr "Время генерации hashcash-сертификата"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:426
+msgid "Estimate"
+msgstr "Прогноз"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:428
+msgid "Hidden"
+msgstr "Скрытый"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:432
+msgid "Signed (signed by)"
+msgstr "Подписанный (указать кем подписан)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:438
+msgid "Modify Certificate"
+msgstr "Изменить сертификат"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:440
+msgid "Modify"
+msgstr "Изменить"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:71
+msgid "I2P Tunnel Manager - List"
+msgstr "Менеджер Туннелей I2P — Список"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:83
+msgid "Status Messages"
+msgstr "Сообщения о состоянии"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:87
+msgid "Refresh"
+msgstr "Обновить"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:91
+msgid "Stop All"
+msgstr "Остановить все"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:95
+msgid "Start All"
+msgstr "Запустить все"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:99
+msgid "Restart All"
+msgstr "Перезапустить все"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:103
+msgid "Reload Config"
+msgstr "Перезагрузить настройки"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:105
+msgid "I2P Server Tunnels"
+msgstr "Серверные I2P туннели"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:109
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:130
+msgid "Points at"
+msgstr "Указывает на"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:111
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:153
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:157
+msgid "Preview"
+msgstr "Предпросмотр"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:113
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:177
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:250
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:278
+msgid "Status"
+msgstr "Состояние"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:163
+msgid "Base32 Address"
+msgstr "Base32-адрес"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:171
+msgid "No Preview"
+msgstr "Предпросмотр недоступен"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:184
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:285
+msgid "Starting..."
+msgstr "Запускается..."
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:191
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:205
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:292
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:306
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:320
+msgid "Stop"
+msgstr "Остановить"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:198
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:313
+msgid "Running"
+msgstr "Запущен"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:212
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:327
+msgid "Stopped"
+msgstr "Остановлен"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:219
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:334
+msgid "Start"
+msgstr "Запустить"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:234
+msgid "New server tunnel"
+msgstr "Новый серверный туннель"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:367
+msgid "Standard"
+msgstr "Стандартный"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:238
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:369
+msgid "Create"
+msgstr "Создать"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:240
+msgid "I2P Client Tunnels"
+msgstr "Клиентские I2P туннели"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:248
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:274
+msgid "Interface"
+msgstr "Сетевой интерфейс"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:299
+msgid "Standby"
+msgstr "Режим ожидания"
+
+# This term intentionally left in English
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:345
+msgid "Outproxy"
+msgstr "Outproxy"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:349
+msgid "Destination"
+msgstr "Адрес назначения"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:365
+msgid "New client tunnel"
+msgstr "Новый клиентский туннель"
+
diff --git a/apps/i2ptunnel/locale/messages_zh.po b/apps/i2ptunnel/locale/messages_zh.po
new file mode 100644
index 0000000000000000000000000000000000000000..3e9f29211965f92f3c251dd9d331167c14952c7f
--- /dev/null
+++ b/apps/i2ptunnel/locale/messages_zh.po
@@ -0,0 +1,663 @@
+# I2P
+# Copyright (C) 2009 The I2P Project
+# This file is distributed under the same license as the i2ptunnel package.
+# To contribute translations, see http://www.i2p2.de/newdevelopers
+# foo <foo@bar>, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: I2P i2ptunnel\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-01-02 08:14+0000\n"
+"PO-Revision-Date: 2010-01-02 23:43+0800\n"
+"Last-Translator: walking <zhazhenzhong@gmail.com>\n"
+"Language-Team: foo <foo@bar>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Chinese\n"
+
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:426
+#, java-format
+msgid "To visit the destination in your host database, click <a href=\"{0}\">here</a>. To visit the conflicting addresshelper link by temporarily giving it a random alias, click <a href=\"{1}\">here</a>."
+msgstr "要访问您本地【地址簿】中规定的主机(相当与IP),请点击<a href=\"{0}\">这里</a>。要访问【地址助手】返回的主机请点<a href=\"{1}\">这里</a>(主机的域名会被临时强制替换)。"
+
+#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:792
+msgid "Click a link below to look for an address helper by using a \"jump\" service:"
+msgstr "请点击下面的链接通过【跳转(Jump)】服务提供的【地址助手】链接跳转至域名对应的主机:"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:362
+msgid "New Tunnel"
+msgstr "新建隧道"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:382
+msgid "Standard client"
+msgstr "标准客户端"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:383
+msgid "HTTP client"
+msgstr "HTTP 客户端"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:384
+msgid "IRC client"
+msgstr "IRC 客户端"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:385
+msgid "Standard server"
+msgstr "标准服务器"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:386
+msgid "HTTP server"
+msgstr "HTTP 服务器"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:387
+msgid "SOCKS 4/4a/5 proxy"
+msgstr "SOCKS4/4A/5 代理"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:388
+msgid "CONNECT/SSL/HTTPS proxy"
+msgstr "CONNECT/SSL/HTTPS 代理"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:389
+msgid "IRC server"
+msgstr "IRC 服务器"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:390
+msgid "Streamr client"
+msgstr "Streamr 客户端"
+
+#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:391
+msgid "Streamr server"
+msgstr "Streamr 服务器"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:73
+msgid "I2P Tunnel Manager - Edit Client Tunnel"
+msgstr "I2P 隧道管理器 - 编辑客户端隧道"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:93
+msgid "Edit proxy settings"
+msgstr "编辑代理设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:101
+msgid "New proxy settings"
+msgstr "新建代理设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:112
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:112
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:107
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:121
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:242
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:257
+msgid "Name"
+msgstr "名称"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:116
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:116
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:246
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:270
+msgid "Type"
+msgstr "类型"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:120
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:120
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:226
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:357
+msgid "Description"
+msgstr "描述"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:126
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:136
+msgid "Target"
+msgstr "目标"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:130
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:132
+msgid "Access Point"
+msgstr "接入点"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:137
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:179
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:207
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:157
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:181
+msgid "required"
+msgstr "必要"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:150
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142
+msgid "Reachable by"
+msgstr "访问地址"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:162
+msgid "Locally (127.0.0.1)"
+msgstr "本地(127.0.0.1)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:166
+msgid "Everyone (0.0.0.0)"
+msgstr "任何人(0.0.0.0)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:170
+msgid "LAN Hosts (Please specify your LAN address)"
+msgstr "局域网(请指定LAN地址)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:186
+msgid "Other"
+msgstr "其他"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:195
+msgid "Outproxies"
+msgstr "出口代理"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:202
+msgid "Tunnel Destination"
+msgstr "隧道目标"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:214
+msgid "name or destination"
+msgstr "名称或描述"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:190
+msgid "Profile"
+msgstr "连接类型"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:197
+msgid "interactive connection"
+msgstr "速度连接"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:231
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:201
+msgid "bulk connection (downloads/websites/BT)"
+msgstr "效率连接(下载/WEB/BT)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:233
+msgid "Delay Connect"
+msgstr "连接延迟断开"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:237
+msgid "for request/response connections"
+msgstr "单请求/响应连接"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:239
+msgid "Shared Client"
+msgstr "共享客户端"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:243
+msgid "(Share tunnels with other clients and irc/httpclients? Change requires restart of client proxy)"
+msgstr "(与其他客户端例如IRC/HTTP共享隧道?修改需要重新启动)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:247
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:124
+msgid "Auto Start"
+msgstr "自动启动"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:251
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:128
+msgid "(Check the Box for 'YES')"
+msgstr "(选中表示\"是\")"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:253
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:219
+msgid "Advanced networking options"
+msgstr "高级网络设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:255
+msgid "(NOTE: when this client proxy is configured to share tunnels, then these options are for all the shared proxy clients!)"
+msgstr "(注意:此客户代理被设置使用共享隧道时,这些设置将影响所有使用共享隧道的客户端!)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:257
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:221
+msgid "Tunnel Options"
+msgstr "隧道选项"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:259
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:223
+msgid "Length"
+msgstr "长度"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:266
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:230
+msgid "0 hop tunnel (low anonymity, low latency)"
+msgstr "直连(匿名性无,延迟低)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:270
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:234
+msgid "1 hop tunnel (medium anonymity, medium latency)"
+msgstr "隧道跳点x1(匿名性中,延迟中)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:274
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:238
+msgid "2 hop tunnel (high anonymity, high latency)"
+msgstr "隧道跳点x2(匿名性高,延迟高)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:278
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:242
+msgid "3 hop tunnel (very high anonymity, poor performance)"
+msgstr "隧道跳点x3(匿名性优,影响性能)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:287
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:251
+msgid "hop tunnel (very poor performance)"
+msgstr "跳点隧道(严重影响性能)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:292
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:256
+msgid "Variance"
+msgstr "随机变化"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:299
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:263
+msgid "0 hop variance (no randomisation, consistant performance)"
+msgstr "隧道长度恒定(随机性无,性能稳定)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:303
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:267
+msgid "+ 0-1 hop variance (medium additive randomisation, subtractive performance)"
+msgstr "隧道长度+ 0-1(随机性中,影响性能)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:307
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:271
+msgid "+ 0-2 hop variance (high additive randomisation, subtractive performance)"
+msgstr "隧道长度+ 0-2(随机性高,影响性能)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:311
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:275
+msgid "+/- 0-1 hop variance (standard randomisation, standard performance)"
+msgstr "隧道长度+/- 0-1(随机性标准,正常性能)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:315
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:279
+msgid "+/- 0-2 hop variance (not recommended)"
+msgstr "隧道程度+/- 0-2(不推荐)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:327
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:291
+msgid "hop variance"
+msgstr "节点数量"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:332
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:296
+msgid "Count"
+msgstr "计数"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:339
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:303
+msgid "1 inbound, 1 outbound tunnel  (low bandwidth usage, less reliability)"
+msgstr "出/入站隧道x1(带宽低,低可靠性)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:343
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:307
+msgid "2 inbound, 2 outbound tunnels (standard bandwidth usage, standard reliability)"
+msgstr "出/入站隧道x2(带宽标准,标准稳定性)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:347
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:311
+msgid "3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)"
+msgstr "出/入站隧道x3(带宽高,高稳定性)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:356
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:320
+msgid "tunnels"
+msgstr "隧道"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:361
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:325
+msgid "Backup Count"
+msgstr "备用数量"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:368
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:332
+msgid "0 backup tunnels (0 redundancy, no added resource usage)"
+msgstr "无备用隧道(无冗余,不增加资源占用)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:372
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:336
+msgid "1 backup tunnel each direction (low redundancy, low resource usage)"
+msgstr "备用隧道对x1 (低冗余,低资源占用)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:376
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:340
+msgid "2 backup tunnels each direction (medium redundancy, medium resource usage)"
+msgstr "备用隧道对x2 (中冗余,中资源占用)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:380
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:344
+msgid "3 backup tunnels each direction (high redundancy, high resource usage)"
+msgstr "备用隧道对x3 (高冗余,高资源占用)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:389
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:353
+msgid "backup tunnels"
+msgstr "备用隧道"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:394
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:358
+msgid "I2CP Options"
+msgstr "I2CP选项"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:396
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:146
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:360
+msgid "Host"
+msgstr "主机"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:400
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:152
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:244
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:266
+msgid "Port"
+msgstr "端口"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:406
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:398
+msgid "Reduce tunnel quantity when idle"
+msgstr "空闲时缩减隧道数量"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:408
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:422
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:430
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:442
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:452
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:370
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:388
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:400
+msgid "Enable"
+msgstr "启用"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:412
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:404
+msgid "Reduced tunnel count"
+msgstr "削减后的隧道数量"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:416
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:436
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:408
+msgid "Idle minutes"
+msgstr "空闲时间(分钟)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:420
+msgid "Close tunnels when idle"
+msgstr "空闲时关闭隧道"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:426
+msgid "New Keys on Reopen"
+msgstr "重新打开隧道时使用新密钥"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:434
+msgid "Disable"
+msgstr "禁用"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:440
+msgid "Delay tunnel open until required"
+msgstr "仅在请求时打开"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:450
+msgid "Persistent private key"
+msgstr "永久私有密钥"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:456
+msgid "File"
+msgstr "文件"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:460
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:205
+msgid "Local destination"
+msgstr "本地目标"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:464
+msgid "(if known)"
+msgstr "(如果已知)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:468
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:444
+msgid "Custom options"
+msgstr "自定义选项"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:472
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:448
+msgid "NOTE: If tunnel is currently running, most changes will not take effect until tunnel is stopped and restarted."
+msgstr "注意:如果当前隧道已经启动,设置需要【停止】并重新【启动】相应隧道后才能生效。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:474
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:450
+msgid "Save"
+msgstr "保存"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:478
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:454
+msgid "Delete"
+msgstr "删除"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:480
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:456
+msgid "Cancel"
+msgstr "取消"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:73
+msgid "I2P Tunnel Manager - Edit Server Tunnel"
+msgstr "I2P隧道管理器 - 编辑服务器隧道"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:93
+msgid "Edit server settings"
+msgstr "服务器隧道设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:101
+msgid "New server settings"
+msgstr "新建服务器设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:167
+msgid "Website name"
+msgstr "网站名称"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:171
+msgid "(leave blank for outproxies)"
+msgstr "(出口代理这里请置空)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:176
+msgid "Private key file"
+msgstr "私钥文件"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:215
+msgid "Add to local addressbook"
+msgstr "添加至本地地址簿"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:368
+msgid "Encrypt Leaseset"
+msgstr "加密赁集"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:374
+msgid "Encryption Key"
+msgstr "加密密钥"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:378
+msgid "Generate New Key"
+msgstr "生成新密钥"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:380
+msgid "Generate"
+msgstr "生成"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:382
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:442
+msgid "(Tunnel must be stopped first)"
+msgstr "(必须先停止隧道)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:384
+msgid "Restricted Access List"
+msgstr "限制访问列表"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:386
+msgid "Unimplemented"
+msgstr "尚未实现"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:392
+msgid "Access List"
+msgstr "访问列表"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:396
+msgid "(Restrict to these clients only)"
+msgstr "(仅允许这些客户访问)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:412
+msgid "New Certificate type"
+msgstr "新建证书类型"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:414
+msgid "None"
+msgstr "æ— "
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:418
+msgid "Hashcash (effort)"
+msgstr "Hashcash (强度)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:424
+msgid "Hashcash Calc Time"
+msgstr "Hashcash 计算时间"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:426
+msgid "Estimate"
+msgstr "ä¼°ç®—"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:428
+msgid "Hidden"
+msgstr "隐藏"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:432
+msgid "Signed (signed by)"
+msgstr "签名(签名者)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:438
+msgid "Modify Certificate"
+msgstr "修改证书"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:440
+msgid "Modify"
+msgstr "修改"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:71
+msgid "I2P Tunnel Manager - List"
+msgstr "I2P隧道管理器 - 列表"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:83
+msgid "Status Messages"
+msgstr "状态信息"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:87
+msgid "Refresh"
+msgstr "刷新"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:91
+msgid "Stop All"
+msgstr "全部停止"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:95
+msgid "Start All"
+msgstr "全部启动"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:99
+msgid "Restart All"
+msgstr "全部重启"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:103
+msgid "Reload Config"
+msgstr "重新载入设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:105
+msgid "I2P Server Tunnels"
+msgstr "I2P服务端隧道"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:109
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:130
+msgid "Points at"
+msgstr "指向"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:111
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:153
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:157
+msgid "Preview"
+msgstr "预览"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:113
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:177
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:250
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:278
+msgid "Status"
+msgstr "状态"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:163
+msgid "Base32 Address"
+msgstr "Base32地址"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:171
+msgid "No Preview"
+msgstr "无预览"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:184
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:285
+msgid "Starting..."
+msgstr "正在启动..."
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:191
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:205
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:292
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:306
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:320
+msgid "Stop"
+msgstr "停止"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:198
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:313
+msgid "Running"
+msgstr "运行中"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:212
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:327
+msgid "Stopped"
+msgstr "已停止"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:219
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:334
+msgid "Start"
+msgstr "启动"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:234
+msgid "New server tunnel"
+msgstr "新建服务器隧道"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:367
+msgid "Standard"
+msgstr "标准"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:238
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:369
+msgid "Create"
+msgstr "创建"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:240
+msgid "I2P Client Tunnels"
+msgstr "I2P客户端隧道"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:248
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:274
+msgid "Interface"
+msgstr "网络接口"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:299
+msgid "Standby"
+msgstr "等待"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:345
+msgid "Outproxy"
+msgstr "出口代理"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:349
+msgid "Destination"
+msgstr "目标"
+
+#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:365
+msgid "New client tunnel"
+msgstr "新建客户隧道"
+
diff --git a/apps/routerconsole/java/bundle-messages.sh b/apps/routerconsole/java/bundle-messages.sh
index 33db275725edf592e4a9116e3626b63d52ff667c..ddc6785a032119fdbc0f9137df701f564d144570 100755
--- a/apps/routerconsole/java/bundle-messages.sh
+++ b/apps/routerconsole/java/bundle-messages.sh
@@ -104,7 +104,7 @@ do
 	echo "Generating ${CLASS}_$LG ResourceBundle..."
 
 	# convert to class files in build/obj
-	msgfmt --java -r $CLASS -l $LG -d build/obj $i
+	msgfmt --java --statistics -r $CLASS -l $LG -d build/obj $i
 	if [ $? -ne 0 ]
 	then
 		echo 'Warning - msgfmt failed, not updating translations'
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/CSSHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/CSSHelper.java
index d4f825a9a1acf400af350f2435f1239a9a1d1ed1..ffc77f71bb754ef575a648c574e00566b618814e 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/CSSHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/CSSHelper.java
@@ -11,6 +11,8 @@ public class CSSHelper extends HelperBase {
     public static final String DEFAULT_THEME = "light";
     private static final String BASE = "/themes/console/";
     private static final String FORCE = "classic";
+    public static final String PROP_REFRESH = "routerconsole.summaryRefresh";
+    public static final String DEFAULT_REFRESH = "60";
 
     public String getTheme(String userAgent) {
         String url = BASE;
@@ -34,6 +36,17 @@ public class CSSHelper extends HelperBase {
         return Messages.getLanguage(_context);
     }
 
+    /** change refresh and save it */
+    public void setRefresh(String r) {
+        _context.router().setConfigSetting(PROP_REFRESH, r);
+        _context.router().saveConfig();
+    }
+
+    /** @return refresh time in seconds, as a string */
+    public String getRefresh() {
+        return _context.getProperty(PROP_REFRESH, DEFAULT_REFRESH);
+    }
+
     /** translate the title and display consistently */
     public String title(String s) {
          StringBuilder buf = new StringBuilder(128);
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHandler.java
index 373a272f0313cba921d9a1a822d1550f702954b7..0da8bdc248b997e7c0dfeb01af7da37e5f9c0510 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHandler.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHandler.java
@@ -4,7 +4,7 @@ import net.i2p.router.Router;
 import net.i2p.router.transport.FIFOBandwidthRefiller;
 import net.i2p.router.transport.TransportManager;
 import net.i2p.router.transport.udp.UDPTransport;
-import net.i2p.router.web.ConfigServiceHandler.UpdateWrapperManagerAndRekeyTask;
+import net.i2p.router.web.ConfigServiceHandler;
 
 /**
  * Handler to deal with form submissions from the main config form and act
@@ -30,6 +30,7 @@ public class ConfigNetHandler extends FormHandler {
     private String _ntcpAutoIP;
     private boolean _ntcpAutoPort;
     private boolean _upnp;
+    private boolean _laptop;
     private String _inboundRate;
     private String _inboundBurstRate;
     private String _inboundBurst;
@@ -70,6 +71,7 @@ public class ConfigNetHandler extends FormHandler {
         _ntcpAutoPort = mode.equals("2");
     }
     public void setUpnp(String moo) { _upnp = true; }
+    public void setLaptop(String moo) { _laptop = true; }
     
     public void setHostname(String hostname) { 
         _hostname = (hostname != null ? hostname.trim() : null); 
@@ -230,6 +232,16 @@ public class ConfigNetHandler extends FormHandler {
             }
             _context.router().setConfigSetting(TransportManager.PROP_ENABLE_UPNP, "" + _upnp);
 
+            if (Boolean.valueOf(_context.getProperty(UDPTransport.PROP_LAPTOP_MODE)).booleanValue() !=
+                _laptop) {
+                // This is minor, don't set restartRequired
+                if (_laptop)
+                    addFormNotice(_("Enabling laptop mode"));
+                else
+                    addFormNotice(_("Disabling laptop mode"));
+            }
+            _context.router().setConfigSetting(UDPTransport.PROP_LAPTOP_MODE, "" + _laptop);
+
             if (_requireIntroductions) {
                 _context.router().setConfigSetting(UDPTransport.PROP_FORCE_INTRODUCERS, "true");
                 addFormNotice(_("Requiring SSU introducers"));
@@ -256,30 +268,33 @@ public class ConfigNetHandler extends FormHandler {
         if (switchRequired) {
             hiddenSwitch();
         } else if (restartRequired) {
-            // Wow this dumps all conns immediately and really isn't nice
-            //addFormNotice("Performing a soft restart");
-            //_context.router().restart();
-            //addFormNotice("Soft restart complete");
+            if (System.getProperty("wrapper.version") == null) {
+                // Wow this dumps all conns immediately and really isn't nice
+                addFormNotice("Performing a soft restart");
+                _context.router().restart();
+                addFormNotice("Soft restart complete");
 
-            // Most of the time we aren't changing addresses, just enabling or disabling
-            // things, so let's try just a new routerInfo and see how that works.
-            // Maybe we should restart if we change addresses though?
-            // No, this doesn't work well, really need to call SSU Transport externalAddressReceived(),
-            // but that's hard to get to, and doesn't handle port changes, etc.
-            // So don't do this...
-            //_context.router().rebuildRouterInfo();
-            //addFormNotice("Router Info rebuilt");
-
-            // There's a few changes that don't really require restart (e.g. enabling inbound TCP)
-            // But it would be hard to get right, so just do a restart.
-            addFormError(_("Gracefully restarting I2P to change published router address"));
-            _context.router().shutdownGracefully(Router.EXIT_GRACEFUL_RESTART);
+                // Most of the time we aren't changing addresses, just enabling or disabling
+                // things, so let's try just a new routerInfo and see how that works.
+                // Maybe we should restart if we change addresses though?
+                // No, this doesn't work well, really need to call SSU Transport externalAddressReceived(),
+                // but that's hard to get to, and doesn't handle port changes, etc.
+                // So don't do this...
+                //_context.router().rebuildRouterInfo();
+                //addFormNotice("Router Info rebuilt");
+            } else {
+                // There's a few changes that don't really require restart (e.g. enabling inbound TCP)
+                // But it would be hard to get right, so just do a restart.
+                addFormError(_("Gracefully restarting I2P to change published router address"));
+                _context.addShutdownTask(new ConfigServiceHandler.UpdateWrapperManagerTask(Router.EXIT_GRACEFUL_RESTART));
+                _context.router().shutdownGracefully(Router.EXIT_GRACEFUL_RESTART);
+            }
         }
     }
 
     private void hiddenSwitch() {
         // Full restart required to generate new keys
-        _context.addShutdownTask(new UpdateWrapperManagerAndRekeyTask(Router.EXIT_GRACEFUL_RESTART));
+        _context.addShutdownTask(new ConfigServiceHandler.UpdateWrapperManagerAndRekeyTask(Router.EXIT_GRACEFUL_RESTART));
         _context.router().shutdownGracefully(Router.EXIT_GRACEFUL_RESTART);
     }
     
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHelper.java
index b7a692daa7c61d34cd2dc176010567ec7454f833..05f49cea6495b3c8f5d5dce152682eb0abb04241 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHelper.java
@@ -84,6 +84,10 @@ public class ConfigNetHelper extends HelperBase {
         return getChecked(Router.PROP_DYNAMIC_KEYS);
     }
 
+    public String getLaptopChecked() {
+        return getChecked(UDPTransport.PROP_LAPTOP_MODE);
+    }
+
     public String getTcpAutoPortChecked(int mode) {
         String port = _context.getProperty(PROP_I2NP_NTCP_PORT); 
         boolean specified = port != null && port.length() > 0;
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java
index b57ed4652765475a12401e0116fa225aca3fad52..d6eb2edd1c8745de06f11351ab949c5d93253663 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java
@@ -10,7 +10,7 @@ public class LogsHelper extends HelperBase {
     
     public String getLogs() {
         String str = formatMessages(_context.logManager().getBuffer().getMostRecentMessages());
-        return "Location: <b><code>" + _context.logManager().currentFile() + "</code></b><br><br>" + str;
+        return _("File location") + ": <b><code>" + _context.logManager().currentFile() + "</code></b><br><br>" + str;
     }
     
     public String getCriticalLogs() {
@@ -34,7 +34,7 @@ public class LogsHelper extends HelperBase {
             return "";
         else {
             str = str.replaceAll("<", "&lt;").replaceAll(">", "&gt;");
-            return "Location:<b><code> " + f.getAbsolutePath() + "</code></b> <pre>" + str + "</pre>";
+            return _("File location") + ": <b><code>" + f.getAbsolutePath() + "</code></b> <pre>" + str + "</pre>";
         }
     }
     
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NewsFetcher.java b/apps/routerconsole/java/src/net/i2p/router/web/NewsFetcher.java
index 973357baacc8f2204d0bbf405aed984b9dcd8047..8140282d19f491b17f57d38b10c5a1ba0d19a891 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/NewsFetcher.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/NewsFetcher.java
@@ -179,7 +179,7 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
             if (get.fetch()) {
                 String lastmod = get.getLastModified();
                 if (lastmod != null) {
-                    if (!(_context instanceof RouterContext)) return;
+                    if (!(_context.isRouterContext())) return;
                     long modtime = parse822Date(lastmod);
                     if (modtime <= 0) return;
                     String lastUpdate = _context.getProperty(UpdateHandler.PROP_LAST_UPDATE_TIME);
@@ -310,7 +310,7 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
             if (_log.shouldLog(Log.DEBUG))
                 _log.debug("Policy requests update, so we update");
             UpdateHandler handler = null;
-            if (_context instanceof RouterContext) {
+            if (_context.isRouterContext()) {
                 handler = new UpdateHandler((RouterContext)_context);
             } else {
                 List contexts = RouterContext.listContexts();
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/StatsGenerator.java b/apps/routerconsole/java/src/net/i2p/router/web/StatsGenerator.java
index 2228f6078755f660ef956c7d1e45c2ffdd637787..4ddc6e6f453a89953b69d63922d18bfdce72cf77 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/StatsGenerator.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/StatsGenerator.java
@@ -40,7 +40,7 @@ public class StatsGenerator {
             String group = (String)entry.getKey();
             Set stats = (Set)entry.getValue();
             buf.append("<option value=\"/stats.jsp#").append(group).append("\">");
-            buf.append(group).append("</option>\n");
+            buf.append(_(group)).append("</option>\n");
             for (Iterator statIter = stats.iterator(); statIter.hasNext(); ) {
                 String stat = (String)statIter.next();
                 buf.append("<option value=\"/stats.jsp#");
@@ -52,7 +52,7 @@ public class StatsGenerator {
             out.write(buf.toString());
             buf.setLength(0);
         }
-        buf.append("</select> <input type=\"submit\" value=\"GO\" />");
+        buf.append("</select> <input type=\"submit\" value=\"").append(_("GO")).append("\" />");
         buf.append("</form>");
         
         buf.append(_("Statistics gathered during this router's uptime")).append(" (");
@@ -69,7 +69,7 @@ public class StatsGenerator {
             buf.append("<h3><a name=\"");
             buf.append(group);
             buf.append("\">");
-            buf.append(group);
+            buf.append(_(group));
             buf.append("</a></h3>");
             buf.append("<ul>");
             out.write(buf.toString());
@@ -88,7 +88,7 @@ public class StatsGenerator {
                 out.write(buf.toString());
                 buf.setLength(0);
             }
-            out.write("</ul><br>");
+            out.write("</ul><br>\n");
         }
         out.flush();
     }
@@ -104,7 +104,7 @@ public class StatsGenerator {
         for (int i = 0; i < periods.length; i++) {
             if (periods[i] > uptime)
                 break;
-            renderPeriod(buf, periods[i], "frequency");
+            renderPeriod(buf, periods[i], _("frequency"));
             Frequency curFreq = freq.getFrequency(periods[i]);
             buf.append(" <i>avg per period:</i> (");
             buf.append(num(curFreq.getAverageEventsPerPeriod()));
@@ -124,9 +124,9 @@ public class StatsGenerator {
             buf.append(" using the lifetime of ");
             buf.append(curFreq.getEventCount());
             buf.append(" events)");
-            buf.append("<br>");
+            buf.append("<br>\n");
         }
-        buf.append("<br>");
+        buf.append("<br>\n");
     }
     
     private void renderRate(String name, StringBuilder buf) {
@@ -138,7 +138,7 @@ public class StatsGenerator {
             buf.append("</i><br>");
         }
         if (rate.getLifetimeEventCount() <= 0) {
-            buf.append("No lifetime events<br>");
+            buf.append(_("No lifetime events")).append("<br>\n");
             return;
         }
         long now = _context.clock().now();
@@ -150,9 +150,9 @@ public class StatsGenerator {
             if (curRate.getLastCoalesceDate() <= curRate.getCreationDate())
                 break;
             buf.append("<li>");
-            renderPeriod(buf, periods[i], "rate");
+            renderPeriod(buf, periods[i], _("rate"));
             if (curRate.getLastEventCount() > 0) {
-                buf.append( "<i>avg value:</i> (");
+                buf.append( "<i>").append(_("avg value")).append(":</i> (");
                 buf.append(num(curRate.getAverageValue()));
                 buf.append(" peak ");
                 buf.append(num(curRate.getExtremeAverageValue()));
@@ -181,21 +181,21 @@ public class StatsGenerator {
                     buf.append(num(curRate.getExtremeSaturationLimit()));
                     buf.append(")");
                 }
-                buf.append(" <i>events:</i> ");
+                buf.append(" <i>").append(_("events")).append(":</i> ");
                 buf.append(curRate.getLastEventCount());
                 buf.append(" <i>in this period which ended:</i> ");
                 buf.append(DataHelper.formatDuration(now - curRate.getLastCoalesceDate()));
                 buf.append(" ago ");
             } else {
-                buf.append(" <i>No events</i> ");
+                buf.append(" <i>").append(_("No events")).append("</i> ");
             }
             long numPeriods = curRate.getLifetimePeriods();
             if (numPeriods > 0) {
                 double avgFrequency = curRate.getLifetimeEventCount() / (double)numPeriods;
                 double peakFrequency = curRate.getExtremeEventCount();
-                buf.append(" (lifetime average: ");
+                buf.append(" (").append(_("lifetime average")).append(": ");
                 buf.append(num(avgFrequency));
-                buf.append(", peak average: ");
+                buf.append(", ").append(_("peak average")).append(": ");
                 buf.append(curRate.getExtremeEventCount());
                 buf.append(")");
             }
@@ -210,16 +210,16 @@ public class StatsGenerator {
                 buf.append("&amp;format=xml\" title=\"Dump stat history as XML\">XML</a>");
                 buf.append(" in a format <a href=\"http://people.ee.ethz.ch/~oetiker/webtools/rrdtool\">RRDTool</a> understands)");
             }
-            buf.append("</li>");
+            buf.append("</li>\n");
         }
         // Display the strict average
-        buf.append("<li><b>lifetime average value:</b> ");
+        buf.append("<li><b>").append(_("lifetime average value")).append(":</b> ");
         buf.append(num(rate.getLifetimeAverageValue()));
         buf.append(" over ");
         buf.append(rate.getLifetimeEventCount());
         buf.append(" events<br></li>");
         buf.append("</ul>");
-        buf.append("<br>");
+        buf.append("<br>\n");
     }
     
     private static void renderPeriod(StringBuilder buf, long period, String name) {
@@ -240,4 +240,9 @@ public class StatsGenerator {
     private String _(String s) {
         return Messages.getString(s, _context);
     }
+
+    /** translate a string */
+    private String _(String s, Object o) {
+        return Messages.getString(s, o, _context);
+    }
 }
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java
index bbffa6c9d0978de4bd39d508f5c47a9165dedf70..89922dec819767fbd1cc9c4a49d95a48753e45b7 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java
@@ -19,10 +19,14 @@ public class SummaryBarRenderer {
         _helper = helper;
     }
 
+    /**
+     *  Note - ensure all links in here are absolute, as the summary bar may be displayed
+     *         on lower-level directory errors.
+     */
     public void renderSummaryHTML(Writer out) throws IOException {
         StringBuilder buf = new StringBuilder(8*1024);
 
-        buf.append("<a href=\"index.jsp\" target=\"_top\"><img src=\"/themes/console/images/i2plogo.png\" alt=\"")
+        buf.append("<a href=\"/index.jsp\" target=\"_top\"><img src=\"/themes/console/images/i2plogo.png\" alt=\"")
            .append(_("I2P Router Console"))
            .append("\" title=\"")
            .append(_("I2P Router Console"))
@@ -44,19 +48,19 @@ public class SummaryBarRenderer {
 
                        "<hr><table>" +
 
-                       "<tr><td><a href=\"susidns/index.jsp\" target=\"_blank\" title=\"")
+                       "<tr><td><a href=\"/susidns/index.jsp\" target=\"_blank\" title=\"")
                .append(_("Manage your I2P hosts file here (I2P domain name resolution)"))
                .append("\">")
                .append(_("Addressbook"))
                .append("</a>\n" +
 
-                       "<a href=\"i2psnark/\" target=\"_blank\" title=\"")
+                       "<a href=\"/i2psnark/\" target=\"_blank\" title=\"")
                .append(_("Built-in anonymous BitTorrent Client"))
                .append("\">")
                .append(_("Torrents"))
                .append("</a>\n" +
 
-                       "<a href=\"susimail/susimail\" target=\"blank\" title=\"")
+                       "<a href=\"/susimail/susimail\" target=\"blank\" title=\"")
                .append(_("Anonymous webmail client"))
                .append("\">")
                .append(_("Webmail"))
@@ -68,7 +72,7 @@ public class SummaryBarRenderer {
                .append(_("Webserver"))
                .append("</a></td></tr></table>\n" +
 
-                       "<hr><h3><a href=\"config.jsp\" target=\"_top\" title=\"")
+                       "<hr><h3><a href=\"/config.jsp\" target=\"_top\" title=\"")
                .append(_("Configure I2P Router"))
                .append("\">")
                .append(_("I2P Internals"))
@@ -76,52 +80,59 @@ public class SummaryBarRenderer {
 
                        "<table><tr><td>\n" +
 
-                       "<a href=\"tunnels.jsp\" target=\"_top\" title=\"")
+                       "<a href=\"/tunnels.jsp\" target=\"_top\" title=\"")
                .append(_("View existing tunnels and tunnel build status"))
                .append("\">")
                .append(_("Tunnels"))
                .append("</a>\n" +
 
-                       "<a href=\"peers.jsp\" target=\"_top\" title=\"")
+                       "<a href=\"/peers.jsp\" target=\"_top\" title=\"")
                .append(_("Show all current peer connections"))
                .append("\">")
                .append(_("Peers"))
                .append("</a>\n" +
 
-                       "<a href=\"profiles.jsp\" target=\"_top\" title=\"")
+                       "<a href=\"/profiles.jsp\" target=\"_top\" title=\"")
                .append(_("Show recent peer performance profiles"))
                .append("\">")
                .append(_("Profiles"))
                .append("</a>\n" +
 
-                       "<a href=\"netdb.jsp\" target=\"_top\" title=\"")
+                       "<a href=\"/netdb.jsp\" target=\"_top\" title=\"")
                .append(_("Show list of all known I2P routers"))
                .append("\">")
                .append(_("NetDB"))
                .append("</a>\n" +
 
-                       "<a href=\"logs.jsp\" target=\"_top\" title=\"")
+                       "<a href=\"/logs.jsp\" target=\"_top\" title=\"")
                .append(_("Health Report"))
                .append("\">")
                .append(_("Logs"))
                .append("</a>\n" +
 
-                       "<a href=\"jobs.jsp\" target=\"_top\" title=\"")
+                       "<a href=\"/jobs.jsp\" target=\"_top\" title=\"")
                .append(_("Show the router's workload, and how it's performing"))
                .append("\">")
                .append(_("Jobs"))
                .append("</a>\n" +
 
-                       "<a href=\"graphs.jsp\" target=\"_top\" title=\"")
+                       "<a href=\"/graphs.jsp\" target=\"_top\" title=\"")
                .append(_("Graph router performance"))
                .append("\">")
                .append(_("Graphs"))
                .append("</a>\n" +
 
-                       "<a href=\"stats.jsp\" target=\"_top\" title=\"")
+                       "<a href=\"/stats.jsp\" target=\"_top\" title=\"")
                .append(_("Textual router performance statistics"))
                .append("\">")
                .append(_("Stats"))
+               .append("</a>\n" +
+
+                        "<a href=\"/i2ptunnel/index.jsp\" target=\"_blank\" title=\"")
+               .append(_("Local Destinations"))
+               .append("\">")
+               .append(_("I2PTunnel"))
+
                .append("</a></td></tr></table>\n");
 
             out.write(buf.toString());
@@ -130,7 +141,7 @@ public class SummaryBarRenderer {
 
 
 
-        buf.append("<hr><h3><a href=\"help.jsp\" target=\"_top\" title=\"")
+        buf.append("<hr><h3><a href=\"/help.jsp\" target=\"_top\" title=\"")
            .append(_("I2P Router Help"))
            .append("\">")
            .append(_("General"))
@@ -141,7 +152,7 @@ public class SummaryBarRenderer {
            .append(_helper.getIdent())
            .append(", ")
            .append(_("never reveal it to anyone"))
-           .append("\" href=\"netdb.jsp?r=.\" target=\"_top\">")
+           .append("\" href=\"/netdb.jsp?r=.\" target=\"_top\">")
            .append(_("Local Identity"))
            .append("</a></h4><hr>\n" +
 
@@ -163,7 +174,7 @@ public class SummaryBarRenderer {
            .append(_helper.getUptime())
            .append("</td></tr></table>\n" +
 
-                   "<hr><h4><a href=\"config.jsp#help\" target=\"_top\" title=\"")
+                   "<hr><h4><a href=\"/config.jsp#help\" target=\"_top\" title=\"")
            .append(_("Help with configuring your firewall and router for optimal I2P performance"))
            .append("\">")
            .append(_helper.getReachability())
@@ -172,7 +183,7 @@ public class SummaryBarRenderer {
 
         if (_helper.updateAvailable() || _helper.unsignedUpdateAvailable()) {
             // display all the time so we display the final failure message
-            buf.append("<br>").append(UpdateHandler.getStatus());
+            buf.append(UpdateHandler.getStatus());
             if ("true".equals(System.getProperty("net.i2p.router.web.UpdateHandler.updateInProgress"))) {
                 // nothing
             } else if(
@@ -187,7 +198,7 @@ public class SummaryBarRenderer {
                     System.setProperty("net.i2p.router.web.UpdateHandler.noncePrev", prev);
                 System.setProperty("net.i2p.router.web.UpdateHandler.nonce", nonce+"");
                 String uri = _helper.getRequestURI();
-                buf.append("<form action=\"").append(uri).append("\" method=\"GET\">\n");
+                buf.append("<p><form action=\"").append(uri).append("\" method=\"GET\">\n");
                 buf.append("<input type=\"hidden\" name=\"updateNonce\" value=\"").append(nonce).append("\" >\n");
                 if (_helper.updateAvailable()) {
                     buf.append("<button type=\"submit\" name=\"updateAction\" value=\"signed\" >")
@@ -217,7 +228,7 @@ public class SummaryBarRenderer {
         buf.append("<p>")
            .append(ConfigRestartBean.renderStatus(_helper.getRequestURI(), _helper.getAction(), _helper.getConsoleNonce()))
 
-           .append("</p><hr><h3><a href=\"peers.jsp\" target=\"_top\" title=\"")
+           .append("</p><hr><h3><a href=\"/peers.jsp\" target=\"_top\" title=\"")
            .append(_("Show all current peer connections"))
            .append("\">")
            .append(_("Peers"))
@@ -266,7 +277,7 @@ public class SummaryBarRenderer {
 
         boolean anotherLine = false;
         if (_helper.showFirewallWarning()) {
-            buf.append("<h4><a href=\"config.jsp\" target=\"_top\" title=\"")
+            buf.append("<h4><a href=\"/config.jsp\" target=\"_top\" title=\"")
                .append(_("Help with firewall configuration"))
                .append("\">")
                .append(_("Check NAT/firewall"))
@@ -305,7 +316,7 @@ public class SummaryBarRenderer {
             buf.append("<hr>");
 
 
-        buf.append("<h3><a href=\"config.jsp\" title=\"")
+        buf.append("<h3><a href=\"/config.jsp\" title=\"")
            .append(_("Configure router bandwidth allocation"))
            .append("\" target=\"_top\">")
            .append(_("Bandwidth in/out"))
@@ -340,7 +351,7 @@ public class SummaryBarRenderer {
            .append(_helper.getOutboundTransferred())
            .append("</td></tr></table>\n" +
 
-                   "<hr><h3><a href=\"tunnels.jsp\" target=\"_top\" title=\"")
+                   "<hr><h3><a href=\"/tunnels.jsp\" target=\"_top\" title=\"")
            .append(_("View existing tunnels and tunnel build status"))
            .append("\">")
            .append(_("Tunnels in/out"))
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java
index 1fc6c31b7096df0094e0f2942fccbf333e2264b1..d1e8cb7fdad48100bcdd37ce88500ad8d79ac31d 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java
@@ -62,6 +62,9 @@ public class SummaryHelper extends HelperBase {
             return DataHelper.formatDuration(router.getUptime());
     }
     
+/**
+    this displayed offset, not skew - now handled in reachability()
+
     private String timeSkew() {
         if (_context == null) return "";
         //if (!_context.clock().getUpdatedSuccessfully())
@@ -72,6 +75,7 @@ public class SummaryHelper extends HelperBase {
             return "";
         return " (" + DataHelper.formatDuration(diff) + " " + _("skew") + ")";
     }
+**/
     
     public boolean allowReseed() {
         return _context.netDb().isInitialized() &&
@@ -83,15 +87,20 @@ public class SummaryHelper extends HelperBase {
     public int getAllPeers() { return Math.max(_context.netDb().getKnownRouters() - 1, 0); }
     
     public String getReachability() {
-        return reachability() + timeSkew();
+        return reachability(); // + timeSkew();
     }
 
     private String reachability() {
         if (_context.router().getUptime() > 60*1000 && (!_context.router().gracefulShutdownInProgress()) &&
             !_context.clientManager().isAlive())
             return _("ERR-Client Manager I2CP Error - check logs");  // not a router problem but the user should know
-        if (!_context.clock().getUpdatedSuccessfully())
-            return _("ERR-ClockSkew");
+        // Warn based on actual skew from peers, not update status, so if we successfully offset
+        // the clock, we don't complain.
+        //if (!_context.clock().getUpdatedSuccessfully())
+        Long skew = _context.commSystem().getFramedAveragePeerClockSkew(33);
+        // Display the actual skew, not the offset
+        if (skew != null && Math.abs(skew.longValue()) > 45)
+            return _("ERR-Clock Skew of {0}", DataHelper.formatDuration(Math.abs(skew.longValue()) * 1000));
         if (_context.router().isHidden())
             return _("Hidden");
 
@@ -118,7 +127,9 @@ public class SummaryHelper extends HelperBase {
             default:
                 ra = _context.router().getRouterInfo().getTargetAddress("SSU");
                 if (ra == null && _context.router().getUptime() > 5*60*1000) {
-                    if (_context.getProperty(ConfigNetHelper.PROP_I2NP_NTCP_HOSTNAME) == null ||
+                    if (getActivePeers() <= 0)
+                        return _("ERR-No Active Peers, Check Network Connection and Firewall");
+                    else if (_context.getProperty(ConfigNetHelper.PROP_I2NP_NTCP_HOSTNAME) == null ||
                         _context.getProperty(ConfigNetHelper.PROP_I2NP_NTCP_PORT) == null)
                         return _("ERR-UDP Disabled and Inbound TCP host/port not set");
                     else
@@ -347,52 +358,58 @@ public class SummaryHelper extends HelperBase {
     }
     
     /**
-     * How many client destinations are connected locally.
+     * Client destinations connected locally.
      *
      * @return html section summary
      */
     public String getDestinations() {
-        // covert the set to a list so we can sort by name and not lose duplicates
-        List clients = new ArrayList(_context.clientManager().listClients());
-        Collections.sort(clients, new AlphaComparator());
+        // convert the set to a list so we can sort by name and not lose duplicates
+        List<Destination> clients = new ArrayList(_context.clientManager().listClients());
         
         StringBuilder buf = new StringBuilder(512);
-        buf.append("<h3><a href=\"i2ptunnel/index.jsp\" target=\"_blank\" title=\"").append(_("Add/remove/edit &amp; control your client and server tunnels")).append("\">").append(_("Local Destinations")).append("</a></h3><hr><div class=\"tunnels\"><table>");
-        
-        for (Iterator iter = clients.iterator(); iter.hasNext(); ) {
-            Destination client = (Destination)iter.next();
-            String name = getName(client);
-            Hash h = client.calculateHash();
+        buf.append("<h3><a href=\"/i2ptunnel/index.jsp\" target=\"_blank\" title=\"").append(_("Add/remove/edit &amp; control your client and server tunnels")).append("\">").append(_("Local Destinations")).append("</a></h3><hr><div class=\"tunnels\">");
+        if (clients.size() > 0) {
+            Collections.sort(clients, new AlphaComparator());
+            buf.append("<table>");
             
-            buf.append("<tr><td align=\"right\"><img src=\"/themes/console/images/");
-            if (_context.clientManager().shouldPublishLeaseSet(h))
-                buf.append("server.png\" alt=\"Server\" title=\"" + _("Server") + "\">");
-            else
-                buf.append("client.png\" alt=\"Client\" title=\"" + _("Client") + "\">");
-            buf.append("</td><td align=\"left\"><b><a href=\"tunnels.jsp#").append(h.toBase64().substring(0,4));
-            buf.append("\" target=\"_top\" title=\"" + _("Show tunnels") + "\">");
-            if (name.length() < 16)
-                buf.append(name);
-            else
-                buf.append(name.substring(0,15)).append("&hellip;");
-            buf.append("</a></b></td>\n");
-            LeaseSet ls = _context.netDb().lookupLeaseSetLocally(h);
-            if (ls != null) {
-                long timeToExpire = ls.getEarliestLeaseDate() - _context.clock().now();
-                if (timeToExpire < 0) {
-                    // red or yellow light                 
-                    buf.append("<td><img src=\"/themes/console/images/local_inprogress.png\" alt=\"").append(_("Rebuilding")).append("&hellip;\" title=\"").append(_("Leases expired")).append(" ").append(DataHelper.formatDuration(0-timeToExpire));
-                    buf.append(" ").append(_("ago")).append(". ").append(_("Rebuilding")).append("&hellip;\"></td></tr>\n");                    
+            for (Iterator<Destination> iter = clients.iterator(); iter.hasNext(); ) {
+                Destination client = iter.next();
+                String name = getName(client);
+                Hash h = client.calculateHash();
+                
+                buf.append("<tr><td align=\"right\"><img src=\"/themes/console/images/");
+                if (_context.clientManager().shouldPublishLeaseSet(h))
+                    buf.append("server.png\" alt=\"Server\" title=\"" + _("Server") + "\">");
+                else
+                    buf.append("client.png\" alt=\"Client\" title=\"" + _("Client") + "\">");
+                buf.append("</td><td align=\"left\"><b><a href=\"tunnels.jsp#").append(h.toBase64().substring(0,4));
+                buf.append("\" target=\"_top\" title=\"" + _("Show tunnels") + "\">");
+                if (name.length() < 16)
+                    buf.append(name);
+                else
+                    buf.append(name.substring(0,15)).append("&hellip;");
+                buf.append("</a></b></td>\n");
+                LeaseSet ls = _context.netDb().lookupLeaseSetLocally(h);
+                if (ls != null) {
+                    long timeToExpire = ls.getEarliestLeaseDate() - _context.clock().now();
+                    if (timeToExpire < 0) {
+                        // red or yellow light                 
+                        buf.append("<td><img src=\"/themes/console/images/local_inprogress.png\" alt=\"").append(_("Rebuilding")).append("&hellip;\" title=\"").append(_("Leases expired")).append(" ").append(DataHelper.formatDuration(0-timeToExpire));
+                        buf.append(" ").append(_("ago")).append(". ").append(_("Rebuilding")).append("&hellip;\"></td></tr>\n");                    
+                    } else {
+                        // green light 
+                        buf.append("<td><img src=\"/themes/console/images/local_up.png\" alt=\"Ready\" title=\"").append(_("Ready")).append("\"></td></tr>\n");
+                    }
                 } else {
-                    // green light 
-                    buf.append("<td><img src=\"/themes/console/images/local_up.png\" alt=\"Ready\" title=\"").append(_("Ready")).append("\"></td></tr>\n");
+                    // yellow light
+                    buf.append("<td><img src=\"/themes/console/images/local_inprogress.png\" alt=\"").append(_("Building")).append("&hellip;\" title=\"").append(_("Building tunnels")).append("&hellip;\"></td></tr>\n");
                 }
-            } else {
-                // yellow light
-                buf.append("<td><img src=\"/themes/console/images/local_inprogress.png\" alt=\"").append(_("Building")).append("&hellip;\" title=\"").append(_("Building tunnels")).append("&hellip;\"></td></tr>\n");
             }
+            buf.append("</table>");
+        } else {
+            buf.append("<center><i>").append(_("none")).append("</i></center>");
         }
-        buf.append("</table></div><hr>\n");
+        buf.append("</div><hr>\n");
         return buf.toString();
     }
     
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/TunnelRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/TunnelRenderer.java
index 9091e072f308b034f7542ad1bb2461171ab48b86..101160d41cb2b90fe79d8c4cc33203bf9271ac01 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/TunnelRenderer.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/TunnelRenderer.java
@@ -23,6 +23,7 @@ import net.i2p.router.TunnelInfo;
 import net.i2p.router.TunnelPoolSettings;
 import net.i2p.router.tunnel.HopConfig;
 import net.i2p.router.tunnel.pool.TunnelPool;
+import net.i2p.router.CommSystemFacade;
 import net.i2p.stat.RateStat;
 import net.i2p.util.ObjectCounter;
 
@@ -84,41 +85,40 @@ public class TunnelRenderer {
             }
             out.write("<tr>");
             if (cfg.getReceiveTunnel() != null)
-                out.write(" <td class=\"cells\" align=\"center\">" + cfg.getReceiveTunnel().getTunnelId() +"</td>");
+                out.write("<td class=\"cells\" align=\"center\">" + cfg.getReceiveTunnel().getTunnelId() +"</td>");
             else
-                out.write(" <td class=\"cells\" align=\"center\">n/a</td>");
+                out.write("<td class=\"cells\" align=\"center\">n/a</td>");
             if (cfg.getReceiveFrom() != null)
-                out.write(" <td class=\"cells\" align=\"right\">" + netDbLink(cfg.getReceiveFrom()) +"</td>");
+                out.write("<td class=\"cells\" align=\"center\">" + netDbLink(cfg.getReceiveFrom()) +"</td>");
             else
-                out.write(" <td class=\"cells\" align=\"center\">&nbsp;</td>");
+                out.write("<td class=\"cells\">&nbsp;</td>");
             if (cfg.getSendTunnel() != null)
-                out.write(" <td class=\"cells\" align=\"center\">" + cfg.getSendTunnel().getTunnelId() +"</td>");
+                out.write("<td class=\"cells\" align=\"center\">" + cfg.getSendTunnel().getTunnelId() +"</td>");
             else
-                out.write(" <td class=\"cells\" align=\"center\">&nbsp;</td>");
+                out.write("<td class=\"cells\">&nbsp;</td>");
             if (cfg.getSendTo() != null)
-                out.write(" <td class=\"cells\" align=\"center\">" + netDbLink(cfg.getSendTo()) +"</td>");
+                out.write("<td class=\"cells\" align=\"center\">" + netDbLink(cfg.getSendTo()) +"</td>");
             else
-//                out.write(" <td class=\"cells\" align=\"center\">&nbsp;</td>");
-                out.write(" <td class=\"cells\" align=\"center\">&nbsp;</td>");
+                out.write("<td class=\"cells\">&nbsp;</td>");
             long timeLeft = cfg.getExpiration()-_context.clock().now();
             if (timeLeft > 0)
-                out.write(" <td class=\"cells\" align=\"center\">" + DataHelper.formatDuration(timeLeft) + "</td>");
+                out.write("<td class=\"cells\" align=\"center\">" + DataHelper.formatDuration(timeLeft) + "</td>");
             else
-                out.write(" <td class=\"cells\" align=\"center\">(" + _("grace period") + ")</td>");
-            out.write(" <td class=\"cells\" align=\"center\">" + cfg.getProcessedMessagesCount() + "KB</td>");
+                out.write("<td class=\"cells\" align=\"center\">(" + _("grace period") + ")</td>");
+            out.write("<td class=\"cells\" align=\"center\">" + cfg.getProcessedMessagesCount() + "KB</td>");
             int lifetime = (int) ((_context.clock().now() - cfg.getCreation()) / 1000);
             if (lifetime <= 0)
                 lifetime = 1;
             if (lifetime > 10*60)
                 lifetime = 10*60;
             int bps = 1024 * (int) cfg.getProcessedMessagesCount() / lifetime;
-            out.write(" <td class=\"cells\" align=\"center\">" + bps + "Bps</td>");
+            out.write("<td class=\"cells\" align=\"center\">" + bps + "Bps</td>");
             if (cfg.getSendTo() == null)
-                out.write(" <td class=\"cells\" align=\"center\">" + _("Outbound Endpoint") + "</td>");
+                out.write("<td class=\"cells\" align=\"center\">" + _("Outbound Endpoint") + "</td>");
             else if (cfg.getReceiveFrom() == null)
-                out.write(" <td class=\"cells\" align=\"center\">" + _("Inbound Gateway") + "</td>");
+                out.write("<td class=\"cells\" align=\"center\">" + _("Inbound Gateway") + "</td>");
             else
-                out.write(" <td class=\"cells\" align=\"center\">" + _("Participant") + "</td>");
+                out.write("<td class=\"cells\" align=\"center\">" + _("Participant") + "</td>");
             out.write("</tr>\n");
             processed += cfg.getProcessedMessagesCount();
         }
@@ -229,10 +229,10 @@ public class TunnelRenderer {
         Set<Hash> peers = new HashSet(lc.objects());
         peers.addAll(pc.objects());
         List<Hash> peerList = new ArrayList(peers);
-        Collections.sort(peerList, new HashComparator());
+        Collections.sort(peerList, new CountryComparator(this._context.commSystem()));
 
         out.write("<h2><a name=\"peers\"></a>" + _("Tunnel Counts By Peer") + "</h2>\n");
-        out.write("<table><tr><th>" + _("Peer") + "</th><th>" + _("Expl. + Client") + "</th><th>" + _("% of total") + "</th><th>" + _("Part. from + to") + "</th><th>" + _("% of total") + "</th></tr>\n");
+        out.write("<table><tr><th>" + _("Peer") + "</th><th>" + _("Our Tunnels") + "</th><th>" + _("% of total") + "</th><th>" + _("Participating Tunnels") + "</th><th>" + _("% of total") + "</th></tr>\n");
         for (Hash h : peerList) {
              out.write("<tr> <td class=\"cells\" align=\"center\">");
              out.write(netDbLink(h));
@@ -250,7 +250,7 @@ public class TunnelRenderer {
                  out.write('0');
              out.write('\n');
         }
-        out.write("<tr class=\"tablefooter\"> <td align=\"center\"><b>" + _("Tunnels") + "</b> <td align=\"center\"><b>" + tunnelCount);
+        out.write("<tr class=\"tablefooter\"> <td align=\"center\"><b>" + _("Totals") + "</b> <td align=\"center\"><b>" + tunnelCount);
         out.write("</b> <td>&nbsp;</td> <td align=\"center\"><b>" + partCount);
         out.write("</b> <td>&nbsp;</td></tr></table></div>\n");
     }
@@ -295,6 +295,26 @@ public class TunnelRenderer {
              return ((Hash)l).toBase64().compareTo(((Hash)r).toBase64());
         }
     }
+    
+    private static class CountryComparator implements Comparator<Hash> {
+        public CountryComparator(CommSystemFacade comm) {
+            this.comm = comm;
+        }
+        public int compare(Hash l, Hash r) {
+            // get both countries
+            String lc = this.comm.getCountry(l);
+            String rc = this.comm.getCountry(r);
+            
+            // make them non-null
+            lc = (lc == null) ? "zzzz" : lc;
+            rc = (rc == null) ? "zzzz" : rc;
+            
+            // let String handle the rest
+            return lc.compareTo(rc);
+        }
+        
+        private CommSystemFacade comm;
+    }
 
     private String getCapacity(Hash peer) {
         RouterInfo info = _context.netDb().lookupRouterInfoLocally(peer);
diff --git a/apps/routerconsole/java/strings/Strings.java b/apps/routerconsole/java/strings/Strings.java
index cddec4197baf89b3443ef6f9f0223b78bd4238fd..0805d479a119730e809bcd2d9a523af8194872d0 100644
--- a/apps/routerconsole/java/strings/Strings.java
+++ b/apps/routerconsole/java/strings/Strings.java
@@ -52,5 +52,24 @@ class Dummy {
         _("dark");
         _("light");
         _("midnight");        
+
+        // stat groups for stats.jsp
+        _("Bandwidth");
+        _("BandwidthLimiter");
+        _("ClientMessages");
+        _("Encryption");
+        _("i2cp");
+        _("I2PTunnel");
+        _("InNetPool");
+        _("JobQueue");
+        _("NetworkDatabase");
+        _("ntcp");
+        _("Peers");
+        _("Router");
+        _("Stream");
+        _("Throttle");
+        _("Transport");
+        _("Tunnels");
+        _("udp");
     }
 }
diff --git a/apps/routerconsole/jsp/config.jsp b/apps/routerconsole/jsp/config.jsp
index 9a9942c79f8c5142b4ffe53d4f34d4561b3665d1..edd02bba6b56c4522f6493265821bc9cfb27117d 100644
--- a/apps/routerconsole/jsp/config.jsp
+++ b/apps/routerconsole/jsp/config.jsp
@@ -122,6 +122,11 @@
     <br>
     <input type="radio" class="optbox" name="udpAutoIP" value="hidden" <%=nethelper.getUdpAutoIPChecked(2) %> />
     <%=intl._("Hidden mode - do not publish IP")%> <i><%=intl._("(prevents participating traffic)")%></i><br>
+ </p><p>
+ <%=intl._("Action when IP changes")%>:<br>
+    <input type="checkbox" class="optbox" name="laptop" value="true" <jsp:getProperty name="nethelper" property="laptopChecked" /> />
+    <%=intl._("Laptop mode - Change router identity and UDP port when IP changes for enhanced anonymity")%>
+    (<i><%=intl._("Experimental")%></i>)
  </p><p><b><%=intl._("UDP Configuration:")%></b><br>
  <%=intl._("UDP port:")%>
  <input name ="udpPort" type="text" size="5" maxlength="5" value="<jsp:getProperty name="nethelper" property="configuredUdpPort" />" /><br>
diff --git a/apps/routerconsole/jsp/logs.jsp b/apps/routerconsole/jsp/logs.jsp
index 5af8b6afdcd84f948376dc0c0d0256e0dc1e3c38..5aa0150fbec7391286f6b2f934a9431f57e48027 100644
--- a/apps/routerconsole/jsp/logs.jsp
+++ b/apps/routerconsole/jsp/logs.jsp
@@ -20,10 +20,10 @@
 <b>Encoding:</b> <%=System.getProperty("file.encoding")%></p>
  <jsp:useBean class="net.i2p.router.web.LogsHelper" id="logsHelper" scope="request" />
  <jsp:setProperty name="logsHelper" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />
- <h3>Critical Logs</h3><a name="criticallogs"> </a>
+<h3><%=intl._("Critical Logs")%></h3><a name="criticallogs"> </a>
  <jsp:getProperty name="logsHelper" property="criticalLogs" />
- <h3>Router Logs [<a href="configlogging.jsp">configure</a>]</h3>
+<h3><%=intl._("Router Logs")%> (<a href="configlogging.jsp"><%=intl._("configure")%></a>)</h3>
  <jsp:getProperty name="logsHelper" property="logs" />
- <h3>Service (Wrapper) Logs</h3><a name="servicelogs"> </a>
+<h3><%=intl._("Service (Wrapper) Logs")%></h3><a name="servicelogs"> </a>
  <jsp:getProperty name="logsHelper" property="serviceLogs" />
 </div><hr></div></body></html>
diff --git a/apps/routerconsole/jsp/summary.jsi b/apps/routerconsole/jsp/summary.jsi
index fcab70132f643f216df8c17f1563a1a7471698ae..29be519891ba62fe92f25dc7a57012daf331b544 100644
--- a/apps/routerconsole/jsp/summary.jsi
+++ b/apps/routerconsole/jsp/summary.jsi
@@ -6,10 +6,12 @@
     String d = request.getParameter("refresh");
     String newDelay = "";
     if (d == null || "".equals(d))
-        d = System.getProperty("routerconsole.summaryRefresh");
-    else
+        d = intl.getRefresh();
+    else {
+        d = net.i2p.data.DataHelper.stripHTML(d);  // XSS
         // pass the new delay parameter to the iframe
         newDelay = "?refresh=" + d;
+    }
     if (!"0".equals(d))
         out.print("<iframe src=\"/summaryframe.jsp" + newDelay + "\" height=\"1500\" width=\"200\" scrolling=\"auto\" frameborder=\"0\" title=\"sidepanel\">\n");
 %>
@@ -25,13 +27,11 @@
         out.print("<div class=\"refresh\"><form action=\"" + request.getRequestURI() + "\" method=\"GET\">\n");
         out.print("<b>");
         // We have intl defined when this is included, but not when compiled standalone.
-        // Not that we really need it standalone, but I can't figure out how to keep
-        // this from being compiled by JspC in the build file.
-        out.print(net.i2p.router.web.Messages.getString("Refresh (s)", net.i2p.I2PAppContext.getGlobalContext()));
-        out.print(":</b> <input size=\"3\" type=\"text\" name=\"refresh\" value=\"60\" />\n");
+        out.print(intl._("Refresh (s)"));
+        out.print(":</b> <input size=\"3\" type=\"text\" name=\"refresh\" value=\"60\" >\n");
         out.print("<button type=\"submit\" value=\"Enable\" >");
         // ditto
-        out.print(net.i2p.router.web.Messages.getString("Enable", net.i2p.I2PAppContext.getGlobalContext()));
+        out.print(intl._("Enable"));
         out.print("</button>\n");
         out.print("</form></div></div>\n");
     }
diff --git a/apps/routerconsole/jsp/summaryframe.jsp b/apps/routerconsole/jsp/summaryframe.jsp
index a0123fe6f8fc82609a2e1f920a270c57e9675c24..867678299684fb7a83b4272324caac5dd29a67de 100644
--- a/apps/routerconsole/jsp/summaryframe.jsp
+++ b/apps/routerconsole/jsp/summaryframe.jsp
@@ -19,11 +19,10 @@
                            "Shutdown immediately".equals(action) || "Restart immediately".equals(action);
     if (!shutdownSoon) {
         if (d == null || "".equals(d)) {
-            d = System.getProperty("routerconsole.summaryRefresh");
-            if (d == null || "".equals(d))
-                d = "60";
+            d = intl.getRefresh();
         } else {
-            System.setProperty("routerconsole.summaryRefresh", d);
+            d = net.i2p.data.DataHelper.stripHTML(d);  // XSS
+            intl.setRefresh(d);
         }
         // we probably don't get here if d == "0" since caught in summary.jsi, but just
         // to be sure...
@@ -42,7 +41,7 @@
             long delay = 60;
             try { delay = Long.parseLong(d); } catch (NumberFormatException nfe) {}
             if (delay*1000 < timeleft + 5000)
-                out.print("<meta http-equiv=\"refresh\" content=\"" + d + "\" />\n");
+                out.print("<meta http-equiv=\"refresh\" content=\"" + d + "\" >\n");
             else
                 shutdownSoon = true;
         }
@@ -57,13 +56,13 @@
         if ("0".equals(d)) {
             out.print("<b>");
             out.print(intl._("Refresh (s)"));
-            out.print(":</b> <input size=\"3\" type=\"text\" name=\"refresh\" value=\"60\" />\n");
+            out.print(":</b> <input size=\"3\" type=\"text\" name=\"refresh\" value=\"60\" >\n");
             out.print("<button type=\"submit\" value=\"Enable\" >");
             out.print(intl._("Enable"));
             out.print("</button></div>\n");
         } else {
             // this will load in the iframe but subsequent pages will not have the iframe
-            out.print("<input type=\"hidden\" name=\"refresh\" value=\"0\" />\n");
+            out.print("<input type=\"hidden\" name=\"refresh\" value=\"0\" >\n");
             out.print("<button type=\"submit\" value=\"Disable\" >");
             out.print(intl._("Disable {0}s Refresh", d));
             out.print("</button></div>\n");
diff --git a/apps/routerconsole/locale/messages_ru.po b/apps/routerconsole/locale/messages_ru.po
new file mode 100644
index 0000000000000000000000000000000000000000..684fa78b9cc09f9d599a45c483afc6cd5b01424f
--- /dev/null
+++ b/apps/routerconsole/locale/messages_ru.po
@@ -0,0 +1,4861 @@
+# I2P
+# Copyright (C) 2009 The I2P Project
+# This file is distributed under the same license as the routerconsole package.
+# To contribute translations, see http://www.i2p2.de/newdevelopers
+# foo <foo@bar>, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: I2P routerconsole\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-12-12 18:10+0000\n"
+"PO-Revision-Date: 2009-12-12 20:14+0300\n"
+"Last-Translator: Russian Sponsor <russiansponsor@mail.i2p>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Russian\n"
+
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:117
+#, fuzzy, java-format
+msgid "Banned by router hash: {0}"
+msgstr "Забанен маршрутизатора хэш: {0}"
+
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:119
+#, fuzzy
+msgid "Banned by router hash"
+msgstr "Забанен маршрутизатора хэш"
+
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:664
+#, fuzzy
+msgid "IP banned"
+msgstr "IP запрещен"
+
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:734
+#, fuzzy, java-format
+msgid "IP banned by blocklist.txt entry {0}"
+msgstr "IP запрещен в blocklist.txt этой записей {0}"
+
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:91
+#, fuzzy
+msgid "Rejecting tunnels: Shutting down"
+msgstr "Отвергая туннели: Выключение"
+
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:140
+#, fuzzy
+msgid "Rejecting tunnels: High message delay"
+msgstr "Отвергая туннели: Высокая сообщения задержка"
+
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:176
+#, fuzzy
+msgid "Rejecting most tunnels: High number of requests"
+msgstr "Отвергая большинстве туннелей: Высокое число запросов"
+
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:232
+#, fuzzy
+msgid "Rejecting tunnels: Limit reached"
+msgstr "Отвергая туннелей: дошел до предела"
+
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:300
+#, fuzzy
+msgid "Rejecting tunnels: Bandwidth limit"
+msgstr "Отвергая туннели: ограничить пропускную способность"
+
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:370
+#, fuzzy
+msgid "Rejecting most tunnels: Bandwidth limit"
+msgstr "Отвергая наиболее туннели: ограничить пропускную способность"
+
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:374
+#, fuzzy
+msgid "Accepting most tunnels"
+msgstr "Принимая большинство туннели"
+
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:376
+#, fuzzy
+msgid "Accepting tunnels"
+msgstr "Принимая туннелей"
+
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:486
+#, fuzzy
+msgid "Rejecting tunnels"
+msgstr "Отвергая туннелей"
+
+#: ../../../router/java/src/net/i2p/router/transport/GetBidsJob.java:70
+#, fuzzy
+msgid "No transports (hidden or starting up?)"
+msgstr "Нет транспорты (скрытой или начинать?)"
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:450
+#, fuzzy
+msgid "Unreachable on any transport"
+msgstr "Недоступные на любом транспорте"
+
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/EstablishState.java:373
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/EstablishState.java:578
+#, fuzzy, java-format
+msgid "Excessive clock skew: {0}"
+msgstr "Чрезмерное часы не совпадающие по времени: {0}"
+
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:128
+#, fuzzy
+msgid "Dropping tunnel requests: Too slow"
+msgstr "Удаление туннель просит: слишком медленный"
+
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:340
+#, fuzzy
+msgid "Dropping tunnel requests: Overloaded"
+msgstr "Удаление туннель просит: Перегруженный"
+
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:499
+#, fuzzy
+msgid "Rejecting tunnels: Request overload"
+msgstr "Отвергая туннелей: Запрос перегрузки"
+
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:524
+#, fuzzy
+msgid "Rejecting tunnels: Connection limit"
+msgstr "Отвергая туннелей: Подключение к пределу"
+
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:725
+#, fuzzy
+msgid "Dropping tunnel requests: High load"
+msgstr "Удаление туннель просит: Высокие нагрузки"
+
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:734
+#, fuzzy
+msgid "Dropping tunnel requests: Queue time"
+msgstr "Удаление туннель просит: Очередь время"
+
+#: ../java/build/Countries.java:3
+#, fuzzy
+msgid "Andorra"
+msgstr "Андорра"
+
+#: ../java/build/Countries.java:4
+#, fuzzy
+msgid "United Arab Emirates"
+msgstr "Объединенные Арабские Эмираты"
+
+#: ../java/build/Countries.java:5
+#, fuzzy
+msgid "Afghanistan"
+msgstr "Афганистан"
+
+#: ../java/build/Countries.java:6
+#, fuzzy
+msgid "Antigua and Barbuda"
+msgstr "Антигуа и Барбуда"
+
+#: ../java/build/Countries.java:7
+#, fuzzy
+msgid "Anguilla"
+msgstr "Ангилья"
+
+#: ../java/build/Countries.java:8
+#, fuzzy
+msgid "Albania"
+msgstr "Албания"
+
+#: ../java/build/Countries.java:9
+#, fuzzy
+msgid "Armenia"
+msgstr "Армения"
+
+#: ../java/build/Countries.java:10
+#, fuzzy
+msgid "Netherlands Antilles"
+msgstr "Нидерландские Антильские острова"
+
+#: ../java/build/Countries.java:11
+#, fuzzy
+msgid "Angola"
+msgstr "Ангола"
+
+#: ../java/build/Countries.java:12
+#, fuzzy
+msgid "Antarctica"
+msgstr "Антарктида"
+
+#: ../java/build/Countries.java:13
+#, fuzzy
+msgid "Argentina"
+msgstr "Аргентина"
+
+#: ../java/build/Countries.java:14
+#, fuzzy
+msgid "American Samoa"
+msgstr "Американское Самоа"
+
+#: ../java/build/Countries.java:15
+#, fuzzy
+msgid "Austria"
+msgstr "Австрия"
+
+#: ../java/build/Countries.java:16
+#, fuzzy
+msgid "Australia"
+msgstr "Австралия"
+
+#: ../java/build/Countries.java:17
+#, fuzzy
+msgid "Aruba"
+msgstr "Аруба"
+
+#: ../java/build/Countries.java:19
+#, fuzzy
+msgid "Azerbaijan"
+msgstr "Азербайджан"
+
+#: ../java/build/Countries.java:20
+#, fuzzy
+msgid "Bosnia and Herzegovina"
+msgstr "Босния и Герцеговина"
+
+#: ../java/build/Countries.java:21
+#, fuzzy
+msgid "Barbados"
+msgstr "Барбадос"
+
+#: ../java/build/Countries.java:22
+#, fuzzy
+msgid "Bangladesh"
+msgstr "Бангладеш"
+
+#: ../java/build/Countries.java:23
+#, fuzzy
+msgid "Belgium"
+msgstr "Бельгия"
+
+#: ../java/build/Countries.java:24
+#, fuzzy
+msgid "Burkina Faso"
+msgstr "Буркина-Фасо"
+
+#: ../java/build/Countries.java:25
+#, fuzzy
+msgid "Bulgaria"
+msgstr "Болгария"
+
+#: ../java/build/Countries.java:26
+#, fuzzy
+msgid "Bahrain"
+msgstr "Бахрейн"
+
+#: ../java/build/Countries.java:27
+#, fuzzy
+msgid "Burundi"
+msgstr "Бурунди"
+
+#: ../java/build/Countries.java:28
+#, fuzzy
+msgid "Benin"
+msgstr "Бенин"
+
+#: ../java/build/Countries.java:29
+#, fuzzy
+msgid "Bermuda"
+msgstr "Бермудские Острова"
+
+#: ../java/build/Countries.java:30
+#, fuzzy
+msgid "Brunei Darussalam"
+msgstr "Бруней-Даруссалам"
+
+#: ../java/build/Countries.java:31
+#, fuzzy
+msgid "Bolivia"
+msgstr "Боливия"
+
+#: ../java/build/Countries.java:32
+#, fuzzy
+msgid "Brazil"
+msgstr "Бразилия"
+
+#: ../java/build/Countries.java:33
+#, fuzzy
+msgid "Bahamas"
+msgstr "Багамские острова"
+
+#: ../java/build/Countries.java:34
+#, fuzzy
+msgid "Bhutan"
+msgstr "Бутан"
+
+#: ../java/build/Countries.java:35
+#, fuzzy
+msgid "Bouvet Island"
+msgstr "Остров Буве"
+
+#: ../java/build/Countries.java:36
+#, fuzzy
+msgid "Botswana"
+msgstr "Ботсвана"
+
+#: ../java/build/Countries.java:37
+#, fuzzy
+msgid "Belarus"
+msgstr "Беларусь"
+
+#: ../java/build/Countries.java:38
+#, fuzzy
+msgid "Belize"
+msgstr "Белиз"
+
+#: ../java/build/Countries.java:39
+#, fuzzy
+msgid "Canada"
+msgstr "Канада"
+
+#: ../java/build/Countries.java:40
+#, fuzzy
+msgid "The Democratic Republic of the Congo"
+msgstr "Демократическая Республика Конго"
+
+#: ../java/build/Countries.java:41
+#, fuzzy
+msgid "Central African Republic"
+msgstr "Центральноафриканская Республика"
+
+#: ../java/build/Countries.java:42
+#, fuzzy
+msgid "Congo"
+msgstr "Конго"
+
+#: ../java/build/Countries.java:43
+#, fuzzy
+msgid "Switzerland"
+msgstr "Швейцария"
+
+#: ../java/build/Countries.java:44
+#, fuzzy
+msgid "Cote D'Ivoire"
+msgstr "Кот-д'Ивуар"
+
+#: ../java/build/Countries.java:45
+#, fuzzy
+msgid "Cook Islands"
+msgstr "Острова Кука"
+
+#: ../java/build/Countries.java:46
+#, fuzzy
+msgid "Chile"
+msgstr "Чили"
+
+#: ../java/build/Countries.java:47
+#, fuzzy
+msgid "Cameroon"
+msgstr "Камерун"
+
+#: ../java/build/Countries.java:48
+#, fuzzy
+msgid "China"
+msgstr "Китай"
+
+#: ../java/build/Countries.java:49
+#, fuzzy
+msgid "Colombia"
+msgstr "Колумбия"
+
+#: ../java/build/Countries.java:50
+#, fuzzy
+msgid "Costa Rica"
+msgstr "Коста-Рика"
+
+#: ../java/build/Countries.java:51
+#, fuzzy
+msgid "Serbia and Montenegro"
+msgstr "Сербия и Черногория"
+
+#: ../java/build/Countries.java:52
+#, fuzzy
+msgid "Cuba"
+msgstr "Куба"
+
+#: ../java/build/Countries.java:53
+#, fuzzy
+msgid "Cape Verde"
+msgstr "Кабо-Верде"
+
+#: ../java/build/Countries.java:54
+#, fuzzy
+msgid "Cyprus"
+msgstr "Кипр"
+
+#: ../java/build/Countries.java:55
+#, fuzzy
+msgid "Czech Republic"
+msgstr "Чехия"
+
+#: ../java/build/Countries.java:56
+#, fuzzy
+msgid "Germany"
+msgstr "Германия"
+
+#: ../java/build/Countries.java:57
+#, fuzzy
+msgid "Djibouti"
+msgstr "Джибути"
+
+#: ../java/build/Countries.java:58
+#, fuzzy
+msgid "Denmark"
+msgstr "Дания"
+
+#: ../java/build/Countries.java:59
+#, fuzzy
+msgid "Dominica"
+msgstr "Доминика"
+
+#: ../java/build/Countries.java:60
+#, fuzzy
+msgid "Dominican Republic"
+msgstr "Доминиканская Республика"
+
+#: ../java/build/Countries.java:61
+#, fuzzy
+msgid "Algeria"
+msgstr "Алжир"
+
+#: ../java/build/Countries.java:62
+#, fuzzy
+msgid "Ecuador"
+msgstr "Эквадор"
+
+#: ../java/build/Countries.java:63
+#, fuzzy
+msgid "Estonia"
+msgstr "Эстония"
+
+#: ../java/build/Countries.java:64
+#, fuzzy
+msgid "Egypt"
+msgstr "Египет"
+
+#: ../java/build/Countries.java:65
+#, fuzzy
+msgid "Eritrea"
+msgstr "Эритрея"
+
+#: ../java/build/Countries.java:66
+#, fuzzy
+msgid "Spain"
+msgstr "Испания"
+
+#: ../java/build/Countries.java:67
+#, fuzzy
+msgid "Ethiopia"
+msgstr "Эфиопия"
+
+#: ../java/build/Countries.java:68
+#, fuzzy
+msgid "Finland"
+msgstr "Финляндия"
+
+#: ../java/build/Countries.java:69
+#, fuzzy
+msgid "Fiji"
+msgstr "Фиджи"
+
+#: ../java/build/Countries.java:70
+#, fuzzy
+msgid "Falkland Islands (Malvinas)"
+msgstr "Фолклендские (Мальвинские)"
+
+#: ../java/build/Countries.java:71
+#, fuzzy
+msgid "Federated States of Micronesia"
+msgstr "Федеративные Штаты Микронезии"
+
+#: ../java/build/Countries.java:72
+#, fuzzy
+msgid "Faroe Islands"
+msgstr "Фарерские острова"
+
+#: ../java/build/Countries.java:73
+#, fuzzy
+msgid "France"
+msgstr "Франция"
+
+#: ../java/build/Countries.java:74
+#, fuzzy
+msgid "Gabon"
+msgstr "Габон"
+
+#: ../java/build/Countries.java:75
+#, fuzzy
+msgid "United Kingdom"
+msgstr "Великобритания"
+
+#: ../java/build/Countries.java:76
+#, fuzzy
+msgid "Grenada"
+msgstr "Гренада"
+
+#: ../java/build/Countries.java:77
+#, fuzzy
+msgid "Georgia"
+msgstr "Грузия"
+
+#: ../java/build/Countries.java:78
+#, fuzzy
+msgid "French Guiana"
+msgstr "Французская Гвиана"
+
+#: ../java/build/Countries.java:79
+#, fuzzy
+msgid "Ghana"
+msgstr "Гана"
+
+#: ../java/build/Countries.java:80
+#, fuzzy
+msgid "Gibraltar"
+msgstr "Гибралтар"
+
+#: ../java/build/Countries.java:81
+#, fuzzy
+msgid "Greenland"
+msgstr "Гренландия"
+
+#: ../java/build/Countries.java:82
+#, fuzzy
+msgid "Gambia"
+msgstr "Гамбия"
+
+#: ../java/build/Countries.java:83
+#, fuzzy
+msgid "Guinea"
+msgstr "Гвинея"
+
+#: ../java/build/Countries.java:84
+#, fuzzy
+msgid "Guadeloupe"
+msgstr "Гваделупа"
+
+#: ../java/build/Countries.java:85
+#, fuzzy
+msgid "Equatorial Guinea"
+msgstr "Экваториальная Гвинея"
+
+#: ../java/build/Countries.java:86
+#, fuzzy
+msgid "Greece"
+msgstr "Греция"
+
+#: ../java/build/Countries.java:87
+#, fuzzy
+msgid "South Georgia and the South Sandwich Islands"
+msgstr "Южная Джорджия и Южные Сандвичевы Острова"
+
+#: ../java/build/Countries.java:88
+#, fuzzy
+msgid "Guatemala"
+msgstr "Гватемала"
+
+#: ../java/build/Countries.java:89
+#, fuzzy
+msgid "Guam"
+msgstr "Гуам"
+
+#: ../java/build/Countries.java:90
+#, fuzzy
+msgid "Guinea-Bissau"
+msgstr "Гвинея-Бисау"
+
+#: ../java/build/Countries.java:91
+#, fuzzy
+msgid "Guyana"
+msgstr "Гайана"
+
+#: ../java/build/Countries.java:92
+#, fuzzy
+msgid "Hong Kong"
+msgstr "Гонконг"
+
+#: ../java/build/Countries.java:93
+#, fuzzy
+msgid "Honduras"
+msgstr "Гондурас"
+
+#: ../java/build/Countries.java:94
+#, fuzzy
+msgid "Croatia"
+msgstr "Хорватия"
+
+#: ../java/build/Countries.java:95
+#, fuzzy
+msgid "Haiti"
+msgstr "Гаити"
+
+#: ../java/build/Countries.java:96
+#, fuzzy
+msgid "Hungary"
+msgstr "Венгрия"
+
+#: ../java/build/Countries.java:97
+#, fuzzy
+msgid "Indonesia"
+msgstr "Индонезия"
+
+#: ../java/build/Countries.java:98
+#, fuzzy
+msgid "Ireland"
+msgstr "Ирландия"
+
+#: ../java/build/Countries.java:99
+#, fuzzy
+msgid "Israel"
+msgstr "Израиль"
+
+#: ../java/build/Countries.java:101
+#, fuzzy
+msgid "India"
+msgstr "Индия"
+
+#: ../java/build/Countries.java:102
+#, fuzzy
+msgid "British Indian Ocean Territory"
+msgstr "Британская территория в Индийском океане"
+
+#: ../java/build/Countries.java:103
+#, fuzzy
+msgid "Iraq"
+msgstr "Ирак"
+
+#: ../java/build/Countries.java:104
+#, fuzzy
+msgid "Islamic Republic of Iran"
+msgstr "Исламская Республика Иран"
+
+#: ../java/build/Countries.java:105
+#, fuzzy
+msgid "Iceland"
+msgstr "Исландия"
+
+#: ../java/build/Countries.java:106
+#, fuzzy
+msgid "Italy"
+msgstr "Италия"
+
+#: ../java/build/Countries.java:108
+#, fuzzy
+msgid "Jamaica"
+msgstr "Ямайка"
+
+#: ../java/build/Countries.java:109
+#, fuzzy
+msgid "Jordan"
+msgstr "Иордания"
+
+#: ../java/build/Countries.java:110
+#, fuzzy
+msgid "Japan"
+msgstr "Япония"
+
+#: ../java/build/Countries.java:111
+#, fuzzy
+msgid "Kenya"
+msgstr "Кения"
+
+#: ../java/build/Countries.java:112
+#, fuzzy
+msgid "Kyrgyzstan"
+msgstr "Кыргызстан"
+
+#: ../java/build/Countries.java:113
+#, fuzzy
+msgid "Cambodia"
+msgstr "Камбоджа"
+
+#: ../java/build/Countries.java:114
+#, fuzzy
+msgid "Kiribati"
+msgstr "Кирибати"
+
+#: ../java/build/Countries.java:115
+#, fuzzy
+msgid "Comoros"
+msgstr "Коморские Острова"
+
+#: ../java/build/Countries.java:116
+#, fuzzy
+msgid "Saint Kitts and Nevis"
+msgstr "Сент-Китс и Невис"
+
+#: ../java/build/Countries.java:117
+#, fuzzy
+msgid "Republic of Korea"
+msgstr "Республика Корея"
+
+#: ../java/build/Countries.java:118
+#, fuzzy
+msgid "Kuwait"
+msgstr "Кувейт"
+
+#: ../java/build/Countries.java:119
+#, fuzzy
+msgid "Cayman Islands"
+msgstr "Каймановы острова"
+
+#: ../java/build/Countries.java:120
+#, fuzzy
+msgid "Kazakhstan"
+msgstr "Казахстан"
+
+#: ../java/build/Countries.java:121
+#, fuzzy
+msgid "Lao People's Democratic Republic"
+msgstr "Лаосская Народно-Демократическая Республика"
+
+#: ../java/build/Countries.java:122
+#, fuzzy
+msgid "Lebanon"
+msgstr "Ливан"
+
+#: ../java/build/Countries.java:123
+#, fuzzy
+msgid "Saint Lucia"
+msgstr "Сент-Люсия"
+
+#: ../java/build/Countries.java:124
+#, fuzzy
+msgid "Liechtenstein"
+msgstr "Лихтенштейн"
+
+#: ../java/build/Countries.java:125
+#, fuzzy
+msgid "Sri Lanka"
+msgstr "Шри-Ланка"
+
+#: ../java/build/Countries.java:126
+#, fuzzy
+msgid "Liberia"
+msgstr "Либерия"
+
+#: ../java/build/Countries.java:127
+#, fuzzy
+msgid "Lesotho"
+msgstr "Лесото"
+
+#: ../java/build/Countries.java:128
+#, fuzzy
+msgid "Lithuania"
+msgstr "Литва"
+
+#: ../java/build/Countries.java:129
+#, fuzzy
+msgid "Luxembourg"
+msgstr "Люксембург"
+
+#: ../java/build/Countries.java:130
+#, fuzzy
+msgid "Latvia"
+msgstr "Латвия"
+
+#: ../java/build/Countries.java:131
+#, fuzzy
+msgid "Libyan Arab Jamahiriya"
+msgstr "Ливийская Арабская Джамахирия"
+
+#: ../java/build/Countries.java:132
+#, fuzzy
+msgid "Morocco"
+msgstr "Марокко"
+
+#: ../java/build/Countries.java:133
+#, fuzzy
+msgid "Monaco"
+msgstr "Монако"
+
+#: ../java/build/Countries.java:134
+#, fuzzy
+msgid "Republic of Moldova"
+msgstr "Республика Молдова"
+
+#: ../java/build/Countries.java:137
+#, fuzzy
+msgid "Madagascar"
+msgstr "Мадагаскар"
+
+#: ../java/build/Countries.java:138
+#, fuzzy
+msgid "Marshall Islands"
+msgstr "Маршалловы Острова"
+
+#: ../java/build/Countries.java:139
+#, fuzzy
+msgid "The Former Yugoslav Republic of Macedonia"
+msgstr "Бывшая югославская Республика Македония"
+
+#: ../java/build/Countries.java:140
+#, fuzzy
+msgid "Mali"
+msgstr "Мали"
+
+#: ../java/build/Countries.java:141
+#, fuzzy
+msgid "Myanmar"
+msgstr "Мьянма"
+
+#: ../java/build/Countries.java:142
+#, fuzzy
+msgid "Mongolia"
+msgstr "Монголия"
+
+#: ../java/build/Countries.java:143
+#, fuzzy
+msgid "Macao"
+msgstr "Макао"
+
+#: ../java/build/Countries.java:144
+#, fuzzy
+msgid "Northern Mariana Islands"
+msgstr "Северные Марианские о-ва"
+
+#: ../java/build/Countries.java:145
+#, fuzzy
+msgid "Martinique"
+msgstr "Мартиника"
+
+#: ../java/build/Countries.java:146
+#, fuzzy
+msgid "Mauritania"
+msgstr "Мавритания"
+
+#: ../java/build/Countries.java:147
+#, fuzzy
+msgid "Montserrat"
+msgstr "Монтсеррат"
+
+#: ../java/build/Countries.java:148
+#, fuzzy
+msgid "Malta"
+msgstr "Мальта"
+
+#: ../java/build/Countries.java:149
+#, fuzzy
+msgid "Mauritius"
+msgstr "Маврикий"
+
+#: ../java/build/Countries.java:150
+#, fuzzy
+msgid "Maldives"
+msgstr "Мальдивы"
+
+#: ../java/build/Countries.java:151
+#, fuzzy
+msgid "Malawi"
+msgstr "Малави"
+
+#: ../java/build/Countries.java:152
+#, fuzzy
+msgid "Mexico"
+msgstr "Мексика"
+
+#: ../java/build/Countries.java:153
+#, fuzzy
+msgid "Malaysia"
+msgstr "Малайзия"
+
+#: ../java/build/Countries.java:154
+#, fuzzy
+msgid "Mozambique"
+msgstr "Мозамбик"
+
+#: ../java/build/Countries.java:155
+#, fuzzy
+msgid "Namibia"
+msgstr "Мозамбик"
+
+#: ../java/build/Countries.java:156
+#, fuzzy
+msgid "New Caledonia"
+msgstr "Новая Каледония"
+
+#: ../java/build/Countries.java:157
+#, fuzzy
+msgid "Niger"
+msgstr "Нигер"
+
+#: ../java/build/Countries.java:158
+#, fuzzy
+msgid "Norfolk Island"
+msgstr "Остров Норфолк"
+
+#: ../java/build/Countries.java:159
+#, fuzzy
+msgid "Nigeria"
+msgstr "Нигерия"
+
+#: ../java/build/Countries.java:160
+#, fuzzy
+msgid "Nicaragua"
+msgstr "Никарагуа"
+
+#: ../java/build/Countries.java:161
+#, fuzzy
+msgid "Netherlands"
+msgstr "Нидерланды"
+
+#: ../java/build/Countries.java:162
+#, fuzzy
+msgid "Norway"
+msgstr "Норвегия"
+
+#: ../java/build/Countries.java:163
+#, fuzzy
+msgid "Nepal"
+msgstr "Непал"
+
+#: ../java/build/Countries.java:164
+#, fuzzy
+msgid "Nauru"
+msgstr "Науру"
+
+#: ../java/build/Countries.java:165
+#, fuzzy
+msgid "Niue"
+msgstr "Ниуэ"
+
+#: ../java/build/Countries.java:166
+#, fuzzy
+msgid "New Zealand"
+msgstr "Новая Зеландия"
+
+#: ../java/build/Countries.java:167
+#, fuzzy
+msgid "Oman"
+msgstr "Оман"
+
+#: ../java/build/Countries.java:168
+#, fuzzy
+msgid "Panama"
+msgstr "Панама"
+
+#: ../java/build/Countries.java:169
+#, fuzzy
+msgid "Peru"
+msgstr "Перу"
+
+#: ../java/build/Countries.java:170
+#, fuzzy
+msgid "French Polynesia"
+msgstr "Французская Полинезия"
+
+#: ../java/build/Countries.java:171
+#, fuzzy
+msgid "Papua New Guinea"
+msgstr "Папуа-Новая Гвинея"
+
+#: ../java/build/Countries.java:172
+#, fuzzy
+msgid "Philippines"
+msgstr "Филиппины"
+
+#: ../java/build/Countries.java:173
+#, fuzzy
+msgid "Pakistan"
+msgstr "Пакистан"
+
+#: ../java/build/Countries.java:174
+#, fuzzy
+msgid "Poland"
+msgstr "Польша"
+
+#: ../java/build/Countries.java:175
+#, fuzzy
+msgid "Saint Pierre and Miquelon"
+msgstr "Сен-Пьер и Микелон"
+
+#: ../java/build/Countries.java:176
+#, fuzzy
+msgid "Puerto Rico"
+msgstr "Пуэрто-Рико"
+
+#: ../java/build/Countries.java:177
+#, fuzzy
+msgid "Palestinian Territory"
+msgstr "Палестинская автономия"
+
+#: ../java/build/Countries.java:178
+#, fuzzy
+msgid "Portugal"
+msgstr "Португалия"
+
+#: ../java/build/Countries.java:179
+#, fuzzy
+msgid "Palau"
+msgstr "Палау"
+
+#: ../java/build/Countries.java:180
+#, fuzzy
+msgid "Paraguay"
+msgstr "Парагвай"
+
+#: ../java/build/Countries.java:181
+#, fuzzy
+msgid "Qatar"
+msgstr "Катар"
+
+#: ../java/build/Countries.java:182
+#, fuzzy
+msgid "Reunion"
+msgstr "Реюньон"
+
+#: ../java/build/Countries.java:183
+#, fuzzy
+msgid "Romania"
+msgstr "Румыния"
+
+#: ../java/build/Countries.java:184
+#, fuzzy
+msgid "Serbia"
+msgstr "Сербия"
+
+#: ../java/build/Countries.java:185
+#, fuzzy
+msgid "Russian Federation"
+msgstr "Русская Федерация"
+
+#: ../java/build/Countries.java:186
+#, fuzzy
+msgid "Rwanda"
+msgstr "Руанда"
+
+#: ../java/build/Countries.java:187
+#, fuzzy
+msgid "Saudi Arabia"
+msgstr "Саудовская Аравия"
+
+#: ../java/build/Countries.java:188
+#, fuzzy
+msgid "Solomon Islands"
+msgstr "Соломоновы Острова"
+
+#: ../java/build/Countries.java:189
+#, fuzzy
+msgid "Seychelles"
+msgstr "Сейшельские Острова"
+
+#: ../java/build/Countries.java:190
+#, fuzzy
+msgid "Sudan"
+msgstr "Судан"
+
+#: ../java/build/Countries.java:191
+#, fuzzy
+msgid "Sweden"
+msgstr "Швеция"
+
+#: ../java/build/Countries.java:192
+#, fuzzy
+msgid "Singapore"
+msgstr "Сингапур"
+
+#: ../java/build/Countries.java:193
+#, fuzzy
+msgid "Slovenia"
+msgstr "Словения"
+
+#: ../java/build/Countries.java:194
+#, fuzzy
+msgid "Slovakia"
+msgstr "Словакия"
+
+#: ../java/build/Countries.java:195
+#, fuzzy
+msgid "Sierra Leone"
+msgstr "Сьерра-Леоне"
+
+#: ../java/build/Countries.java:196
+#, fuzzy
+msgid "San Marino"
+msgstr "Сан - Марине"
+
+#: ../java/build/Countries.java:197
+#, fuzzy
+msgid "Senegal"
+msgstr "Сенегал"
+
+#: ../java/build/Countries.java:198
+#, fuzzy
+msgid "Somalia"
+msgstr "Сомали"
+
+#: ../java/build/Countries.java:199
+#, fuzzy
+msgid "Suriname"
+msgstr "Суринам"
+
+#: ../java/build/Countries.java:200
+#, fuzzy
+msgid "Sao Tome and Principe"
+msgstr "Сан-Томе и Принсипи"
+
+#: ../java/build/Countries.java:201
+#, fuzzy
+msgid "El Salvador"
+msgstr "Сальвадор"
+
+#: ../java/build/Countries.java:202
+#, fuzzy
+msgid "Syrian Arab Republic"
+msgstr "Сирийская Арабская Республика"
+
+#: ../java/build/Countries.java:203
+#, fuzzy
+msgid "Swaziland"
+msgstr "Свазиленд"
+
+#: ../java/build/Countries.java:204
+#, fuzzy
+msgid "Turks and Caicos Islands"
+msgstr "Острова Теркс и Кайкос"
+
+#: ../java/build/Countries.java:205
+#, fuzzy
+msgid "Chad"
+msgstr "Чад"
+
+#: ../java/build/Countries.java:206
+#, fuzzy
+msgid "French Southern Territories"
+msgstr "Французские Южные Территории"
+
+#: ../java/build/Countries.java:207
+#, fuzzy
+msgid "Togo"
+msgstr "Того"
+
+#: ../java/build/Countries.java:208
+#, fuzzy
+msgid "Thailand"
+msgstr "Таиланд"
+
+#: ../java/build/Countries.java:209
+#, fuzzy
+msgid "Tajikistan"
+msgstr "Таджикистан"
+
+#: ../java/build/Countries.java:210
+#, fuzzy
+msgid "Tokelau"
+msgstr "Токелау"
+
+#: ../java/build/Countries.java:211
+#, fuzzy
+msgid "Timor-Leste"
+msgstr "Восточный Тимор"
+
+#: ../java/build/Countries.java:212
+#, fuzzy
+msgid "Turkmenistan"
+msgstr "Туркменистан"
+
+#: ../java/build/Countries.java:213
+#, fuzzy
+msgid "Tunisia"
+msgstr "Тунис"
+
+#: ../java/build/Countries.java:214
+#, fuzzy
+msgid "Tonga"
+msgstr "Тонга"
+
+#: ../java/build/Countries.java:215
+#, fuzzy
+msgid "Turkey"
+msgstr "Турция"
+
+#: ../java/build/Countries.java:216
+#, fuzzy
+msgid "Trinidad and Tobago"
+msgstr "Тринидад и Тобаго"
+
+#: ../java/build/Countries.java:217
+#, fuzzy
+msgid "Tuvalu"
+msgstr "Тувалу"
+
+#: ../java/build/Countries.java:218
+#, fuzzy
+msgid "Taiwan"
+msgstr "Тайвань"
+
+#: ../java/build/Countries.java:219
+#, fuzzy
+msgid "United Republic of Tanzania"
+msgstr "Объединенная Республика Танзания"
+
+#: ../java/build/Countries.java:220
+#, fuzzy
+msgid "Ukraine"
+msgstr "Украина"
+
+#: ../java/build/Countries.java:221
+#, fuzzy
+msgid "Uganda"
+msgstr "Уганда"
+
+#: ../java/build/Countries.java:222
+#, fuzzy
+msgid "United States Minor Outlying Islands"
+msgstr "Внешние малые острова (США)"
+
+#: ../java/build/Countries.java:223
+#, fuzzy
+msgid "United States"
+msgstr "Соединенные Штаты Америки"
+
+#: ../java/build/Countries.java:224
+#, fuzzy
+msgid "Uruguay"
+msgstr "Уругвай"
+
+#: ../java/build/Countries.java:225
+#, fuzzy
+msgid "Uzbekistan"
+msgstr "Узбекистан"
+
+#: ../java/build/Countries.java:226
+#, fuzzy
+msgid "Holy See (Vatican City State)"
+msgstr "Святой Престол (Ватикан)"
+
+#: ../java/build/Countries.java:227
+#, fuzzy
+msgid "Saint Vincent and the Grenadines"
+msgstr "Сент-Винсент и Гренадины"
+
+#: ../java/build/Countries.java:228
+#, fuzzy
+msgid "Venezuela"
+msgstr "Венесуэла"
+
+#: ../java/build/Countries.java:229
+#: ../java/build/Countries.java:230
+#, fuzzy
+msgid "Virgin Islands"
+msgstr "Виргинские острова"
+
+#: ../java/build/Countries.java:231
+#, fuzzy
+msgid "Viet Nam"
+msgstr "Вьетнам"
+
+#: ../java/build/Countries.java:232
+#, fuzzy
+msgid "Vanuatu"
+msgstr "Вануату"
+
+#: ../java/build/Countries.java:233
+#, fuzzy
+msgid "Wallis and Futuna"
+msgstr "Уоллис и Футуна"
+
+#: ../java/build/Countries.java:234
+#, fuzzy
+msgid "Samoa"
+msgstr "Самоа"
+
+#: ../java/build/Countries.java:235
+#, fuzzy
+msgid "Yemen"
+msgstr "Йемен"
+
+#: ../java/build/Countries.java:236
+#, fuzzy
+msgid "Mayotte"
+msgstr "Майотта"
+
+#: ../java/build/Countries.java:237
+#, fuzzy
+msgid "South Africa"
+msgstr "Южная Африка"
+
+#: ../java/build/Countries.java:238
+#, fuzzy
+msgid "Zambia"
+msgstr "Замбия"
+
+#: ../java/build/Countries.java:239
+#, fuzzy
+msgid "Zimbabwe"
+msgstr "Зимбабве"
+
+#: ../java/src/net/i2p/router/web/CSSHelper.java:41
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:30
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:32
+#: ../java/strings/Strings.java:29
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:234
+#, fuzzy
+msgid "I2P Router Console"
+msgstr "Консоль Маршрутизатора I2P"
+
+#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:57
+#, fuzzy
+msgid "Error updating the configuration - please see the error logs"
+msgstr "Ошибка при обновлении конфигурации - смотрите логи ошибок"
+
+#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:69
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:251
+#, fuzzy
+msgid "Configuration saved successfully"
+msgstr "Конфигурация успешно сохранены"
+
+#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:71
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:253
+#, fuzzy
+msgid "Error saving the configuration (applied but not saved) - please see the error logs"
+msgstr "Ошибка при сохранении конфигурации (применяется, но не сохранили) - пожалуйста, смотрите логи ошибок"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:32
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:321
+#, fuzzy
+msgid "Save Client Configuration"
+msgstr "Сохраните Настройки Клиента"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:36
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:333
+#, fuzzy
+msgid "Save WebApp Configuration"
+msgstr "Сохранять WebApp Конфигурацию"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:54
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:67
+#, fuzzy
+msgid "Start"
+msgstr "Включать"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:68
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:49
+#, fuzzy
+msgid "Unsupported"
+msgstr "Неподдерживаемый"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:83
+#, fuzzy
+msgid "Client configuration saved successfully - restart required to take effect."
+msgstr "Настройка клиента успешно сохранены - Требуется перезагрузка вступили в силу."
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:89
+#, fuzzy
+msgid "Bad client index."
+msgstr "Индекс плохой клиент."
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:94
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:17
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:363
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:371
+#, fuzzy
+msgid "Client"
+msgstr "Клиент"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:94
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:129
+#, fuzzy
+msgid "started"
+msgstr "началось"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:111
+#, fuzzy
+msgid "WebApp configuration saved successfully - restart required to take effect."
+msgstr "Конфигурация веб-приложений успешно сохранены - Требуется перезагрузка вступили в силу."
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:129
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:34
+#, fuzzy
+msgid "WebApp"
+msgstr "Веб-приложение"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:131
+#, fuzzy
+msgid "Failed to start"
+msgstr "Сбой при запуске"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:137
+#, fuzzy
+msgid "Failed to find server."
+msgstr "Не удалось найти сервер."
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:17
+#, fuzzy
+msgid "Class and arguments"
+msgstr "Класс и параметры"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:17
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:34
+#, fuzzy
+msgid "Run at Startup?"
+msgstr "Запустить при следующем запуске системы?"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:17
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:34
+#, fuzzy
+msgid "Start Now"
+msgstr "Запустить Cейчас"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:34
+#, fuzzy
+msgid "Description"
+msgstr "Описание"
+
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:18
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:320
+#, fuzzy
+msgid "Add key"
+msgstr "Добавить ключ"
+
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:19
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:322
+#, fuzzy
+msgid "Delete key"
+msgstr "Удалить ключ"
+
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:21
+#, fuzzy
+msgid "You must enter a destination"
+msgstr "Вы должны ввести назначения"
+
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:23
+#, fuzzy
+msgid "You must enter a key"
+msgstr "Вы должны ввести ключевые"
+
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:34
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:41
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:43
+#, fuzzy
+msgid "Key for"
+msgstr "Ключ для"
+
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:34
+#, fuzzy
+msgid "added to keyring"
+msgstr "добавить в связку ключей"
+
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:36
+#, fuzzy
+msgid "Invalid destination or key"
+msgstr "Invalid destination or key"
+
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:41
+#, fuzzy
+msgid "removed from keyring"
+msgstr "удалены из связку ключей"
+
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:43
+#, fuzzy
+msgid "not found in keyring"
+msgstr "Не найдено в связку ключей"
+
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:45
+#, fuzzy
+msgid "Invalid destination"
+msgstr "Invalid destination"
+
+#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:52
+#, fuzzy
+msgid "CRIT"
+msgstr "КРИТИЧЕСКИЕ"
+
+#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:52
+#, fuzzy
+msgid "DEBUG"
+msgstr "ОТЛАДКА"
+
+#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:52
+#, fuzzy
+msgid "ERROR"
+msgstr "ОШИБКА"
+
+#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:52
+#, fuzzy
+msgid "INFO"
+msgstr "ИНФОРМАЦИЯ"
+
+#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:52
+#, fuzzy
+msgid "WARN"
+msgstr "ПРЕДУПРЕЖДЕНИЕ"
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
+#, fuzzy
+msgid "Network"
+msgstr "Сеть"
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
+#, fuzzy
+msgid "Service"
+msgstr "Сервис"
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:86
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:253
+#, fuzzy
+msgid "Tunnels"
+msgstr "Туннели"
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
+#, fuzzy
+msgid "UI"
+msgstr "Интерфейс Пользователя"
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:202
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:209
+#, fuzzy
+msgid "Update"
+msgstr "Обновление"
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
+#, fuzzy
+msgid "Clients"
+msgstr "Клиенты"
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:292
+#, fuzzy
+msgid "Keyring"
+msgstr "Cвязку Kлючей"
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
+#, fuzzy
+msgid "Logging"
+msgstr "Логи"
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:92
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:227
+#, fuzzy
+msgid "Peers"
+msgstr "Пиры"
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:293
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:128
+#, fuzzy
+msgid "Stats"
+msgstr "Статистика"
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:20
+#, fuzzy
+msgid "Advanced"
+msgstr "Расширенный"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:47
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:249
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:35
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:357
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:494
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:333
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:373
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:341
+#, fuzzy
+msgid "Save changes"
+msgstr "Сохранить изменения"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:119
+#, fuzzy
+msgid "Rechecking router reachability..."
+msgstr "Повторная проверка доступности маршрутизатора..."
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:148
+#, fuzzy
+msgid "Updating IP address"
+msgstr "Обновление IP-адреса"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:166
+#, fuzzy
+msgid "Disabling TCP completely"
+msgstr "Отключение TCP полностью"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:170
+#, fuzzy
+msgid "Updating inbound TCP address to"
+msgstr "Обновление входящего в адрес TCP"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:174
+#, fuzzy
+msgid "Disabling inbound TCP"
+msgstr "Отключение входящие TCP"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:176
+#, fuzzy
+msgid "Updating inbound TCP address to auto"
+msgstr "Обновление входящего адреса TCP автоматически"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:185
+#, fuzzy
+msgid "Updating inbound TCP port to"
+msgstr "Обновление входящего порта TCP для"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:188
+#, fuzzy
+msgid "Updating inbound TCP port to auto"
+msgstr "Обновление входящего порта TCP автоматически"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:200
+#, fuzzy
+msgid "Updating UDP port from"
+msgstr "Обновление от UDP порта"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:200
+#, fuzzy
+msgid "to"
+msgstr "к"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:216
+#, fuzzy
+msgid "Gracefully restarting into Hidden Router Mode"
+msgstr "Правильно перезапуска в скрытые режиме маршрутизатора"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:218
+#, fuzzy
+msgid "Gracefully restarting to exit Hidden Router Mode"
+msgstr "Правильно перезапуска для выхода Скрытый режим маршрутизатора"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:227
+#, fuzzy
+msgid "Enabling UPnP, restart required to take effect"
+msgstr "Включение UPnP, необходима перезагрузка вступили в силу"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:229
+#, fuzzy
+msgid "Disabling UPnP, restart required to take effect"
+msgstr "Отключение UPnP, необходима перезагрузка вступили в силу"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:235
+#, fuzzy
+msgid "Requiring SSU introducers"
+msgstr "Требование SSU поручителями"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:275
+#, fuzzy
+msgid "Gracefully restarting I2P to change published router address"
+msgstr "Правильно перезапуска I2P изменить опубликован адрес маршрутизатора"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:293
+#, fuzzy
+msgid "Updating bandwidth share percentage"
+msgstr "Обновление пропускную процентной доли"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:363
+#, fuzzy
+msgid "Updated bandwidth limits"
+msgstr "Обновлен пределы полосы пропускания"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:39
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:47
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:50
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:57
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:60
+#, fuzzy
+msgid "unknown"
+msgstr "неизвестный"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:165
+#, fuzzy
+msgid "bits per second"
+msgstr "бит в секунду"
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:20
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:314
+#, fuzzy
+msgid "Ban peer until restart"
+msgstr "Запрет пир пока маршрутизатора перезагружается"
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:23
+#, fuzzy, java-format
+msgid "Manually banned via {0}"
+msgstr "Вручную запретили через {0}"
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:24
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:33
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:35
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:81
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:187
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:235
+#, fuzzy
+msgid "Peer"
+msgstr "Пир"
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:24
+#, fuzzy
+msgid "banned until restart"
+msgstr "Запрещена пока перезагрузка"
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:27
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:38
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:59
+#, fuzzy
+msgid "Invalid peer"
+msgstr "Неверное сверстников"
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:28
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:316
+#, fuzzy
+msgid "Unban peer"
+msgstr "Отмена запрета пира"
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:33
+#, fuzzy
+msgid "unbanned"
+msgstr "запрет удален"
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:35
+#, fuzzy
+msgid "is not currently banned"
+msgstr "в настоящее время не запрещена"
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:39
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:322
+#, fuzzy
+msgid "Adjust Profile Bonuses"
+msgstr "Настройка дополнительных потоков профиля"
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:47
+#, fuzzy
+msgid "Bad speed value"
+msgstr "Неправильное значение скорости"
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:52
+#, fuzzy
+msgid "Bad capacity value"
+msgstr "Неправильное значение потенциала"
+
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:32
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:57
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:292
+#, fuzzy
+msgid "Shutdown immediately"
+msgstr "Выключить сразу"
+
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:36
+#, fuzzy
+msgid "Cancel shutdown"
+msgstr "Отмена выключения"
+
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:37
+#, fuzzy
+msgid "Cancel restart"
+msgstr "Отмена перезагрузка"
+
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:39
+#, fuzzy
+msgid "Restart immediately"
+msgstr "Перезагрузка сразу"
+
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:43
+#, fuzzy
+msgid "Restart"
+msgstr "Перезагрузка"
+
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:46
+#, fuzzy
+msgid "Shutdown"
+msgstr "Выключение"
+
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:59
+#, fuzzy
+msgid "Restart imminent"
+msgstr "Перезагрузка сразу"
+
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:61
+#, fuzzy
+msgid "Shutdown imminent"
+msgstr "Выключения неминуемого"
+
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:65
+#, fuzzy, java-format
+msgid "Shutdown in {0}"
+msgstr "Выключение через {0}"
+
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:70
+#, fuzzy, java-format
+msgid "Restart in {0}"
+msgstr "Перезагрузка через {0}"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:53
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:290
+#, fuzzy
+msgid "Shutdown gracefully"
+msgstr "Грациозно выключить"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:56
+#, fuzzy
+msgid "Graceful shutdown initiated"
+msgstr "Изящный выключение инициативе"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:60
+#, fuzzy
+msgid "Shutdown immediately!  boom bye bye bad bwoy"
+msgstr "выключения немедленно! бум пока пока плохой мальчик"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:61
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:294
+#, fuzzy
+msgid "Cancel graceful shutdown"
+msgstr "Отмена изящные выключении"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:63
+#, fuzzy
+msgid "Graceful shutdown cancelled"
+msgstr "Изящный выключения отменен"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:64
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:308
+#, fuzzy
+msgid "Graceful restart"
+msgstr "Мягкого перезапуска"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:67
+#, fuzzy
+msgid "Graceful restart requested"
+msgstr "Мягкого перезапуска просил"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:68
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:310
+#, fuzzy
+msgid "Hard restart"
+msgstr "Жесткая перезагрузка"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:71
+#, fuzzy
+msgid "Hard restart requested"
+msgstr "Жесткая перезагрузка просил"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:72
+#, fuzzy
+msgid "Rekey and Restart"
+msgstr "Восстановить Ключ и Перезагрузите"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:73
+#, fuzzy
+msgid "Rekeying after graceful restart"
+msgstr "Повторный ввод после мягкого перезапуска"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:76
+#, fuzzy
+msgid "Rekey and Shutdown"
+msgstr "Восстановить Ключ и Выключении"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:77
+#, fuzzy
+msgid "Rekeying after graceful shutdown"
+msgstr "Повторный ввод после выключения изящный"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:80
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:338
+#, fuzzy
+msgid "Run I2P on startup"
+msgstr "Запуск I2P при запуске"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:82
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:340
+#, fuzzy
+msgid "Don't run I2P on startup"
+msgstr "Не запускать при запуске I2P"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:84
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:356
+#, fuzzy
+msgid "Dump threads"
+msgstr "Сваливать Память"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:91
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:324
+#, fuzzy
+msgid "Show systray icon"
+msgstr "Показать системном трее значок"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:96
+#, fuzzy
+msgid "System tray icon enabled."
+msgstr "Значок на панели задач включена."
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:98
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:110
+#, fuzzy
+msgid "System tray icon feature not supported on this platform. Sorry!"
+msgstr "Значок на панели задач функция не поддерживается на этой платформе. Извините!"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:101
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:113
+#, fuzzy
+msgid "Warning: unable to contact the systray manager"
+msgstr "Предупреждение: Не удается связаться с менеджером системный трей"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:103
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:326
+#, fuzzy
+msgid "Hide systray icon"
+msgstr "Скрыть системном трее значок"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:108
+#, fuzzy
+msgid "System tray icon disabled."
+msgstr "Значок на панели задач отключен."
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:115
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:364
+#, fuzzy
+msgid "View console on startup"
+msgstr "Открыть консоль при старте"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:117
+#, fuzzy
+msgid "Console is to be shown on startup"
+msgstr "Консоль будет показано при старте"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:118
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:366
+#, fuzzy
+msgid "Do not view console on startup"
+msgstr "Не рассматривают консоль при старте"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:120
+#, fuzzy
+msgid "Console is not to be shown on startup"
+msgstr "Консоли не будет показано при старте"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:129
+#, fuzzy
+msgid "Service installed"
+msgstr "Установлена служба"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:131
+#, fuzzy
+msgid "Warning: unable to install the service"
+msgstr "Предупреждение: не удалось установить службу"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:137
+#, fuzzy
+msgid "Service removed"
+msgstr "Служба удалена"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:139
+#, fuzzy
+msgid "Warning: unable to remove the service"
+msgstr "Предупреждение: Не удается удалить службу"
+
+#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:118
+#, fuzzy
+msgid "Stat filter and location updated successfully to"
+msgstr "Стат фильтра и расположения успешно обновлена до"
+
+#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:120
+#, fuzzy
+msgid "Failed to update the stat filter and location"
+msgstr "Не удалось обновить фильтра стат и местоположение"
+
+#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:121
+#, fuzzy
+msgid "Graph list updated, may take up to 60s to be reflected here and on the <a href=\"graphs.jsp\">Graphs Page</a>"
+msgstr "Графика список обновляется, может занять до 60s должно быть отражено здесь и на <a href=\"graphs.jsp\"> графов странице </a>"
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:137
+#, fuzzy
+msgid "Updated settings for all pools."
+msgstr "Обновление настройки для всех бассейнов."
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:142
+#, fuzzy
+msgid "Exploratory tunnel configuration saved successfully."
+msgstr "Разведочный конфигурации туннеля успешно сохранены."
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:144
+#: ../java/src/net/i2p/router/web/ConfigUIHandler.java:36
+#, fuzzy
+msgid "Error saving the configuration (applied but not saved) - please see the error logs."
+msgstr "Ошибка при сохранении конфигурации (применяется, но не сохранили) - пожалуйста, смотрите логи ошибок."
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:11
+#, fuzzy
+msgid "hop"
+msgstr "хоп"
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:12
+#, fuzzy
+msgid "tunnel"
+msgstr "туннель"
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:14
+#, fuzzy
+msgid "hops"
+msgstr "хопа"
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:15
+#, fuzzy
+msgid "tunnels"
+msgstr "туннели"
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:26
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:40
+#, fuzzy
+msgid "Exploratory tunnels"
+msgstr "Разведочные туннели"
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:46
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:60
+#, fuzzy
+msgid "Client tunnels for"
+msgstr "Клиентские туннели для"
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:69
+#, fuzzy
+msgid "ANONYMITY WARNING - Settings include 0-hop tunnels."
+msgstr "АНОНИМНОСТЬ ПРЕДУПРЕЖДЕНИЕ - Настройки включают 0-хоп туннелей."
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:74
+#, fuzzy
+msgid "ANONYMITY WARNING - Settings include 1-hop tunnels."
+msgstr "ANONYMITY WARNING - Settings include 1-hop tunnels."
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:77
+#, fuzzy
+msgid "PERFORMANCE WARNING - Settings include very long tunnels."
+msgstr "ИСПОЛНЕНИИ ВНИМАНИЕ - настройки включают в себя очень длинные туннели."
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:80
+#, fuzzy
+msgid "PERFORMANCE WARNING - Settings include high tunnel quantities."
+msgstr "ИСПОЛНЕНИИ ВНИМАНИЕ - настройки включают в больших количествах туннель."
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82
+#, fuzzy
+msgid "Inbound"
+msgstr "Входящий"
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82
+#, fuzzy
+msgid "Outbound"
+msgstr "Исходящие"
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:87
+#, fuzzy
+msgid "Length"
+msgstr "Лесото"
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:104
+#, fuzzy
+msgid "Randomization"
+msgstr "Рандомизации"
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:128
+#, fuzzy
+msgid "Quantity"
+msgstr "Колич."
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:145
+#, fuzzy
+msgid "Backup quantity"
+msgstr "Резервное копирование количестве"
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:167
+#, fuzzy
+msgid "Inbound options"
+msgstr "Входящий конфигурации"
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:180
+#, fuzzy
+msgid "Outbound options"
+msgstr "Исходящие конфигурации"
+
+#: ../java/src/net/i2p/router/web/ConfigUIHandler.java:31
+#, fuzzy
+msgid "Theme change saved."
+msgstr "Изменение сохраненной тема."
+
+#: ../java/src/net/i2p/router/web/ConfigUIHandler.java:33
+#, fuzzy
+msgid "Refresh the page to view."
+msgstr "Обновите страницу, чтобы просмотреть."
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:41
+#, fuzzy
+msgid "English"
+msgstr "Английский"
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:41
+#, fuzzy
+msgid "French"
+msgstr "Французский"
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:41
+#, fuzzy
+msgid "German"
+msgstr "Немецкий"
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:42
+#, fuzzy
+msgid "Chinese"
+msgstr "Китайский"
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:42
+#, fuzzy
+msgid "Dutch"
+msgstr "Голландский"
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:42
+#, fuzzy
+msgid "Russian"
+msgstr "Русский"
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:42
+#, fuzzy
+msgid "Swedish"
+msgstr "Шведский"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:56
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:310
+#, fuzzy
+msgid "Check for updates"
+msgstr "Проверка обновлений"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:63
+#, fuzzy
+msgid "Update available, attempting to download now"
+msgstr "Доступно обновление, пытаясь загрузить сейчас"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:65
+#, fuzzy
+msgid "Update available, click button on left to download"
+msgstr "Доступные обновления, нажмите кнопку на левой скачать"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:67
+#, fuzzy
+msgid "No update available"
+msgstr "Нет доступных обновлений"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:75
+#, fuzzy
+msgid "Updating news URL to"
+msgstr "Обновление новостей на URL"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:83
+#, fuzzy
+msgid "Updating proxy host to"
+msgstr "Обновление прокси-сервера для"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:91
+#, fuzzy
+msgid "Updating proxy port to"
+msgstr "Обновление прокси порта"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:104
+#, fuzzy
+msgid "Updating refresh frequency to"
+msgstr "Обновление частоту обновления для"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:111
+#, fuzzy
+msgid "Updating update policy to"
+msgstr "Updating update rules to"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:120
+#, fuzzy
+msgid "Updating update URLs."
+msgstr "Обновляет обновления URL-адресов."
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:128
+#, fuzzy
+msgid "Updating trusted keys."
+msgstr "Обновление доверенных ключей."
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:136
+#, fuzzy
+msgid "Updating unsigned update URL to"
+msgstr "Обновление неподписанных URL обновления"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:75
+#: ../java/src/net/i2p/router/web/GraphHelper.java:115
+#, fuzzy
+msgid "Never"
+msgstr "Никогда"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:77
+#, fuzzy
+msgid "Every"
+msgstr "Каждый"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:90
+#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:92
+#, fuzzy
+msgid "Notify only"
+msgstr "Сообщите только"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:95
+#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:97
+#, fuzzy
+msgid "Download and verify only"
+msgstr "Скачать и проверить только"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:101
+#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:103
+#, fuzzy
+msgid "Download, verify, and restart"
+msgstr "Скачать, проверки и перезапуск"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:107
+#, fuzzy
+msgid "Configure Graph Display"
+msgstr "Конфигурация Диаграмм Дисплея"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:107
+#, fuzzy
+msgid "Select Stats"
+msgstr "Выберите статистику"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:109
+#, fuzzy
+msgid "Periods"
+msgstr "Периоды"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:110
+#, fuzzy
+msgid "Plot averages"
+msgstr "Среднее значение диаграммы"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:111
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:405
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:336
+#, fuzzy
+msgid "or"
+msgstr "или"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:111
+#, fuzzy
+msgid "plot events"
+msgstr "показания диаграммы"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:112
+#, fuzzy
+msgid "Image sizes"
+msgstr "Размеры изображения"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:112
+#, fuzzy
+msgid "width"
+msgstr "ширина"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:113
+#, fuzzy
+msgid "height"
+msgstr "высота"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:113
+#: ../java/src/net/i2p/router/web/GraphHelper.java:114
+#, fuzzy
+msgid "pixels"
+msgstr "пиксели"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:115
+#, fuzzy
+msgid "Refresh delay"
+msgstr "Задержка обновления"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:115
+#, fuzzy
+msgid "hour"
+msgstr "час"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:115
+#, fuzzy
+msgid "minute"
+msgstr "минута"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:115
+#, fuzzy
+msgid "minutes"
+msgstr "минуты"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:116
+#, fuzzy
+msgid "Redraw"
+msgstr "Перерисовать"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:59
+#, fuzzy
+msgid "Network Database RouterInfo Lookup"
+msgstr "Поиск Информации о Маршрутизаторе Базы Данных Сети"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:74
+#, fuzzy
+msgid "Router"
+msgstr "Маршрутизатор"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:74
+#, fuzzy
+msgid "not found in network database"
+msgstr "не найдено в сети баз данных"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:82
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:134
+#, fuzzy
+msgid "Network Database Contents"
+msgstr "База Данных Содержание"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:83
+#, fuzzy
+msgid "View RouterInfo"
+msgstr "Открыть Маршрутизатор Информация"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:84
+#, fuzzy
+msgid "LeaseSets"
+msgstr "АрендаНаборы"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:92
+#, fuzzy
+msgid "LeaseSet"
+msgstr "АрендаНаборы"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:94
+#, fuzzy
+msgid "Local"
+msgstr "Локальный"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:96
+#, fuzzy
+msgid "Unpublished"
+msgstr "Неопубликованные"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:97
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:104
+#, fuzzy
+msgid "Destination"
+msgstr "Направление"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:114
+#, fuzzy, java-format
+msgid "Expires in {0}"
+msgstr "Срок истекает в {0}"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:116
+#, fuzzy, java-format
+msgid "Expired {0} ago"
+msgstr "Истек {0} назад"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:118
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:156
+#, fuzzy
+msgid "Gateway"
+msgstr "Шлюз"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:118
+#, fuzzy
+msgid "Lease"
+msgstr "Аренда"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:120
+#, fuzzy
+msgid "Tunnel"
+msgstr "Туннель"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:134
+#, fuzzy
+msgid "View LeaseSets"
+msgstr "Смотреть на Аренду-Наборы"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:136
+#, fuzzy
+msgid "Not initialized"
+msgstr "Не инициализируется"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:145
+#, fuzzy
+msgid "Routers"
+msgstr "Маршрутизаторы"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:147
+#, fuzzy
+msgid "Show all routers"
+msgstr "Показать все маршрутизаторы"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:149
+#, fuzzy
+msgid "Show all routers with full stats"
+msgstr "Показать все маршрутизаторы с полной статистики"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:184
+#, fuzzy
+msgid "Network Database Router Statistics"
+msgstr "Сетевая База Данных Статистики Маршрутизатора"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:190
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:204
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:222
+#, fuzzy
+msgid "Count"
+msgstr "Количество"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:190
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:154
+#, fuzzy
+msgid "Version"
+msgstr "Версия"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:204
+#, fuzzy
+msgid "Transports"
+msgstr "Транспортные"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:222
+#, fuzzy
+msgid "Country"
+msgstr "Страна"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:254
+#, fuzzy
+msgid "Our info"
+msgstr "Наша информация"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:256
+#, fuzzy
+msgid "Peer info for"
+msgstr "Информация о пире"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:260
+#, fuzzy
+msgid "Full entry"
+msgstr "Полная запись"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:266
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:96
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:581
+#, fuzzy
+msgid "Hidden"
+msgstr "Скрыто"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:266
+#, fuzzy
+msgid "Updated"
+msgstr "Обновлено"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:267
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:270
+#, fuzzy, java-format
+msgid "{0} ago"
+msgstr "{0} назад"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:269
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:273
+#, fuzzy
+msgid "Published"
+msgstr "Опубликован"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:275
+#, fuzzy
+msgid "Address(es)"
+msgstr "Адреса"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:308
+#, fuzzy
+msgid "Hidden or starting up"
+msgstr "Скрытая или запуском"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:308
+#, fuzzy
+msgid "SSU"
+msgstr "SSU"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:308
+#, fuzzy
+msgid "SSU with introducers"
+msgstr "SSU с поручителями"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:309
+#, fuzzy
+msgid "NTCP"
+msgstr "NTCP"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:309
+#, fuzzy
+msgid "NTCP and SSU"
+msgstr "NTCP и SSU"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:309
+#, fuzzy
+msgid "NTCP and SSU with introducers"
+msgstr "NTCP и SSU с поручителями"
+
+#: ../java/src/net/i2p/router/web/NewsFetcher.java:80
+#, fuzzy, java-format
+msgid "News last updated {0} ago."
+msgstr "Новости Последнее обновление {0} назад."
+
+#: ../java/src/net/i2p/router/web/NewsFetcher.java:86
+#, fuzzy, java-format
+msgid "News last checked {0} ago."
+msgstr "Новости Последняя проверка: {0} назад."
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:72
+#, fuzzy
+msgid "Peer Profiles"
+msgstr "Профили Пиров"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:73
+#, fuzzy, java-format
+msgid "Showing {0} recent profiles."
+msgstr "Показаны {0} последних профилей."
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:75
+#, fuzzy, java-format
+msgid "Hiding {0} older profiles."
+msgstr "Сокрытие {0} взрослыми профилей."
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:77
+#, fuzzy, java-format
+msgid "Hiding {0} standard profiles."
+msgstr "Сокрытие {0} стандартных профилей."
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:82
+#, fuzzy
+msgid "Groups (Caps)"
+msgstr "Группы (Способности)"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:83
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:251
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:334
+#, fuzzy
+msgid "Speed"
+msgstr "Скорость"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:84
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:253
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:338
+#, fuzzy
+msgid "Capacity"
+msgstr "Способность"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:85
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:255
+#, fuzzy
+msgid "Integration"
+msgstr "Интеграция"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:86
+#, fuzzy
+msgid "Status"
+msgstr "Статус"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:126
+#, fuzzy
+msgid "Fast, High Capacity"
+msgstr "Быстрый, Высокая Производительная Мощность"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:127
+#, fuzzy
+msgid "High Capacity"
+msgstr "Высокая производительная мощность"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:128
+#, fuzzy
+msgid "Standard"
+msgstr "Стандартный"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:129
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:163
+#, fuzzy
+msgid "Failing"
+msgstr "В противном случае"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:131
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:253
+#, fuzzy
+msgid "Integrated"
+msgstr "Интегрированные"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:162
+#, fuzzy
+msgid "Banned"
+msgstr "Запрещена"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:164
+#, fuzzy
+msgid "Unreachable"
+msgstr "Недоступные"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:171
+#, fuzzy
+msgid "Test Fails"
+msgstr "Испытание Неудачи"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:175
+#, fuzzy
+msgid "profile"
+msgstr "профиль"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:184
+#, fuzzy
+msgid "Floodfill and Integrated Peers"
+msgstr "Floodfill и Интегрированные Пиры"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:188
+#, fuzzy
+msgid "Caps"
+msgstr "Предельные"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:189
+#, fuzzy
+msgid "Integ. Value"
+msgstr "Интегрированное значение"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:190
+#, fuzzy
+msgid "Last Heard About"
+msgstr "Последний Слышали О"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:191
+#, fuzzy
+msgid "Last Heard From"
+msgstr "Последний Раз Слышали От"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:192
+#, fuzzy
+msgid "Last Good Send"
+msgstr "Последний Хорошо Отправить"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:193
+#, fuzzy
+msgid "Last Bad Send"
+msgstr "Последний Плохо Отправить"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:194
+#, fuzzy
+msgid "10m Resp. Time"
+msgstr "10 мин. Время отклика"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:195
+#, fuzzy
+msgid "1h Resp. Time"
+msgstr "1 час Время отклика"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:196
+#, fuzzy
+msgid "1d Resp. Time"
+msgstr "1 день Время отклика"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:197
+#, fuzzy
+msgid "Last Good Lookup"
+msgstr "Последний Хороший Поиск"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:198
+#, fuzzy
+msgid "Last Bad Lookup"
+msgstr "Последний Плохо Поиска"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:199
+#, fuzzy
+msgid "Last Good Store"
+msgstr "Последний Хорошо Хранения"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:200
+#, fuzzy
+msgid "Last Bad Store"
+msgstr "Последний Плохо Хранения"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:201
+#, fuzzy
+msgid "1h Fail Rate"
+msgstr "1ч Интенсивность Отказов"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:202
+#, fuzzy
+msgid "1d Fail Rate"
+msgstr "1д Интенсивность Отказов"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:250
+#, fuzzy
+msgid "Thresholds"
+msgstr "Порог"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:252
+#, fuzzy
+msgid "fast peers"
+msgstr "быстрые пиры"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:254
+#, fuzzy
+msgid "high capacity peers"
+msgstr "пиры у которых высокая производительная мощность"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:256
+#, fuzzy
+msgid " well integrated peers"
+msgstr "хорошо интегрированные пиры"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:257
+#, fuzzy
+msgid "Definitions"
+msgstr "Определение"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258
+#, fuzzy
+msgid "as determined by the profile organizer"
+msgstr "как определяется профилем организатор"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258
+#, fuzzy
+msgid "groups"
+msgstr "группы"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259
+#, fuzzy
+msgid "capabilities in the netDb, not used to determine profiles"
+msgstr "возможности в сетьБД, не используются для определения профилей"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259
+#, fuzzy
+msgid "caps"
+msgstr "пределы"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260
+#, fuzzy
+msgid "peak throughput (bytes per second) over a 1 minute period that the peer has sustained in a single tunnel"
+msgstr "Пик производительности (байт в секунду) в течение 1 минуты периода, что партнер имеет выдержанный в одном туннеле"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260
+#, fuzzy
+msgid "speed"
+msgstr "скорость"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261
+#, fuzzy
+msgid "capacity"
+msgstr "потенциала"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261
+#, fuzzy
+msgid "how many tunnels can we ask them to join in an hour?"
+msgstr "cколько туннелей мы можем попросить их присоединиться к часу?"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262
+#, fuzzy
+msgid "how many new peers have they told us about lately?"
+msgstr "сколько новых узлов не нам сказали последнее время?"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262
+#, fuzzy
+msgid "integration"
+msgstr "интеграция"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263
+#, fuzzy
+msgid "is the peer banned, or unreachable, or failing tunnel tests?"
+msgstr "это совокупность запрещены или недоступны, или не туннель тесты?"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263
+#, fuzzy
+msgid "status"
+msgstr "статус"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:321
+#, fuzzy
+msgid "n/a"
+msgstr "не доступно"
+
+#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:57
+#, fuzzy, java-format
+msgid "Temporary ban expiring in {0}"
+msgstr "Временного запрета истекает в {0}"
+
+#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:59
+#, fuzzy, java-format
+msgid "Banned until restart or in {0}"
+msgstr "Запрещены до перезагрузку через {0}"
+
+#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:71
+#, fuzzy
+msgid "unban now"
+msgstr "удалить запрета сейчас"
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:58
+#, fuzzy
+msgid "Statistics gathered during this router's uptime"
+msgstr "Статистические данные, полученные во время проведенное на сайте этого маршрутизатора"
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:61
+#, fuzzy
+msgid "The data gathered is quantized over a 1 minute period, so should just be used as an estimate."
+msgstr "Данные собраны квантуется более 1 минуты периода, поэтому следует использовать в качестве оценки."
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:44
+#, fuzzy
+msgid "Configure startup of clients and webapps (services); manually start dormant services"
+msgstr "Настройка запуска клиентов и Webapps (услуг); вручную запустить покоя услуги"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:46
+#, fuzzy
+msgid "I2P Services"
+msgstr "Сервисы I2P"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:52
+#, fuzzy
+msgid "Manage your I2P hosts file here (I2P domain name resolution)"
+msgstr "Управляйте своими I2P хостов файла здесь (I2P доменных имен)"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:54
+#, fuzzy
+msgid "Addressbook"
+msgstr "Адресная Книжка"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:58
+#, fuzzy
+msgid "Built-in anonymous BitTorrent Client"
+msgstr "Встроенные в анонимной загрузки клиента"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:60
+#, fuzzy
+msgid "Torrents"
+msgstr "Торренты"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:64
+#, fuzzy
+msgid "Anonymous webmail client"
+msgstr "Аноним электронной почтовый веб-клиент"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:66
+#, fuzzy
+msgid "Webmail"
+msgstr "Веб-Почта"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:70
+#, fuzzy
+msgid "Anonymous resident webserver"
+msgstr "Аноним сервер резидента"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:72
+#, fuzzy
+msgid "Webserver"
+msgstr "Веб-Сервер"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:76
+#, fuzzy
+msgid "Configure I2P Router"
+msgstr "Настройка Маршрутизатора I2P"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:78
+#, fuzzy
+msgid "I2P Internals"
+msgstr "Внутренняя Организация I2P"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:84
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:348
+#, fuzzy
+msgid "View existing tunnels and tunnel build status"
+msgstr "Просмотр существующих туннелей и туннелей построить статус"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:90
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:225
+#, fuzzy
+msgid "Show all current peer connections"
+msgstr "Показать все текущие подключения сверстников"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:96
+#, fuzzy
+msgid "Show recent peer performance profiles"
+msgstr "Показать последних профили производительности сверстников"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:98
+#, fuzzy
+msgid "Profiles"
+msgstr "Профили"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:102
+#, fuzzy
+msgid "Show list of all known I2P routers"
+msgstr "Показать список всех известных I2P маршрутизаторы"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:104
+#, fuzzy
+msgid "NetDB"
+msgstr "СетьДБ"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:108
+#, fuzzy
+msgid "Health Report"
+msgstr "Доклад о Состоянии Здравоохранения"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:110
+#, fuzzy
+msgid "Logs"
+msgstr "Логи"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:114
+#, fuzzy
+msgid "Show the router's workload, and how it's performing"
+msgstr "Показать нагрузку на маршрутизатор, и как это исполняющей"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:116
+#, fuzzy
+msgid "Jobs"
+msgstr "Задачи"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:120
+#, fuzzy
+msgid "Graph router performance"
+msgstr "График производительности маршрутизатора"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:122
+#, fuzzy
+msgid "Graphs"
+msgstr "Диаграммы"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:126
+#, fuzzy
+msgid "Textual router performance statistics"
+msgstr "Текстовое маршрутизатора статистики по эффективности"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:138
+#, fuzzy
+msgid "I2P Router Help"
+msgstr "I2P Помощь Маршрутизатор"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:140
+#, fuzzy
+msgid "General"
+msgstr "Общий"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:143
+#, fuzzy
+msgid "Your unique I2P router identity is"
+msgstr "Ваш уникальный I2P маршрутизатора идентичность"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:147
+#, fuzzy
+msgid "never reveal it to anyone"
+msgstr "никогда не показывайте его никому"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:149
+#, fuzzy
+msgid "Local Identity"
+msgstr "Локальный Адрес"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:161
+#, fuzzy
+msgid "How long we've been running for this session"
+msgstr "Как долго мы уже в течение этой сессии"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:164
+#, fuzzy
+msgid "Uptime"
+msgstr "Аптайм"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:171
+#, fuzzy
+msgid "Help with configuring your firewall and router for optimal I2P performance"
+msgstr "Помощь в настройке брандмауэра и маршрутизатора для обеспечения оптимальной производительности I2P"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:198
+#, fuzzy
+msgid "Download"
+msgstr "Загрузка"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:207
+#, fuzzy
+msgid "Download Unsigned"
+msgstr "Загрузка Неподписанных"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:233
+#, fuzzy
+msgid "Active"
+msgstr "Активные"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:241
+#, fuzzy
+msgid "Fast"
+msgstr "Быстрые"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:247
+#, fuzzy
+msgid "High capacity"
+msgstr "Высокая производительная мощность"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:259
+#, fuzzy
+msgid "Known"
+msgstr "Общепризнанные"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:274
+#, fuzzy
+msgid "Help with firewall configuration"
+msgstr "Помощь в настройке брандмауэра"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:276
+#, fuzzy
+msgid "Check NAT/firewall"
+msgstr "Проверка NAT/брандмауэры"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:296
+#, fuzzy
+msgid "Reseed"
+msgstr "Повтор Первой Сети Связи"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:313
+#, fuzzy
+msgid "Configure router bandwidth allocation"
+msgstr "Настройка маршрутизатора распределения пропускной способностью"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:315
+#, fuzzy
+msgid "Bandwidth in/out"
+msgstr "Пропускная способность входящего / выходящего"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:332
+#, fuzzy
+msgid "Total"
+msgstr "Всего"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:340
+#, fuzzy
+msgid "Used"
+msgstr "Колич."
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:350
+#, fuzzy
+msgid "Tunnels in/out"
+msgstr "Туннели входящие / выходящие "
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:355
+#, fuzzy
+msgid "Exploratory"
+msgstr "Разведочные"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:371
+#, fuzzy
+msgid "Participating"
+msgstr "Участвующие"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:377
+#, fuzzy
+msgid "What's in the router's job queue?"
+msgstr "Что в очереди заданий маршрутизатор?"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:379
+#, fuzzy
+msgid "Congestion"
+msgstr "Перегрузка"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:384
+#, fuzzy
+msgid "Job lag"
+msgstr "Задержка задачи"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:390
+#, fuzzy
+msgid "Message delay"
+msgstr "Задержка доставки сообщения"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:396
+#, fuzzy
+msgid "Tunnel lag"
+msgstr "Задержка туннеля"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:402
+#, fuzzy
+msgid "Backlog"
+msgstr "Очередь"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:73
+#, fuzzy
+msgid "skew"
+msgstr "отклонение"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:92
+#, fuzzy
+msgid "ERR-Client Manager I2CP Error - check logs"
+msgstr "ОШИБКА-менеджер клиентов I2CP ошибка - проверьте журналы"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:94
+#, fuzzy
+msgid "ERR-ClockSkew"
+msgstr "ОШИБКА-ЧасиОтклонение"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:103
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:557
+#, fuzzy
+msgid "OK"
+msgstr "ОК"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:104
+#, fuzzy
+msgid "ERR-Private TCP Address"
+msgstr "ОШИБКА Частные TCP-адрес"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:106
+#, fuzzy
+msgid "ERR-SymmetricNAT"
+msgstr "ОШИБКА - Симметричный-NAT"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:109
+#, fuzzy
+msgid "WARN-Firewalled with Inbound TCP Enabled"
+msgstr "ПРЕДУПРЕЖДЕНИЕ-файрвол с Входящий TCP Включено"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:111
+#, fuzzy
+msgid "WARN-Firewalled and Floodfill"
+msgstr "ПРЕДУПРЕЖДЕНИЕ-файрволл и Floodfill"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:113
+#, fuzzy
+msgid "WARN-Firewalled and Fast"
+msgstr "ПРЕДУПРЕЖДЕНИЕ-файрволл и быстро"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:114
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:561
+#, fuzzy
+msgid "Firewalled"
+msgstr "За Брандмауэром"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:116
+#, fuzzy
+msgid "ERR-UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart"
+msgstr "ОШИБКА UDP-порта в использовании - Задать i2np.udp.internalPort=xxxx Расширенный конфигурации и перезапустить"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:123
+#, fuzzy
+msgid "ERR-UDP Disabled and Inbound TCP host/port not set"
+msgstr "ERROR-UDP Disabled and Inbound TCP host/port not set"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:125
+#, fuzzy
+msgid "WARN-Firewalled with UDP Disabled"
+msgstr "ПРЕДУПРЕЖДЕНИЕ-файрвол с UDP отключено"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:127
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:577
+#, fuzzy
+msgid "Testing"
+msgstr "Проверка"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:360
+#, fuzzy
+msgid "Add/remove/edit &amp; control your client and server tunnels"
+msgstr "Добавлять / удалять / редактировать и управлять вашим клиентом и сервером туннелей"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:360
+#, fuzzy
+msgid "Local Destinations"
+msgstr "Локальные Пункты Назначения"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:369
+#, fuzzy
+msgid "Server"
+msgstr "Сервер"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:373
+#, fuzzy
+msgid "Show tunnels"
+msgstr "Показать туннелей"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:384
+#, fuzzy
+msgid "Leases expired"
+msgstr "Срока аренды"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:384
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:385
+#, fuzzy
+msgid "Rebuilding"
+msgstr "Восстановление"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:385
+#, fuzzy
+msgid "ago"
+msgstr "назад"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:388
+#, fuzzy
+msgid "Ready"
+msgstr "Готовый"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:392
+#, fuzzy
+msgid "Building"
+msgstr "Строительство"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:392
+#, fuzzy
+msgid "Building tunnels"
+msgstr "Строительство туннелей"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:404
+#: ../java/strings/Strings.java:36
+#, fuzzy
+msgid "shared clients"
+msgstr "общие клиенты"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:40
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:62
+#, fuzzy
+msgid "configure"
+msgstr "конфигурировать"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:64
+#, fuzzy
+msgid "dead"
+msgstr "мертвый"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:70
+#, fuzzy
+msgid "Participating tunnels"
+msgstr "Участвующие туннели"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:71
+#, fuzzy
+msgid "From"
+msgstr "От"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:71
+#, fuzzy
+msgid "Receive on"
+msgstr "Получить на"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:72
+#, fuzzy
+msgid "Expiration"
+msgstr "Истечение срока"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:72
+#, fuzzy
+msgid "Send on"
+msgstr "Отправить по"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:72
+#, fuzzy
+msgid "To"
+msgstr "К"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:73
+#, fuzzy
+msgid "Rate"
+msgstr "Ставка"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:73
+#, fuzzy
+msgid "Role"
+msgstr "Роль"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:73
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:156
+#, fuzzy
+msgid "Usage"
+msgstr "Использование"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:107
+#, fuzzy
+msgid "grace period"
+msgstr "льготный период"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:117
+#, fuzzy
+msgid "Outbound Endpoint"
+msgstr "Исходящие Конечная точка"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:119
+#, fuzzy
+msgid "Inbound Gateway"
+msgstr "Входящий Сетевой Шлюз"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:121
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:162
+#, fuzzy
+msgid "Participant"
+msgstr "Участник"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:126
+#, fuzzy
+msgid "Inactive participating tunnels"
+msgstr "Неактивные участвующие туннелей"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:127
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:216
+#, fuzzy
+msgid "Lifetime bandwidth usage"
+msgstr "Использование долговечной пропускной способности входящего канала"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:156
+#, fuzzy
+msgid "Expiry"
+msgstr "Истечение Срока"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:156
+#, fuzzy
+msgid "In/Out"
+msgstr "Входящего / Выходящего"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:159
+#, fuzzy
+msgid "Participants"
+msgstr "Участники"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:165
+#, fuzzy
+msgid "Endpoint"
+msgstr "Конечная Точка"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:205
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:211
+#, fuzzy
+msgid "Build in progress"
+msgstr "Опираясь на данном моменте"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:205
+#, fuzzy
+msgid "inbound"
+msgstr "входящий"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:211
+#, fuzzy
+msgid "outbound"
+msgstr "исходящий"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:215
+#, fuzzy
+msgid "No tunnels; waiting for the grace period to end."
+msgstr "Нет туннелях, ожидая льготного периода и до конца."
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:216
+#, fuzzy
+msgid "in"
+msgstr "входящий"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:217
+#, fuzzy
+msgid "out"
+msgstr "исходящий"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:234
+#, fuzzy
+msgid "Tunnel Counts By Peer"
+msgstr "Тоннель графов По Пиру"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:235
+#, fuzzy
+msgid "% of total"
+msgstr "% всего"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:235
+#, fuzzy
+msgid "Expl. + Client"
+msgstr "Разведочной + Клиентский"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:235
+#, fuzzy
+msgid "Part. from + to"
+msgstr "Участие от + до"
+
+#: ../java/strings/Strings.java:12
+#, fuzzy
+msgid "addressbook"
+msgstr "адресная книжка"
+
+#: ../java/strings/Strings.java:13
+#, fuzzy
+msgid "i2psnark"
+msgstr "i2psnark"
+
+#: ../java/strings/Strings.java:14
+#, fuzzy
+msgid "i2ptunnel"
+msgstr "i2p-туннель"
+
+#: ../java/strings/Strings.java:15
+#, fuzzy
+msgid "susimail"
+msgstr "susi-почта"
+
+#: ../java/strings/Strings.java:16
+#, fuzzy
+msgid "susidns"
+msgstr "susidns"
+
+#: ../java/strings/Strings.java:17
+#, fuzzy
+msgid "routerconsole"
+msgstr "маршрутизатор-консоли"
+
+#: ../java/strings/Strings.java:22
+#, fuzzy
+msgid "Web console"
+msgstr "Веб-консоль"
+
+#: ../java/strings/Strings.java:23
+#, fuzzy
+msgid "SAM application bridge"
+msgstr "Мост приложения SAM"
+
+#: ../java/strings/Strings.java:24
+#, fuzzy
+msgid "Application tunnels"
+msgstr "Применение туннелей"
+
+#: ../java/strings/Strings.java:25
+#, fuzzy
+msgid "My eepsite web server"
+msgstr "Мой веб-сервер «eepsite»"
+
+#: ../java/strings/Strings.java:26
+#, fuzzy
+msgid "I2P webserver (eepsite)"
+msgstr "Мой веб-сервер «eepsite»"
+
+#: ../java/strings/Strings.java:27
+#, fuzzy
+msgid "Browser launch at startup"
+msgstr "Запуск браузера при запуске I2P"
+
+#: ../java/strings/Strings.java:28
+#, fuzzy
+msgid "BOB application bridge"
+msgstr "Мост приложения BOB"
+
+#: ../java/strings/Strings.java:30
+#, fuzzy
+msgid "Open Router Console in web browser at startup"
+msgstr "Открыть консоль маршрутизатора в веб-браузере при запуске"
+
+#: ../java/strings/Strings.java:37
+#, fuzzy
+msgid "IRC proxy"
+msgstr "IRC прокси"
+
+#: ../java/strings/Strings.java:38
+#, fuzzy
+msgid "eepsite"
+msgstr "eepsite"
+
+#: ../java/strings/Strings.java:39
+#, fuzzy
+msgid "I2P webserver"
+msgstr "I2P web-server"
+
+#: ../java/strings/Strings.java:40
+#, fuzzy
+msgid "HTTP Proxy"
+msgstr "HTTP Прокси"
+
+#: ../java/strings/Strings.java:42
+#, fuzzy
+msgid "eepProxy"
+msgstr "eep-Прокси"
+
+#: ../java/strings/Strings.java:43
+#, fuzzy
+msgid "ircProxy"
+msgstr "irc-Прокси"
+
+#: ../java/strings/Strings.java:45
+#, fuzzy
+msgid "I2PSnark"
+msgstr "I2PSnark"
+
+#: ../java/strings/Strings.java:47
+#, fuzzy
+msgid "iMule"
+msgstr "iMule"
+
+#: ../java/strings/Strings.java:51
+#, fuzzy
+msgid "classic"
+msgstr "классическая"
+
+#: ../java/strings/Strings.java:52
+#, fuzzy
+msgid "dark"
+msgstr "темная"
+
+#: ../java/strings/Strings.java:53
+#, fuzzy
+msgid "light"
+msgstr "светлая"
+
+#: ../java/strings/Strings.java:54
+#, fuzzy
+msgid "midnight"
+msgstr "полуночная"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:106
+#, fuzzy
+msgid "config networking"
+msgstr "конфигурация сети"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:217
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:218
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:217
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:217
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:231
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:217
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:217
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:218
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:217
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:217
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:217
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:228
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:217
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:236
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:216
+#, fuzzy
+msgid "Refresh (s)"
+msgstr "Обновить (сек)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:221
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:221
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:221
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:221
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:221
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:221
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:221
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:221
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:224
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:232
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:221
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:224
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:224
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:224
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:239
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:220
+#, fuzzy
+msgid "Enable"
+msgstr "Включать"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:241
+#, fuzzy
+msgid "I2P Network Configuration"
+msgstr "I2P Настройке Сети"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:297
+#, fuzzy
+msgid "Bandwidth limiter"
+msgstr "Ограничитель диапазона частот"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:299
+#, fuzzy
+msgid "I2P will work best if you configure your rates to match the speed of your internet connection."
+msgstr "I2P будет работать лучше, если Вы настроите частоту для подбора соответствующей скорости подсоединения к Интернету."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:303
+#, fuzzy
+msgid "KBps In"
+msgstr "Кбит/сек Загруженное"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:317
+#, fuzzy
+msgid "KBps Out"
+msgstr "Кбит/сек Закаченное"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:333
+#, fuzzy
+msgid "Share"
+msgstr "Поделено"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:340
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:307
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:303
+#, fuzzy
+msgid "NOTE"
+msgstr "ЗАМЕТЬТЕ"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:342
+#, fuzzy, java-format
+msgid "You have configured I2P to share only {0} KBps."
+msgstr "Вы настроили протокол I2P, чтоб использовать только {0} килобит информации за секунду."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:345
+#, fuzzy
+msgid "I2P requires at least 12KBps to enable sharing. "
+msgstr "I2P требует, по крайней мере 12KBps чтобы поделить трафик. "
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:346
+#, fuzzy
+msgid "Please enable sharing (participating in tunnels) by configuring more bandwidth. "
+msgstr "Пожалуйста, включите поделен трафик (участие в туннелях), настроя больше пропускной способностью. "
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:347
+#, fuzzy
+msgid "It improves your anonymity by creating cover traffic, and helps the network."
+msgstr "Это улучшает вашу анонимность создавая покрытия трафика, а также помогает в сети."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:350
+#, fuzzy, java-format
+msgid "You have configured I2P to share {0} KBps."
+msgstr "Вы настроили протокол I2P, чтоб использовать {0} килобит информации за секунду."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:353
+#, fuzzy
+msgid "The higher the share bandwidth the more you improve your anonymity and help the network."
+msgstr "Чем больше пропускная способность входящего/исходящего канала расшаренного ресурса, тем больше Вы поддерживаете анонимность и тем самым помогаете сети."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:359
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:496
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:305
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:324
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:335
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:375
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:343
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:323
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:356
+#, fuzzy
+msgid "Cancel"
+msgstr "Отклонить изменения"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:363
+#, fuzzy
+msgid "IP and Transport Configuration"
+msgstr "IP и конфигурации транспорта"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:365
+#, fuzzy
+msgid "The default settings will work for most people."
+msgstr "Настройки по умолчанию будет работать для большинства людей."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:367
+#, fuzzy
+msgid "There is help below."
+msgstr "Дополнительную информацию смотрите ниже:"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:369
+#, fuzzy
+msgid "UPnP Configuration"
+msgstr "Конфигурация UPnP"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:373
+#, fuzzy
+msgid "Enable UPnP to open firewall ports"
+msgstr "Запустите UPnP, чтоб открыть порты брандмауэра"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:375
+#, fuzzy
+msgid "UPnP status"
+msgstr "статус UPnP"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:377
+#, fuzzy
+msgid "IP Configuration"
+msgstr "IP Конфигурация"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:379
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:441
+#, fuzzy
+msgid "Externally reachable hostname or IP address"
+msgstr "Внешне достижимое имя хоста или IP -адрес"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:383
+#, fuzzy
+msgid "Use all auto-detect methods"
+msgstr "Используйте все методы автоматического опознавания"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:387
+#, fuzzy
+msgid "Disable UPnP IP address detection"
+msgstr "Отключите детектор IP-адреса UPnP"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:391
+#, fuzzy
+msgid "Ignore local interface IP address"
+msgstr "Отклоните IP адрес локального интерфейса."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:395
+#, fuzzy
+msgid "Use SSU IP address detection only"
+msgstr "Используйте только детектор IP- адреса SSU"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:399
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:459
+#, fuzzy
+msgid "Specify hostname or IP"
+msgstr "Установите имя хоста или IP"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:405
+#, fuzzy
+msgid "Select Interface"
+msgstr "Выбирать Интерфейс"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:419
+#, fuzzy
+msgid "Hidden mode - do not publish IP"
+msgstr "Скрытый метод – не разглашайте IP адрес"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:421
+#, fuzzy
+msgid "(prevents participating traffic)"
+msgstr "(препятствует причастному трафику)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:423
+#, fuzzy
+msgid "UDP Configuration:"
+msgstr "UDP Конфигурация"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:425
+#, fuzzy
+msgid "UDP port:"
+msgstr "UDP Порт:"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:439
+#, fuzzy
+msgid "TCP Configuration"
+msgstr "TCP Конфигурация"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:445
+#, fuzzy
+msgid "Use auto-detected IP address"
+msgstr "Используйте только автоматически распознанный IP -адрес"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:447
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:479
+#, fuzzy
+msgid "currently"
+msgstr "в настоящее время"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:451
+#, fuzzy
+msgid "if we are not firewalled"
+msgstr "если есть доступ к порту."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:455
+#, fuzzy
+msgid "Always use auto-detected IP address (Not firewalled)"
+msgstr "Всегда используйте только автоматически распознанный IP-адрес (а не адрес брандмауэра)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:465
+#, fuzzy
+msgid "Disable inbound (Firewalled)"
+msgstr "Отключите входящие (за брандмауэром)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:469
+#, fuzzy
+msgid "Completely disable"
+msgstr "Полностью отключите"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:471
+#, fuzzy
+msgid "(select only if behind a firewall that throttles or blocks outbound TCP)"
+msgstr "(выберете, только если брандмауэр тормозит работу или блокирует выходные данные протокола управления передачей данных)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:473
+#, fuzzy
+msgid "Externally reachable TCP port"
+msgstr "Внешне достижимый порт протокола TCP"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:477
+#, fuzzy
+msgid "Use the same port configured for UDP"
+msgstr "Используйте тот же порт, настроенный для протокола UDP"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:485
+#, fuzzy
+msgid "Specify Port"
+msgstr "Определите Порт"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:489
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:342
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:329
+#, fuzzy
+msgid "Note"
+msgstr "Заметьте"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:492
+#, fuzzy
+msgid "Changing these settings will restart your router."
+msgstr "При изменении настроек, происходит перезагрузка маршрутизатора."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:498
+#, fuzzy
+msgid "Configuration Help"
+msgstr "Помощь конфигурации"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:500
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:549
+#, fuzzy
+msgid "While I2P will work fine behind most firewalls, your speeds and network integration will generally improve if the I2P port is forwarded for both UDP and TCP."
+msgstr "Хотя I2P будет прекрасно работать позади большинства брандмауэров, ваша скорость и сетевой интеграции, вероятно, улучшится, если порт I2P направляется для UDP и TCP."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:502
+#, fuzzy
+msgid "If you can, please poke a hole in your firewall to allow unsolicited UDP and TCP packets to reach you."
+msgstr "Если можно, сделайте, пожалуйста, отверстие в брандмауэре, чтоб самостоятельно предоставленные UDP и TCP-пакеты могли дойти до Вас."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:504
+#, fuzzy
+msgid "If you can't, I2P supports UPnP (Universal Plug and Play) and UDP hole punching with \"SSU introductions\" to relay traffic."
+msgstr "Если не можете, I2P поспособствует тому, чтоб UPnP (набор сетевых протоколов) и отверстие в UDP, проделанное «применением SSU» переключили трафик."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:506
+#, fuzzy
+msgid "Most of the options above are for special situations, for example where UPnP does not work correctly, or a firewall not under your control is doing harm."
+msgstr "Множество из перечисленных опций предназначены для использования в отдельных ситуациях, к примеру, где UPnP работает неверно, или брандмауэр находится вне контроля и причиняет вред."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:508
+#, fuzzy
+msgid "Certain firewalls such as symmetric NATs may not work well with I2P."
+msgstr "Некоторые брадмауэры, к примеру, симметричные NAT-устройствам (преобразования сетевых адресов) могут и «не сработаться» с I2P."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:517
+#, fuzzy
+msgid "UPnP is used to communicate with Internet Gateway Devices (IGDs) to detect the external IP address and forward ports."
+msgstr "UPnP используется для связи с интернет-шлюзом (IGDs), чтоб определять внешний IP-адрес и передовые порты."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:519
+#, fuzzy
+msgid "UPnP support is beta, and may not work for any number of reasons"
+msgstr "Поддержка UPnP не испробована, и может не работать по нескольким причинам"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:521
+#, fuzzy
+msgid "No UPnP-compatible device present"
+msgstr "Отсутствие UPnP- существующее совместимое устройство"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:523
+#, fuzzy
+msgid "UPnP disabled on the device"
+msgstr "Выключенный UPnP в устройстве"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:525
+#, fuzzy
+msgid "Software firewall interference with UPnP"
+msgstr "Взаимодействие программного обеспечения брандмауэра с UPnP"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:527
+#, fuzzy
+msgid "Bugs in the device's UPnP implementation"
+msgstr "Ошибки при внедрении устройства UPnP"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:529
+#, fuzzy
+msgid "Multiple firewall/routers in the internet connection path"
+msgstr "Разнообразные брандмауэры/маршрутизаторы в способах подсоединения к интернету"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:531
+#, fuzzy
+msgid "UPnP device change, reset, or address change"
+msgstr "Замена устройства UPnP, перезагрузка или изменение адреса"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:533
+#, fuzzy
+msgid "Review the UPnP status here."
+msgstr "Обзор статуса UPnP здесь."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:535
+#, fuzzy
+msgid "UPnP may be enabled or disabled above, but a change requires a router restart to take effect."
+msgstr "UPnP может быть включено или отключено, но для получения желательного результата изменения требуется перезагрузка маршрутизатора."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:537
+#, fuzzy
+msgid "Hostnames entered above will be published in the network database."
+msgstr "Имена хоста, зарегистрированные выше, будут опубликованы в базе данных сети."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:539
+#, fuzzy
+msgid "They are <b>not private</b>."
+msgstr "Они <b>не являются личными</b>."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:541
+#, fuzzy
+msgid "Also, <b>do not enter a private IP address</b> like 127.0.0.1 or 192.168.1.1."
+msgstr "Также, <b>не запишите личный IP-адрес</b>, как 127.0.0.1 или 192.168.1.1."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:543
+#, fuzzy
+msgid "If you specify the wrong IP address or hostname, or do not properly configure your NAT or firewall, your network performance will degrade substantially."
+msgstr "Если Вы установите неправильный IP-адрес или имя хоста, или неправильно сконфигурируете Ваше NAT-устройство или брандмауэр, работа сети будет существенно ухудшаться."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:545
+#, fuzzy
+msgid "When in doubt, leave the settings at the defaults."
+msgstr "Если Вы сомневаетесь, не заходите на настройки."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:547
+#, fuzzy
+msgid "Reachability Help"
+msgstr "Помощь доступности"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:552
+#, fuzzy
+msgid "If you think you have opened up your firewall and I2P still thinks you are firewalled, remember that you may have multiple firewalls, for example both software packages and external hardware routers."
+msgstr "Если Вы думаете, что открыли Ваш брандмауэр, а протокол I2P все еще думает, что доступа к порту нет, помните, что у Вас могут быть различные брандмауэры, то есть,- и программное обеспечение, и внешние маршрутизаторы аппаратного обеспечения."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:555
+#, fuzzy
+msgid "If there is an error, the <a href=\"logs.jsp\">logs</a> may also help diagnose the problem."
+msgstr "Если обнаружится ошибка, <a href=\"logs.jsp\">текстовые файлы (logs)</a> могут помочь раскрыть сущность проблемы."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:559
+#, fuzzy
+msgid "Your UDP port does not appear to be firewalled."
+msgstr "Ваш UDP порт не закрыт"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:563
+#, fuzzy
+msgid "Your UDP port appears to be firewalled."
+msgstr "Ваш UDP-порт закрыт. Кажеться что ваш UDP порт за брандмауером."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:565
+#, fuzzy
+msgid "As the firewall detection methods are not 100% reliable, this may occasionally be displayed in error."
+msgstr "Поскольку методы детектирования брандмауэра не надежны на 100 %, может случайно обнаружиться ошибка."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:567
+#, fuzzy
+msgid "However, if it appears consistently, you should check whether both your external and internal firewalls are open for your port."
+msgstr "Однако, если окажется, последовательно, Вы должны убедиться, как внешний и внутренний брандмауэр открыт для вашего порта."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:569
+#, fuzzy
+msgid "I2P will work fine when firewalled, there is no reason for concern. When firewalled, the router uses \"introducers\" to relay inbound connections."
+msgstr "Сеть заработает должным образом, если будет закрыт порт, причин для беспокойства нет. Когда доступа к порту нет, маршрутизатор использует «устройство ввода», чтоб ретранслировать входящее соединение."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:571
+#, fuzzy
+msgid "However, you will get more participating traffic and help the network more if you can open your firewall(s)."
+msgstr "Несмотря на это, Вы получите больше сетевого трафика и тем самым поможете работе сети при условии, если откроете брандмауэры."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:573
+#, fuzzy
+msgid "If you think you have already done so, remember that you may have both a hardware and a software firewall, or be behind an additional, institutional firewall you cannot control."
+msgstr "Если думаете, что Вы все сделали правильно, помните, что у Вас может быть как аппаратное, так  и программное оборудование, и что в обходе дополнительного, основного брандмауэра, Вы не можете контролировать."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:575
+#, fuzzy
+msgid "Also, some routers cannot correctly forward both TCP and UDP on a single port, or may have other limitations or bugs that prevent them from passing traffic through to I2P."
+msgstr "Также некоторые маршрутизаторы не могут правильно отсылать TCP и UDP протоколы на один порт, или же они могут иметь иные ограничения или вирусы, которые препятствуют прохождению трафика в I2P."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:579
+#, fuzzy
+msgid "The router is currently testing whether your UDP port is firewalled."
+msgstr "Маршрутизатор проверяет, закрыт ли Ваш UDP порт."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:583
+#, fuzzy
+msgid "The router is not configured to publish its address, therefore it does not expect incoming connections."
+msgstr "Маршрутизатор не конфигурируется для публикации адреса, поэтому он не ожидает входящего соединения."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:585
+#, fuzzy
+msgid "WARN - Firewalled and Fast"
+msgstr "ПРЕДУПРЕЖДЕНИЕ - За Брандмауэром и Быстрый"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:587
+#, fuzzy
+msgid "You have configured I2P to share more than 128KBps of bandwidth, but you are firewalled."
+msgstr "Вы сконфигурировали протокол I2P, чтоб использовать более, чем 128 килобайт в секунду диапазона частоты, но доступа к порту нет."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:589
+#, fuzzy
+msgid "While I2P will work fine in this configuration, if you really have over 128KBps of bandwidth to share, it will be much more helpful to the network if you open your firewall."
+msgstr "Хотя сеть будет должным образом работать в этой конфигурации, если Вы действительно имеете для совместного использования более 128 килобайт в секунду диапазона частот, будет лучше для сети, если б Вы открыли брандмауэр."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:591
+#, fuzzy
+msgid "WARN - Firewalled and Floodfill"
+msgstr "ПРЕДУПРЕЖДЕНИЕ - За Брандмауэром и Floodfill"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:593
+#, fuzzy
+msgid "You have configured I2P to be a floodfill router, but you are firewalled."
+msgstr "Вы настроили I2P быть floodfill маршрутизатора, но маршрутизатор за брандмауэром."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:595
+#, fuzzy
+msgid "For best participation as a floodfill router, you should open your firewall."
+msgstr "Для лучшей совместной работы в качестве floodfill маршрутизатора, Вы должны открыть свой брандмауэр."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:597
+#, fuzzy
+msgid "WARN - Firewalled with Inbound TCP Enabled"
+msgstr "ПРЕДУПРЕЖДЕНИЕ - За Брандмауэром и Входящий TCP Включено"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:599
+#, fuzzy
+msgid "You have configured inbound TCP, however your UDP port is firewalled, and therefore it is likely that your TCP port is firewalled as well."
+msgstr "Вы сконфигурировали входящий TCP, однако Ваш UDP порт закрыт, поэтому скорее всего Ваш TCP – порт так же закрыт."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:601
+#, fuzzy
+msgid "If your TCP port is firewalled with inbound TCP enabled, routers will not be able to contact you via TCP, which will hurt the network."
+msgstr "Если Ваш TCP порт закрыт входящим включенным TCP, маршрутизаторы не смогут соединиться с Вами через TCP, т.к. могут повредить сеть."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:603
+#, fuzzy
+msgid "Please open your firewall or disable inbound TCP above."
+msgstr "Пожалуйста, откройте свой брандмауэр или отключенный входящий порт TCP."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:605
+#, fuzzy
+msgid "WARN - Firewalled with UDP Disabled"
+msgstr "ПРЕДУПРЕЖДЕНИЕ - За Брандмауэром и UDP Отключенный"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:607
+#, fuzzy
+msgid "You have configured inbound TCP, however you have disabled UDP."
+msgstr "Вы сконфигурировали входящий TCP, но все равно Вы отключили UDP."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:609
+#, fuzzy
+msgid "You appear to be firewalled on TCP, therefore your router cannot accept inbound connections."
+msgstr "Вы firewalled on TCP, поэтому Ваш маршрутизатор не может принять входящие соединения."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:611
+#, fuzzy
+msgid "Please open your firewall or enable UDP."
+msgstr "Пожалуйста, откройте свой брандмауер или закройте UDP."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:613
+#, fuzzy
+msgid "ERR - Clock Skew"
+msgstr "ОШИБКА - Часы Отклонение"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:615
+#, fuzzy
+msgid "Your system's clock is skewed, which will make it difficult to participate in the network."
+msgstr "Вашы часы системного времени сбились, что усложнит работу в сети."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:617
+#, fuzzy
+msgid "Correct your clock setting if this error persists."
+msgstr "Настройте часы, если эта ошибка не исчезает."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:619
+#, fuzzy
+msgid "ERR - Private TCP Address"
+msgstr "ОШИБКА - Частный TCP Адрес"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:621
+#, fuzzy
+msgid "You must never advertise an unroutable IP address such as 127.0.0.1 or 192.168.1.1 as your external address."
+msgstr "Нельзя разглашать немаршрутизируемый IP –адрес, как 127.0.0.1 или 192.168.1.1 в качестве Вашего внешнего адреса."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:623
+#, fuzzy
+msgid "Correct the address or disable inbound TCP above."
+msgstr "Исправьте адрес или отключите входящий TCP сверх."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:625
+#, fuzzy
+msgid "ERR - SymmetricNAT"
+msgstr "ОШИБКА - симметрическим NAT"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:627
+#, fuzzy
+msgid "I2P detected that you are firewalled by a Symmetric NAT."
+msgstr "I2P определила, что порт был закрыт симметрическим NAT."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:629
+#, fuzzy
+msgid "I2P does not work well behind this type of firewall. You will probably not be able to accept inbound connections, which will limit your participation in the network."
+msgstr "I2P не работает должным образом из-за отсутствия доступа к порту. Возможно, Вы не сможете принять входящее соединение, которое будет ограничивать доступ к сети."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:631
+#, fuzzy
+msgid "ERR - UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart"
+msgstr "ОШИБКА - UDP-порта уже используется - Настройте i2np.udp.internalPort=xxxx в advanced config и перезагрузите"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:633
+#, fuzzy
+msgid "I2P was unable to bind to port 8887 or other configured port."
+msgstr "I2P не мог подсоединиться к порту 8887 или к другому конфигурируемому порту."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:635
+#, fuzzy
+msgid "Check to see if another program is using the configured port. If so, stop that program or configure I2P to use a different port."
+msgstr "Проверьте что другая программа использует настроенный порт. Если да, то остановить программу или настроить I2P использовать другой порт."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:637
+#, fuzzy
+msgid "This may be a transient error, if the other program is no longer using the port."
+msgstr "Может произойти сбой, если другая программа больше не использует этот порт."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:639
+#, fuzzy
+msgid "However, a restart is always required after this error."
+msgstr "Однако после такой ошибки всегда требуется перезагрузка."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:641
+#, fuzzy
+msgid "ERR - UDP Disabled and Inbound TCP host/port not set"
+msgstr "ОШИБКА - UDP отключен и входящий TCP / порт не указан"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:643
+#, fuzzy
+msgid "You have not configured inbound TCP with a hostname and port above, however you have disabled UDP."
+msgstr "Вы не сконфигурировали входящий TCP с именем хоста и выше указанным портом, но все равно Вы отключили UDP."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:645
+#, fuzzy
+msgid "Therefore your router cannot accept inbound connections."
+msgstr "Следовательно Ваш маршрутизатор не может принять входящее соединение."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:647
+#, fuzzy
+msgid "Please configure a TCP host and port above or enable UDP."
+msgstr "Пожалуйста, сконфигурируйте хост TCP и выше указанный порт или же включите UDP."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:649
+#, fuzzy
+msgid "ERR - Client Manager I2CP Error - check logs"
+msgstr "ОШИБКА - Менеджер Клиентов I2CP Ошибка - проверьте текстовые файлы (logs)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:651
+#, fuzzy
+msgid "This is usually due to a port 7654 conflict. Check the logs to verify."
+msgstr "Обычно это обусловлено конфликтом порта 7654 (ошибка). Проверьте текстовые файлы (logs), чтоб удостовериться."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:653
+#, fuzzy
+msgid "Do you have another I2P instance running? Stop the conflicting program and restart I2P."
+msgstr "У Вас есть другое выполнение запроса через протокол I2P? Остановите эту программу и перезагрузите I2P."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:107
+#, fuzzy
+msgid "config advanced"
+msgstr "расширенные настройки"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:242
+#, fuzzy
+msgid "I2P Advanced Configuration"
+msgstr "I2P Расширенные Настройки"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:299
+#, fuzzy
+msgid "Advanced I2P Configuration"
+msgstr "Расширенные I2P Настройки"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:303
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:321
+#, fuzzy
+msgid "Apply"
+msgstr "Применить"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:309
+#, fuzzy
+msgid "Some changes may require a restart to take effect."
+msgstr "Может потребоваться перезагрузка системы для того, чтобы некоторые изменения вступили в силу."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:106
+#, fuzzy
+msgid "config clients"
+msgstr "настройка клиента"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:241
+#, fuzzy
+msgid "I2P Client Configuration"
+msgstr "I2P Настройка Клиента"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:306
+#, fuzzy
+msgid "Client Configuration"
+msgstr "Настройка Клиента"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:308
+#, fuzzy
+msgid "The Java clients listed below are started by the router and run in the same JVM."
+msgstr "Java-клиенты, приведенные ниже, запускаются маршрутизатором и действуют в одной и той же Java-машине."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:312
+#, fuzzy
+msgid "To change other client options, edit the file"
+msgstr "Для того, чтобы изменить другие пользовательские настройки, выполните редактирование файла"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:319
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:331
+#, fuzzy
+msgid "All changes require restart to take effect."
+msgstr "Для того, чтобы данные изменения вступили в силу, выполните перезагрузку I2P."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:323
+#, fuzzy
+msgid "WebApp Configuration"
+msgstr "WebApp Конфигурация"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:325
+#, fuzzy
+msgid "The Java web applications listed below are started by the webConsole client and run in the same JVM as the router. They are usually web applications accessible through the router console. They may be complete applications (e.g. i2psnark),front-ends to another client or application which must be separately enabled (e.g. susidns, i2ptunnel), or have no web interface at all (e.g. addressbook)."
+msgstr "Веб-приложения Java, перечисленные ниже, запускаются при помощи консольного клиента с веб-интерфейсом и действуют в той же Java-машине, что и маршрутизатор. Обычно это веб-приложения, доступные через консоль маршрутизатора. Они могут быть полными (например, i2psnark), обеспечивающими взаимодействие с внешними клиентами или приложениями, которые должны быть запущены отдельно (например, susidns, i2ptunnel), или же такими, которые не имеют интерфейса вообще (например, addressbook)."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:327
+#, fuzzy
+msgid "A web app may also be disabled by removing the .war file from the webapps directory; however the .war file and web app will reappear when you update your router to a newer version, so disabling the web app here is the preferred method."
+msgstr "Веб-приложение также можно блокировать посредством удаления файла с расширением .war из папки webappsс веб-приложениями; тем не менее, файл с расширением .war и веб-приложение появятся, когда вы обновите маршрутизатор до более новой версии, так что блокировка веб-приложения является предпочтительной."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:106
+#, fuzzy
+msgid "config keyring"
+msgstr "конфигурация для устройств хранения данных"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:228
+#, fuzzy
+msgid "I2P Keyring Configuration"
+msgstr "Конфигурация I2P Для Устройств Хранения Данных"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:294
+#, fuzzy
+msgid "The router keyring is used to decrypt encrypted leaseSets."
+msgstr "Устройство хранения данных маршрутизатора используется для расшифровки зашифрованных наборов адресов."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:297
+#, fuzzy
+msgid "The keyring may contain keys for local or remote encrypted destinations."
+msgstr "На устройстве могут содержаться ключи для локальных или удаленных адресов зашифрованных назначений."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:307
+#, fuzzy
+msgid "Manual Keyring Addition"
+msgstr "Ручное Дополнение К Накопителю Информации"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:309
+#, fuzzy
+msgid "Enter keys for encrypted remote destinations here."
+msgstr "Введите ключи для зашифрованных удаленных адресов."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:312
+#, fuzzy
+msgid "Keys for local destinations must be entered on the"
+msgstr "Ключи для локальных адресов назначения необходимо ввести на"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:314
+#, fuzzy
+msgid "I2PTunnel page"
+msgstr "странице I2PTunnel"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:316
+#, fuzzy
+msgid "Dest. name, hash, or full key"
+msgstr "Имя адреса назначения, хэш или полный ключ"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:318
+#, fuzzy
+msgid "Encryption Key"
+msgstr "Криптографический ключ"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:107
+#, fuzzy
+msgid "config logging"
+msgstr "настройка журнала"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:242
+#, fuzzy
+msgid "I2P Logging Configuration"
+msgstr "I2P Настройке Журнала"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:299
+#, fuzzy
+msgid "Configure I2P Logging Options"
+msgstr "Опции Записи Конфигурации I2P"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:301
+#, fuzzy
+msgid "Logging filename"
+msgstr "Имя файла записи"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:305
+#, fuzzy
+msgid "(the symbol '@' will be replaced during log rotation)"
+msgstr "(символ «@» будет заменен в процессе сканирования записи)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:307
+#, fuzzy
+msgid "Log record format"
+msgstr "Формат записи системного журнала"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:311
+#, fuzzy
+msgid "(use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, 'm' = message)"
+msgstr "(используйте следующие обозначения: «d» = дата, «c» = класс, «t» = тред, «p» = приоритет, «m» = сообщение)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:313
+#, fuzzy
+msgid "Log date format"
+msgstr "Формат даты записи"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:317
+#, fuzzy
+msgid "('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' = millisecond)"
+msgstr "(«MM» = месяц, «dd» = день, «HH» = часы, «mm» = минуты, «ss» = секунды, «SSS» = миллисекунды)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:319
+#, fuzzy
+msgid "Max log file size"
+msgstr "Максимальный размер файла системного журнала"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:323
+#, fuzzy
+msgid "Default log level"
+msgstr "Уровень записи по умолчанию"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:327
+#, fuzzy
+msgid "(DEBUG and INFO are not recommended defaults, as they will drastically slow down your router)"
+msgstr "(настройки DEBUG и INFO не являются рекомендованными по умолчанию, так как они значительно замедляют работу маршрутизатора)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:329
+#, fuzzy
+msgid "Log level overrides"
+msgstr "Редактирование уровня записи"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:106
+#, fuzzy
+msgid "config peers"
+msgstr "конфигурация пиров"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:228
+#, fuzzy
+msgid "I2P Peer Configuration"
+msgstr "Конфигурация Пиров I2P"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:304
+#, fuzzy
+msgid "Manual Peer Controls"
+msgstr "Ручное Управление Пирами"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:306
+#, fuzzy
+msgid "Router Hash"
+msgstr "Хэш Маршрутизатора"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:310
+#, fuzzy
+msgid "Manually Ban / Unban a Peer"
+msgstr "ручную запретить / разрешить пиры"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:312
+#, fuzzy
+msgid "Banning will prevent the participation of this peer in tunnels you create."
+msgstr "Запрет предотвратит участие данного пира в созданных вами туннелях."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:324
+#, fuzzy
+msgid "Bonuses may be positive or negative, and affect the peer's inclusion in Fast and High Capacity tiers. Fast peers are used for client tunnels, and High Capacity peers are used for some exploratory tunnels. Current bonuses are displayed on the"
+msgstr "Дополнительные потоки могут быть как положительными и отрицательными, оказывающими влияние на вовлечение узлов сети в быстрых узлах и узлах большой мощност. Быстрые узлы используются для клиентских туннелей, а узлы большой мощности используются в некоторых типах поисковых туннелей. Текущие потоки отображены на"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:326
+#, fuzzy
+msgid "profiles page"
+msgstr "странице профилей"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:342
+#, fuzzy
+msgid "Adjust peer bonuses"
+msgstr "Настройка дополнительных потоков пиров"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:344
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:253
+#, fuzzy
+msgid "Banned Peers"
+msgstr "Запрещенные Пиры"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:366
+#, fuzzy
+msgid "Banned IPs"
+msgstr "Запрещенные IP адресы"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:106
+#, fuzzy
+msgid "config service"
+msgstr "конфигурация сервиса"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:228
+#, fuzzy
+msgid "I2P Service Configuration"
+msgstr "Конфигурация Сервиса I2P"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:284
+#, fuzzy
+msgid "Shutdown the router"
+msgstr "Выключить маршрутизатор"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:286
+#, fuzzy
+msgid "Graceful shutdown lets the router satisfy the agreements it has already made before shutting down, but may take a few minutes."
+msgstr "Постепенное выключение позволяет маршрутизатору выполнить запланированные задания до его выключения, но это займет несколько минут."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:288
+#, fuzzy
+msgid "If you need to kill the router immediately, that option is available as well."
+msgstr "Постепенное выключение позволяет маршрутизатору выполнить запланированные задания до его выключения, но это займет несколько минут."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:298
+#, fuzzy
+msgid "If you want the router to restart itself after shutting down, you can choose one of the following."
+msgstr "Если Вы хотите, чтоб маршрутизатор перезагрузился после выключения, Вы можете выбрать одно из действий."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:300
+#, fuzzy
+msgid "This is useful in some situations"
+msgstr "В некоторых случаях это полезно"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:302
+#, fuzzy
+msgid "for example, if you changed some settings that client applications only read at startup, such as the routerconsole password or the interface it listens on."
+msgstr "к примеру, если Вы поменяли некоторые настройки, которые приложения-клиенты читают только при запуске, такие как пароль консоля маршрутизатора или прослушивание интерфейса."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:304
+#, fuzzy
+msgid "A graceful restart will take a few minutes (but your peers will appreciate your patience), while a hard restart does so immediately."
+msgstr "Постепенное выключение будет длиться несколько минут (но твои пиры будут благодарны за твое терпение), а жесткая перезагрузка делает это незамедлительно."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:306
+#, fuzzy
+msgid "After tearing down the router, it will wait 1 minute before starting back up again."
+msgstr "После разбора настройки маршрутизатора, пройдет еще 1 минута до загрузки."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:316
+#, fuzzy
+msgid "Systray integration"
+msgstr "Система лоток интеграции"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:318
+#, fuzzy
+msgid "On the windows platform, there is a small application to sit in the system tray, allowing you to view the router's status"
+msgstr "На платформе Windows, есть небольшое приложение, чтобы сидеть в системном трее, что позволяет Вам просматривать статус маршрутизатора"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:320
+#, fuzzy
+msgid "(later on, I2P client applications will be able to integrate their own functionality into the system tray as well)."
+msgstr "(позднее, I2P приложений клиент сможет интегрировать свои функции в системном трее тоже)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:322
+#, fuzzy
+msgid "If you are on windows, you can either enable or disable that icon here."
+msgstr "Если вы на Windows, вы можете включить или отключить этот значок здесь."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:328
+#, fuzzy
+msgid "Run on startup"
+msgstr "Запуск при старте"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:330
+#, fuzzy
+msgid "You can control whether I2P is run on startup or not by selecting one of the following options"
+msgstr "Вы можете управлять ли I2P запускается при запуске или не выбрать один из следующих вариантов"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:332
+#, fuzzy
+msgid "I2P will install (or remove) a service accordingly."
+msgstr "I2P будет установить (или удалить) услуга, соответственно."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:334
+#, fuzzy
+msgid "If you prefer the command line, you can also run the "
+msgstr "Если вы предпочитаете командную строку, вы можете также запустить "
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:344
+#, fuzzy
+msgid "If you are running I2P as service right now, removing it will shut down your router immediately."
+msgstr "Если вы используете I2P как сервис на данный момент, удалив будет закрыта маршрутизатор немедленно."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:346
+#, fuzzy
+msgid "You may want to consider shutting down gracefully, as above, then running uninstall_i2p_service_winnt.bat."
+msgstr "Вы можете рассмотреть вопрос о закрытии грациозно, как указано выше, затем запустить uninstall_i2p_service_winnt.bat."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:354
+#, fuzzy
+msgid "Debugging"
+msgstr "Отладка программы"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:360
+#, fuzzy
+msgid "Launch browser on router startup?"
+msgstr "Загружать браузер при запуске маршрутизатора?"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:362
+#, fuzzy
+msgid "I2P's main configuration interface is this web console, so for your convenience I2P can launch a web browser on startup pointing at"
+msgstr "Основной интерфейс конфигурации I2P таки веб-консоли, поэтому для вашего удобства I2P может открыть веб-браузер при запуске указывая на"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:107
+#, fuzzy
+msgid "config stats"
+msgstr "конфигурации статистики"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:229
+#, fuzzy
+msgid "I2P Stats Configuration"
+msgstr "Конфигурация Статистики I2P"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:300
+#, fuzzy
+msgid "Configure I2P Stat Collection"
+msgstr "Конфигурация Сбора Статистики I2P"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:302
+#, fuzzy
+msgid "Enable full stats?"
+msgstr "Активировать полную статистику?"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:309
+#, fuzzy
+msgid "change requires restart to take effect"
+msgstr "для того, чтобы изменения вступили в силу, необходима перезагрузка системы"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:311
+#, fuzzy
+msgid "Stat file"
+msgstr "Файл статистики"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:315
+#, fuzzy
+msgid "Filter"
+msgstr "Фильтр"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:317
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:326
+#, fuzzy
+msgid "toggle all"
+msgstr "переключить все"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:328
+#, fuzzy
+msgid "Log"
+msgstr "Запись"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:330
+#, fuzzy
+msgid "Graph"
+msgstr "Диаграмма"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:369
+#, fuzzy
+msgid "Advanced filter"
+msgstr "Дополнительные фильтры"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:106
+#, fuzzy
+msgid "config tunnels"
+msgstr "конфигурация туннеля"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:241
+#, fuzzy
+msgid "I2P Tunnel Configuration"
+msgstr "Конфигурация Туннеля I2P"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:305
+#, fuzzy
+msgid "The default settings work for most people."
+msgstr "Стандартные настройки действуют в большинстве случаев."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:309
+#, fuzzy
+msgid "There is a fundamental tradeoff between anonymity and performance."
+msgstr "Необходимо сделать выбор между анонимностью и производительностью."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:312
+#, fuzzy
+msgid "Tunnels longer than 3 hops (for example 2 hops + 0-2 hops, 3 hops + 0-1 hops, 3 hops + 0-2 hops), or a high quantity + backup quantity, may severely reduce performance or reliability."
+msgstr "Туннели, длина которых составляет более 3 хопов (например, 2 хопа + 0-2 хопа, 3 хопа + 0-1 хоп, 3 хопа + 0-2 хопа), или большое количество + резервное количество, могут значительно уменьшить производительность или надежность."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:315
+#, fuzzy
+msgid "High CPU and/or high outbound bandwidth usage may result."
+msgstr "Это также может привести к перегрузке ЦП и/или ухудшению пропускной способности входящего канала."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:318
+#, fuzzy
+msgid "Change these settings with care, and adjust them if you have problems."
+msgstr "Будьте внимательны при изменении данных настроек, урегулируйте их в том случае, если возникнут какие-либо проблемы."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:332
+#, fuzzy
+msgid "Exploratory tunnel setting changes are stored in the router.config file."
+msgstr "Разведочный туннель изменений параметров хранятся в файле router.config."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:335
+#, fuzzy
+msgid "Client tunnel changes are temporary and are not saved."
+msgstr "Клиент туннель изменения являются временными и не сохраняются."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:337
+#, fuzzy
+msgid "To make permanent client tunnel changes see the"
+msgstr "Для постоянных клиентов изменения туннеля см."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:339
+#, fuzzy
+msgid "i2ptunnel page"
+msgstr "i2ptunnel страницу"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:106
+#, fuzzy
+msgid "config UI"
+msgstr "конфигурации интерфейса"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:241
+#, fuzzy
+msgid "I2P UI Configuration"
+msgstr "I2P Настройка Пользовательского Интерфейса"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:291
+#, fuzzy
+msgid "Router Console Theme"
+msgstr "Тема Консоля Маршрутизатора"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:309
+#, fuzzy
+msgid "Theme selection disabled for Internet Explorer, sorry."
+msgstr "Выбор тем отключена для Internet Explorer, извините."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:311
+#, fuzzy
+msgid "If you're not using IE, it's likely that your browser is pretending to be IE; please configure your browser (or proxy) to use a different User Agent string if you'd like to access the console themes."
+msgstr "Если вы не используете IE, то, скорее всего, ваш браузер притворяется IE, пожалуйста, настроить Ваш браузер (или прокси-сервера), чтобы использовать различные User Agent String, если вы хотите получить доступ к консоли темам."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:315
+#, fuzzy
+msgid "Router Console Language"
+msgstr "Язык Маршрутизатора Консоля"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:319
+#, fuzzy
+msgid "Please contribute to the router console translation project! Contact the developers on IRC #i2p to help."
+msgstr "Пожалуйста, помогите маршрутизатор консоли проект по переводу! Свяжете с разработчиками на IRC # I2P помочь."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:106
+#, fuzzy
+msgid "config update"
+msgstr "обновленная конфигурация"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:228
+#, fuzzy
+msgid "I2P Update Configuration"
+msgstr "Обновленная Конфигурация I2P"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:300
+#, fuzzy
+msgid "Check for I2P and news updates"
+msgstr "Проверьте данные I2P и обновление новостей"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:302
+#, fuzzy
+msgid "News &amp; I2P Updates"
+msgstr "Новости и Обновление  I2P"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:306
+#, fuzzy
+msgid "Update In Progress"
+msgstr "Выполняется обновление"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:314
+#, fuzzy
+msgid "News URL"
+msgstr "Новости URL"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:318
+#, fuzzy
+msgid "Refresh frequency"
+msgstr "Частота обновления"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:322
+#, fuzzy
+msgid "Update policy"
+msgstr "Обновление конфигурации"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:326
+#, fuzzy
+msgid "Update through the eepProxy?"
+msgstr "Обновление через eep-Прокси?"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:330
+#, fuzzy
+msgid "eepProxy host"
+msgstr "eep-Прокси хост"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:334
+#, fuzzy
+msgid "eepProxy port"
+msgstr "eep-Прокси порт"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:338
+#, fuzzy
+msgid "Update URLs"
+msgstr "Обновления URL-адресы"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:342
+#, fuzzy
+msgid "Trusted keys"
+msgstr "Доверенные криптографические ключи"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:346
+#, fuzzy
+msgid "Update with unsigned development builds?"
+msgstr "Обновить беззнаковой тестовой сборкой?"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:350
+#, fuzzy
+msgid "Unsigned Build URL"
+msgstr "Беззнаковая тестовая сборка URL"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:354
+#, fuzzy
+msgid "Save"
+msgstr "Сохранить"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:117
+#, fuzzy
+msgid "Page Not Found"
+msgstr "Страница Не Найдена"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:243
+#, fuzzy
+msgid "Sorry! You appear to be requesting a non-existent Router Console page or resource."
+msgstr "Извините! Вы, как представляется, с просьбой о несуществующих Маршрутизатор консоли страницы или ресурса."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:245
+#, fuzzy
+msgid "Error 404"
+msgstr "Ошибка 404"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:250
+#, fuzzy
+msgid "not found"
+msgstr "не найдено"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:106
+#, fuzzy
+msgid "graphs"
+msgstr "диаграммы"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:228
+#, fuzzy
+msgid "I2P Performance Graphs"
+msgstr "I2P Диаграммы Производительности"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:105
+#, fuzzy
+msgid "home"
+msgstr "дома"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:105
+#, fuzzy
+msgid "job queue"
+msgstr "очереди заданий"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:227
+#, fuzzy
+msgid "I2P Router Job Queue"
+msgstr "Маршрутизатор I2P Очередь Заданий"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:105
+#, fuzzy
+msgid "logs"
+msgstr "логи"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:227
+#, fuzzy
+msgid "I2P Router Logs"
+msgstr "I2P Маршрутизатор Логи"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:229
+#, fuzzy
+msgid "I2P Version & Running Environment"
+msgstr "I2P Версии & Действуюшая Окружающей Среды"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:231
+#, fuzzy
+msgid "Please include this information in bug reports"
+msgstr "Пожалуйста, включите эту информацию в докладах ошибка"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:105
+#, fuzzy
+msgid "network database summary"
+msgstr "база данных резюме"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:227
+#, fuzzy
+msgid "I2P Network Database Summary"
+msgstr "I2P База Данных Резюме"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:109
+#, fuzzy
+msgid "WebApp Not Found"
+msgstr "Страница Не Найдена"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:231
+#, fuzzy
+msgid "Web Application Not Running"
+msgstr "Применение туннелей"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:233
+#, fuzzy
+msgid "The requested web application is not running."
+msgstr "Предложила веб-приложений не запущено."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:235
+#, fuzzy
+msgid "Please visit the <a href=\"/configclients.jsp#webapp\">config clients page</a> to start it."
+msgstr "Пожалуйста, посетите <a href=\"/configclients.jsp#webapp\">страницу конфигурации клиента</a> для его запуска."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:105
+#, fuzzy
+msgid "peer connections"
+msgstr "связи пиров"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:227
+#, fuzzy
+msgid "I2P Network Peers"
+msgstr "I2P Сеть Пиры"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:105
+#, fuzzy
+msgid "peer profiles"
+msgstr "профили пиров"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:227
+#, fuzzy
+msgid "I2P Network Peer Profiles"
+msgstr "Профили Пиров Сети I2P"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:105
+#, fuzzy
+msgid "statistics"
+msgstr "статистика"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:242
+#, fuzzy
+msgid "I2P Router Statistics"
+msgstr "I2P Маршрутизатор Статистика"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:245
+#, fuzzy, java-format
+msgid "Disable {0}s Refresh"
+msgstr "Откл. {0}с. Обновление"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:105
+#, fuzzy
+msgid "tunnel summary"
+msgstr "туннель резюме"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:227
+#, fuzzy
+msgid "I2P Tunnel Summary"
+msgstr "I2P Тоннеля Резюме"
+
+#, fuzzy
+#~ msgid "Depth"
+#~ msgstr "Глубина"
+
diff --git a/apps/routerconsole/locale/messages_zh.po b/apps/routerconsole/locale/messages_zh.po
index aa7e0404002263e311dd6fee9b62b9ae490c6530..f58ecf519900bc0980c8291a2af517aa7a404acd 100644
--- a/apps/routerconsole/locale/messages_zh.po
+++ b/apps/routerconsole/locale/messages_zh.po
@@ -1,3960 +1,4360 @@
-# I2P
-# Copyright (C) 2009 The I2P Project
-# This file is distributed under the same license as the routerconsole package.
-# To contribute translations, see http://www.i2p2.de/newdevelopers
-# foo <foo@bar>, 2009.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: I2P routerconsole\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-11-18 10:04+0000\n"
-"PO-Revision-Date: \n"
-"Last-Translator: walking <walking@mail.i2p>\n"
-"Language-Team: \n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"X-Poedit-Language: Chinese\n"
-"X-Poedit-Country: CHINA\n"
-
-#: ../../../router/java/src/net/i2p/router/Blocklist.java:117
-#, java-format
-msgid "Banned by router hash: {0}"
-msgstr "按路由器指纹封杀:{0}"
-
-#: ../../../router/java/src/net/i2p/router/Blocklist.java:119
-msgid "Banned by router hash"
-msgstr "路由指纹封锁"
-
-#: ../../../router/java/src/net/i2p/router/Blocklist.java:664
-msgid "IP banned"
-msgstr "IP封锁"
-
-#: ../../../router/java/src/net/i2p/router/Blocklist.java:734
-#, java-format
-msgid "IP banned by blocklist.txt entry {0}"
-msgstr "按IP黑名单blocklist.txt封杀的节点{0}"
-
-#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:91
-msgid "Rejecting tunnels: Shutting down"
-msgstr "拒绝共享:准备退出"
-
-#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:140
-msgid "Rejecting tunnels: High message delay"
-msgstr "拒绝共享:高消息延迟"
-
-#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:176
-msgid "Rejecting most tunnels: High number of requests"
-msgstr "收紧共享:高请求量"
-
-#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:232
-msgid "Rejecting tunnels: Limit reached"
-msgstr "拒绝共享:隧道数限额"
-
-#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:300
-msgid "Rejecting tunnels: Bandwidth limit"
-msgstr "拒绝共享:带宽限额"
-
-#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:370
-msgid "Rejecting most tunnels: Bandwidth limit"
-msgstr "收紧共享:带宽限额"
-
-#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:374
-msgid "Accepting most tunnels"
-msgstr "接收多数隧道"
-
-#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:376
-msgid "Accepting tunnels"
-msgstr "接收共享隧道"
-
-#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:486
-msgid "Rejecting tunnels"
-msgstr "拒绝参与共享隧道"
-
-#: ../../../router/java/src/net/i2p/router/transport/GetBidsJob.java:70
-msgid "No transports (hidden or starting up?)"
-msgstr "无数据传输(隐身或正在启动)"
-
-#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:450
-msgid "Unreachable on any transport"
-msgstr "各传输方式均不可达"
-
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/EstablishState.java:373
-#: ../../../router/java/src/net/i2p/router/transport/ntcp/EstablishState.java:578
-#, java-format
-msgid "Excessive clock skew: {0}"
-msgstr "严重时滞:{0}"
-
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:128
-msgid "Dropping tunnel requests: Too slow"
-msgstr "忽略共享请求:速度太慢"
-
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:340
-msgid "Dropping tunnel requests: Overloaded"
-msgstr "忽略共享请求:路由过载"
-
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:499
-msgid "Rejecting tunnels: Request overload"
-msgstr "拒绝共享:请求过多"
-
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:524
-msgid "Rejecting tunnels: Connection limit"
-msgstr "拒绝共享:连接受限"
-
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:725
-msgid "Dropping tunnel requests: High load"
-msgstr "忽略共享请求:高负载"
-
-#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:734
-msgid "Dropping tunnel requests: Queue time"
-msgstr "忽略共享请求:队列积压"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:106
-msgid "config networking"
-msgstr "连网设置"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:217
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:218
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:217
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:217
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:231
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:217
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:217
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:218
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:217
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:217
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:217
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:228
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:217
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fzh_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:223
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:216
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summary_jsp.java:157
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:236
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:216
-msgid "Refresh (s)"
-msgstr "刷新(秒)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:221
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:222
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:221
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:221
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:235
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:221
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:221
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:222
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:221
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:221
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:221
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:224
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:232
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:221
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fzh_jsp.java:224
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:224
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:227
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:224
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:220
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summary_jsp.java:161
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:239
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:220
-msgid "Enable"
-msgstr "启用"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:241
-msgid "I2P Network Configuration"
-msgstr "I2P 连网设置"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:297
-msgid "Bandwidth limiter"
-msgstr "带宽限制"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:299
-msgid "I2P will work best if you configure your rates to match the speed of your internet connection."
-msgstr "与联网环境相符的速度能使I2P以最佳的状态工作。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:303
-msgid "KBps In"
-msgstr "KBps 入站"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:313
-msgid "KBps Out"
-msgstr "KBps 出站"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:323
-msgid "Share"
-msgstr "共享"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:330
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:307
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:303
-msgid "NOTE"
-msgstr "注意"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:332
-#, java-format
-msgid "You have configured I2P to share only {0} KBps."
-msgstr "您设置I2P仅共享 {0} KBps"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:335
-msgid "I2P requires at least 12KBps to enable sharing. "
-msgstr "I2P 需要至少 12KBps 才能进行共享。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:336
-msgid "Please enable sharing (participating in tunnels) by configuring more bandwidth. "
-msgstr "请设置更多的带宽以便启用共享功能(加入到其他节点的隧道创建中)。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:337
-msgid "It improves your anonymity by creating cover traffic, and helps the network."
-msgstr "通过制造混淆流量共享能增强您的匿名性,帮助网络成长。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:340
-#, java-format
-msgid "You have configured I2P to share {0} KBps."
-msgstr "您设置I2P共享 {0} KBps"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:343
-msgid "The higher the share bandwidth the more you improve your anonymity and help the network."
-msgstr "共享的带宽越多,您的匿名性越强同时能帮助网络成长。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:347
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:478
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:333
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:373
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:341
-#: src/net/i2p/router/web/ConfigNetHandler.java:47
-#: src/net/i2p/router/web/ConfigNetHandler.java:249
-#: src/net/i2p/router/web/ConfigTunnelsHandler.java:35
-msgid "Save changes"
-msgstr "保存修改"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:349
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:480
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:305
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:324
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:335
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:375
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:343
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:323
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:356
-msgid "Cancel"
-msgstr "取消"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:353
-msgid "IP and Transport Configuration"
-msgstr "IP 与传输设置"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:355
-msgid "The default settings will work for most people."
-msgstr "默认设置适于大多数人。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:357
-msgid "There is help below."
-msgstr "页面下方有帮助信息"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:359
-msgid "UPnP Configuration"
-msgstr "UPnP 设置"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:363
-msgid "Enable UPnP to open firewall ports"
-msgstr "启用UPnP以打开防火墙端口"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:365
-msgid "UPnP status"
-msgstr "UPnP 统计"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:367
-msgid "IP Configuration"
-msgstr "IP 设置"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:369
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:425
-msgid "Externally reachable hostname or IP address"
-msgstr "公网可访问的本机域名或IP"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:373
-msgid "Use all auto-detect methods"
-msgstr "使用全部自动探测方法"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:377
-msgid "Disable UPnP IP address detection"
-msgstr "禁用UPnP IP 地址探测"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:381
-msgid "Ignore local interface IP address"
-msgstr "忽略本地接口的 IP 地址"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:385
-msgid "Use SSU IP address detection only"
-msgstr "仅使用SSU IP 地址探测"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:389
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:443
-msgid "Specify hostname or IP"
-msgstr "指定主机名或IP"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:395
-msgid "Select Interface"
-msgstr "选择网络接口"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:395
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:336
-#: src/net/i2p/router/web/GraphHelper.java:111
-msgid "or"
-msgstr "或"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:409
-msgid "Hidden mode - do not publish IP"
-msgstr "隐身模式 - 不发布IP"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:411
-msgid "(prevents participating traffic)"
-msgstr "(阻止共享流量)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:413
-msgid "UDP Configuration:"
-msgstr "UPnP 设置:"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:415
-msgid "UDP port:"
-msgstr "UDP端口"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:423
-msgid "TCP Configuration"
-msgstr "TCP 连接设置"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:429
-msgid "Use auto-detected IP address"
-msgstr "使用自动检测得到的 IP 地址"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:431
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:463
-msgid "currently"
-msgstr "目前"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:435
-msgid "if we are not firewalled"
-msgstr "如果没有受到防火墙阻挡"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:439
-msgid "Always use auto-detected IP address (Not firewalled)"
-msgstr "总是使用自动探测到的IP地址(没有防火墙限制)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:449
-msgid "Disable inbound (Firewalled)"
-msgstr "禁止入站连接(受防火墙限制)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:453
-msgid "Completely disable"
-msgstr "完全禁用"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:455
-msgid "(select only if behind a firewall that throttles or blocks outbound TCP)"
-msgstr "仅在受到防火墙的流量限制或入站连接限制时使用"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:457
-msgid "Externally reachable TCP port"
-msgstr "公网可访问的TCP端口"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:461
-msgid "Use the same port configured for UDP"
-msgstr "使用与UDP相同的端口"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:469
-msgid "Specify Port"
-msgstr "指定端口"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:473
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:342
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:329
-msgid "Note"
-msgstr "注意"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:476
-msgid "Changing these settings will restart your router."
-msgstr "修改这些设置将必须重启路由器。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:482
-msgid "Configuration Help"
-msgstr "设置帮助"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:484
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:526
-msgid "While I2P will work fine behind most firewalls, your speeds and network integration will generally improve if the I2P port is forwarded for both UDP and TCP."
-msgstr "I2P可以与大多数防火墙共存,如果I2P端口(第一次安装时随机选择)进行了UDP/TCP映射,您的速度和网络整合度会逐渐提升。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:486
-msgid "If you can, please poke a hole in your firewall to allow unsolicited UDP and TCP packets to reach you."
-msgstr "如果可能,请在防火墙中添加端口并允许入站UDP/TCP数据包通过。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:488
-msgid "If you can't, I2P supports UPnP (Universal Plug and Play) and UDP hole punching with \"SSU introductions\" to relay traffic."
-msgstr "如果不能,I2P支持UPnP(Universal Plug and Play)或借助“SSU中介”进行UDP端口穿透,通过它们也可以中继数据。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:490
-msgid "Most of the options above are for special situations, for example where UPnP does not work correctly, or a firewall not under your control is doing harm."
-msgstr "上述大部分设置仅为特殊情况准备,例如UPnP不能正常工作,或外部防火墙封锁网络。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:492
-msgid "Certain firewalls such as symmetric NATs may not work well with I2P."
-msgstr "在某些防火墙下例如Symmetric,I2P可能无法有效利用NAT工作。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:494
-msgid "UPnP is used to communicate with Internet Gateway Devices (IGDs) to detect the external IP address and forward ports."
-msgstr "UPnP与公网网关设备(IGD)通讯可以检测外部IP和映射端口。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:496
-msgid "UPnP support is beta, and may not work for any number of reasons"
-msgstr "UPnP支持仍在测试阶段,可能由于一些原因无法正常工作。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:498
-msgid "No UPnP-compatible device present"
-msgstr "没有发现UPnP兼容设备"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:500
-msgid "UPnP disabled on the device"
-msgstr "设备上的UPnP支持已禁用"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:502
-msgid "Software firewall interference with UPnP"
-msgstr "软件防火墙阻止UPnP"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:504
-msgid "Bugs in the device's UPnP implementation"
-msgstr "设备的UPnP支持有Bug"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:506
-msgid "Multiple firewall/routers in the internet connection path"
-msgstr "公网连接中存在多个防火墙/路由器"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:508
-msgid "UPnP device change, reset, or address change"
-msgstr "UPnP设备改变、重置或地址迁移"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:510
-msgid "Review the UPnP status here."
-msgstr "在这里检查UPnP状态。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:512
-msgid "UPnP may be enabled or disabled above, but a change requires a router restart to take effect."
-msgstr "UPnP 的关闭或开启均需要程序重启后生效。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:514
-msgid "Hostnames entered above will be published in the network database."
-msgstr "上面输入的主机名称将在网络数据库(NetDB)中发布。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:516
-msgid "They are <b>not private</b>."
-msgstr "他们并<b>非私有地址</b>。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:518
-msgid "Also, <b>do not enter a private IP address</b> like 127.0.0.1 or 192.168.1.1."
-msgstr "此外,<b>请勿输入如127.0.0.1或192.168.1.1等私有地址</b>"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:520
-msgid "If you specify the wrong IP address or hostname, or do not properly configure your NAT or firewall, your network performance will degrade substantially."
-msgstr "如果您设置了错误的IP地址或主机名称,或NAT/防火墙配置不当,您的网络性能将受到明显影响。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:522
-msgid "When in doubt, leave the settings at the defaults."
-msgstr "如果对设置有疑问,请保留默认设置。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:524
-msgid "Reachability Help"
-msgstr "连通性帮助"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:529
-msgid "If you think you have opened up your firewall and I2P still thinks you are firewalled, remember that you may have multiple firewalls, for example both software packages and external hardware routers."
-msgstr "如果您认为已经打开了防火墙,但I2P仍然报告您受到防火墙阻隔,请想想您是否可能有多层防火墙,例如软件防护墙和外部的硬件路由器。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:532
-msgid "If there is an error, the <a href=\"logs.jsp\">logs</a> may also help diagnose the problem."
-msgstr "如果存在错误,<a href=\"logs.jsp\">日志</a>可以帮助您诊断问题。"
-
-# 暂不翻译,确定/良好 可能影响按钮的翻译
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:534
-#: src/net/i2p/router/web/SummaryHelper.java:103
-msgid "OK"
-msgstr "正常"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:536
-msgid "Your UDP port does not appear to be firewalled."
-msgstr "您的UDP端口似乎一切正常。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:538
-#: src/net/i2p/router/web/SummaryHelper.java:114
-msgid "Firewalled"
-msgstr "防火墙限制"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:540
-msgid "Your UDP port appears to be firewalled."
-msgstr "您的UDP端口似乎因防火墙而连接受限。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:542
-msgid "As the firewall detection methods are not 100% reliable, this may occasionally be displayed in error."
-msgstr "由于防火墙检测方法并非100%可靠,有时也可能错误地显示此此提示。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:544
-msgid "However, if it appears consistently, you should check whether both your external and internal firewalls are open for your port."
-msgstr "然而,如果总是出现此提示,您应检查外部或内部防火墙是否打开了I2P端口。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:546
-msgid "I2P will work fine when firewalled, there is no reason for concern. When firewalled, the router uses \"introducers\" to relay inbound connections."
-msgstr "即使受到防火墙阻拦,I2P也能够正常工作,无需担心。受到防火墙阻隔时,路由器将通过“中介(Introducers)”中继入站连接。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:548
-msgid "However, you will get more participating traffic and help the network more if you can open your firewall(s)."
-msgstr "然而,如果您能打开防火墙端口,您才能得到的共享流量,更好的帮助I2P网络。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:550
-msgid "If you think you have already done so, remember that you may have both a hardware and a software firewall, or be behind an additional, institutional firewall you cannot control."
-msgstr "如果您确信已经打开了防火墙,请想想是不是同时存在硬件和软件防火墙,或存在您无法控制的额外的机构性的防火墙。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:552
-msgid "Also, some routers cannot correctly forward both TCP and UDP on a single port, or may have other limitations or bugs that prevent them from passing traffic through to I2P."
-msgstr "当然,某些路由器可能无法正确映射同时使用TCP和UDP协议的端口,或存在其他限制或缺陷,障碍了数据进入I2P网络。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:554
-#: src/net/i2p/router/web/SummaryHelper.java:127
-msgid "Testing"
-msgstr "测试中"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:556
-msgid "The router is currently testing whether your UDP port is firewalled."
-msgstr "路由器正在测试您的UDP端口是否被防火墙阻挡。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:558
-#: src/net/i2p/router/web/NetDbRenderer.java:266
-#: src/net/i2p/router/web/SummaryHelper.java:96
-msgid "Hidden"
-msgstr "隐身"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:560
-msgid "The router is not configured to publish its address, therefore it does not expect incoming connections."
-msgstr "路由器被设置为禁止发布IP地址,因此并不需要入站连接。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:562
-msgid "WARN - Firewalled and Fast"
-msgstr "警告 - 快速节点,因防火墙受限"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:564
-msgid "You have configured I2P to share more than 128KBps of bandwidth, but you are firewalled."
-msgstr "您设置I2P共享超过128KBps的带宽,但您的连接因防火墙受阻。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:566
-msgid "While I2P will work fine in this configuration, if you really have over 128KBps of bandwidth to share, it will be much more helpful to the network if you open your firewall."
-msgstr "尽管在此种配置情况下I2P可以正常工作,但如果您的确能够分享超过128kps的带宽,打开防火墙端口它能工作的更好帮助网络中其他的人。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:568
-msgid "WARN - Firewalled and Floodfill"
-msgstr "警告 - 种子节点,因防火墙受限"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:570
-msgid "You have configured I2P to be a floodfill router, but you are firewalled."
-msgstr "您已将I2P设置为种子路由,但您的连接已因防火墙受阻。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:572
-msgid "For best participation as a floodfill router, you should open your firewall."
-msgstr "为了种子路由能够更好的参与到I2P网络中,请您的防火墙中打开端口。"
-
-# 暂不翻译方便反馈
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:574
-msgid "WARN - Firewalled with Inbound TCP Enabled"
-msgstr "警告 - 入站TCP开启,但因防火墙受限"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:576
-msgid "You have configured inbound TCP, however your UDP port is firewalled, and therefore it is likely that your TCP port is firewalled as well."
-msgstr "您设置了使用入站TCP连接,同时您的UDP端口因防火墙受阻,由此看来您的TCP端口也被防火墙阻挡。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:578
-msgid "If your TCP port is firewalled with inbound TCP enabled, routers will not be able to contact you via TCP, which will hurt the network."
-msgstr "如果您在TCP端口因防火墙受阻的情况下启用入站TCP连接,其他路由器节点将无法与您建立连接,造成网络受阻。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:580
-msgid "Please open your firewall or disable inbound TCP above."
-msgstr "请打开您的防火墙端口或禁用上面的入站TCP连接。"
-
-# 暂不翻译
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:582
-msgid "WARN - Firewalled with UDP Disabled"
-msgstr "警告 - 因防火墙受限,且UDP被禁用"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:584
-msgid "You have configured inbound TCP, however you have disabled UDP."
-msgstr "您设置了使用TCP连接,然而禁用了UDP连接。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:586
-msgid "You appear to be firewalled on TCP, therefore your router cannot accept inbound connections."
-msgstr "您的TCP连接似乎因防火墙受阻,导致您的路由器无法接收入站连接。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:588
-msgid "Please open your firewall or enable UDP."
-msgstr "请打开防火墙端口或启用UDP。"
-
-# 暂不翻译,方便错误反馈
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:590
-msgid "ERR - Clock Skew"
-msgstr "错误 - 系统时滞"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:592
-msgid "Your system's clock is skewed, which will make it difficult to participate in the network."
-msgstr "如果您的系统时钟太快或太慢,将影响计算机接入网络。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:594
-msgid "Correct your clock setting if this error persists."
-msgstr "如果错误持续,请校对您的系统时间。"
-
-# 暂不翻译,方便错误反馈
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:596
-msgid "ERR - Private TCP Address"
-msgstr "错误 - 私有TCP地址"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:598
-msgid "You must never advertise an unroutable IP address such as 127.0.0.1 or 192.168.1.1 as your external address."
-msgstr "您不能发布一个公网无法访问的 IP 地址,例如127.0.0.1或192.168.1.1一类的内网地址。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:600
-msgid "Correct the address or disable inbound TCP above."
-msgstr "正确设置IP地址或禁用上面的入站TCP连接。"
-
-# 暂不翻译,方便错误反馈
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:602
-msgid "ERR - SymmetricNAT"
-msgstr "错误 - SymmetricNAT"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:604
-msgid "I2P detected that you are firewalled by a Symmetric NAT."
-msgstr "I2P检测到您受到Symmetic NAT的阻挡。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:606
-msgid "I2P does not work well behind this type of firewall. You will probably not be able to accept inbound connections, which will limit your participation in the network."
-msgstr "I2P无法与此类防火墙很好的并存。您可能无法接收入站连接,这会障碍您连入I2P网络。"
-
-# 暂不翻译,方便问题反馈
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:608
-msgid "ERR - UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart"
-msgstr "错误 - UDP端口已占用 - 在高级设置中设置 i2np.udp.internalPort=新端口 并重启程序"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:610
-msgid "I2P was unable to bind to port 8887 or other configured port."
-msgstr "I2P无法绑定到端口8887或其他指定的端口上。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:612
-msgid "Check to see if another program is using the configured port. If so, stop that program or configure I2P to use a different port."
-msgstr "检查是否有其他程序正在使用了I2P的端口,如果是,关闭此程序或设置I2P使用不同的端口。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:614
-msgid "This may be a transient error, if the other program is no longer using the port."
-msgstr "如果其他程序不再使用此端口,这可能是临时性的错误。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:616
-msgid "However, a restart is always required after this error."
-msgstr "然而,发生此错误后一般需要重启程序才能解决。"
-
-# 暂不翻译,方便错误反馈
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:618
-msgid "ERR - UDP Disabled and Inbound TCP host/port not set"
-msgstr "错误 - UDP已禁用,且TCP入站主机与端口未设置"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:620
-msgid "You have not configured inbound TCP with a hostname and port above, however you have disabled UDP."
-msgstr "您没有设置入站TCP的主机名称和端口,同时又关闭了UDP。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:622
-msgid "Therefore your router cannot accept inbound connections."
-msgstr "因此您的路由器无法接收入站连接。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:624
-msgid "Please configure a TCP host and port above or enable UDP."
-msgstr "请在前面设置TCP主机和端口或启用UDP"
-
-# 错误提示暂不翻译,以便错误反馈。
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:626
-msgid "ERR - Client Manager I2CP Error - check logs"
-msgstr "错误 - 客户程序管理器 I2CP 错误 - 请看日志"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:628
-msgid "This is usually due to a port 7654 conflict. Check the logs to verify."
-msgstr "这通常为7654端口冲突所致,请查看日志确认原因。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:630
-msgid "Do you have another I2P instance running? Stop the conflicting program and restart I2P."
-msgstr "您是否已经运行了另一个I2P实例?请关掉冲突的程序并重启I2P。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:107
-msgid "config advanced"
-msgstr "高级设置"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:242
-msgid "I2P Advanced Configuration"
-msgstr "I2P 高级设置"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:299
-msgid "Advanced I2P Configuration"
-msgstr "I2P 高级设置"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:303
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:321
-msgid "Apply"
-msgstr "应用"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:309
-msgid "Some changes may require a restart to take effect."
-msgstr "某些设置需要程序重启后生效。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:106
-msgid "config clients"
-msgstr "升级设置"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:241
-msgid "I2P Client Configuration"
-msgstr "I2P 客户程序设置"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:306
-msgid "Client Configuration"
-msgstr "客户程序设置"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:308
-msgid "The Java clients listed below are started by the router and run in the same JVM."
-msgstr "下面列出的Java客户端随路由器启动并运行于同一JVM中。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:312
-msgid "To change other client options, edit the file"
-msgstr "修改其他客户端设置请编辑文件"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:319
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:331
-msgid "All changes require restart to take effect."
-msgstr "所有更改均需要程序重启才能生效。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:321
-#: src/net/i2p/router/web/ConfigClientsHandler.java:32
-msgid "Save Client Configuration"
-msgstr "保存客户程序设置"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:323
-msgid "WebApp Configuration"
-msgstr "WebApp 设置"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:325
-msgid "The Java web applications listed below are started by the webConsole client and run in the same JVM as the router. They are usually web applications accessible through the router console. They may be complete applications (e.g. i2psnark),front-ends to another client or application which must be separately enabled (e.g. susidns, i2ptunnel), or have no web interface at all (e.g. addressbook)."
-msgstr "下面列出的Java Web 程序随客户端“web控制台”一同启动,并与路由运行于同一JVM中。这些Web程序通常可以通过路由器界面直接访问。他们可能是完整的程序 (例如  i2psnark/BT客户端),其他客户端程序的前端或必须单独启动的程序(例如. susidns, i2ptunnel),甚至根本没有Web界面(例如 addressbook)。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:327
-msgid "A web app may also be disabled by removing the .war file from the webapps directory; however the .war file and web app will reappear when you update your router to a newer version, so disabling the web app here is the preferred method."
-msgstr "从webapps目录中删除相应的.war文件同样可以禁用Web程序;然而这些 .war 文件和Web程序在更新I2P后还会再次出现,所以推荐在这里通过设置的方法禁用不用的Web程序。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:333
-#: src/net/i2p/router/web/ConfigClientsHandler.java:36
-msgid "Save WebApp Configuration"
-msgstr "保存 WebApp 设置"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:106
-msgid "config keyring"
-msgstr "钥匙环设置"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:228
-msgid "I2P Keyring Configuration"
-msgstr "I2P 钥匙环设置"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:292
-#: src/net/i2p/router/web/ConfigNavHelper.java:19
-msgid "Keyring"
-msgstr "钥匙环"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:294
-msgid "The router keyring is used to decrypt encrypted leaseSets."
-msgstr "路由的钥匙环被用来解密和加密赁集."
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:297
-msgid "The keyring may contain keys for local or remote encrypted destinations."
-msgstr "钥匙环可以包含本地和远程的加密目标(Destination)."
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:307
-msgid "Manual Keyring Addition"
-msgstr "手动添加钥匙环"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:309
-msgid "Enter keys for encrypted remote destinations here."
-msgstr "在此处添加远程加密目标的密钥。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:312
-msgid "Keys for local destinations must be entered on the"
-msgstr "输入本地目标的密钥请到"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:314
-msgid "I2PTunnel page"
-msgstr "I2P 隧道页面"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:316
-msgid "Dest. name, hash, or full key"
-msgstr "目标(Dest.)名称, HASH, 或完整公钥"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:318
-msgid "Encryption Key"
-msgstr "加密密钥"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:320
-#: src/net/i2p/router/web/ConfigKeyringHandler.java:18
-msgid "Add key"
-msgstr "添加密钥"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:322
-#: src/net/i2p/router/web/ConfigKeyringHandler.java:19
-msgid "Delete key"
-msgstr "删除密钥"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:107
-msgid "config logging"
-msgstr "日志设置"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:242
-msgid "I2P Logging Configuration"
-msgstr "I2P 记录设置"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:299
-msgid "Configure I2P Logging Options"
-msgstr "设置 I2P 记录选项"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:301
-msgid "Logging filename"
-msgstr "日志文件名称"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:305
-msgid "(the symbol '@' will be replaced during log rotation)"
-msgstr "(日志轮转时符号'@'将被替换)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:307
-msgid "Log record format"
-msgstr "日志记录格式"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:311
-msgid "(use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, 'm' = message)"
-msgstr "( 'd' = 日期, 'c' = 类, 't' = 线程, 'p' = 优先级, 'm' = 消息)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:313
-msgid "Log date format"
-msgstr "日志日期格式"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:317
-msgid "('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' = millisecond)"
-msgstr "('MM' = 月, 'dd' = 天, 'HH' = 小时, 'mm' = 分钟, 'ss' = 秒, 'SSS' = 毫秒)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:319
-msgid "Max log file size"
-msgstr "日志最大体积"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:323
-msgid "Default log level"
-msgstr "默认日志等级"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:327
-msgid "(DEBUG and INFO are not recommended defaults, as they will drastically slow down your router)"
-msgstr "(建议不要使用 DEBUG 或 INFO 作为默认等级,他们会明显降低程序性能)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:329
-msgid "Log level overrides"
-msgstr "等级外<br>日志项目"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:106
-msgid "config peers"
-msgstr "节点设置"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:228
-msgid "I2P Peer Configuration"
-msgstr "I2P 节点设置"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:304
-msgid "Manual Peer Controls"
-msgstr "手动节点控制"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:306
-msgid "Router Hash"
-msgstr "路由器Key(见NetDB)"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:310
-msgid "Manually Ban / Unban a Peer"
-msgstr "手动封杀/解封某个节点"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:312
-msgid "Banning will prevent the participation of this peer in tunnels you create."
-msgstr "封锁将阻止节点参与您的隧道创建"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:314
-#: src/net/i2p/router/web/ConfigPeerHandler.java:20
-msgid "Ban peer until restart"
-msgstr "封杀节点直到重启"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:316
-#: src/net/i2p/router/web/ConfigPeerHandler.java:28
-msgid "Unban peer"
-msgstr "节点解封"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:322
-#: src/net/i2p/router/web/ConfigPeerHandler.java:39
-msgid "Adjust Profile Bonuses"
-msgstr "调整节点评分"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:324
-msgid "Bonuses may be positive or negative, and affect the peer's inclusion in Fast and High Capacity tiers. Fast peers are used for client tunnels, and High Capacity peers are used for some exploratory tunnels. Current bonuses are displayed on the"
-msgstr "评分(Bonuse)可能为正或为负并影响节点是否评为快速和高容量节点。快速节点用于客户程序通道,高容量节点用于探索隧道。当前评分显示于"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:326
-msgid "profiles page"
-msgstr "节点信息页面"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:334
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:71
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:238
-msgid "Speed"
-msgstr "速度"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:338
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:72
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:240
-msgid "Capacity"
-msgstr "容量"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:342
-msgid "Adjust peer bonuses"
-msgstr "调整节点评分"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:344
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:249
-msgid "Banned Peers"
-msgstr "已封锁节点"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:366
-msgid "Banned IPs"
-msgstr "已封锁IP"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:106
-msgid "config service"
-msgstr "服务设置"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:228
-msgid "I2P Service Configuration"
-msgstr "I2P 服务设置"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:284
-msgid "Shutdown the router"
-msgstr "关闭路由器"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:286
-msgid "Graceful shutdown lets the router satisfy the agreements it has already made before shutting down, but may take a few minutes."
-msgstr "平滑关闭让路由器在关闭前完成已达成的任务,但这可能需要花费几分钟的时间。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:288
-msgid "If you need to kill the router immediately, that option is available as well."
-msgstr "当然你也可以选择立即关闭路由。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:290
-#: src/net/i2p/router/web/ConfigServiceHandler.java:53
-msgid "Shutdown gracefully"
-msgstr "平滑关闭"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:292
-#: src/net/i2p/router/web/ConfigRestartBean.java:32
-#: src/net/i2p/router/web/ConfigServiceHandler.java:57
-msgid "Shutdown immediately"
-msgstr "立刻关闭"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:294
-#: src/net/i2p/router/web/ConfigServiceHandler.java:61
-msgid "Cancel graceful shutdown"
-msgstr "取消平滑关闭"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:298
-msgid "If you want the router to restart itself after shutting down, you can choose one of the following."
-msgstr "如果你想要路由器关闭后自动重新启动,可以选择下面的选项。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:300
-msgid "This is useful in some situations"
-msgstr "重启在某些情况下有用"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:302
-msgid "for example, if you changed some settings that client applications only read at startup, such as the routerconsole password or the interface it listens on."
-msgstr "例如当修改了客户程序仅在启动时读取的设置,比如路由器控制界面的密码,监听的接口。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:304
-msgid "A graceful restart will take a few minutes (but your peers will appreciate your patience), while a hard restart does so immediately."
-msgstr "平滑重启可能会等待几分钟的时间(但你的节点一定会感激你的耐心),硬重启可以立即完成。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:306
-msgid "After tearing down the router, it will wait 1 minute before starting back up again."
-msgstr "路由关闭后将等待1分钟再重新启动。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:308
-#: src/net/i2p/router/web/ConfigServiceHandler.java:64
-msgid "Graceful restart"
-msgstr "平滑重启"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:310
-#: src/net/i2p/router/web/ConfigServiceHandler.java:68
-msgid "Hard restart"
-msgstr "硬重启"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:316
-msgid "Systray integration"
-msgstr "使用系统托盘"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:318
-msgid "On the windows platform, there is a small application to sit in the system tray, allowing you to view the router's status"
-msgstr "Windows 平台允许小程序进驻系统托盘,让你可以查看路由状态"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:320
-msgid "(later on, I2P client applications will be able to integrate their own functionality into the system tray as well)."
-msgstr "(以后的 I2P 客户端程序也会将它们的功能集成到系统托盘里)。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:322
-msgid "If you are on windows, you can either enable or disable that icon here."
-msgstr "如果你使用Windows, 可以在这里开启或关闭这个托盘图标。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:324
-#: src/net/i2p/router/web/ConfigServiceHandler.java:91
-msgid "Show systray icon"
-msgstr "显示托盘图标"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:326
-#: src/net/i2p/router/web/ConfigServiceHandler.java:103
-msgid "Hide systray icon"
-msgstr "隐藏系统图标"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:328
-msgid "Run on startup"
-msgstr "启动时运行"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:330
-msgid "You can control whether I2P is run on startup or not by selecting one of the following options"
-msgstr "这里你可以通过下面的选项来设置开机后 I2P 是否启动"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:332
-msgid "I2P will install (or remove) a service accordingly."
-msgstr "I2P将相应的将自身安装为服务(或卸载服务)。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:334
-msgid "If you prefer the command line, you can also run the "
-msgstr "如果你偏好使用命令行,可以运行"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:338
-#: src/net/i2p/router/web/ConfigServiceHandler.java:80
-msgid "Run I2P on startup"
-msgstr "系统启动时运行I2P"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:340
-#: src/net/i2p/router/web/ConfigServiceHandler.java:82
-msgid "Don't run I2P on startup"
-msgstr "系统启动时不运行I2P"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:344
-msgid "If you are running I2P as service right now, removing it will shut down your router immediately."
-msgstr "如果您目前已经以服务形式运行 I2P ,删除 I2P 服务将立刻关闭路由器。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:346
-msgid "You may want to consider shutting down gracefully, as above, then running uninstall_i2p_service_winnt.bat."
-msgstr "您可以考虑先平滑关闭路由,待退出后运行 uninstall_i2p_service_winnt.bat。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:354
-msgid "Debugging"
-msgstr "调试"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:356
-#: src/net/i2p/router/web/ConfigServiceHandler.java:84
-msgid "Dump threads"
-msgstr ""
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:360
-msgid "Launch browser on router startup?"
-msgstr "路由器启动时运行浏览器?"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:362
-msgid "I2P's main configuration interface is this web console, so for your convenience I2P can launch a web browser on startup pointing at"
-msgstr "此Web控制台是I2P的主要设置界面,所以如果您您觉得有必要I2P可以在路由启动时调用浏览器打开"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:364
-#: src/net/i2p/router/web/ConfigServiceHandler.java:115
-msgid "View console on startup"
-msgstr "程序启动时显示控制台"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:366
-#: src/net/i2p/router/web/ConfigServiceHandler.java:118
-msgid "Do not view console on startup"
-msgstr "启动后不打开控制台"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:107
-msgid "config stats"
-msgstr "统计设置"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:229
-msgid "I2P Stats Configuration"
-msgstr "I2P 统计设置"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:300
-msgid "Configure I2P Stat Collection"
-msgstr "设置 I2P 统计项"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:302
-msgid "Enable full stats?"
-msgstr "启用完整统计?"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:309
-msgid "change requires restart to take effect"
-msgstr "设置需要程序重启后才能生效。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:311
-msgid "Stat file"
-msgstr "统计文件"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:315
-msgid "Filter"
-msgstr "过滤器"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:317
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:326
-msgid "toggle all"
-msgstr "全部切换"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:328
-msgid "Log"
-msgstr "日志"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:330
-msgid "Graph"
-msgstr "图表"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:369
-msgid "Advanced filter"
-msgstr "高级过滤器"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:106
-msgid "config tunnels"
-msgstr "隧道设置"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:241
-msgid "I2P Tunnel Configuration"
-msgstr "I2P 隧道设置"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:305
-msgid "The default settings work for most people."
-msgstr "默认设置适于大多数人。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:309
-msgid "There is a fundamental tradeoff between anonymity and performance."
-msgstr "匿名性需要以性能为代价。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:312
-msgid "Tunnels longer than 3 hops (for example 2 hops + 0-2 hops, 3 hops + 0-1 hops, 3 hops + 0-2 hops), or a high quantity + backup quantity, may severely reduce performance or reliability."
-msgstr "长于3个跳点的隧道(例如 2跳点 + 0-2跳点,3跳点 + 0-1跳点, 3跳点 + 0-2跳点),或大量常规+大量备用,可能降低性能和稳定性。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:315
-msgid "High CPU and/or high outbound bandwidth usage may result."
-msgstr "导致高CPU占用和/或高上行流量。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:318
-msgid "Change these settings with care, and adjust them if you have problems."
-msgstr "小心更改这些设置。如果遇到问题可以在这里调整。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:332
-msgid "Exploratory tunnel setting changes are stored in the router.config file."
-msgstr "对探测隧道设置的更改将保存入router.config文件中。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:335
-msgid "Client tunnel changes are temporary and are not saved."
-msgstr "对客户程序隧道的修改是临时的,将不予保存。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:337
-msgid "To make permanent client tunnel changes see the"
-msgstr "要永久性更改客户通道的设置参见"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:339
-msgid "i2ptunnel page"
-msgstr "I2P 隧道页面"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:106
-msgid "config UI"
-msgstr "界面设置"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:241
-msgid "I2P UI Configuration"
-msgstr "I2P 界面设置"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:291
-msgid "Router Console Theme"
-msgstr "路由控制台主题"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:309
-msgid "Theme selection disabled for Internet Explorer, sorry."
-msgstr "抱歉,主题功能在InternetExplorer中已禁用。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:311
-msgid "If you're not using IE, it's likely that your browser is pretending to be IE; please configure your browser (or proxy) to use a different User Agent string if you'd like to access the console themes."
-msgstr "如果您没使用IE,您的浏览器可能正在伪装IE的UserAgent;您需要设置浏览器(或过滤式代理)使用不同的UserAgent,才能访问路由控制台的主题功能。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:315
-msgid "Router Console Language"
-msgstr "路由控制台语言"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:319
-msgid "Please contribute to the router console translation project! Contact the developers on IRC #i2p to help."
-msgstr "欢迎加入路由控制台翻译项目!提供帮助请通过IRC到#i2p房间与开发人员联系。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:106
-msgid "config update"
-msgstr "升级设置"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:228
-msgid "I2P Update Configuration"
-msgstr "I2P 更新设置"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:300
-msgid "Check for I2P and news updates"
-msgstr "检查I2P软件及新闻更新"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:302
-msgid "News &amp; I2P Updates"
-msgstr "软件及新闻更新"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:306
-msgid "Update In Progress"
-msgstr "更新中"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:310
-#: src/net/i2p/router/web/ConfigUpdateHandler.java:56
-msgid "Check for updates"
-msgstr "检查更新"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:314
-msgid "News URL"
-msgstr "新闻链接"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:318
-msgid "Refresh frequency"
-msgstr "更新频率"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:322
-msgid "Update policy"
-msgstr "升级策略"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:326
-msgid "Update through the eepProxy?"
-msgstr "通过I2P代理更新?"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:330
-msgid "eepProxy host"
-msgstr "I2P代理主机"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:334
-msgid "eepProxy port"
-msgstr "I2P代理端口"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:338
-msgid "Update URLs"
-msgstr "更新链接"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:342
-msgid "Trusted keys"
-msgstr "可信公钥"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:346
-msgid "Update with unsigned development builds?"
-msgstr "更新包括未签名的开发版?"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:350
-msgid "Unsigned Build URL"
-msgstr "未签名软件链接"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:354
-msgid "Save"
-msgstr "保存"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:117
-msgid "Page Not Found"
-msgstr "页面未找到"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:243
-msgid "Sorry! You appear to be requesting a non-existent Router Console page or resource."
-msgstr "抱歉!您请求的页面或资源不存在。"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:245
-msgid "Error 404"
-msgstr "错误 404"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:250
-msgid "not found"
-msgstr "未找到"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:106
-msgid "graphs"
-msgstr "图表"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:228
-msgid "I2P Performance Graphs"
-msgstr "I2P 性能图表"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:105
-msgid "home"
-msgstr "主页"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:234
-#: src/net/i2p/router/web/CSSHelper.java:41
-#: src/net/i2p/router/web/SummaryBarRenderer.java:26
-#: src/net/i2p/router/web/SummaryBarRenderer.java:28
-#: strings/Strings.java:29
-msgid "I2P Router Console"
-msgstr "I2P 路由控制台"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:105
-msgid "job queue"
-msgstr "作业队列"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:227
-msgid "I2P Router Job Queue"
-msgstr "I2P 路由器作业队列"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:105
-msgid "logs"
-msgstr "日志"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:227
-msgid "I2P Router Logs"
-msgstr "I2P 路由器日志"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:229
-msgid "I2P Version & Running Environment"
-msgstr "I2P 版本及运行环境"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:231
-msgid "Please include this information in bug reports"
-msgstr "报告问题时请包括以下信息"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:105
-msgid "network database summary"
-msgstr "I2P 网络数据库概况"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:227
-msgid "I2P Network Database Summary"
-msgstr "I2P 网络数据库概况"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:105
-msgid "peer connections"
-msgstr "节点连接"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:227
-msgid "I2P Network Peers"
-msgstr "I2P 网络节点"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:105
-msgid "peer profiles"
-msgstr "节点信息"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:227
-msgid "I2P Network Peer Profiles"
-msgstr "I2P 网络节点信息"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:105
-msgid "statistics"
-msgstr "统计"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:242
-msgid "I2P Router Statistics"
-msgstr "I2P 路由器统计数据"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:245
-#, java-format
-msgid "Disable {0}s Refresh"
-msgstr "停止 {0}秒 刷新"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:105
-msgid "tunnel summary"
-msgstr "隧道概况"
-
-#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:227
-msgid "I2P Tunnel Summary"
-msgstr "I2P 隧道概况"
-
-#: build/Countries.java:3
-msgid "Andorra"
-msgstr "安道尔"
-
-#: build/Countries.java:4
-msgid "United Arab Emirates"
-msgstr "阿联酋"
-
-#: build/Countries.java:5
-msgid "Afghanistan"
-msgstr "阿富汗"
-
-#: build/Countries.java:6
-msgid "Antigua and Barbuda"
-msgstr "安提瓜与巴布达"
-
-#: build/Countries.java:7
-msgid "Anguilla"
-msgstr "安格拉"
-
-#: build/Countries.java:8
-msgid "Albania"
-msgstr "阿尔巴尼亚"
-
-#: build/Countries.java:9
-msgid "Armenia"
-msgstr "亚美尼亚"
-
-#: build/Countries.java:10
-msgid "Netherlands Antilles"
-msgstr "荷兰属地"
-
-#: build/Countries.java:11
-msgid "Angola"
-msgstr "安哥拉"
-
-#: build/Countries.java:12
-msgid "Antarctica"
-msgstr "南极洲"
-
-#: build/Countries.java:13
-msgid "Argentina"
-msgstr "阿根廷"
-
-#: build/Countries.java:14
-msgid "American Samoa"
-msgstr "东萨摩亚"
-
-#: build/Countries.java:15
-msgid "Austria"
-msgstr "奥地利"
-
-#: build/Countries.java:16
-msgid "Australia"
-msgstr "澳大利亚"
-
-#: build/Countries.java:17
-msgid "Aruba"
-msgstr "阿鲁巴"
-
-#: build/Countries.java:19
-msgid "Azerbaijan"
-msgstr "阿塞拜疆"
-
-#: build/Countries.java:20
-msgid "Bosnia and Herzegovina"
-msgstr "波黑"
-
-#: build/Countries.java:21
-msgid "Barbados"
-msgstr "巴巴多斯"
-
-#: build/Countries.java:22
-msgid "Bangladesh"
-msgstr "孟加拉"
-
-#: build/Countries.java:23
-msgid "Belgium"
-msgstr "比利时"
-
-#: build/Countries.java:24
-msgid "Burkina Faso"
-msgstr "布基纳法索"
-
-#: build/Countries.java:25
-msgid "Bulgaria"
-msgstr "保加利亚"
-
-#: build/Countries.java:26
-msgid "Bahrain"
-msgstr "å·´æž—"
-
-#: build/Countries.java:27
-msgid "Burundi"
-msgstr "不丹"
-
-#: build/Countries.java:28
-msgid "Benin"
-msgstr "贝宁"
-
-#: build/Countries.java:29
-msgid "Bermuda"
-msgstr "百慕大"
-
-#: build/Countries.java:30
-msgid "Brunei Darussalam"
-msgstr "文莱达鲁萨兰"
-
-#: build/Countries.java:31
-msgid "Bolivia"
-msgstr "玻利维亚"
-
-#: build/Countries.java:32
-msgid "Brazil"
-msgstr "巴西"
-
-#: build/Countries.java:33
-msgid "Bahamas"
-msgstr "巴哈马"
-
-#: build/Countries.java:34
-msgid "Bhutan"
-msgstr "不丹"
-
-#: build/Countries.java:35
-msgid "Bouvet Island"
-msgstr "布韦群岛"
-
-#: build/Countries.java:36
-msgid "Botswana"
-msgstr "伯兹瓦纳"
-
-#: build/Countries.java:37
-msgid "Belarus"
-msgstr "白俄罗斯"
-
-#: build/Countries.java:38
-msgid "Belize"
-msgstr "伯利兹"
-
-#: build/Countries.java:39
-msgid "Canada"
-msgstr "加拿大"
-
-#: build/Countries.java:40
-msgid "The Democratic Republic of the Congo"
-msgstr "刚果"
-
-#: build/Countries.java:41
-msgid "Central African Republic"
-msgstr "中非"
-
-#: build/Countries.java:42
-msgid "Congo"
-msgstr "Congo"
-
-#: build/Countries.java:43
-msgid "Switzerland"
-msgstr "瑞士"
-
-#: build/Countries.java:44
-msgid "Cote D'Ivoire"
-msgstr "象牙海岸"
-
-#: build/Countries.java:45
-msgid "Cook Islands"
-msgstr "库克群岛"
-
-#: build/Countries.java:46
-msgid "Chile"
-msgstr "智利"
-
-#: build/Countries.java:47
-msgid "Cameroon"
-msgstr "喀麦隆"
-
-#: build/Countries.java:48
-msgid "China"
-msgstr "中国"
-
-#: build/Countries.java:49
-msgid "Colombia"
-msgstr "哥伦比亚"
-
-#: build/Countries.java:50
-msgid "Costa Rica"
-msgstr "哥斯达黎加"
-
-#: build/Countries.java:51
-msgid "Serbia and Montenegro"
-msgstr "塞尔维亚与黑山"
-
-#: build/Countries.java:52
-msgid "Cuba"
-msgstr "古巴"
-
-#: build/Countries.java:53
-msgid "Cape Verde"
-msgstr "佛得角"
-
-#: build/Countries.java:54
-msgid "Cyprus"
-msgstr "塞浦路斯"
-
-#: build/Countries.java:55
-msgid "Czech Republic"
-msgstr "捷克"
-
-#: build/Countries.java:56
-msgid "Germany"
-msgstr "德国"
-
-#: build/Countries.java:57
-msgid "Djibouti"
-msgstr "吉布提"
-
-#: build/Countries.java:58
-msgid "Denmark"
-msgstr "丹麦"
-
-#: build/Countries.java:59
-msgid "Dominica"
-msgstr "多米尼"
-
-#: build/Countries.java:60
-msgid "Dominican Republic"
-msgstr "多米尼加联邦"
-
-#: build/Countries.java:61
-msgid "Algeria"
-msgstr "阿尔及利亚"
-
-#: build/Countries.java:62
-msgid "Ecuador"
-msgstr "厄瓜多尔"
-
-#: build/Countries.java:63
-msgid "Estonia"
-msgstr "爱沙尼亚"
-
-#: build/Countries.java:64
-msgid "Egypt"
-msgstr "埃及"
-
-#: build/Countries.java:65
-msgid "Eritrea"
-msgstr "厄立特里亚"
-
-#: build/Countries.java:66
-msgid "Spain"
-msgstr "西班牙"
-
-#: build/Countries.java:67
-msgid "Ethiopia"
-msgstr "埃塞俄比亚"
-
-#: build/Countries.java:68
-msgid "Finland"
-msgstr "芬兰"
-
-#: build/Countries.java:69
-msgid "Fiji"
-msgstr "斐济"
-
-#: build/Countries.java:70
-msgid "Falkland Islands (Malvinas)"
-msgstr "福克兰群岛"
-
-#: build/Countries.java:71
-msgid "Federated States of Micronesia"
-msgstr "密克罗尼西亚"
-
-#: build/Countries.java:72
-msgid "Faroe Islands"
-msgstr "法罗群岛"
-
-#: build/Countries.java:73
-msgid "France"
-msgstr "法国"
-
-#: build/Countries.java:74
-msgid "Gabon"
-msgstr "加蓬"
-
-#: build/Countries.java:75
-msgid "United Kingdom"
-msgstr "英国"
-
-#: build/Countries.java:76
-msgid "Grenada"
-msgstr "格林纳达"
-
-#: build/Countries.java:77
-msgid "Georgia"
-msgstr "格鲁吉亚"
-
-#: build/Countries.java:78
-msgid "French Guiana"
-msgstr "圭亚那"
-
-#: build/Countries.java:79
-msgid "Ghana"
-msgstr "加纳"
-
-#: build/Countries.java:80
-msgid "Gibraltar"
-msgstr "直布罗陀"
-
-#: build/Countries.java:81
-msgid "Greenland"
-msgstr "格陵兰群岛"
-
-#: build/Countries.java:82
-msgid "Gambia"
-msgstr "冈比亚"
-
-#: build/Countries.java:83
-msgid "Guinea"
-msgstr "几内亚"
-
-#: build/Countries.java:84
-msgid "Guadeloupe"
-msgstr "瓜德罗普岛"
-
-#: build/Countries.java:85
-msgid "Equatorial Guinea"
-msgstr "赤道几内亚"
-
-#: build/Countries.java:86
-msgid "Greece"
-msgstr "希腊"
-
-#: build/Countries.java:87
-msgid "South Georgia and the South Sandwich Islands"
-msgstr "南乔治亚岛和南桑德韦奇岛"
-
-#: build/Countries.java:88
-msgid "Guatemala"
-msgstr "危地马拉"
-
-#: build/Countries.java:89
-msgid "Guam"
-msgstr "关岛"
-
-#: build/Countries.java:90
-msgid "Guinea-Bissau"
-msgstr "几内亚比绍"
-
-#: build/Countries.java:91
-msgid "Guyana"
-msgstr "圭亚那"
-
-#: build/Countries.java:92
-msgid "Hong Kong"
-msgstr "香港"
-
-#: build/Countries.java:93
-msgid "Honduras"
-msgstr "洪都拉斯"
-
-#: build/Countries.java:94
-msgid "Croatia"
-msgstr "克罗蒂亚"
-
-#: build/Countries.java:95
-msgid "Haiti"
-msgstr "海地"
-
-#: build/Countries.java:96
-msgid "Hungary"
-msgstr "匈牙利"
-
-#: build/Countries.java:97
-msgid "Indonesia"
-msgstr "印尼"
-
-#: build/Countries.java:98
-msgid "Ireland"
-msgstr "爱尔兰"
-
-#: build/Countries.java:99
-msgid "Israel"
-msgstr "以色列"
-
-#: build/Countries.java:101
-msgid "India"
-msgstr "印度"
-
-#: build/Countries.java:102
-msgid "British Indian Ocean Territory"
-msgstr "英属印度洋地区"
-
-#: build/Countries.java:103
-msgid "Iraq"
-msgstr "伊拉克"
-
-#: build/Countries.java:104
-msgid "Islamic Republic of Iran"
-msgstr "伊朗"
-
-#: build/Countries.java:105
-msgid "Iceland"
-msgstr "冰岛"
-
-#: build/Countries.java:106
-msgid "Italy"
-msgstr "意大利"
-
-#: build/Countries.java:108
-msgid "Jamaica"
-msgstr "牙买加"
-
-#: build/Countries.java:109
-msgid "Jordan"
-msgstr "约旦"
-
-#: build/Countries.java:110
-msgid "Japan"
-msgstr "日本"
-
-#: build/Countries.java:111
-msgid "Kenya"
-msgstr "肯尼亚"
-
-#: build/Countries.java:112
-msgid "Kyrgyzstan"
-msgstr "吉尔吉斯斯坦"
-
-#: build/Countries.java:113
-msgid "Cambodia"
-msgstr "柬埔塞"
-
-#: build/Countries.java:114
-msgid "Kiribati"
-msgstr "基里巴斯"
-
-#: build/Countries.java:115
-msgid "Comoros"
-msgstr "科摩罗"
-
-#: build/Countries.java:116
-msgid "Saint Kitts and Nevis"
-msgstr "圣克里斯多福与尼维斯"
-
-#: build/Countries.java:117
-msgid "Republic of Korea"
-msgstr "韩国"
-
-#: build/Countries.java:118
-msgid "Kuwait"
-msgstr "科威特"
-
-#: build/Countries.java:119
-msgid "Cayman Islands"
-msgstr "开曼群岛"
-
-#: build/Countries.java:120
-msgid "Kazakhstan"
-msgstr "哈萨克斯坦"
-
-#: build/Countries.java:121
-msgid "Lao People's Democratic Republic"
-msgstr "老挝"
-
-#: build/Countries.java:122
-msgid "Lebanon"
-msgstr "黎巴嫩"
-
-#: build/Countries.java:123
-msgid "Saint Lucia"
-msgstr "圣露西亚岛"
-
-#: build/Countries.java:124
-msgid "Liechtenstein"
-msgstr "列支敦士登"
-
-#: build/Countries.java:125
-msgid "Sri Lanka"
-msgstr "斯里兰卡"
-
-#: build/Countries.java:126
-msgid "Liberia"
-msgstr "利比里亚"
-
-#: build/Countries.java:127
-msgid "Lesotho"
-msgstr "莱索托"
-
-#: build/Countries.java:128
-msgid "Lithuania"
-msgstr "立陶宛"
-
-#: build/Countries.java:129
-msgid "Luxembourg"
-msgstr "卢森堡"
-
-#: build/Countries.java:130
-msgid "Latvia"
-msgstr "拉脱维亚"
-
-#: build/Countries.java:131
-msgid "Libyan Arab Jamahiriya"
-msgstr "利比亚"
-
-#: build/Countries.java:132
-msgid "Morocco"
-msgstr "摩洛哥"
-
-#: build/Countries.java:133
-msgid "Monaco"
-msgstr "摩纳哥"
-
-#: build/Countries.java:134
-msgid "Republic of Moldova"
-msgstr "摩尔多瓦"
-
-#: build/Countries.java:137
-msgid "Madagascar"
-msgstr "马达加斯加"
-
-#: build/Countries.java:138
-msgid "Marshall Islands"
-msgstr "马绍尔群岛"
-
-#: build/Countries.java:139
-msgid "The Former Yugoslav Republic of Macedonia"
-msgstr "前南斯拉夫之马其顿共和国"
-
-#: build/Countries.java:140
-msgid "Mali"
-msgstr "马里"
-
-#: build/Countries.java:141
-msgid "Myanmar"
-msgstr "缅甸"
-
-#: build/Countries.java:142
-msgid "Mongolia"
-msgstr "蒙古"
-
-#: build/Countries.java:143
-msgid "Macao"
-msgstr "澳门"
-
-#: build/Countries.java:144
-msgid "Northern Mariana Islands"
-msgstr "北马里亚纳群岛"
-
-#: build/Countries.java:145
-msgid "Martinique"
-msgstr "马提尼克岛"
-
-#: build/Countries.java:146
-msgid "Mauritania"
-msgstr "毛里塔尼亚"
-
-#: build/Countries.java:147
-msgid "Montserrat"
-msgstr "蒙特塞拉特"
-
-#: build/Countries.java:148
-msgid "Malta"
-msgstr "马尔他"
-
-#: build/Countries.java:149
-msgid "Mauritius"
-msgstr "毛里求斯"
-
-#: build/Countries.java:150
-msgid "Maldives"
-msgstr "马尔代夫"
-
-#: build/Countries.java:151
-msgid "Malawi"
-msgstr "马拉维"
-
-#: build/Countries.java:152
-msgid "Mexico"
-msgstr "墨西哥"
-
-#: build/Countries.java:153
-msgid "Malaysia"
-msgstr "马来西亚"
-
-#: build/Countries.java:154
-msgid "Mozambique"
-msgstr "莫桑比克"
-
-#: build/Countries.java:155
-msgid "Namibia"
-msgstr "纳米比亚"
-
-#: build/Countries.java:156
-msgid "New Caledonia"
-msgstr "新喀里多尼亚"
-
-#: build/Countries.java:157
-msgid "Niger"
-msgstr "尼日尔"
-
-#: build/Countries.java:158
-msgid "Norfolk Island"
-msgstr "尼加拉瓜"
-
-#: build/Countries.java:159
-msgid "Nigeria"
-msgstr "尼日利亚"
-
-#: build/Countries.java:160
-msgid "Nicaragua"
-msgstr "尼加拉瓜"
-
-#: build/Countries.java:161
-msgid "Netherlands"
-msgstr "荷兰"
-
-#: build/Countries.java:162
-msgid "Norway"
-msgstr "挪威"
-
-#: build/Countries.java:163
-msgid "Nepal"
-msgstr "尼泊尔"
-
-#: build/Countries.java:164
-msgid "Nauru"
-msgstr "瑙鲁"
-
-#: build/Countries.java:165
-msgid "Niue"
-msgstr "纽埃岛"
-
-#: build/Countries.java:166
-msgid "New Zealand"
-msgstr "新西兰"
-
-#: build/Countries.java:167
-msgid "Oman"
-msgstr "阿曼"
-
-#: build/Countries.java:168
-msgid "Panama"
-msgstr "巴拿马"
-
-#: build/Countries.java:169
-msgid "Peru"
-msgstr "秘鲁"
-
-#: build/Countries.java:170
-msgid "French Polynesia"
-msgstr "玻利尼西亚"
-
-#: build/Countries.java:171
-msgid "Papua New Guinea"
-msgstr "巴布亚新几内亚"
-
-#: build/Countries.java:172
-msgid "Philippines"
-msgstr "菲律宾"
-
-#: build/Countries.java:173
-msgid "Pakistan"
-msgstr "巴基斯坦"
-
-#: build/Countries.java:174
-msgid "Poland"
-msgstr "波兰"
-
-#: build/Countries.java:175
-msgid "Saint Pierre and Miquelon"
-msgstr "圣皮埃尔岛和密克隆"
-
-#: build/Countries.java:176
-msgid "Puerto Rico"
-msgstr "波多黎各"
-
-#: build/Countries.java:177
-msgid "Palestinian Territory"
-msgstr "巴勒斯坦地区"
-
-#: build/Countries.java:178
-msgid "Portugal"
-msgstr "葡萄牙"
-
-#: build/Countries.java:179
-msgid "Palau"
-msgstr "帕劳"
-
-#: build/Countries.java:180
-msgid "Paraguay"
-msgstr "巴拉圭"
-
-#: build/Countries.java:181
-msgid "Qatar"
-msgstr "卡塔尔"
-
-#: build/Countries.java:182
-msgid "Reunion"
-msgstr "留尼汪岛"
-
-#: build/Countries.java:183
-msgid "Romania"
-msgstr "罗马尼亚"
-
-#: build/Countries.java:184
-msgid "Serbia"
-msgstr "塞尔维亚"
-
-#: build/Countries.java:185
-msgid "Russian Federation"
-msgstr "俄联邦"
-
-#: build/Countries.java:186
-msgid "Rwanda"
-msgstr "卢旺达"
-
-#: build/Countries.java:187
-msgid "Saudi Arabia"
-msgstr "沙特阿拉伯"
-
-#: build/Countries.java:188
-msgid "Solomon Islands"
-msgstr "所罗门群岛"
-
-#: build/Countries.java:189
-msgid "Seychelles"
-msgstr "塞舌尔"
-
-#: build/Countries.java:190
-msgid "Sudan"
-msgstr "苏丹"
-
-#: build/Countries.java:191
-msgid "Sweden"
-msgstr "ç‘žå…¸"
-
-#: build/Countries.java:192
-msgid "Singapore"
-msgstr "新加坡"
-
-#: build/Countries.java:193
-msgid "Slovenia"
-msgstr "斯洛文尼亚"
-
-#: build/Countries.java:194
-msgid "Slovakia"
-msgstr "斯洛伐克"
-
-#: build/Countries.java:195
-msgid "Sierra Leone"
-msgstr "塞拉利昂"
-
-#: build/Countries.java:196
-msgid "San Marino"
-msgstr "圣马力诺"
-
-#: build/Countries.java:197
-msgid "Senegal"
-msgstr "塞内加尔"
-
-#: build/Countries.java:198
-msgid "Somalia"
-msgstr "索马里"
-
-#: build/Countries.java:199
-msgid "Suriname"
-msgstr "苏里南"
-
-#: build/Countries.java:200
-msgid "Sao Tome and Principe"
-msgstr "圣多美与普林西比共和国"
-
-#: build/Countries.java:201
-msgid "El Salvador"
-msgstr "萨尔瓦多"
-
-#: build/Countries.java:202
-msgid "Syrian Arab Republic"
-msgstr "叙利亚"
-
-#: build/Countries.java:203
-msgid "Swaziland"
-msgstr "斯威士兰"
-
-#: build/Countries.java:204
-msgid "Turks and Caicos Islands"
-msgstr "特克斯和凯科斯群岛"
-
-#: build/Countries.java:205
-msgid "Chad"
-msgstr "乍得"
-
-#: build/Countries.java:206
-msgid "French Southern Territories"
-msgstr "法属南半球领地"
-
-#: build/Countries.java:207
-msgid "Togo"
-msgstr "多哥"
-
-#: build/Countries.java:208
-msgid "Thailand"
-msgstr "泰国"
-
-#: build/Countries.java:209
-msgid "Tajikistan"
-msgstr "塔吉克斯坦"
-
-#: build/Countries.java:210
-msgid "Tokelau"
-msgstr "托克劳群岛"
-
-#: build/Countries.java:211
-msgid "Timor-Leste"
-msgstr "东帝汶"
-
-#: build/Countries.java:212
-msgid "Turkmenistan"
-msgstr "土库曼斯坦"
-
-#: build/Countries.java:213
-msgid "Tunisia"
-msgstr "突尼斯"
-
-#: build/Countries.java:214
-msgid "Tonga"
-msgstr "汤加"
-
-#: build/Countries.java:215
-msgid "Turkey"
-msgstr "土耳其"
-
-#: build/Countries.java:216
-msgid "Trinidad and Tobago"
-msgstr "特立尼达和多巴哥"
-
-#: build/Countries.java:217
-msgid "Tuvalu"
-msgstr "图瓦鲁"
-
-#: build/Countries.java:218
-msgid "Taiwan"
-msgstr "台湾"
-
-#: build/Countries.java:219
-msgid "United Republic of Tanzania"
-msgstr "坦桑尼亚"
-
-#: build/Countries.java:220
-msgid "Ukraine"
-msgstr "乌克兰"
-
-#: build/Countries.java:221
-msgid "Uganda"
-msgstr "乌干达"
-
-#: build/Countries.java:222
-msgid "United States Minor Outlying Islands"
-msgstr "美国本土外小岛屿"
-
-#: build/Countries.java:223
-msgid "United States"
-msgstr "美国"
-
-#: build/Countries.java:224
-msgid "Uruguay"
-msgstr "乌拉圭"
-
-#: build/Countries.java:225
-msgid "Uzbekistan"
-msgstr "乌兹别克斯坦"
-
-#: build/Countries.java:226
-msgid "Holy See (Vatican City State)"
-msgstr "梵地冈"
-
-#: build/Countries.java:227
-msgid "Saint Vincent and the Grenadines"
-msgstr "圣文森特和格林纳丁斯"
-
-#: build/Countries.java:228
-msgid "Venezuela"
-msgstr "委内瑞拉"
-
-#: build/Countries.java:229
-#: build/Countries.java:230
-msgid "Virgin Islands"
-msgstr "维京群岛"
-
-#: build/Countries.java:231
-msgid "Viet Nam"
-msgstr "越南"
-
-#: build/Countries.java:232
-msgid "Vanuatu"
-msgstr "瓦努阿图"
-
-#: build/Countries.java:233
-msgid "Wallis and Futuna"
-msgstr "瓦利斯群岛和富图纳群岛"
-
-#: build/Countries.java:234
-msgid "Samoa"
-msgstr "东萨摩亚"
-
-#: build/Countries.java:235
-msgid "Yemen"
-msgstr "也门"
-
-#: build/Countries.java:236
-msgid "Mayotte"
-msgstr "马约特"
-
-#: build/Countries.java:237
-msgid "South Africa"
-msgstr "南非"
-
-#: build/Countries.java:238
-msgid "Zambia"
-msgstr "赞比亚"
-
-#: build/Countries.java:239
-msgid "Zimbabwe"
-msgstr "津巴布韦"
-
-#: src/net/i2p/router/web/ConfigAdvancedHandler.java:57
-msgid "Error updating the configuration - please see the error logs"
-msgstr "配置更新出错 - 请查看错误日志"
-
-#: src/net/i2p/router/web/ConfigAdvancedHandler.java:69
-#: src/net/i2p/router/web/ConfigNetHandler.java:251
-msgid "Configuration saved successfully"
-msgstr "设置保存成功"
-
-#: src/net/i2p/router/web/ConfigAdvancedHandler.java:71
-#: src/net/i2p/router/web/ConfigNetHandler.java:253
-msgid "Error saving the configuration (applied but not saved) - please see the error logs"
-msgstr "配置保存出错(已应用但未保存) - 参见错误日志"
-
-#: src/net/i2p/router/web/ConfigClientsHandler.java:54
-#: src/net/i2p/router/web/ConfigClientsHelper.java:67
-msgid "Start"
-msgstr "启动"
-
-#: src/net/i2p/router/web/ConfigClientsHandler.java:68
-#: src/net/i2p/router/web/ConfigKeyringHandler.java:49
-msgid "Unsupported"
-msgstr "未支持的"
-
-#: src/net/i2p/router/web/ConfigClientsHandler.java:83
-msgid "Client configuration saved successfully - restart required to take effect."
-msgstr "客户程序设置保存成功 - 程序重启后生效"
-
-#: src/net/i2p/router/web/ConfigClientsHandler.java:89
-msgid "Bad client index."
-msgstr "客户程序索引无效"
-
-#: src/net/i2p/router/web/ConfigClientsHandler.java:94
-#: src/net/i2p/router/web/ConfigClientsHelper.java:17
-#: src/net/i2p/router/web/SummaryBarRenderer.java:359
-#: src/net/i2p/router/web/SummaryHelper.java:371
-msgid "Client"
-msgstr "客户"
-
-#: src/net/i2p/router/web/ConfigClientsHandler.java:94
-#: src/net/i2p/router/web/ConfigClientsHandler.java:129
-msgid "started"
-msgstr "已启动"
-
-#: src/net/i2p/router/web/ConfigClientsHandler.java:111
-msgid "WebApp configuration saved successfully - restart required to take effect."
-msgstr "WebApp设置保存成功 - 程序重启后生效"
-
-#: src/net/i2p/router/web/ConfigClientsHandler.java:129
-#: src/net/i2p/router/web/ConfigClientsHelper.java:34
-msgid "WebApp"
-msgstr "Web程序"
-
-#: src/net/i2p/router/web/ConfigClientsHandler.java:131
-msgid "Failed to start"
-msgstr "启动失败"
-
-#: src/net/i2p/router/web/ConfigClientsHandler.java:137
-msgid "Failed to find server."
-msgstr "服务器或服务程序查找失败。"
-
-#: src/net/i2p/router/web/ConfigClientsHelper.java:17
-msgid "Class and arguments"
-msgstr "类与参数"
-
-#: src/net/i2p/router/web/ConfigClientsHelper.java:17
-#: src/net/i2p/router/web/ConfigClientsHelper.java:34
-msgid "Run at Startup?"
-msgstr "启动时运行?"
-
-#: src/net/i2p/router/web/ConfigClientsHelper.java:17
-#: src/net/i2p/router/web/ConfigClientsHelper.java:34
-msgid "Start Now"
-msgstr "立即启动"
-
-#: src/net/i2p/router/web/ConfigClientsHelper.java:34
-msgid "Description"
-msgstr "描述"
-
-#: src/net/i2p/router/web/ConfigKeyringHandler.java:21
-msgid "You must enter a destination"
-msgstr "您必须输入一个目标"
-
-#: src/net/i2p/router/web/ConfigKeyringHandler.java:23
-msgid "You must enter a key"
-msgstr "您必须输入一个密钥"
-
-#: src/net/i2p/router/web/ConfigKeyringHandler.java:34
-#: src/net/i2p/router/web/ConfigKeyringHandler.java:41
-#: src/net/i2p/router/web/ConfigKeyringHandler.java:43
-msgid "Key for"
-msgstr "密钥"
-
-#: src/net/i2p/router/web/ConfigKeyringHandler.java:34
-msgid "added to keyring"
-msgstr "已加入钥匙环"
-
-#: src/net/i2p/router/web/ConfigKeyringHandler.java:36
-msgid "Invalid destination or key"
-msgstr "目标或密钥无效"
-
-#: src/net/i2p/router/web/ConfigKeyringHandler.java:41
-msgid "removed from keyring"
-msgstr "已从钥匙环中删除"
-
-#: src/net/i2p/router/web/ConfigKeyringHandler.java:43
-msgid "not found in keyring"
-msgstr "在钥匙环未找到"
-
-#: src/net/i2p/router/web/ConfigKeyringHandler.java:45
-msgid "Invalid destination"
-msgstr "目标无效"
-
-#: src/net/i2p/router/web/ConfigLoggingHelper.java:52
-msgid "CRIT"
-msgstr ""
-
-#: src/net/i2p/router/web/ConfigLoggingHelper.java:52
-msgid "DEBUG"
-msgstr ""
-
-#: src/net/i2p/router/web/ConfigLoggingHelper.java:52
-msgid "ERROR"
-msgstr ""
-
-#: src/net/i2p/router/web/ConfigLoggingHelper.java:52
-msgid "INFO"
-msgstr ""
-
-#: src/net/i2p/router/web/ConfigLoggingHelper.java:52
-msgid "WARN"
-msgstr ""
-
-#: src/net/i2p/router/web/ConfigNavHelper.java:18
-msgid "Network"
-msgstr "网络"
-
-#: src/net/i2p/router/web/ConfigNavHelper.java:18
-msgid "Service"
-msgstr "服务"
-
-#: src/net/i2p/router/web/ConfigNavHelper.java:18
-#: src/net/i2p/router/web/SummaryBarRenderer.java:82
-#: src/net/i2p/router/web/TunnelRenderer.java:253
-msgid "Tunnels"
-msgstr "隧道"
-
-#: src/net/i2p/router/web/ConfigNavHelper.java:18
-msgid "UI"
-msgstr "界面"
-
-#: src/net/i2p/router/web/ConfigNavHelper.java:18
-#: src/net/i2p/router/web/SummaryBarRenderer.java:198
-#: src/net/i2p/router/web/SummaryBarRenderer.java:205
-msgid "Update"
-msgstr "æ›´æ–°"
-
-#: src/net/i2p/router/web/ConfigNavHelper.java:19
-msgid "Clients"
-msgstr "客户端"
-
-#: src/net/i2p/router/web/ConfigNavHelper.java:19
-msgid "Logging"
-msgstr "日志"
-
-#: src/net/i2p/router/web/ConfigNavHelper.java:19
-#: src/net/i2p/router/web/SummaryBarRenderer.java:88
-#: src/net/i2p/router/web/SummaryBarRenderer.java:223
-msgid "Peers"
-msgstr "节点"
-
-#: src/net/i2p/router/web/ConfigNavHelper.java:19
-#: src/net/i2p/router/web/NetDbRenderer.java:288
-#: src/net/i2p/router/web/SummaryBarRenderer.java:124
-msgid "Stats"
-msgstr "统计"
-
-#: src/net/i2p/router/web/ConfigNavHelper.java:20
-msgid "Advanced"
-msgstr "高级"
-
-#: src/net/i2p/router/web/ConfigNetHandler.java:119
-msgid "Rechecking router reachability..."
-msgstr "正在重检查路由连通性..."
-
-#: src/net/i2p/router/web/ConfigNetHandler.java:148
-msgid "Updating IP address"
-msgstr "正在更新IP地址"
-
-#: src/net/i2p/router/web/ConfigNetHandler.java:166
-msgid "Disabling TCP completely"
-msgstr "正在彻底禁用TCP"
-
-#: src/net/i2p/router/web/ConfigNetHandler.java:170
-msgid "Updating inbound TCP address to"
-msgstr "正在更新进站TCP地址至"
-
-#: src/net/i2p/router/web/ConfigNetHandler.java:174
-msgid "Disabling inbound TCP"
-msgstr "正在禁用入站TCP"
-
-#: src/net/i2p/router/web/ConfigNetHandler.java:176
-msgid "Updating inbound TCP address to auto"
-msgstr "正在更新入站TCP地址至"
-
-#: src/net/i2p/router/web/ConfigNetHandler.java:185
-msgid "Updating inbound TCP port to"
-msgstr "正在更新入站TCP端口至"
-
-#: src/net/i2p/router/web/ConfigNetHandler.java:188
-msgid "Updating inbound TCP port to auto"
-msgstr "正在更新入站TCP端口至"
-
-#: src/net/i2p/router/web/ConfigNetHandler.java:200
-msgid "Updating UDP port from"
-msgstr "正在更新UDP端口由"
-
-#: src/net/i2p/router/web/ConfigNetHandler.java:200
-msgid "to"
-msgstr "至"
-
-#: src/net/i2p/router/web/ConfigNetHandler.java:216
-msgid "Gracefully restarting into Hidden Router Mode"
-msgstr "正在平滑重启路由进入隐身模式"
-
-#: src/net/i2p/router/web/ConfigNetHandler.java:218
-msgid "Gracefully restarting to exit Hidden Router Mode"
-msgstr "正在平滑重启路由退出隐身模式"
-
-#: src/net/i2p/router/web/ConfigNetHandler.java:227
-msgid "Enabling UPnP, restart required to take effect"
-msgstr "正在启用UPnP,程序重启后生效"
-
-#: src/net/i2p/router/web/ConfigNetHandler.java:229
-msgid "Disabling UPnP, restart required to take effect"
-msgstr "正在禁用UPnP,程序重启后生效"
-
-#: src/net/i2p/router/web/ConfigNetHandler.java:235
-msgid "Requiring SSU introduers"
-msgstr "正在获取SSU中介"
-
-#: src/net/i2p/router/web/ConfigNetHandler.java:275
-msgid "Gracefully restarting I2P to change published router address"
-msgstr "正在平滑重启路由重新发布路由地址"
-
-#: src/net/i2p/router/web/ConfigNetHandler.java:293
-msgid "Updating bandwidth share percentage"
-msgstr "正在更新共享带宽比例"
-
-#: src/net/i2p/router/web/ConfigNetHandler.java:363
-msgid "Updated bandwidth limits"
-msgstr "带宽限制更新完毕"
-
-#: src/net/i2p/router/web/ConfigNetHelper.java:39
-#: src/net/i2p/router/web/ConfigNetHelper.java:47
-#: src/net/i2p/router/web/ConfigNetHelper.java:50
-#: src/net/i2p/router/web/ConfigNetHelper.java:57
-#: src/net/i2p/router/web/ConfigNetHelper.java:60
-msgid "unknown"
-msgstr "未知"
-
-#: src/net/i2p/router/web/ConfigNetHelper.java:165
-msgid "bits per second"
-msgstr "比特/秒"
-
-#: src/net/i2p/router/web/ConfigPeerHandler.java:23
-#, java-format
-msgid "Manually banned via {0}"
-msgstr "通过{0}手动封锁"
-
-#: src/net/i2p/router/web/ConfigPeerHandler.java:24
-#: src/net/i2p/router/web/ConfigPeerHandler.java:33
-#: src/net/i2p/router/web/ConfigPeerHandler.java:35
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:69
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:175
-#: src/net/i2p/router/web/TunnelRenderer.java:235
-msgid "Peer"
-msgstr "节点"
-
-#: src/net/i2p/router/web/ConfigPeerHandler.java:24
-msgid "banned until restart"
-msgstr "已封锁直到重启"
-
-#: src/net/i2p/router/web/ConfigPeerHandler.java:27
-#: src/net/i2p/router/web/ConfigPeerHandler.java:38
-#: src/net/i2p/router/web/ConfigPeerHandler.java:59
-msgid "Invalid peer"
-msgstr "无效节点"
-
-#: src/net/i2p/router/web/ConfigPeerHandler.java:33
-msgid "unbanned"
-msgstr "已解封"
-
-#: src/net/i2p/router/web/ConfigPeerHandler.java:35
-msgid "is not currently banned"
-msgstr "目前未封锁"
-
-#: src/net/i2p/router/web/ConfigPeerHandler.java:47
-msgid "Bad speed value"
-msgstr "速度值无效"
-
-#: src/net/i2p/router/web/ConfigPeerHandler.java:52
-msgid "Bad capacity value"
-msgstr "容量值无效"
-
-#: src/net/i2p/router/web/ConfigRestartBean.java:36
-msgid "Cancel shutdown"
-msgstr "取消关闭"
-
-#: src/net/i2p/router/web/ConfigRestartBean.java:37
-msgid "Cancel restart"
-msgstr "取消重启"
-
-#: src/net/i2p/router/web/ConfigRestartBean.java:39
-msgid "Restart immediately"
-msgstr "立刻重启"
-
-#: src/net/i2p/router/web/ConfigRestartBean.java:43
-msgid "Restart"
-msgstr "重 启"
-
-#: src/net/i2p/router/web/ConfigRestartBean.java:46
-msgid "Shutdown"
-msgstr "关 闭"
-
-#: src/net/i2p/router/web/ConfigRestartBean.java:57
-msgid "Shutdown imminent"
-msgstr "立刻关闭"
-
-#: src/net/i2p/router/web/ConfigRestartBean.java:60
-#, java-format
-msgid "Shutdown in {0}"
-msgstr "{0} 后退出"
-
-#: src/net/i2p/router/web/ConfigRestartBean.java:65
-#, java-format
-msgid "Restart in {0}"
-msgstr "{0} 后重启"
-
-#: src/net/i2p/router/web/ConfigServiceHandler.java:56
-msgid "Graceful shutdown initiated"
-msgstr "开始平滑关闭"
-
-#: src/net/i2p/router/web/ConfigServiceHandler.java:60
-msgid "Shutdown immediately!  boom bye bye bad bwoy"
-msgstr "立即关闭!不推荐"
-
-#: src/net/i2p/router/web/ConfigServiceHandler.java:63
-msgid "Graceful shutdown cancelled"
-msgstr "平滑关闭已取消"
-
-#: src/net/i2p/router/web/ConfigServiceHandler.java:67
-msgid "Graceful restart requested"
-msgstr "平滑重启已请求"
-
-#: src/net/i2p/router/web/ConfigServiceHandler.java:71
-msgid "Hard restart requested"
-msgstr "硬重启已请求"
-
-#: src/net/i2p/router/web/ConfigServiceHandler.java:72
-msgid "Rekey and Restart"
-msgstr "更换密钥并重启"
-
-#: src/net/i2p/router/web/ConfigServiceHandler.java:73
-msgid "Rekeying after graceful restart"
-msgstr "平滑重启后更换密钥"
-
-#: src/net/i2p/router/web/ConfigServiceHandler.java:76
-msgid "Rekey and Shutdown"
-msgstr "更换密钥并关闭"
-
-#: src/net/i2p/router/web/ConfigServiceHandler.java:77
-msgid "Rekeying after graceful shutdown"
-msgstr "平滑关闭后更换密钥"
-
-#: src/net/i2p/router/web/ConfigServiceHandler.java:96
-msgid "System tray icon enabled."
-msgstr "系统托盘图标已启用"
-
-#: src/net/i2p/router/web/ConfigServiceHandler.java:98
-#: src/net/i2p/router/web/ConfigServiceHandler.java:110
-msgid "System tray icon feature not supported on this platform. Sorry!"
-msgstr "您的平台不支持系统托盘图标功能"
-
-#: src/net/i2p/router/web/ConfigServiceHandler.java:101
-#: src/net/i2p/router/web/ConfigServiceHandler.java:113
-msgid "Warning: unable to contact the systray manager"
-msgstr "警告:与托盘管理器通讯失败"
-
-#: src/net/i2p/router/web/ConfigServiceHandler.java:108
-msgid "System tray icon disabled."
-msgstr "系统托盘已禁用"
-
-#: src/net/i2p/router/web/ConfigServiceHandler.java:117
-msgid "Console is to be shown on startup"
-msgstr "启动后显示控制台"
-
-#: src/net/i2p/router/web/ConfigServiceHandler.java:120
-msgid "Console is not to be shown on startup"
-msgstr "启动后不显示控制台"
-
-#: src/net/i2p/router/web/ConfigServiceHandler.java:129
-msgid "Service installed"
-msgstr "服务已安装"
-
-#: src/net/i2p/router/web/ConfigServiceHandler.java:131
-msgid "Warning: unable to install the service"
-msgstr "警告:无法安装服务"
-
-#: src/net/i2p/router/web/ConfigServiceHandler.java:137
-msgid "Service removed"
-msgstr "服务已卸载"
-
-#: src/net/i2p/router/web/ConfigServiceHandler.java:139
-msgid "Warning: unable to remove the service"
-msgstr "警告:无法卸载服务"
-
-#: src/net/i2p/router/web/ConfigStatsHandler.java:118
-msgid "Stat filter and location updated successfully to"
-msgstr "统计数据过滤器及位置成功更新至"
-
-#: src/net/i2p/router/web/ConfigStatsHandler.java:120
-msgid "Failed to update the stat filter and location"
-msgstr "统计数据过滤器及地址更新失败"
-
-#: src/net/i2p/router/web/ConfigStatsHandler.java:121
-msgid "Graph list updated, may take up to 60s to be reflected here and on the <a href=\"graphs.jsp\">Graphs Page</a>"
-msgstr "曲线图列表已更新,更新后的内容可能需要最多 60s 的时间才能在这里及 <a href=\"graphs.jsp\">统计图表</a>页面中反映出来。"
-
-#: src/net/i2p/router/web/ConfigTunnelsHandler.java:137
-msgid "Updated settings for all pools."
-msgstr "隧道池更新完毕"
-
-#: src/net/i2p/router/web/ConfigTunnelsHandler.java:142
-msgid "Exploratory tunnel configuration saved successfully."
-msgstr "探索隧道设置保存成功。"
-
-#: src/net/i2p/router/web/ConfigTunnelsHandler.java:144
-#: src/net/i2p/router/web/ConfigUIHandler.java:36
-msgid "Error saving the configuration (applied but not saved) - please see the error logs."
-msgstr "配置保存出错(已应用但未保存) - 参见错误日志"
-
-#: src/net/i2p/router/web/ConfigTunnelsHelper.java:11
-msgid "hop"
-msgstr "跳点"
-
-#: src/net/i2p/router/web/ConfigTunnelsHelper.java:12
-msgid "tunnel"
-msgstr "隧道"
-
-#: src/net/i2p/router/web/ConfigTunnelsHelper.java:14
-msgid "hops"
-msgstr "跳点"
-
-#: src/net/i2p/router/web/ConfigTunnelsHelper.java:15
-msgid "tunnels"
-msgstr "隧道"
-
-#: src/net/i2p/router/web/ConfigTunnelsHelper.java:26
-#: src/net/i2p/router/web/TunnelRenderer.java:40
-msgid "Exploratory tunnels"
-msgstr "探测隧道"
-
-#: src/net/i2p/router/web/ConfigTunnelsHelper.java:46
-#: src/net/i2p/router/web/TunnelRenderer.java:60
-msgid "Client tunnels for"
-msgstr "客户隧道 - "
-
-#: src/net/i2p/router/web/ConfigTunnelsHelper.java:69
-msgid "ANONYMITY WARNING - Settings include 0-hop tunnels."
-msgstr "匿名性警告 - 设置中包括 0-跳点 隧道"
-
-#: src/net/i2p/router/web/ConfigTunnelsHelper.java:74
-msgid "ANONYMITY WARNING - Settings include 1-hop tunnels."
-msgstr "匿名性警告 - 设置中包括 1-跳点 隧道"
-
-#: src/net/i2p/router/web/ConfigTunnelsHelper.java:77
-msgid "PERFORMANCE WARNING - Settings include very long tunnels."
-msgstr "性能警告 - 设置中包括长隧道"
-
-#: src/net/i2p/router/web/ConfigTunnelsHelper.java:80
-msgid "PERFORMANCE WARNING - Settings include high tunnel quantities."
-msgstr "性能警告 - 设置中包括大量隧道"
-
-#: src/net/i2p/router/web/ConfigTunnelsHelper.java:82
-msgid "Inbound"
-msgstr "入站"
-
-#: src/net/i2p/router/web/ConfigTunnelsHelper.java:82
-msgid "Outbound"
-msgstr "出站"
-
-#: src/net/i2p/router/web/ConfigTunnelsHelper.java:87
-msgid "Depth"
-msgstr "深度"
-
-#: src/net/i2p/router/web/ConfigTunnelsHelper.java:104
-msgid "Randomization"
-msgstr "随机"
-
-#: src/net/i2p/router/web/ConfigTunnelsHelper.java:128
-msgid "Quantity"
-msgstr "数量"
-
-#: src/net/i2p/router/web/ConfigTunnelsHelper.java:145
-msgid "Backup quantity"
-msgstr "备用数量"
-
-#: src/net/i2p/router/web/ConfigTunnelsHelper.java:167
-msgid "Inbound options"
-msgstr "入站选项"
-
-#: src/net/i2p/router/web/ConfigTunnelsHelper.java:180
-msgid "Outbound options"
-msgstr "出站选项"
-
-#: src/net/i2p/router/web/ConfigUIHandler.java:31
-msgid "Theme change saved."
-msgstr "主题设置已保存。"
-
-#: src/net/i2p/router/web/ConfigUIHandler.java:33
-msgid "Refresh the page to view."
-msgstr "刷新页面后查看。"
-
-#: src/net/i2p/router/web/ConfigUIHelper.java:41
-msgid "English"
-msgstr "英语"
-
-#: src/net/i2p/router/web/ConfigUIHelper.java:41
-msgid "French"
-msgstr "法语"
-
-#: src/net/i2p/router/web/ConfigUIHelper.java:41
-msgid "German"
-msgstr "德语"
-
-#: src/net/i2p/router/web/ConfigUIHelper.java:42
-msgid "Chinese"
-msgstr "中文"
-
-#: src/net/i2p/router/web/ConfigUIHelper.java:42
-msgid "Dutch"
-msgstr "荷兰语"
-
-#: src/net/i2p/router/web/ConfigUIHelper.java:42
-msgid "Swedish"
-msgstr "瑞士语"
-
-#: src/net/i2p/router/web/ConfigUpdateHandler.java:63
-msgid "Update available, attempting to download now"
-msgstr "有更新可用,正在尝试下载"
-
-#: src/net/i2p/router/web/ConfigUpdateHandler.java:65
-msgid "Update available, click button on left to download"
-msgstr "有更新可用,点左侧按钮下载"
-
-#: src/net/i2p/router/web/ConfigUpdateHandler.java:67
-msgid "No update available"
-msgstr "æ— æ›´æ–°"
-
-#: src/net/i2p/router/web/ConfigUpdateHandler.java:75
-msgid "Updating news URL to"
-msgstr "正在更新新闻链接至"
-
-#: src/net/i2p/router/web/ConfigUpdateHandler.java:83
-msgid "Updating proxy host to"
-msgstr "正在更新代理主机至"
-
-#: src/net/i2p/router/web/ConfigUpdateHandler.java:91
-msgid "Updating proxy port to"
-msgstr "正在更新代理端口至"
-
-#: src/net/i2p/router/web/ConfigUpdateHandler.java:104
-msgid "Updating refresh frequency to"
-msgstr "正在更新更新频率为"
-
-#: src/net/i2p/router/web/ConfigUpdateHandler.java:111
-msgid "Updating update policy to"
-msgstr "正在更新升级策略为"
-
-#: src/net/i2p/router/web/ConfigUpdateHandler.java:120
-msgid "Updating update URLs."
-msgstr "正在更新更新链接至"
-
-#: src/net/i2p/router/web/ConfigUpdateHandler.java:128
-msgid "Updating trusted keys."
-msgstr "正在更新可信公钥为"
-
-#: src/net/i2p/router/web/ConfigUpdateHandler.java:136
-msgid "Updating unsigned update URL to"
-msgstr "正在更新未签名软件链接至"
-
-#: src/net/i2p/router/web/ConfigUpdateHelper.java:75
-#: src/net/i2p/router/web/GraphHelper.java:115
-msgid "Never"
-msgstr "从不"
-
-#: src/net/i2p/router/web/ConfigUpdateHelper.java:77
-msgid "Every"
-msgstr "每"
-
-#: src/net/i2p/router/web/ConfigUpdateHelper.java:90
-#: src/net/i2p/router/web/ConfigUpdateHelper.java:92
-msgid "Notify only"
-msgstr "只提示"
-
-#: src/net/i2p/router/web/ConfigUpdateHelper.java:95
-#: src/net/i2p/router/web/ConfigUpdateHelper.java:97
-msgid "Download and verify only"
-msgstr "仅下载并验证"
-
-#: src/net/i2p/router/web/ConfigUpdateHelper.java:101
-#: src/net/i2p/router/web/ConfigUpdateHelper.java:103
-msgid "Download, verify, and restart"
-msgstr "仅下载、验证并重启"
-
-#: src/net/i2p/router/web/GraphHelper.java:107
-msgid "Configure Graph Display"
-msgstr "图表显示设置"
-
-#: src/net/i2p/router/web/GraphHelper.java:107
-msgid "Select Stats"
-msgstr "选择统计项"
-
-#: src/net/i2p/router/web/GraphHelper.java:109
-msgid "Periods"
-msgstr "周期"
-
-#: src/net/i2p/router/web/GraphHelper.java:110
-msgid "Plot averages"
-msgstr "事件均值"
-
-#: src/net/i2p/router/web/GraphHelper.java:111
-msgid "plot events"
-msgstr "事件数量"
-
-#: src/net/i2p/router/web/GraphHelper.java:112
-msgid "Image sizes"
-msgstr "图像尺寸"
-
-#: src/net/i2p/router/web/GraphHelper.java:112
-msgid "width"
-msgstr "宽度"
-
-#: src/net/i2p/router/web/GraphHelper.java:113
-msgid "height"
-msgstr "高度"
-
-#: src/net/i2p/router/web/GraphHelper.java:113
-#: src/net/i2p/router/web/GraphHelper.java:114
-msgid "pixels"
-msgstr "像素"
-
-#: src/net/i2p/router/web/GraphHelper.java:115
-msgid "Refresh delay"
-msgstr "刷新延迟"
-
-#: src/net/i2p/router/web/GraphHelper.java:115
-msgid "hour"
-msgstr "小时"
-
-#: src/net/i2p/router/web/GraphHelper.java:115
-msgid "minute"
-msgstr "分钟"
-
-#: src/net/i2p/router/web/GraphHelper.java:115
-msgid "minutes"
-msgstr "分钟"
-
-#: src/net/i2p/router/web/GraphHelper.java:116
-msgid "Redraw"
-msgstr "重绘"
-
-#: src/net/i2p/router/web/NetDbRenderer.java:59
-msgid "Network Database RouterInfo Lookup"
-msgstr "网络数据库 RouterInfo 检索"
-
-#: src/net/i2p/router/web/NetDbRenderer.java:74
-msgid "Router"
-msgstr "路由器"
-
-#: src/net/i2p/router/web/NetDbRenderer.java:74
-msgid "not found in network database"
-msgstr "在网络数据库概况未找到"
-
-#: src/net/i2p/router/web/NetDbRenderer.java:82
-#: src/net/i2p/router/web/NetDbRenderer.java:134
-msgid "Network Database Contents"
-msgstr "网络数据库内容"
-
-#: src/net/i2p/router/web/NetDbRenderer.java:83
-msgid "View RouterInfo"
-msgstr "浏览 RouterInfo"
-
-#: src/net/i2p/router/web/NetDbRenderer.java:84
-msgid "LeaseSets"
-msgstr "赁集"
-
-#: src/net/i2p/router/web/NetDbRenderer.java:92
-msgid "LeaseSet"
-msgstr "赁集"
-
-#: src/net/i2p/router/web/NetDbRenderer.java:94
-msgid "Local"
-msgstr "本地"
-
-#: src/net/i2p/router/web/NetDbRenderer.java:96
-msgid "Unpublished"
-msgstr "未发布"
-
-#: src/net/i2p/router/web/NetDbRenderer.java:97
-#: src/net/i2p/router/web/NetDbRenderer.java:104
-msgid "Destination"
-msgstr "目标"
-
-#: src/net/i2p/router/web/NetDbRenderer.java:114
-#, java-format
-msgid "Expires in {0}"
-msgstr "{0} 后过期"
-
-#: src/net/i2p/router/web/NetDbRenderer.java:116
-#, java-format
-msgid "Expired {0} ago"
-msgstr "{0}前过期"
-
-#: src/net/i2p/router/web/NetDbRenderer.java:118
-#: src/net/i2p/router/web/TunnelRenderer.java:156
-msgid "Gateway"
-msgstr "网关"
-
-#: src/net/i2p/router/web/NetDbRenderer.java:118
-msgid "Lease"
-msgstr "租赁"
-
-#: src/net/i2p/router/web/NetDbRenderer.java:120
-msgid "Tunnel"
-msgstr "隧道"
-
-#: src/net/i2p/router/web/NetDbRenderer.java:134
-msgid "View LeaseSets"
-msgstr "查看赁集"
-
-#: src/net/i2p/router/web/NetDbRenderer.java:136
-msgid "Not initialized"
-msgstr "未初始化"
-
-#: src/net/i2p/router/web/NetDbRenderer.java:145
-msgid "Routers"
-msgstr "路由器"
-
-#: src/net/i2p/router/web/NetDbRenderer.java:147
-msgid "Show all routers"
-msgstr "显示所有路由器"
-
-#: src/net/i2p/router/web/NetDbRenderer.java:149
-msgid "Show all routers with full stats"
-msgstr "显示所有路由及统计"
-
-#: src/net/i2p/router/web/NetDbRenderer.java:184
-msgid "Network Database Router Statistics"
-msgstr "NetDb路由器统计"
-
-#: src/net/i2p/router/web/NetDbRenderer.java:190
-#: src/net/i2p/router/web/NetDbRenderer.java:204
-#: src/net/i2p/router/web/NetDbRenderer.java:222
-msgid "Count"
-msgstr "计数"
-
-#: src/net/i2p/router/web/NetDbRenderer.java:190
-#: src/net/i2p/router/web/SummaryBarRenderer.java:150
-msgid "Version"
-msgstr "版本"
-
-#: src/net/i2p/router/web/NetDbRenderer.java:204
-msgid "Transports"
-msgstr "传输"
-
-#: src/net/i2p/router/web/NetDbRenderer.java:222
-msgid "Country"
-msgstr "国家"
-
-#: src/net/i2p/router/web/NetDbRenderer.java:254
-msgid "Our info"
-msgstr "我方信息"
-
-#: src/net/i2p/router/web/NetDbRenderer.java:256
-msgid "Peer info for"
-msgstr "节点信息"
-
-#: src/net/i2p/router/web/NetDbRenderer.java:260
-msgid "Full entry"
-msgstr "完整项"
-
-#: src/net/i2p/router/web/NetDbRenderer.java:266
-msgid "Updated"
-msgstr "已更新"
-
-#: src/net/i2p/router/web/NetDbRenderer.java:266
-#: src/net/i2p/router/web/NetDbRenderer.java:268
-#: src/net/i2p/router/web/SummaryHelper.java:385
-msgid "ago"
-msgstr "前"
-
-#: src/net/i2p/router/web/NetDbRenderer.java:268
-#: src/net/i2p/router/web/NetDbRenderer.java:270
-msgid "Published"
-msgstr "发布"
-
-#: src/net/i2p/router/web/NetDbRenderer.java:271
-msgid "Address(es)"
-msgstr "地址"
-
-#: src/net/i2p/router/web/NetDbRenderer.java:303
-msgid "Hidden or starting up"
-msgstr "隐身或正在启动"
-
-#: src/net/i2p/router/web/NetDbRenderer.java:303
-msgid "SSU"
-msgstr ""
-
-#: src/net/i2p/router/web/NetDbRenderer.java:303
-msgid "SSU with introducers"
-msgstr "使用中介的SSU连接"
-
-#: src/net/i2p/router/web/NetDbRenderer.java:304
-msgid "NTCP"
-msgstr ""
-
-#: src/net/i2p/router/web/NetDbRenderer.java:304
-msgid "NTCP and SSU"
-msgstr "NTCP 与 SSU"
-
-#: src/net/i2p/router/web/NetDbRenderer.java:304
-msgid "NTCP and SSU with introducers"
-msgstr "使用中介的NTCP与SSU连接"
-
-#: src/net/i2p/router/web/NewsFetcher.java:80
-#, java-format
-msgid "News last updated {0} ago."
-msgstr "新闻更新于{0}前"
-
-#: src/net/i2p/router/web/NewsFetcher.java:86
-#, java-format
-msgid "News last checked {0} ago."
-msgstr "最近一次查收新闻在{0}前"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:63
-msgid "Peer Profiles"
-msgstr "节点信息"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:64
-#, java-format
-msgid "Showing {0} recent profiles."
-msgstr "显示最近 {0} 个节点信息"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:65
-#, java-format
-msgid "Hiding {0} older profiles."
-msgstr "隐藏 {0} 个较旧的信息。"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:70
-msgid "Groups (Caps)"
-msgstr "组(容量)"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:73
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:242
-msgid "Integration"
-msgstr "整合"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:74
-msgid "Status"
-msgstr "状态"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:114
-msgid "Fast, High Capacity"
-msgstr "高速,高容"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:115
-msgid "High Capacity"
-msgstr "高容"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:116
-msgid "Standard"
-msgstr "标准"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:117
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:151
-msgid "Failing"
-msgstr "失败"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:119
-#: src/net/i2p/router/web/SummaryBarRenderer.java:249
-msgid "Integrated"
-msgstr "已整合节点"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:150
-msgid "Banned"
-msgstr "已封锁"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:152
-msgid "Unreachable"
-msgstr "不可达"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:159
-msgid "Test Fails"
-msgstr "测试失败"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:163
-msgid "profile"
-msgstr "节点信息"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:172
-msgid "Floodfill and Integrated Peers"
-msgstr "种子节点与整合节点"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:176
-msgid "Caps"
-msgstr "容量"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:177
-msgid "Integ. Value"
-msgstr ""
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:178
-msgid "Last Heard About"
-msgstr ""
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:179
-msgid "Last Heard From"
-msgstr ""
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:180
-msgid "Last Good Send"
-msgstr "上一次发送成功"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:181
-msgid "Last Bad Send"
-msgstr "上一次发送失败"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:182
-msgid "10m Resp. Time"
-msgstr "10m响应时间"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:183
-msgid "1h Resp. Time"
-msgstr "1h响应时间"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:184
-msgid "1d Resp. Time"
-msgstr "1d响应时间"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:185
-msgid "Last Good Lookup"
-msgstr "上一次查询成功"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:186
-msgid "Last Bad Lookup"
-msgstr "上一次查询失败"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:187
-msgid "Last Good Store"
-msgstr "上一次保存成功"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:188
-msgid "Last Bad Store"
-msgstr "上一次保存失败"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:189
-msgid "1h Fail Rate"
-msgstr "1h失败率"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:190
-msgid "1d Fail Rate"
-msgstr "1d失败率"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:237
-msgid "Thresholds"
-msgstr "临界值"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:239
-msgid "fast peers"
-msgstr "高速节点"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:241
-msgid "high capacity peers"
-msgstr "高容节点"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:243
-msgid " well integrated peers"
-msgstr "整合节点"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:244
-msgid "Definitions"
-msgstr "定义"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:245
-msgid "as determined by the profile organizer"
-msgstr "由节点描述信息管理器决定"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:245
-msgid "groups"
-msgstr "分组"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:246
-msgid "capabilities in the netDb, not used to determine profiles"
-msgstr "netDb中的容量,与描述信息无关。"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:246
-msgid "caps"
-msgstr "容量"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:247
-msgid "peak throughput (bytes per second) over a 1 minute period that the peer has sustained in a single tunnel"
-msgstr "该节点一分钟由单一隧道通过的数据峰值(byte/s)。"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:247
-msgid "speed"
-msgstr "速度"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:248
-msgid "capacity"
-msgstr "容量"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:248
-msgid "how many tunnels can we ask them to join in an hour?"
-msgstr "一小时内路由可以邀请加入的隧道总量"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:249
-msgid "how many new peers have they told us about lately?"
-msgstr "最近获知的新节点"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:249
-msgid "integration"
-msgstr "整合"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:250
-msgid "is the peer banned, or unreachable, or failing tunnel tests?"
-msgstr "是否节点被封禁,不可达,或在隧道测试中失败?"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:250
-msgid "status"
-msgstr "状态"
-
-#: src/net/i2p/router/web/ProfileOrganizerRenderer.java:308
-msgid "n/a"
-msgstr ""
-
-#: src/net/i2p/router/web/ShitlistRenderer.java:57
-#, java-format
-msgid "Temporary ban expiring in {0}"
-msgstr "临时封锁{0}后解除"
-
-#: src/net/i2p/router/web/ShitlistRenderer.java:59
-#, java-format
-msgid "Banned until restart or in {0}"
-msgstr "封锁直到重启或{0}后"
-
-#: src/net/i2p/router/web/ShitlistRenderer.java:71
-msgid "unban now"
-msgstr "立即解封"
-
-#: src/net/i2p/router/web/StatsGenerator.java:58
-msgid "Statistics gathered during this router's uptime"
-msgstr "路由运行时收集的统计数据"
-
-#: src/net/i2p/router/web/StatsGenerator.java:61
-msgid "The data gathered is quantized over a 1 minute period, so should just be used as an estimate."
-msgstr "所采集数据量化周期为1分钟,仅供参考。"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:40
-msgid "Configure startup of clients and webapps (services); manually start dormant services"
-msgstr "设置客户程序及Web程序(服务)的启动;手动启动重要服务"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:42
-msgid "I2P Services"
-msgstr "I2P 服务"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:48
-msgid "Manage your I2P hosts file here (I2P domain name resolution)"
-msgstr "管理您的 I2P HOST表(I2P域名解析表)"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:50
-msgid "Addressbook"
-msgstr "地址簿"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:54
-msgid "Built-in anonymous BitTorrent Client"
-msgstr "内建的匿名 BitTorrent 客户端"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:56
-msgid "Torrents"
-msgstr "匿名BT"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:60
-msgid "Anonymous webmail client"
-msgstr "匿名Web邮件客户端"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:62
-msgid "Webmail"
-msgstr "匿名邮箱"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:66
-msgid "Anonymous resident webserver"
-msgstr "内置的匿名Web服务器"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:68
-msgid "Webserver"
-msgstr "匿名主页服务器"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:72
-msgid "Configure I2P Router"
-msgstr "设置 I2P 路由器"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:74
-msgid "I2P Internals"
-msgstr "I2P内部设置"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:80
-#: src/net/i2p/router/web/SummaryBarRenderer.java:344
-msgid "View existing tunnels and tunnel build status"
-msgstr "查看现存隧道及隧道的建立状态"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:86
-#: src/net/i2p/router/web/SummaryBarRenderer.java:221
-msgid "Show all current peer connections"
-msgstr "显示当前所有的节点连接"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:92
-msgid "Show recent peer performance profiles"
-msgstr "显示当前节点的性能记录"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:94
-msgid "Profiles"
-msgstr "节点信息"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:98
-msgid "Show list of all known I2P routers"
-msgstr "包含所有已知I2P路由器的列表"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:100
-msgid "NetDB"
-msgstr "NetDB"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:104
-msgid "Health Report"
-msgstr "路由器健康状况报告"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:106
-msgid "Logs"
-msgstr "日志"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:110
-msgid "Show the router's workload, and how it's performing"
-msgstr "显示I2P路由器的负载与工作状况"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:112
-msgid "Jobs"
-msgstr "作业"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:116
-msgid "Graph router performance"
-msgstr "路由性能统计图"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:118
-msgid "Graphs"
-msgstr "图表"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:122
-msgid "Textual router performance statistics"
-msgstr "路由性能文字统计"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:134
-msgid "I2P Router Help"
-msgstr "I2P路由帮助"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:136
-msgid "General"
-msgstr "功能概况"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:139
-msgid "Your unique I2P router identity is"
-msgstr "您I2P路由的唯一身份为"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:143
-msgid "never reveal it to anyone"
-msgstr "切勿将其告诉任何人"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:145
-msgid "Local Identity"
-msgstr "本地身份"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:157
-msgid "How long we've been running for this session"
-msgstr "本次路由运行时间"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:160
-msgid "Uptime"
-msgstr "运行时间"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:167
-msgid "Help with configuring your firewall and router for optimal I2P performance"
-msgstr "如何正确配置防火墙和(物理)路由器优化I2P性能"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:194
-msgid "Download"
-msgstr "下载"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:203
-msgid "Download Unsigned"
-msgstr "下载未签名更新"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:229
-msgid "Active"
-msgstr "活动节点"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:237
-msgid "Fast"
-msgstr "快速节点"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:243
-msgid "High capacity"
-msgstr "高容量节点"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:255
-msgid "Known"
-msgstr "已知节点"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:270
-msgid "Help with firewall configuration"
-msgstr "如何配置防火墙"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:272
-msgid "Check NAT/firewall"
-msgstr "检查NAT/防火墙"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:292
-msgid "Reseed"
-msgstr "补种(搜索节点启动网络)"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:309
-msgid "Configure router bandwidth allocation"
-msgstr "设置路由的带宽分配"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:311
-msgid "Bandwidth in/out"
-msgstr "带宽(上/下行)"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:328
-msgid "Total"
-msgstr "总计"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:336
-msgid "Used"
-msgstr "已使用"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:346
-msgid "Tunnels in/out"
-msgstr "通道(上/下行)"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:351
-msgid "Exploratory"
-msgstr "探测"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:367
-msgid "Participating"
-msgstr "共享"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:373
-msgid "What's in the router's job queue?"
-msgstr "查看路由的作业队列"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:375
-msgid "Congestion"
-msgstr "拥堵"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:380
-msgid "Job lag"
-msgstr "作业延迟"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:386
-msgid "Message delay"
-msgstr "消息延迟"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:392
-msgid "Tunnel lag"
-msgstr "隧道延迟"
-
-#: src/net/i2p/router/web/SummaryBarRenderer.java:398
-msgid "Backlog"
-msgstr "积压"
-
-#: src/net/i2p/router/web/SummaryHelper.java:73
-msgid "skew"
-msgstr "时滞"
-
-#: src/net/i2p/router/web/SummaryHelper.java:92
-msgid "ERR-Client Manager I2CP Error - check logs"
-msgstr "错误-客户程序管理器I2CP错误 - 请看日志"
-
-#: src/net/i2p/router/web/SummaryHelper.java:94
-msgid "ERR-ClockSkew"
-msgstr "错误-系统时滞"
-
-#: src/net/i2p/router/web/SummaryHelper.java:104
-msgid "ERR-Private TCP Address"
-msgstr "错误-TCP私有地址"
-
-#: src/net/i2p/router/web/SummaryHelper.java:106
-msgid "ERR-SymmetricNAT"
-msgstr "错误-SymmeticNAT"
-
-#: src/net/i2p/router/web/SummaryHelper.java:109
-msgid "WARN-Firewalled with Inbound TCP Enabled"
-msgstr "警告-入站TCP开启但因防火墙受限"
-
-#: src/net/i2p/router/web/SummaryHelper.java:111
-msgid "WARN-Firewalled and Floodfill"
-msgstr "警告-种子节点因防火墙受限"
-
-#: src/net/i2p/router/web/SummaryHelper.java:113
-msgid "WARN-Firewalled and Fast"
-msgstr "警告-快速节点因防火墙受限"
-
-#: src/net/i2p/router/web/SummaryHelper.java:116
-msgid "ERR-UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart"
-msgstr "错误-UDP端口已占用 - 在高级设置中设置 i2np.udp.internalPort=新端口并重启程序"
-
-#: src/net/i2p/router/web/SummaryHelper.java:123
-msgid "ERR-UDP Disabled and Inbound TCP host/port not set"
-msgstr "错误-UDP已禁用且TCP入站主机与端口未设置"
-
-#: src/net/i2p/router/web/SummaryHelper.java:125
-msgid "WARN-Firewalled with UDP Disabled"
-msgstr "警告-因防火墙受限且UDP被禁用"
-
-#: src/net/i2p/router/web/SummaryHelper.java:360
-msgid "Add/remove/edit &amp; control your client and server tunnels"
-msgstr "添加、删除、编辑或控制客户程序隧道和服务隧道"
-
-#: src/net/i2p/router/web/SummaryHelper.java:360
-msgid "Local Destinations"
-msgstr "本地目标"
-
-#: src/net/i2p/router/web/SummaryHelper.java:369
-msgid "Server"
-msgstr "服务"
-
-#: src/net/i2p/router/web/SummaryHelper.java:373
-msgid "Show tunnels"
-msgstr "显示隧道"
-
-#: src/net/i2p/router/web/SummaryHelper.java:384
-msgid "Leases expired"
-msgstr "Lease已过期"
-
-#: src/net/i2p/router/web/SummaryHelper.java:384
-#: src/net/i2p/router/web/SummaryHelper.java:385
-msgid "Rebuilding"
-msgstr "正在重建"
-
-#: src/net/i2p/router/web/SummaryHelper.java:388
-msgid "Ready"
-msgstr "就绪"
-
-#: src/net/i2p/router/web/SummaryHelper.java:392
-msgid "Building"
-msgstr "创建中"
-
-#: src/net/i2p/router/web/SummaryHelper.java:392
-msgid "Building tunnels"
-msgstr "正在隧道创建"
-
-#: src/net/i2p/router/web/SummaryHelper.java:404
-#: strings/Strings.java:36
-msgid "shared clients"
-msgstr "共享客户端"
-
-#: src/net/i2p/router/web/TunnelRenderer.java:40
-#: src/net/i2p/router/web/TunnelRenderer.java:62
-msgid "configure"
-msgstr "设置"
-
-#: src/net/i2p/router/web/TunnelRenderer.java:64
-msgid "dead"
-msgstr "失效"
-
-#: src/net/i2p/router/web/TunnelRenderer.java:70
-msgid "Participating tunnels"
-msgstr "共享隧道"
-
-#: src/net/i2p/router/web/TunnelRenderer.java:71
-msgid "From"
-msgstr "从"
-
-#: src/net/i2p/router/web/TunnelRenderer.java:71
-msgid "Receive on"
-msgstr "接收"
-
-#: src/net/i2p/router/web/TunnelRenderer.java:72
-msgid "Expiration"
-msgstr "到期"
-
-#: src/net/i2p/router/web/TunnelRenderer.java:72
-msgid "Send on"
-msgstr "发送"
-
-#: src/net/i2p/router/web/TunnelRenderer.java:72
-msgid "To"
-msgstr "至"
-
-#: src/net/i2p/router/web/TunnelRenderer.java:73
-msgid "Rate"
-msgstr "速度"
-
-#: src/net/i2p/router/web/TunnelRenderer.java:73
-msgid "Role"
-msgstr "职能"
-
-#: src/net/i2p/router/web/TunnelRenderer.java:73
-#: src/net/i2p/router/web/TunnelRenderer.java:156
-msgid "Usage"
-msgstr "使用情况"
-
-#: src/net/i2p/router/web/TunnelRenderer.java:107
-msgid "grace period"
-msgstr "过渡期"
-
-#: src/net/i2p/router/web/TunnelRenderer.java:117
-msgid "Outbound Endpoint"
-msgstr "出站终端"
-
-#: src/net/i2p/router/web/TunnelRenderer.java:119
-msgid "Inbound Gateway"
-msgstr "入站网关"
-
-#: src/net/i2p/router/web/TunnelRenderer.java:121
-#: src/net/i2p/router/web/TunnelRenderer.java:162
-msgid "Participant"
-msgstr "参与节点"
-
-#: src/net/i2p/router/web/TunnelRenderer.java:126
-msgid "Inactive participating tunnels"
-msgstr "不活跃的共享隧道"
-
-#: src/net/i2p/router/web/TunnelRenderer.java:127
-#: src/net/i2p/router/web/TunnelRenderer.java:216
-msgid "Lifetime bandwidth usage"
-msgstr "运行期间带宽使用情况"
-
-#: src/net/i2p/router/web/TunnelRenderer.java:156
-msgid "Expiry"
-msgstr "到期"
-
-#: src/net/i2p/router/web/TunnelRenderer.java:156
-msgid "In/Out"
-msgstr "入/出"
-
-#: src/net/i2p/router/web/TunnelRenderer.java:159
-msgid "Participants"
-msgstr "参与节点"
-
-#: src/net/i2p/router/web/TunnelRenderer.java:165
-msgid "Endpoint"
-msgstr "终端"
-
-#: src/net/i2p/router/web/TunnelRenderer.java:205
-#: src/net/i2p/router/web/TunnelRenderer.java:211
-msgid "Build in progress"
-msgstr "创建中"
-
-#: src/net/i2p/router/web/TunnelRenderer.java:205
-msgid "inbound"
-msgstr "入站"
-
-#: src/net/i2p/router/web/TunnelRenderer.java:211
-msgid "outbound"
-msgstr "出站"
-
-#: src/net/i2p/router/web/TunnelRenderer.java:215
-msgid "No tunnels; waiting for the grace period to end."
-msgstr "无隧道;等待宽限期结束。"
-
-#: src/net/i2p/router/web/TunnelRenderer.java:216
-msgid "in"
-msgstr "å…¥"
-
-#: src/net/i2p/router/web/TunnelRenderer.java:217
-msgid "out"
-msgstr "出"
-
-#: src/net/i2p/router/web/TunnelRenderer.java:234
-msgid "Tunnel Counts By Peer"
-msgstr "每节点隧道计数"
-
-#: src/net/i2p/router/web/TunnelRenderer.java:235
-msgid "% of total"
-msgstr "占总数%"
-
-#: src/net/i2p/router/web/TunnelRenderer.java:235
-msgid "Expl. + Client"
-msgstr "探测+客户"
-
-#: src/net/i2p/router/web/TunnelRenderer.java:235
-msgid "Part. from + to"
-msgstr "相邻共享节点"
-
-#: strings/Strings.java:12
-msgid "addressbook"
-msgstr "地址簿"
-
-#: strings/Strings.java:13
-msgid "i2psnark"
-msgstr "匿名BT客户端"
-
-#: strings/Strings.java:14
-msgid "i2ptunnel"
-msgstr "I2P隧道"
-
-#: strings/Strings.java:15
-msgid "susimail"
-msgstr "匿名邮箱"
-
-#: strings/Strings.java:16
-msgid "susidns"
-msgstr "susiDNS"
-
-#: strings/Strings.java:17
-msgid "routerconsole"
-msgstr "路由控制台"
-
-#: strings/Strings.java:22
-msgid "Web console"
-msgstr "网页控制台"
-
-#: strings/Strings.java:23
-msgid "SAM application bridge"
-msgstr "SAM 协议桥"
-
-#: strings/Strings.java:24
-msgid "Application tunnels"
-msgstr "程序隧道"
-
-#: strings/Strings.java:25
-msgid "My eepsite web server"
-msgstr "匿名主页服务器"
-
-#: strings/Strings.java:26
-msgid "I2P webserver (eepsite)"
-msgstr "匿名主页服务器(eepsite)"
-
-#: strings/Strings.java:27
-msgid "Browser launch at startup"
-msgstr "路由器启动时运行浏览器"
-
-#: strings/Strings.java:28
-msgid "BOB application bridge"
-msgstr "BOB 协议桥"
-
-#: strings/Strings.java:30
-msgid "Open Router Console in web browser at startup"
-msgstr "路由启动时打开控制台"
-
-#: strings/Strings.java:37
-msgid "IRC proxy"
-msgstr "I2P聊天室"
-
-#: strings/Strings.java:38
-msgid "eepsite"
-msgstr "匿名网站"
-
-#: strings/Strings.java:39
-msgid "I2P webserver"
-msgstr "匿名主页服务器"
-
-#: strings/Strings.java:40
-msgid "HTTP Proxy"
-msgstr "HTTP 代理"
-
-#: strings/Strings.java:42
-msgid "eepProxy"
-msgstr "I2P代理"
-
-#: strings/Strings.java:43
-msgid "ircProxy"
-msgstr "I2P聊天室"
-
-#: strings/Strings.java:45
-msgid "I2PSnark"
-msgstr "I2P Snark"
-
-#: strings/Strings.java:47
-msgid "iMule"
-msgstr ""
-
-#: strings/Strings.java:51
-msgid "classic"
-msgstr "经典"
-
-#: strings/Strings.java:52
-msgid "dark"
-msgstr "暗色调"
-
-#: strings/Strings.java:53
-msgid "light"
-msgstr "亮色调"
-
-#: strings/Strings.java:54
-msgid "midnight"
-msgstr "午夜"
-
-#~ msgid "Addresses"
-#~ msgstr "地址"
-#~ msgid "view without"
-#~ msgstr "查看不含"
-#~ msgid "view with"
-#~ msgstr "查看含"
-#~ msgid "stats"
-#~ msgstr "统计"
-#~ msgid "View"
-#~ msgstr "查看"
-#~ msgid "Not Failing"
-#~ msgstr "标准"
-#~ msgid ""
-#~ "If you want the router to restart itself after shutting down, you can "
-#~ "choose one of the following.  This is useful in some situations - for "
-#~ "example, if you changed some settings that client applications only read "
-#~ "at startup, such as the routerconsole password or the interface it "
-#~ "listens on.  A graceful restart will take a few minutes (but your peers "
-#~ "will appreciate your patience), while a hard restart does so "
-#~ "immediately.  After tearing down the router, it will wait 1 minute before "
-#~ "starting back up again."
-#~ msgstr ""
-#~ "如果你想要路由器关闭后重新启动,可以选择下面的选项。重启在某些情况下有用 "
-#~ "- 例如当修改了客户程序仅在启动时读取的设置比如路由器控制界面的密码,监听的"
-#~ "接口。平滑重启可能会等待几分钟的时间 (但其他节点一定会感激你的耐心),硬重"
-#~ "启可以立即完成。 路由关闭后将等待1分钟再重新启动。"
-#~ msgid ""
-#~ "On the windows platform, there is a small application to sit in the "
-#~ "system tray, allowing you to view the router's status (later on, I2P "
-#~ "client applications will be able to integrate their own functionality "
-#~ "into the system tray as well). If you are on windows, you can either "
-#~ "enable or disable that icon here."
-#~ msgstr ""
-#~ "windows 平台允许小程序进驻系统托盘,让你可以查看路由状态,(以后的 I2P 客户"
-#~ "端程序也会将它们的功能集成到系统托盘里)。如果你使用Windows, 可以在这里开启"
-#~ "或关闭这个托盘图标。"
-
+# I2P
+# Copyright (C) 2009 The I2P Project
+# This file is distributed under the same license as the routerconsole package.
+# To contribute translations, see http://www.i2p2.de/newdevelopers
+# foo <foo@bar>, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: I2P routerconsole\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-01-02 08:13+0000\n"
+"PO-Revision-Date: \n"
+"Last-Translator: walking <zhazhenzhong@gmail.com>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Chinese\n"
+"X-Poedit-Country: CHINA\n"
+
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:117
+#, java-format
+msgid "Banned by router hash: {0}"
+msgstr "按路由器指纹封杀:{0}"
+
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:119
+msgid "Banned by router hash"
+msgstr "路由指纹封锁"
+
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:664
+msgid "IP banned"
+msgstr "IP封锁"
+
+#: ../../../router/java/src/net/i2p/router/Blocklist.java:734
+#, java-format
+msgid "IP banned by blocklist.txt entry {0}"
+msgstr "按IP黑名单blocklist.txt封杀的节点{0}"
+
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:91
+msgid "Rejecting tunnels: Shutting down"
+msgstr "拒绝共享:准备退出"
+
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:140
+msgid "Rejecting tunnels: High message delay"
+msgstr "拒绝共享:高消息延迟"
+
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:176
+msgid "Rejecting most tunnels: High number of requests"
+msgstr "收紧共享:高请求量"
+
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:232
+msgid "Rejecting tunnels: Limit reached"
+msgstr "拒绝共享:隧道数限额"
+
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:300
+msgid "Rejecting tunnels: Bandwidth limit"
+msgstr "拒绝共享:带宽限额"
+
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:370
+msgid "Rejecting most tunnels: Bandwidth limit"
+msgstr "收紧共享:带宽限额"
+
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:374
+msgid "Accepting most tunnels"
+msgstr "接收多数隧道"
+
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:376
+msgid "Accepting tunnels"
+msgstr "接收共享隧道"
+
+#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:486
+msgid "Rejecting tunnels"
+msgstr "拒绝参与共享隧道"
+
+#: ../../../router/java/src/net/i2p/router/transport/GetBidsJob.java:70
+msgid "No transports (hidden or starting up?)"
+msgstr "无数据传输(隐身或正在启动)"
+
+#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:450
+msgid "Unreachable on any transport"
+msgstr "各传输方式均不可达"
+
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/EstablishState.java:373
+#: ../../../router/java/src/net/i2p/router/transport/ntcp/EstablishState.java:578
+#, java-format
+msgid "Excessive clock skew: {0}"
+msgstr "严重时滞:{0}"
+
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:137
+msgid "Dropping tunnel requests: Too slow"
+msgstr "忽略共享请求:速度太慢"
+
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:354
+msgid "Dropping tunnel requests: Overloaded"
+msgstr "忽略共享请求:路由过载"
+
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:521
+msgid "Rejecting tunnels: Request overload"
+msgstr "拒绝共享:请求过多"
+
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:546
+msgid "Rejecting tunnels: Connection limit"
+msgstr "拒绝共享:连接受限"
+
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:748
+msgid "Dropping tunnel requests: High load"
+msgstr "忽略共享请求:高负载"
+
+#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:757
+msgid "Dropping tunnel requests: Queue time"
+msgstr "忽略共享请求:队列积压"
+
+#: ../java/build/Countries.java:3
+msgid "Andorra"
+msgstr "安道尔"
+
+#: ../java/build/Countries.java:4
+msgid "United Arab Emirates"
+msgstr "阿联酋"
+
+#: ../java/build/Countries.java:5
+msgid "Afghanistan"
+msgstr "阿富汗"
+
+#: ../java/build/Countries.java:6
+msgid "Antigua and Barbuda"
+msgstr "安提瓜与巴布达"
+
+#: ../java/build/Countries.java:7
+msgid "Anguilla"
+msgstr "安格拉"
+
+#: ../java/build/Countries.java:8
+msgid "Albania"
+msgstr "阿尔巴尼亚"
+
+#: ../java/build/Countries.java:9
+msgid "Armenia"
+msgstr "亚美尼亚"
+
+#: ../java/build/Countries.java:10
+msgid "Netherlands Antilles"
+msgstr "荷兰属地"
+
+#: ../java/build/Countries.java:11
+msgid "Angola"
+msgstr "安哥拉"
+
+#: ../java/build/Countries.java:12
+msgid "Antarctica"
+msgstr "南极洲"
+
+#: ../java/build/Countries.java:13
+msgid "Argentina"
+msgstr "阿根廷"
+
+#: ../java/build/Countries.java:14
+msgid "American Samoa"
+msgstr "东萨摩亚"
+
+#: ../java/build/Countries.java:15
+msgid "Austria"
+msgstr "奥地利"
+
+#: ../java/build/Countries.java:16
+msgid "Australia"
+msgstr "澳大利亚"
+
+#: ../java/build/Countries.java:17
+msgid "Aruba"
+msgstr "阿鲁巴"
+
+#: ../java/build/Countries.java:19
+msgid "Azerbaijan"
+msgstr "阿塞拜疆"
+
+#: ../java/build/Countries.java:20
+msgid "Bosnia and Herzegovina"
+msgstr "波黑"
+
+#: ../java/build/Countries.java:21
+msgid "Barbados"
+msgstr "巴巴多斯"
+
+#: ../java/build/Countries.java:22
+msgid "Bangladesh"
+msgstr "孟加拉"
+
+#: ../java/build/Countries.java:23
+msgid "Belgium"
+msgstr "比利时"
+
+#: ../java/build/Countries.java:24
+msgid "Burkina Faso"
+msgstr "布基纳法索"
+
+#: ../java/build/Countries.java:25
+msgid "Bulgaria"
+msgstr "保加利亚"
+
+#: ../java/build/Countries.java:26
+msgid "Bahrain"
+msgstr "å·´æž—"
+
+#: ../java/build/Countries.java:27
+msgid "Burundi"
+msgstr "不丹"
+
+#: ../java/build/Countries.java:28
+msgid "Benin"
+msgstr "贝宁"
+
+#: ../java/build/Countries.java:29
+msgid "Bermuda"
+msgstr "百慕大"
+
+#: ../java/build/Countries.java:30
+msgid "Brunei Darussalam"
+msgstr "文莱达鲁萨兰"
+
+#: ../java/build/Countries.java:31
+msgid "Bolivia"
+msgstr "玻利维亚"
+
+#: ../java/build/Countries.java:32
+msgid "Brazil"
+msgstr "巴西"
+
+#: ../java/build/Countries.java:33
+msgid "Bahamas"
+msgstr "巴哈马"
+
+#: ../java/build/Countries.java:34
+msgid "Bhutan"
+msgstr "不丹"
+
+#: ../java/build/Countries.java:35
+msgid "Bouvet Island"
+msgstr "布韦群岛"
+
+#: ../java/build/Countries.java:36
+msgid "Botswana"
+msgstr "伯兹瓦纳"
+
+#: ../java/build/Countries.java:37
+msgid "Belarus"
+msgstr "白俄罗斯"
+
+#: ../java/build/Countries.java:38
+msgid "Belize"
+msgstr "伯利兹"
+
+#: ../java/build/Countries.java:39
+msgid "Canada"
+msgstr "加拿大"
+
+#: ../java/build/Countries.java:40
+msgid "The Democratic Republic of the Congo"
+msgstr "刚果"
+
+#: ../java/build/Countries.java:41
+msgid "Central African Republic"
+msgstr "中非"
+
+#: ../java/build/Countries.java:42
+msgid "Congo"
+msgstr "Congo"
+
+#: ../java/build/Countries.java:43
+msgid "Switzerland"
+msgstr "瑞士"
+
+#: ../java/build/Countries.java:44
+msgid "Cote D'Ivoire"
+msgstr "象牙海岸"
+
+#: ../java/build/Countries.java:45
+msgid "Cook Islands"
+msgstr "库克群岛"
+
+#: ../java/build/Countries.java:46
+msgid "Chile"
+msgstr "智利"
+
+#: ../java/build/Countries.java:47
+msgid "Cameroon"
+msgstr "喀麦隆"
+
+#: ../java/build/Countries.java:48
+msgid "China"
+msgstr "中国"
+
+#: ../java/build/Countries.java:49
+msgid "Colombia"
+msgstr "哥伦比亚"
+
+#: ../java/build/Countries.java:50
+msgid "Costa Rica"
+msgstr "哥斯达黎加"
+
+#: ../java/build/Countries.java:51
+msgid "Serbia and Montenegro"
+msgstr "塞尔维亚与黑山"
+
+#: ../java/build/Countries.java:52
+msgid "Cuba"
+msgstr "古巴"
+
+#: ../java/build/Countries.java:53
+msgid "Cape Verde"
+msgstr "佛得角"
+
+#: ../java/build/Countries.java:54
+msgid "Cyprus"
+msgstr "塞浦路斯"
+
+#: ../java/build/Countries.java:55
+msgid "Czech Republic"
+msgstr "捷克"
+
+#: ../java/build/Countries.java:56
+msgid "Germany"
+msgstr "德国"
+
+#: ../java/build/Countries.java:57
+msgid "Djibouti"
+msgstr "吉布提"
+
+#: ../java/build/Countries.java:58
+msgid "Denmark"
+msgstr "丹麦"
+
+#: ../java/build/Countries.java:59
+msgid "Dominica"
+msgstr "多米尼"
+
+#: ../java/build/Countries.java:60
+msgid "Dominican Republic"
+msgstr "多米尼加联邦"
+
+#: ../java/build/Countries.java:61
+msgid "Algeria"
+msgstr "阿尔及利亚"
+
+#: ../java/build/Countries.java:62
+msgid "Ecuador"
+msgstr "厄瓜多尔"
+
+#: ../java/build/Countries.java:63
+msgid "Estonia"
+msgstr "爱沙尼亚"
+
+#: ../java/build/Countries.java:64
+msgid "Egypt"
+msgstr "埃及"
+
+#: ../java/build/Countries.java:65
+msgid "Eritrea"
+msgstr "厄立特里亚"
+
+#: ../java/build/Countries.java:66
+msgid "Spain"
+msgstr "西班牙"
+
+#: ../java/build/Countries.java:67
+msgid "Ethiopia"
+msgstr "埃塞俄比亚"
+
+#: ../java/build/Countries.java:68
+msgid "Finland"
+msgstr "芬兰"
+
+#: ../java/build/Countries.java:69
+msgid "Fiji"
+msgstr "斐济"
+
+#: ../java/build/Countries.java:70
+msgid "Falkland Islands (Malvinas)"
+msgstr "福克兰群岛"
+
+#: ../java/build/Countries.java:71
+msgid "Federated States of Micronesia"
+msgstr "密克罗尼西亚"
+
+#: ../java/build/Countries.java:72
+msgid "Faroe Islands"
+msgstr "法罗群岛"
+
+#: ../java/build/Countries.java:73
+msgid "France"
+msgstr "法国"
+
+#: ../java/build/Countries.java:74
+msgid "Gabon"
+msgstr "加蓬"
+
+#: ../java/build/Countries.java:75
+msgid "United Kingdom"
+msgstr "英国"
+
+#: ../java/build/Countries.java:76
+msgid "Grenada"
+msgstr "格林纳达"
+
+#: ../java/build/Countries.java:77
+msgid "Georgia"
+msgstr "格鲁吉亚"
+
+#: ../java/build/Countries.java:78
+msgid "French Guiana"
+msgstr "圭亚那"
+
+#: ../java/build/Countries.java:79
+msgid "Ghana"
+msgstr "加纳"
+
+#: ../java/build/Countries.java:80
+msgid "Gibraltar"
+msgstr "直布罗陀"
+
+#: ../java/build/Countries.java:81
+msgid "Greenland"
+msgstr "格陵兰群岛"
+
+#: ../java/build/Countries.java:82
+msgid "Gambia"
+msgstr "冈比亚"
+
+#: ../java/build/Countries.java:83
+msgid "Guinea"
+msgstr "几内亚"
+
+#: ../java/build/Countries.java:84
+msgid "Guadeloupe"
+msgstr "瓜德罗普岛"
+
+#: ../java/build/Countries.java:85
+msgid "Equatorial Guinea"
+msgstr "赤道几内亚"
+
+#: ../java/build/Countries.java:86
+msgid "Greece"
+msgstr "希腊"
+
+#: ../java/build/Countries.java:87
+msgid "South Georgia and the South Sandwich Islands"
+msgstr "南乔治亚岛和南桑德韦奇岛"
+
+#: ../java/build/Countries.java:88
+msgid "Guatemala"
+msgstr "危地马拉"
+
+#: ../java/build/Countries.java:89
+msgid "Guam"
+msgstr "关岛"
+
+#: ../java/build/Countries.java:90
+msgid "Guinea-Bissau"
+msgstr "几内亚比绍"
+
+#: ../java/build/Countries.java:91
+msgid "Guyana"
+msgstr "圭亚那"
+
+#: ../java/build/Countries.java:92
+msgid "Hong Kong"
+msgstr "香港"
+
+#: ../java/build/Countries.java:93
+msgid "Honduras"
+msgstr "洪都拉斯"
+
+#: ../java/build/Countries.java:94
+msgid "Croatia"
+msgstr "克罗蒂亚"
+
+#: ../java/build/Countries.java:95
+msgid "Haiti"
+msgstr "海地"
+
+#: ../java/build/Countries.java:96
+msgid "Hungary"
+msgstr "匈牙利"
+
+#: ../java/build/Countries.java:97
+msgid "Indonesia"
+msgstr "印尼"
+
+#: ../java/build/Countries.java:98
+msgid "Ireland"
+msgstr "爱尔兰"
+
+#: ../java/build/Countries.java:99
+msgid "Israel"
+msgstr "以色列"
+
+#: ../java/build/Countries.java:101
+msgid "India"
+msgstr "印度"
+
+#: ../java/build/Countries.java:102
+msgid "British Indian Ocean Territory"
+msgstr "英属印度洋地区"
+
+#: ../java/build/Countries.java:103
+msgid "Iraq"
+msgstr "伊拉克"
+
+#: ../java/build/Countries.java:104
+msgid "Islamic Republic of Iran"
+msgstr "伊朗"
+
+#: ../java/build/Countries.java:105
+msgid "Iceland"
+msgstr "冰岛"
+
+#: ../java/build/Countries.java:106
+msgid "Italy"
+msgstr "意大利"
+
+#: ../java/build/Countries.java:108
+msgid "Jamaica"
+msgstr "牙买加"
+
+#: ../java/build/Countries.java:109
+msgid "Jordan"
+msgstr "约旦"
+
+#: ../java/build/Countries.java:110
+msgid "Japan"
+msgstr "日本"
+
+#: ../java/build/Countries.java:111
+msgid "Kenya"
+msgstr "肯尼亚"
+
+#: ../java/build/Countries.java:112
+msgid "Kyrgyzstan"
+msgstr "吉尔吉斯斯坦"
+
+#: ../java/build/Countries.java:113
+msgid "Cambodia"
+msgstr "柬埔塞"
+
+#: ../java/build/Countries.java:114
+msgid "Kiribati"
+msgstr "基里巴斯"
+
+#: ../java/build/Countries.java:115
+msgid "Comoros"
+msgstr "科摩罗"
+
+#: ../java/build/Countries.java:116
+msgid "Saint Kitts and Nevis"
+msgstr "圣克里斯多福与尼维斯"
+
+#: ../java/build/Countries.java:117
+msgid "Republic of Korea"
+msgstr "韩国"
+
+#: ../java/build/Countries.java:118
+msgid "Kuwait"
+msgstr "科威特"
+
+#: ../java/build/Countries.java:119
+msgid "Cayman Islands"
+msgstr "开曼群岛"
+
+#: ../java/build/Countries.java:120
+msgid "Kazakhstan"
+msgstr "哈萨克斯坦"
+
+#: ../java/build/Countries.java:121
+msgid "Lao People's Democratic Republic"
+msgstr "老挝"
+
+#: ../java/build/Countries.java:122
+msgid "Lebanon"
+msgstr "黎巴嫩"
+
+#: ../java/build/Countries.java:123
+msgid "Saint Lucia"
+msgstr "圣露西亚岛"
+
+#: ../java/build/Countries.java:124
+msgid "Liechtenstein"
+msgstr "列支敦士登"
+
+#: ../java/build/Countries.java:125
+msgid "Sri Lanka"
+msgstr "斯里兰卡"
+
+#: ../java/build/Countries.java:126
+msgid "Liberia"
+msgstr "利比里亚"
+
+#: ../java/build/Countries.java:127
+msgid "Lesotho"
+msgstr "莱索托"
+
+#: ../java/build/Countries.java:128
+msgid "Lithuania"
+msgstr "立陶宛"
+
+#: ../java/build/Countries.java:129
+msgid "Luxembourg"
+msgstr "卢森堡"
+
+#: ../java/build/Countries.java:130
+msgid "Latvia"
+msgstr "拉脱维亚"
+
+#: ../java/build/Countries.java:131
+msgid "Libyan Arab Jamahiriya"
+msgstr "利比亚"
+
+#: ../java/build/Countries.java:132
+msgid "Morocco"
+msgstr "摩洛哥"
+
+#: ../java/build/Countries.java:133
+msgid "Monaco"
+msgstr "摩纳哥"
+
+#: ../java/build/Countries.java:134
+msgid "Republic of Moldova"
+msgstr "摩尔多瓦"
+
+#: ../java/build/Countries.java:137
+msgid "Madagascar"
+msgstr "马达加斯加"
+
+#: ../java/build/Countries.java:138
+msgid "Marshall Islands"
+msgstr "马绍尔群岛"
+
+#: ../java/build/Countries.java:139
+msgid "The Former Yugoslav Republic of Macedonia"
+msgstr "前南斯拉夫之马其顿共和国"
+
+#: ../java/build/Countries.java:140
+msgid "Mali"
+msgstr "马里"
+
+#: ../java/build/Countries.java:141
+msgid "Myanmar"
+msgstr "缅甸"
+
+#: ../java/build/Countries.java:142
+msgid "Mongolia"
+msgstr "蒙古"
+
+#: ../java/build/Countries.java:143
+msgid "Macao"
+msgstr "澳门"
+
+#: ../java/build/Countries.java:144
+msgid "Northern Mariana Islands"
+msgstr "北马里亚纳群岛"
+
+#: ../java/build/Countries.java:145
+msgid "Martinique"
+msgstr "马提尼克岛"
+
+#: ../java/build/Countries.java:146
+msgid "Mauritania"
+msgstr "毛里塔尼亚"
+
+#: ../java/build/Countries.java:147
+msgid "Montserrat"
+msgstr "蒙特塞拉特"
+
+#: ../java/build/Countries.java:148
+msgid "Malta"
+msgstr "马尔他"
+
+#: ../java/build/Countries.java:149
+msgid "Mauritius"
+msgstr "毛里求斯"
+
+#: ../java/build/Countries.java:150
+msgid "Maldives"
+msgstr "马尔代夫"
+
+#: ../java/build/Countries.java:151
+msgid "Malawi"
+msgstr "马拉维"
+
+#: ../java/build/Countries.java:152
+msgid "Mexico"
+msgstr "墨西哥"
+
+#: ../java/build/Countries.java:153
+msgid "Malaysia"
+msgstr "马来西亚"
+
+#: ../java/build/Countries.java:154
+msgid "Mozambique"
+msgstr "莫桑比克"
+
+#: ../java/build/Countries.java:155
+msgid "Namibia"
+msgstr "纳米比亚"
+
+#: ../java/build/Countries.java:156
+msgid "New Caledonia"
+msgstr "新喀里多尼亚"
+
+#: ../java/build/Countries.java:157
+msgid "Niger"
+msgstr "尼日尔"
+
+#: ../java/build/Countries.java:158
+msgid "Norfolk Island"
+msgstr "尼加拉瓜"
+
+#: ../java/build/Countries.java:159
+msgid "Nigeria"
+msgstr "尼日利亚"
+
+#: ../java/build/Countries.java:160
+msgid "Nicaragua"
+msgstr "尼加拉瓜"
+
+#: ../java/build/Countries.java:161
+msgid "Netherlands"
+msgstr "荷兰"
+
+#: ../java/build/Countries.java:162
+msgid "Norway"
+msgstr "挪威"
+
+#: ../java/build/Countries.java:163
+msgid "Nepal"
+msgstr "尼泊尔"
+
+#: ../java/build/Countries.java:164
+msgid "Nauru"
+msgstr "瑙鲁"
+
+#: ../java/build/Countries.java:165
+msgid "Niue"
+msgstr "纽埃岛"
+
+#: ../java/build/Countries.java:166
+msgid "New Zealand"
+msgstr "新西兰"
+
+#: ../java/build/Countries.java:167
+msgid "Oman"
+msgstr "阿曼"
+
+#: ../java/build/Countries.java:168
+msgid "Panama"
+msgstr "巴拿马"
+
+#: ../java/build/Countries.java:169
+msgid "Peru"
+msgstr "秘鲁"
+
+#: ../java/build/Countries.java:170
+msgid "French Polynesia"
+msgstr "玻利尼西亚"
+
+#: ../java/build/Countries.java:171
+msgid "Papua New Guinea"
+msgstr "巴布亚新几内亚"
+
+#: ../java/build/Countries.java:172
+msgid "Philippines"
+msgstr "菲律宾"
+
+#: ../java/build/Countries.java:173
+msgid "Pakistan"
+msgstr "巴基斯坦"
+
+#: ../java/build/Countries.java:174
+msgid "Poland"
+msgstr "波兰"
+
+#: ../java/build/Countries.java:175
+msgid "Saint Pierre and Miquelon"
+msgstr "圣皮埃尔岛和密克隆"
+
+#: ../java/build/Countries.java:176
+msgid "Puerto Rico"
+msgstr "波多黎各"
+
+#: ../java/build/Countries.java:177
+msgid "Palestinian Territory"
+msgstr "巴勒斯坦地区"
+
+#: ../java/build/Countries.java:178
+msgid "Portugal"
+msgstr "葡萄牙"
+
+#: ../java/build/Countries.java:179
+msgid "Palau"
+msgstr "帕劳"
+
+#: ../java/build/Countries.java:180
+msgid "Paraguay"
+msgstr "巴拉圭"
+
+#: ../java/build/Countries.java:181
+msgid "Qatar"
+msgstr "卡塔尔"
+
+#: ../java/build/Countries.java:182
+msgid "Reunion"
+msgstr "留尼汪岛"
+
+#: ../java/build/Countries.java:183
+msgid "Romania"
+msgstr "罗马尼亚"
+
+#: ../java/build/Countries.java:184
+msgid "Serbia"
+msgstr "塞尔维亚"
+
+#: ../java/build/Countries.java:185
+msgid "Russian Federation"
+msgstr "俄联邦"
+
+#: ../java/build/Countries.java:186
+msgid "Rwanda"
+msgstr "卢旺达"
+
+#: ../java/build/Countries.java:187
+msgid "Saudi Arabia"
+msgstr "沙特阿拉伯"
+
+#: ../java/build/Countries.java:188
+msgid "Solomon Islands"
+msgstr "所罗门群岛"
+
+#: ../java/build/Countries.java:189
+msgid "Seychelles"
+msgstr "塞舌尔"
+
+#: ../java/build/Countries.java:190
+msgid "Sudan"
+msgstr "苏丹"
+
+#: ../java/build/Countries.java:191
+msgid "Sweden"
+msgstr "ç‘žå…¸"
+
+#: ../java/build/Countries.java:192
+msgid "Singapore"
+msgstr "新加坡"
+
+#: ../java/build/Countries.java:193
+msgid "Slovenia"
+msgstr "斯洛文尼亚"
+
+#: ../java/build/Countries.java:194
+msgid "Slovakia"
+msgstr "斯洛伐克"
+
+#: ../java/build/Countries.java:195
+msgid "Sierra Leone"
+msgstr "塞拉利昂"
+
+#: ../java/build/Countries.java:196
+msgid "San Marino"
+msgstr "圣马力诺"
+
+#: ../java/build/Countries.java:197
+msgid "Senegal"
+msgstr "塞内加尔"
+
+#: ../java/build/Countries.java:198
+msgid "Somalia"
+msgstr "索马里"
+
+#: ../java/build/Countries.java:199
+msgid "Suriname"
+msgstr "苏里南"
+
+#: ../java/build/Countries.java:200
+msgid "Sao Tome and Principe"
+msgstr "圣多美与普林西比共和国"
+
+#: ../java/build/Countries.java:201
+msgid "El Salvador"
+msgstr "萨尔瓦多"
+
+#: ../java/build/Countries.java:202
+msgid "Syrian Arab Republic"
+msgstr "叙利亚"
+
+#: ../java/build/Countries.java:203
+msgid "Swaziland"
+msgstr "斯威士兰"
+
+#: ../java/build/Countries.java:204
+msgid "Turks and Caicos Islands"
+msgstr "特克斯和凯科斯群岛"
+
+#: ../java/build/Countries.java:205
+msgid "Chad"
+msgstr "乍得"
+
+#: ../java/build/Countries.java:206
+msgid "French Southern Territories"
+msgstr "法属南半球领地"
+
+#: ../java/build/Countries.java:207
+msgid "Togo"
+msgstr "多哥"
+
+#: ../java/build/Countries.java:208
+msgid "Thailand"
+msgstr "泰国"
+
+#: ../java/build/Countries.java:209
+msgid "Tajikistan"
+msgstr "塔吉克斯坦"
+
+#: ../java/build/Countries.java:210
+msgid "Tokelau"
+msgstr "托克劳群岛"
+
+#: ../java/build/Countries.java:211
+msgid "Timor-Leste"
+msgstr "东帝汶"
+
+#: ../java/build/Countries.java:212
+msgid "Turkmenistan"
+msgstr "土库曼斯坦"
+
+#: ../java/build/Countries.java:213
+msgid "Tunisia"
+msgstr "突尼斯"
+
+#: ../java/build/Countries.java:214
+msgid "Tonga"
+msgstr "汤加"
+
+#: ../java/build/Countries.java:215
+msgid "Turkey"
+msgstr "土耳其"
+
+#: ../java/build/Countries.java:216
+msgid "Trinidad and Tobago"
+msgstr "特立尼达和多巴哥"
+
+#: ../java/build/Countries.java:217
+msgid "Tuvalu"
+msgstr "图瓦鲁"
+
+#: ../java/build/Countries.java:218
+msgid "Taiwan"
+msgstr "台湾"
+
+#: ../java/build/Countries.java:219
+msgid "United Republic of Tanzania"
+msgstr "坦桑尼亚"
+
+#: ../java/build/Countries.java:220
+msgid "Ukraine"
+msgstr "乌克兰"
+
+#: ../java/build/Countries.java:221
+msgid "Uganda"
+msgstr "乌干达"
+
+#: ../java/build/Countries.java:222
+msgid "United States Minor Outlying Islands"
+msgstr "美国本土外小岛屿"
+
+#: ../java/build/Countries.java:223
+msgid "United States"
+msgstr "美国"
+
+#: ../java/build/Countries.java:224
+msgid "Uruguay"
+msgstr "乌拉圭"
+
+#: ../java/build/Countries.java:225
+msgid "Uzbekistan"
+msgstr "乌兹别克斯坦"
+
+#: ../java/build/Countries.java:226
+msgid "Holy See (Vatican City State)"
+msgstr "梵地冈"
+
+#: ../java/build/Countries.java:227
+msgid "Saint Vincent and the Grenadines"
+msgstr "圣文森特和格林纳丁斯"
+
+#: ../java/build/Countries.java:228
+msgid "Venezuela"
+msgstr "委内瑞拉"
+
+#: ../java/build/Countries.java:229 ../java/build/Countries.java:230
+msgid "Virgin Islands"
+msgstr "维京群岛"
+
+#: ../java/build/Countries.java:231
+msgid "Viet Nam"
+msgstr "越南"
+
+#: ../java/build/Countries.java:232
+msgid "Vanuatu"
+msgstr "瓦努阿图"
+
+#: ../java/build/Countries.java:233
+msgid "Wallis and Futuna"
+msgstr "瓦利斯群岛和富图纳群岛"
+
+#: ../java/build/Countries.java:234
+msgid "Samoa"
+msgstr "东萨摩亚"
+
+#: ../java/build/Countries.java:235
+msgid "Yemen"
+msgstr "也门"
+
+#: ../java/build/Countries.java:236
+msgid "Mayotte"
+msgstr "马约特"
+
+#: ../java/build/Countries.java:237
+msgid "South Africa"
+msgstr "南非"
+
+#: ../java/build/Countries.java:238
+msgid "Zambia"
+msgstr "赞比亚"
+
+#: ../java/build/Countries.java:239
+msgid "Zimbabwe"
+msgstr "津巴布韦"
+
+#: ../java/src/net/i2p/router/web/CSSHelper.java:54
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:30
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:32
+#: ../java/strings/Strings.java:29
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:234
+msgid "I2P Router Console"
+msgstr "I2P 路由控制台"
+
+#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:57
+msgid "Error updating the configuration - please see the error logs"
+msgstr "配置更新出错 - 请查看错误日志"
+
+#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:69
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:263
+msgid "Configuration saved successfully"
+msgstr "设置保存成功"
+
+#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:71
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:265
+msgid ""
+"Error saving the configuration (applied but not saved) - please see the "
+"error logs"
+msgstr "配置保存出错(已应用但未保存) - 参见错误日志"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:32
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:321
+msgid "Save Client Configuration"
+msgstr "保存客户程序设置"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:36
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:333
+msgid "Save WebApp Configuration"
+msgstr "保存 WebApp 设置"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:54
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:67
+msgid "Start"
+msgstr "启动"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:68
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:49
+msgid "Unsupported"
+msgstr "未支持的"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:83
+msgid ""
+"Client configuration saved successfully - restart required to take effect."
+msgstr "客户程序设置保存成功 - 程序重启后生效"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:89
+msgid "Bad client index."
+msgstr "客户程序索引无效"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:94
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:17
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:363
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:382
+msgid "Client"
+msgstr "客户"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:94
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:129
+msgid "started"
+msgstr "已启动"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:111
+msgid ""
+"WebApp configuration saved successfully - restart required to take effect."
+msgstr "WebApp设置保存成功 - 程序重启后生效"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:129
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:34
+msgid "WebApp"
+msgstr "Web程序"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:131
+msgid "Failed to start"
+msgstr "启动失败"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:137
+msgid "Failed to find server."
+msgstr "服务器或服务程序查找失败。"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:17
+msgid "Class and arguments"
+msgstr "类与参数"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:17
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:34
+msgid "Run at Startup?"
+msgstr "启动时运行?"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:17
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:34
+msgid "Start Now"
+msgstr "立即启动"
+
+#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:34
+msgid "Description"
+msgstr "描述"
+
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:18
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:320
+msgid "Add key"
+msgstr "添加密钥"
+
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:19
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:322
+msgid "Delete key"
+msgstr "删除密钥"
+
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:21
+msgid "You must enter a destination"
+msgstr "您必须输入一个目标"
+
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:23
+msgid "You must enter a key"
+msgstr "您必须输入一个密钥"
+
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:34
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:41
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:43
+msgid "Key for"
+msgstr "密钥"
+
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:34
+msgid "added to keyring"
+msgstr "已加入钥匙环"
+
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:36
+msgid "Invalid destination or key"
+msgstr "目标或密钥无效"
+
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:41
+msgid "removed from keyring"
+msgstr "已从钥匙环中删除"
+
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:43
+msgid "not found in keyring"
+msgstr "在钥匙环未找到"
+
+#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:45
+msgid "Invalid destination"
+msgstr "目标无效"
+
+#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:52
+msgid "CRIT"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:52
+msgid "DEBUG"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:52
+msgid "ERROR"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:52
+msgid "INFO"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:52
+msgid "WARN"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
+msgid "Network"
+msgstr "网络"
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
+msgid "Service"
+msgstr "服务"
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:86
+#: ../java/strings/Strings.java:72
+msgid "Tunnels"
+msgstr "隧道"
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
+msgid "UI"
+msgstr "界面"
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:202
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:209
+msgid "Update"
+msgstr "æ›´æ–°"
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
+msgid "Clients"
+msgstr "客户端"
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:292
+msgid "Keyring"
+msgstr "钥匙环"
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
+msgid "Logging"
+msgstr "日志"
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:92
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:227
+#: ../java/strings/Strings.java:67
+msgid "Peers"
+msgstr "节点"
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:293
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:128
+msgid "Stats"
+msgstr "统计"
+
+#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:20
+msgid "Advanced"
+msgstr "高级"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:48
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:261
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:35
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:357
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:502
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:333
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:373
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:341
+msgid "Save changes"
+msgstr "保存修改"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:121
+msgid "Rechecking router reachability..."
+msgstr "正在重检查路由连通性..."
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:150
+msgid "Updating IP address"
+msgstr "正在更新IP地址"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:168
+msgid "Disabling TCP completely"
+msgstr "正在彻底禁用TCP"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:172
+msgid "Updating inbound TCP address to"
+msgstr "正在更新进站TCP地址至"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:176
+msgid "Disabling inbound TCP"
+msgstr "正在禁用入站TCP"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:178
+msgid "Updating inbound TCP address to auto"
+msgstr "正在更新入站TCP地址至"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:187
+msgid "Updating inbound TCP port to"
+msgstr "正在更新入站TCP端口至"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:190
+msgid "Updating inbound TCP port to auto"
+msgstr "正在更新入站TCP端口至"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:202
+msgid "Updating UDP port from"
+msgstr "正在更新UDP端口由"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:202
+msgid "to"
+msgstr "至"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:218
+msgid "Gracefully restarting into Hidden Router Mode"
+msgstr "正在平滑重启路由进入隐身模式"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:220
+msgid "Gracefully restarting to exit Hidden Router Mode"
+msgstr "正在平滑重启路由退出隐身模式"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:229
+msgid "Enabling UPnP, restart required to take effect"
+msgstr "正在启用UPnP,程序重启后生效"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:231
+msgid "Disabling UPnP, restart required to take effect"
+msgstr "正在禁用UPnP,程序重启后生效"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:239
+msgid "Enabling laptop mode"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:241
+msgid "Disabling laptop mode"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:247
+msgid "Requiring SSU introducers"
+msgstr "正在获取SSU中介"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:288
+msgid "Gracefully restarting I2P to change published router address"
+msgstr "正在平滑重启路由重新发布路由地址"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:308
+msgid "Updating bandwidth share percentage"
+msgstr "正在更新共享带宽比例"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:378
+msgid "Updated bandwidth limits"
+msgstr "带宽限制更新完毕"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:39
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:47
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:50
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:57
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:60
+msgid "unknown"
+msgstr "未知"
+
+#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:169
+msgid "bits per second"
+msgstr "比特/秒"
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:20
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:314
+msgid "Ban peer until restart"
+msgstr "封杀节点直到重启"
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:23
+#, java-format
+msgid "Manually banned via {0}"
+msgstr "通过{0}手动封锁"
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:24
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:33
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:35
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:81
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:187
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:235
+msgid "Peer"
+msgstr "节点"
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:24
+msgid "banned until restart"
+msgstr "已封锁直到重启"
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:27
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:38
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:59
+msgid "Invalid peer"
+msgstr "无效节点"
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:28
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:316
+msgid "Unban peer"
+msgstr "节点解封"
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:33
+msgid "unbanned"
+msgstr "已解封"
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:35
+msgid "is not currently banned"
+msgstr "目前未封锁"
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:39
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:322
+msgid "Adjust Profile Bonuses"
+msgstr "调整节点评分"
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:47
+msgid "Bad speed value"
+msgstr "速度值无效"
+
+#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:52
+msgid "Bad capacity value"
+msgstr "容量值无效"
+
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:32
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:57
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:292
+msgid "Shutdown immediately"
+msgstr "立刻关闭"
+
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:36
+msgid "Cancel shutdown"
+msgstr "取消关闭"
+
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:37
+msgid "Cancel restart"
+msgstr "取消重启"
+
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:39
+msgid "Restart immediately"
+msgstr "立刻重启"
+
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:43
+msgid "Restart"
+msgstr "重 启"
+
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:46
+msgid "Shutdown"
+msgstr "关 闭"
+
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:59
+msgid "Restart imminent"
+msgstr "立刻重启"
+
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:61
+msgid "Shutdown imminent"
+msgstr "立刻关闭"
+
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:65
+#, java-format
+msgid "Shutdown in {0}"
+msgstr "{0} 后退出"
+
+#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:70
+#, java-format
+msgid "Restart in {0}"
+msgstr "{0} 后重启"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:53
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:290
+msgid "Shutdown gracefully"
+msgstr "平滑关闭"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:56
+msgid "Graceful shutdown initiated"
+msgstr "开始平滑关闭"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:60
+msgid "Shutdown immediately!  boom bye bye bad bwoy"
+msgstr "立即关闭!不推荐"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:61
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:294
+msgid "Cancel graceful shutdown"
+msgstr "取消平滑关闭"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:63
+msgid "Graceful shutdown cancelled"
+msgstr "平滑关闭已取消"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:64
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:308
+msgid "Graceful restart"
+msgstr "平滑重启"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:67
+msgid "Graceful restart requested"
+msgstr "平滑重启已请求"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:68
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:310
+msgid "Hard restart"
+msgstr "硬重启"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:71
+msgid "Hard restart requested"
+msgstr "硬重启已请求"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:72
+msgid "Rekey and Restart"
+msgstr "更换密钥并重启"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:73
+msgid "Rekeying after graceful restart"
+msgstr "平滑重启后更换密钥"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:76
+msgid "Rekey and Shutdown"
+msgstr "更换密钥并关闭"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:77
+msgid "Rekeying after graceful shutdown"
+msgstr "平滑关闭后更换密钥"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:80
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:338
+msgid "Run I2P on startup"
+msgstr "系统启动时运行I2P"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:82
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:340
+msgid "Don't run I2P on startup"
+msgstr "系统启动时不运行I2P"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:84
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:356
+msgid "Dump threads"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:91
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:324
+msgid "Show systray icon"
+msgstr "显示托盘图标"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:96
+msgid "System tray icon enabled."
+msgstr "系统托盘图标已启用"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:98
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:110
+msgid "System tray icon feature not supported on this platform. Sorry!"
+msgstr "您的平台不支持系统托盘图标功能"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:101
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:113
+msgid "Warning: unable to contact the systray manager"
+msgstr "警告:与托盘管理器通讯失败"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:103
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:326
+msgid "Hide systray icon"
+msgstr "隐藏系统图标"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:108
+msgid "System tray icon disabled."
+msgstr "系统托盘已禁用"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:115
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:364
+msgid "View console on startup"
+msgstr "程序启动时显示控制台"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:117
+msgid "Console is to be shown on startup"
+msgstr "启动后显示控制台"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:118
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:366
+msgid "Do not view console on startup"
+msgstr "启动后不打开控制台"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:120
+msgid "Console is not to be shown on startup"
+msgstr "启动后不显示控制台"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:129
+msgid "Service installed"
+msgstr "服务已安装"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:131
+msgid "Warning: unable to install the service"
+msgstr "警告:无法安装服务"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:137
+msgid "Service removed"
+msgstr "服务已卸载"
+
+#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:139
+msgid "Warning: unable to remove the service"
+msgstr "警告:无法卸载服务"
+
+#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:118
+msgid "Stat filter and location updated successfully to"
+msgstr "统计数据过滤器及位置成功更新至"
+
+#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:120
+msgid "Failed to update the stat filter and location"
+msgstr "统计数据过滤器及地址更新失败"
+
+#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:121
+msgid ""
+"Graph list updated, may take up to 60s to be reflected here and on the <a "
+"href=\"graphs.jsp\">Graphs Page</a>"
+msgstr ""
+"曲线图列表已更新,更新后的内容可能需要最多 60s 的时间才能在这里及 <a href="
+"\"graphs.jsp\">统计图表</a>页面中反映出来。"
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:137
+msgid "Updated settings for all pools."
+msgstr "隧道池更新完毕"
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:142
+msgid "Exploratory tunnel configuration saved successfully."
+msgstr "探索隧道设置保存成功。"
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:144
+#: ../java/src/net/i2p/router/web/ConfigUIHandler.java:36
+msgid ""
+"Error saving the configuration (applied but not saved) - please see the "
+"error logs."
+msgstr "配置保存出错(已应用但未保存) - 参见错误日志"
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:11
+msgid "hop"
+msgstr "跳点"
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:12
+msgid "tunnel"
+msgstr "隧道"
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:14
+msgid "hops"
+msgstr "跳点"
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:15
+msgid "tunnels"
+msgstr "隧道"
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:26
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:41
+msgid "Exploratory tunnels"
+msgstr "探测隧道"
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:46
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:61
+msgid "Client tunnels for"
+msgstr "客户隧道 - "
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:69
+msgid "ANONYMITY WARNING - Settings include 0-hop tunnels."
+msgstr "匿名性警告 - 设置中包括 0-跳点 隧道"
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:74
+msgid "ANONYMITY WARNING - Settings include 1-hop tunnels."
+msgstr "匿名性警告 - 设置中包括 1-跳点 隧道"
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:77
+msgid "PERFORMANCE WARNING - Settings include very long tunnels."
+msgstr "性能警告 - 设置中包括长隧道"
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:80
+msgid "PERFORMANCE WARNING - Settings include high tunnel quantities."
+msgstr "性能警告 - 设置中包括大量隧道"
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82
+msgid "Inbound"
+msgstr "入站"
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82
+msgid "Outbound"
+msgstr "出站"
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:87
+msgid "Length"
+msgstr "长度"
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:104
+msgid "Randomization"
+msgstr "随机"
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:128
+msgid "Quantity"
+msgstr "数量"
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:145
+msgid "Backup quantity"
+msgstr "备用数量"
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:167
+msgid "Inbound options"
+msgstr "入站选项"
+
+#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:180
+msgid "Outbound options"
+msgstr "出站选项"
+
+#: ../java/src/net/i2p/router/web/ConfigUIHandler.java:31
+msgid "Theme change saved."
+msgstr "主题设置已保存。"
+
+#: ../java/src/net/i2p/router/web/ConfigUIHandler.java:33
+msgid "Refresh the page to view."
+msgstr "刷新页面后查看。"
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:41
+msgid "English"
+msgstr "英语"
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:41
+msgid "French"
+msgstr "法语"
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:41
+msgid "German"
+msgstr "德语"
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:42
+msgid "Chinese"
+msgstr "中文"
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:42
+msgid "Dutch"
+msgstr "荷兰语"
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:42
+msgid "Russian"
+msgstr "俄语"
+
+#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:42
+msgid "Swedish"
+msgstr "瑞士语"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:56
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:310
+msgid "Check for updates"
+msgstr "检查更新"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:63
+msgid "Update available, attempting to download now"
+msgstr "有更新可用,正在尝试下载"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:65
+msgid "Update available, click button on left to download"
+msgstr "有更新可用,点左侧按钮下载"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:67
+msgid "No update available"
+msgstr "æ— æ›´æ–°"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:75
+msgid "Updating news URL to"
+msgstr "正在更新新闻链接至"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:83
+msgid "Updating proxy host to"
+msgstr "正在更新代理主机至"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:91
+msgid "Updating proxy port to"
+msgstr "正在更新代理端口至"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:104
+msgid "Updating refresh frequency to"
+msgstr "正在更新更新频率为"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:111
+msgid "Updating update policy to"
+msgstr "正在更新升级策略为"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:120
+msgid "Updating update URLs."
+msgstr "正在更新更新链接至"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:128
+msgid "Updating trusted keys."
+msgstr "正在更新可信公钥为"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:136
+msgid "Updating unsigned update URL to"
+msgstr "正在更新未签名软件链接至"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:75
+#: ../java/src/net/i2p/router/web/GraphHelper.java:115
+msgid "Never"
+msgstr "从不"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:77
+msgid "Every"
+msgstr "每"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:90
+#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:92
+msgid "Notify only"
+msgstr "只提示"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:95
+#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:97
+msgid "Download and verify only"
+msgstr "仅下载并验证"
+
+#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:101
+#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:103
+msgid "Download, verify, and restart"
+msgstr "仅下载、验证并重启"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:107
+msgid "Configure Graph Display"
+msgstr "图表显示设置"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:107
+msgid "Select Stats"
+msgstr "选择统计项"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:109
+msgid "Periods"
+msgstr "周期"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:110
+msgid "Plot averages"
+msgstr "事件均值"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:111
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:405
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:336
+msgid "or"
+msgstr "或"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:111
+msgid "plot events"
+msgstr "事件数量"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:112
+msgid "Image sizes"
+msgstr "图像尺寸"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:112
+msgid "width"
+msgstr "宽度"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:113
+msgid "height"
+msgstr "高度"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:113
+#: ../java/src/net/i2p/router/web/GraphHelper.java:114
+msgid "pixels"
+msgstr "像素"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:115
+msgid "Refresh delay"
+msgstr "刷新延迟"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:115
+msgid "hour"
+msgstr "小时"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:115
+msgid "minute"
+msgstr "分钟"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:115
+msgid "minutes"
+msgstr "分钟"
+
+#: ../java/src/net/i2p/router/web/GraphHelper.java:116
+msgid "Redraw"
+msgstr "重绘"
+
+#: ../java/src/net/i2p/router/web/LogsHelper.java:13
+#: ../java/src/net/i2p/router/web/LogsHelper.java:37
+msgid "File location"
+msgstr "文件位置"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:59
+msgid "Network Database RouterInfo Lookup"
+msgstr "网络数据库 RouterInfo 检索"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:74
+#: ../java/strings/Strings.java:68
+msgid "Router"
+msgstr "路由器"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:74
+msgid "not found in network database"
+msgstr "在网络数据库概况未找到"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:82
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:134
+msgid "Network Database Contents"
+msgstr "网络数据库内容"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:83
+msgid "View RouterInfo"
+msgstr "浏览 RouterInfo"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:84
+msgid "LeaseSets"
+msgstr "赁集"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:92
+msgid "LeaseSet"
+msgstr "赁集"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:94
+msgid "Local"
+msgstr "本地"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:96
+msgid "Unpublished"
+msgstr "未发布"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:97
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:104
+msgid "Destination"
+msgstr "目标"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:114
+#, java-format
+msgid "Expires in {0}"
+msgstr "{0} 后过期"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:116
+#, java-format
+msgid "Expired {0} ago"
+msgstr "{0}前过期"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:118
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:156
+msgid "Gateway"
+msgstr "网关"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:118
+msgid "Lease"
+msgstr "租赁"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:120
+msgid "Tunnel"
+msgstr "隧道"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:134
+msgid "View LeaseSets"
+msgstr "查看赁集"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:136
+msgid "Not initialized"
+msgstr "未初始化"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:145
+msgid "Routers"
+msgstr "路由器"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:147
+msgid "Show all routers"
+msgstr "显示所有路由器"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:149
+msgid "Show all routers with full stats"
+msgstr "显示所有路由及统计"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:184
+msgid "Network Database Router Statistics"
+msgstr "NetDb路由器统计"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:190
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:204
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:222
+msgid "Count"
+msgstr "计数"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:190
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:154
+msgid "Version"
+msgstr "版本"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:204
+msgid "Transports"
+msgstr "传输"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:222
+msgid "Country"
+msgstr "国家"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:254
+msgid "Our info"
+msgstr "我方信息"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:256
+msgid "Peer info for"
+msgstr "节点信息"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:260
+msgid "Full entry"
+msgstr "完整项"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:266
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:105
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:589
+msgid "Hidden"
+msgstr "隐身"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:266
+msgid "Updated"
+msgstr "已更新"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:267
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:270
+#, java-format
+msgid "{0} ago"
+msgstr "{0}前"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:269
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:273
+msgid "Published"
+msgstr "发布"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:275
+msgid "Address(es)"
+msgstr "地址"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:308
+msgid "Hidden or starting up"
+msgstr "隐身或正在启动"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:308
+msgid "SSU"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:308
+msgid "SSU with introducers"
+msgstr "使用中介的SSU连接"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:309
+msgid "NTCP"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:309
+msgid "NTCP and SSU"
+msgstr "NTCP 与 SSU"
+
+#: ../java/src/net/i2p/router/web/NetDbRenderer.java:309
+msgid "NTCP and SSU with introducers"
+msgstr "使用中介的NTCP与SSU连接"
+
+#: ../java/src/net/i2p/router/web/NewsFetcher.java:80
+#, java-format
+msgid "News last updated {0} ago."
+msgstr "新闻更新于{0}前"
+
+#: ../java/src/net/i2p/router/web/NewsFetcher.java:86
+#, java-format
+msgid "News last checked {0} ago."
+msgstr "最近一次查收新闻在{0}前"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:72
+msgid "Peer Profiles"
+msgstr "节点信息"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:73
+#, java-format
+msgid "Showing {0} recent profiles."
+msgstr "显示最近 {0} 个节点信息"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:75
+#, java-format
+msgid "Hiding {0} older profiles."
+msgstr "隐藏 {0} 个较旧的信息。"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:77
+#, java-format
+msgid "Hiding {0} standard profiles."
+msgstr "隐藏 {0} 个标准描述。"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:82
+msgid "Groups (Caps)"
+msgstr "组(容量)"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:83
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:251
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:334
+msgid "Speed"
+msgstr "速度"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:84
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:253
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:338
+msgid "Capacity"
+msgstr "容量"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:85
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:255
+msgid "Integration"
+msgstr "整合"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:86
+msgid "Status"
+msgstr "状态"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:126
+msgid "Fast, High Capacity"
+msgstr "高速,高容"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:127
+msgid "High Capacity"
+msgstr "高容"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:128
+msgid "Standard"
+msgstr "标准"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:129
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:163
+msgid "Failing"
+msgstr "失败"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:131
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:253
+msgid "Integrated"
+msgstr "已整合节点"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:162
+msgid "Banned"
+msgstr "已封锁"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:164
+msgid "Unreachable"
+msgstr "不可达"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:171
+msgid "Test Fails"
+msgstr "测试失败"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:175
+msgid "profile"
+msgstr "节点信息"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:184
+msgid "Floodfill and Integrated Peers"
+msgstr "种子节点与整合节点"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:188
+msgid "Caps"
+msgstr "容量"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:189
+msgid "Integ. Value"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:190
+msgid "Last Heard About"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:191
+msgid "Last Heard From"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:192
+msgid "Last Good Send"
+msgstr "上一次发送成功"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:193
+msgid "Last Bad Send"
+msgstr "上一次发送失败"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:194
+msgid "10m Resp. Time"
+msgstr "10m响应时间"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:195
+msgid "1h Resp. Time"
+msgstr "1h响应时间"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:196
+msgid "1d Resp. Time"
+msgstr "1d响应时间"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:197
+msgid "Last Good Lookup"
+msgstr "上一次查询成功"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:198
+msgid "Last Bad Lookup"
+msgstr "上一次查询失败"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:199
+msgid "Last Good Store"
+msgstr "上一次保存成功"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:200
+msgid "Last Bad Store"
+msgstr "上一次保存失败"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:201
+msgid "1h Fail Rate"
+msgstr "1h失败率"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:202
+msgid "1d Fail Rate"
+msgstr "1d失败率"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:250
+msgid "Thresholds"
+msgstr "临界值"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:252
+msgid "fast peers"
+msgstr "高速节点"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:254
+msgid "high capacity peers"
+msgstr "高容节点"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:256
+msgid " well integrated peers"
+msgstr "整合节点"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:257
+msgid "Definitions"
+msgstr "定义"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258
+msgid "as determined by the profile organizer"
+msgstr "由节点描述信息管理器决定"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258
+msgid "groups"
+msgstr "分组"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259
+msgid "capabilities in the netDb, not used to determine profiles"
+msgstr "netDb中的容量,与描述信息无关。"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259
+msgid "caps"
+msgstr "容量"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260
+msgid ""
+"peak throughput (bytes per second) over a 1 minute period that the peer has "
+"sustained in a single tunnel"
+msgstr "该节点一分钟由单一隧道通过的数据峰值(byte/s)。"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260
+msgid "speed"
+msgstr "速度"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261
+msgid "capacity"
+msgstr "容量"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261
+msgid "how many tunnels can we ask them to join in an hour?"
+msgstr "一小时内路由可以邀请加入的隧道总量"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262
+msgid "how many new peers have they told us about lately?"
+msgstr "最近获知的新节点"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262
+msgid "integration"
+msgstr "整合"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263
+msgid "is the peer banned, or unreachable, or failing tunnel tests?"
+msgstr "是否节点被封禁,不可达,或在隧道测试中失败?"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263
+msgid "status"
+msgstr "状态"
+
+#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:321
+msgid "n/a"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:57
+#, java-format
+msgid "Temporary ban expiring in {0}"
+msgstr "临时封锁{0}后解除"
+
+#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:59
+#, java-format
+msgid "Banned until restart or in {0}"
+msgstr "封锁直到重启或{0}后"
+
+#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:71
+msgid "unban now"
+msgstr "立即解封"
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:55
+msgid "GO"
+msgstr ""
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:58
+msgid "Statistics gathered during this router's uptime"
+msgstr "路由运行时收集的统计数据"
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:61
+msgid ""
+"The data gathered is quantized over a 1 minute period, so should just be "
+"used as an estimate."
+msgstr "所采集数据量化周期为1分钟,仅供参考。"
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:107
+msgid "frequency"
+msgstr "更新频率"
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:141
+msgid "No lifetime events"
+msgstr "自运行起无事件"
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:153
+msgid "rate"
+msgstr "速度"
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:155
+msgid "avg value"
+msgstr "均值"
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:184
+msgid "events"
+msgstr "事件"
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:190
+msgid "No events"
+msgstr "无事件"
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:196
+msgid "lifetime average"
+msgstr "总平均值"
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:198
+msgid "peak average"
+msgstr "峰值平均值"
+
+#: ../java/src/net/i2p/router/web/StatsGenerator.java:216
+msgid "lifetime average value"
+msgstr "总平均值"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:44
+msgid ""
+"Configure startup of clients and webapps (services); manually start dormant "
+"services"
+msgstr "设置客户程序及Web程序(服务)的启动;手动启动重要服务"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:46
+msgid "I2P Services"
+msgstr "I2P 服务"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:52
+msgid "Manage your I2P hosts file here (I2P domain name resolution)"
+msgstr "管理您的 I2P HOST表(I2P域名解析表)"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:54
+msgid "Addressbook"
+msgstr "地址簿"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:58
+msgid "Built-in anonymous BitTorrent Client"
+msgstr "内建的匿名 BitTorrent 客户端"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:60
+msgid "Torrents"
+msgstr "匿名BT"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:64
+msgid "Anonymous webmail client"
+msgstr "匿名Web邮件客户端"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:66
+msgid "Webmail"
+msgstr "匿名邮箱"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:70
+msgid "Anonymous resident webserver"
+msgstr "内置的匿名Web服务器"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:72
+msgid "Webserver"
+msgstr "匿名主页服务器"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:76
+msgid "Configure I2P Router"
+msgstr "设置 I2P 路由器"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:78
+msgid "I2P Internals"
+msgstr "I2P内部设置"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:84
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:348
+msgid "View existing tunnels and tunnel build status"
+msgstr "查看现存隧道及隧道的建立状态"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:90
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:225
+msgid "Show all current peer connections"
+msgstr "显示当前所有的节点连接"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:96
+msgid "Show recent peer performance profiles"
+msgstr "显示当前节点的性能记录"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:98
+msgid "Profiles"
+msgstr "节点信息"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:102
+msgid "Show list of all known I2P routers"
+msgstr "包含所有已知I2P路由器的列表"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:104
+msgid "NetDB"
+msgstr "NetDB"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:108
+msgid "Health Report"
+msgstr "路由器健康状况报告"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:110
+msgid "Logs"
+msgstr "日志"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:114
+msgid "Show the router's workload, and how it's performing"
+msgstr "显示I2P路由器的负载与工作状况"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:116
+msgid "Jobs"
+msgstr "作业"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:120
+msgid "Graph router performance"
+msgstr "路由性能统计图"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:122
+msgid "Graphs"
+msgstr "图表"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:126
+msgid "Textual router performance statistics"
+msgstr "路由性能文字统计"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:138
+msgid "I2P Router Help"
+msgstr "I2P路由帮助"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:140
+msgid "General"
+msgstr "功能概况"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:143
+msgid "Your unique I2P router identity is"
+msgstr "您I2P路由的唯一身份为"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:147
+msgid "never reveal it to anyone"
+msgstr "切勿将其告诉任何人"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:149
+msgid "Local Identity"
+msgstr "本地身份"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:161
+msgid "How long we've been running for this session"
+msgstr "本次路由运行时间"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:164
+msgid "Uptime"
+msgstr "运行时间"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:171
+msgid ""
+"Help with configuring your firewall and router for optimal I2P performance"
+msgstr "如何正确配置防火墙和(物理)路由器优化I2P性能"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:198
+msgid "Download"
+msgstr "下载"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:207
+msgid "Download Unsigned"
+msgstr "下载未签名更新"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:233
+msgid "Active"
+msgstr "活动节点"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:241
+msgid "Fast"
+msgstr "快速节点"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:247
+msgid "High capacity"
+msgstr "高容量节点"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:259
+msgid "Known"
+msgstr "已知节点"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:274
+msgid "Help with firewall configuration"
+msgstr "如何配置防火墙"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:276
+msgid "Check NAT/firewall"
+msgstr "检查NAT/防火墙"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:296
+msgid "Reseed"
+msgstr "补种(搜索节点启动网络)"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:313
+msgid "Configure router bandwidth allocation"
+msgstr "设置路由的带宽分配"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:315
+msgid "Bandwidth in/out"
+msgstr "带宽(上/下行)"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:332
+msgid "Total"
+msgstr "总计"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:340
+msgid "Used"
+msgstr "已使用"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:350
+msgid "Tunnels in/out"
+msgstr "通道(上/下行)"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:355
+msgid "Exploratory"
+msgstr "探测"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:371
+msgid "Participating"
+msgstr "共享"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:377
+msgid "What's in the router's job queue?"
+msgstr "查看路由的作业队列"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:379
+msgid "Congestion"
+msgstr "拥堵"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:384
+msgid "Job lag"
+msgstr "作业延迟"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:390
+msgid "Message delay"
+msgstr "消息延迟"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:396
+msgid "Tunnel lag"
+msgstr "隧道延迟"
+
+#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:402
+msgid "Backlog"
+msgstr "积压"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:96
+msgid "ERR-Client Manager I2CP Error - check logs"
+msgstr "错误-客户程序管理器I2CP错误 - 请看日志"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:103
+#, java-format
+msgid "ERR-Clock Skew of {0}"
+msgstr "错误-系统时滞 {0}"
+
+# 暂不翻译,确定/良好 可能影响按钮的翻译
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:112
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:565
+msgid "OK"
+msgstr "正常"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:113
+msgid "ERR-Private TCP Address"
+msgstr "错误-TCP私有地址"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:115
+msgid "ERR-SymmetricNAT"
+msgstr "错误-SymmeticNAT"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:118
+msgid "WARN-Firewalled with Inbound TCP Enabled"
+msgstr "警告-入站TCP开启但因防火墙受限"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:120
+msgid "WARN-Firewalled and Floodfill"
+msgstr "警告-种子节点因防火墙受限"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:122
+msgid "WARN-Firewalled and Fast"
+msgstr "警告-快速节点因防火墙受限"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:123
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:569
+msgid "Firewalled"
+msgstr "防火墙限制"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:125
+msgid ""
+"ERR-UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and "
+"restart"
+msgstr ""
+"错误-UDP端口已占用 - 在高级设置中设置 i2np.udp.internalPort=新端口并重启程序"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:131
+msgid "ERR-No Active Peers, Check Network Connection and Firewall"
+msgstr "错误-无活动节点,请检查网络连接及防火墙"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:134
+msgid "ERR-UDP Disabled and Inbound TCP host/port not set"
+msgstr "错误-UDP已禁用且TCP入站主机与端口未设置"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:136
+msgid "WARN-Firewalled with UDP Disabled"
+msgstr "警告-因防火墙受限且UDP被禁用"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:138
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:585
+msgid "Testing"
+msgstr "测试中"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:371
+msgid "Add/remove/edit &amp; control your client and server tunnels"
+msgstr "添加、删除、编辑或控制客户程序隧道和服务隧道"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:371
+msgid "Local Destinations"
+msgstr "本地目标"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:380
+msgid "Server"
+msgstr "服务"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:384
+msgid "Show tunnels"
+msgstr "显示隧道"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:395
+msgid "Leases expired"
+msgstr "Lease已过期"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:395
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:396
+msgid "Rebuilding"
+msgstr "正在重建"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:396
+msgid "ago"
+msgstr "前"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:399
+msgid "Ready"
+msgstr "就绪"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:403
+msgid "Building"
+msgstr "创建中"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:403
+msgid "Building tunnels"
+msgstr "正在隧道创建"
+
+#: ../java/src/net/i2p/router/web/SummaryHelper.java:415
+#: ../java/strings/Strings.java:36
+msgid "shared clients"
+msgstr "共享客户端"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:41
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:63
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:273
+msgid "configure"
+msgstr "设置"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:65
+msgid "dead"
+msgstr "失效"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:71
+msgid "Participating tunnels"
+msgstr "共享隧道"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:72
+msgid "From"
+msgstr "从"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:72
+msgid "Receive on"
+msgstr "接收"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:73
+msgid "Expiration"
+msgstr "到期"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:73
+msgid "Send on"
+msgstr "发送"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:73
+msgid "To"
+msgstr "至"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:74
+msgid "Rate"
+msgstr "速度"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:74
+msgid "Role"
+msgstr "职能"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:74
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:156
+msgid "Usage"
+msgstr "使用情况"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:107
+msgid "grace period"
+msgstr "过渡期"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:117
+msgid "Outbound Endpoint"
+msgstr "出站终端"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:119
+msgid "Inbound Gateway"
+msgstr "入站网关"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:121
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:162
+msgid "Participant"
+msgstr "参与节点"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:126
+msgid "Inactive participating tunnels"
+msgstr "不活跃的共享隧道"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:127
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:216
+msgid "Lifetime bandwidth usage"
+msgstr "运行期间带宽使用情况"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:156
+msgid "Expiry"
+msgstr "到期"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:156
+msgid "In/Out"
+msgstr "入/出"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:159
+msgid "Participants"
+msgstr "参与节点"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:165
+msgid "Endpoint"
+msgstr "终端"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:205
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:211
+msgid "Build in progress"
+msgstr "创建中"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:205
+msgid "inbound"
+msgstr "入站"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:211
+msgid "outbound"
+msgstr "出站"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:215
+msgid "No tunnels; waiting for the grace period to end."
+msgstr "无隧道;等待宽限期结束。"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:216
+msgid "in"
+msgstr "å…¥"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:217
+msgid "out"
+msgstr "出"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:234
+msgid "Tunnel Counts By Peer"
+msgstr "每节点隧道计数"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:235
+msgid "% of total"
+msgstr "占总数%"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:235
+msgid "Our Tunnels"
+msgstr "我方隧道"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:235
+msgid "Participating Tunnels"
+msgstr "共享隧道"
+
+#: ../java/src/net/i2p/router/web/TunnelRenderer.java:253
+msgid "Totals"
+msgstr "总计"
+
+#: ../java/strings/Strings.java:12
+msgid "addressbook"
+msgstr "地址簿"
+
+#: ../java/strings/Strings.java:13
+msgid "i2psnark"
+msgstr "匿名BT客户端"
+
+#: ../java/strings/Strings.java:14
+msgid "i2ptunnel"
+msgstr "I2P隧道"
+
+#: ../java/strings/Strings.java:15
+msgid "susimail"
+msgstr "匿名邮箱"
+
+#: ../java/strings/Strings.java:16
+msgid "susidns"
+msgstr "susiDNS"
+
+#: ../java/strings/Strings.java:17
+msgid "routerconsole"
+msgstr "路由控制台"
+
+#: ../java/strings/Strings.java:22
+msgid "Web console"
+msgstr "网页控制台"
+
+#: ../java/strings/Strings.java:23
+msgid "SAM application bridge"
+msgstr "SAM 协议桥"
+
+#: ../java/strings/Strings.java:24
+msgid "Application tunnels"
+msgstr "程序隧道"
+
+#: ../java/strings/Strings.java:25
+msgid "My eepsite web server"
+msgstr "匿名主页服务器"
+
+#: ../java/strings/Strings.java:26
+msgid "I2P webserver (eepsite)"
+msgstr "匿名主页服务器(eepsite)"
+
+#: ../java/strings/Strings.java:27
+msgid "Browser launch at startup"
+msgstr "路由器启动时运行浏览器"
+
+#: ../java/strings/Strings.java:28
+msgid "BOB application bridge"
+msgstr "BOB 协议桥"
+
+#: ../java/strings/Strings.java:30
+msgid "Open Router Console in web browser at startup"
+msgstr "路由启动时打开控制台"
+
+#: ../java/strings/Strings.java:37
+msgid "IRC proxy"
+msgstr "I2P聊天室"
+
+#: ../java/strings/Strings.java:38
+msgid "eepsite"
+msgstr "匿名网站"
+
+#: ../java/strings/Strings.java:39
+msgid "I2P webserver"
+msgstr "匿名主页服务器"
+
+#: ../java/strings/Strings.java:40
+msgid "HTTP Proxy"
+msgstr "HTTP 代理"
+
+#: ../java/strings/Strings.java:42
+msgid "eepProxy"
+msgstr "I2P代理"
+
+#: ../java/strings/Strings.java:43
+msgid "ircProxy"
+msgstr "I2P聊天室"
+
+#: ../java/strings/Strings.java:45
+msgid "I2PSnark"
+msgstr "I2P Snark"
+
+#: ../java/strings/Strings.java:47
+msgid "iMule"
+msgstr ""
+
+#: ../java/strings/Strings.java:51
+msgid "classic"
+msgstr "经典"
+
+#: ../java/strings/Strings.java:52
+msgid "dark"
+msgstr "暗色调"
+
+#: ../java/strings/Strings.java:53
+msgid "light"
+msgstr "亮色调"
+
+#: ../java/strings/Strings.java:54
+msgid "midnight"
+msgstr "午夜"
+
+#: ../java/strings/Strings.java:57
+msgid "Bandwidth"
+msgstr "带宽"
+
+#: ../java/strings/Strings.java:58
+msgid "BandwidthLimiter"
+msgstr "带宽限制"
+
+#: ../java/strings/Strings.java:59
+msgid "ClientMessages"
+msgstr "客户消息"
+
+#: ../java/strings/Strings.java:60
+msgid "Encryption"
+msgstr "加密"
+
+#: ../java/strings/Strings.java:61
+msgid "i2cp"
+msgstr ""
+
+#: ../java/strings/Strings.java:62
+msgid "I2PTunnel"
+msgstr "I2P隧道"
+
+#: ../java/strings/Strings.java:63
+msgid "InNetPool"
+msgstr ""
+
+#: ../java/strings/Strings.java:64
+msgid "JobQueue"
+msgstr "作业队列"
+
+#: ../java/strings/Strings.java:65
+msgid "NetworkDatabase"
+msgstr "网络数据库"
+
+#: ../java/strings/Strings.java:66
+msgid "ntcp"
+msgstr "NTCP"
+
+#: ../java/strings/Strings.java:69
+msgid "Stream"
+msgstr "流"
+
+#: ../java/strings/Strings.java:70
+msgid "Throttle"
+msgstr "门槛"
+
+#: ../java/strings/Strings.java:71
+msgid "Transport"
+msgstr "传输"
+
+#: ../java/strings/Strings.java:73
+msgid "udp"
+msgstr "UDP"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:106
+msgid "config networking"
+msgstr "连网设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:217
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:218
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:217
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:217
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:231
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:217
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:217
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:218
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:217
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:217
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:217
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:228
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:217
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:223
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:216
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:216
+msgid "Refresh (s)"
+msgstr "刷新(秒)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:221
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:221
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:221
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:235
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:221
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:221
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:222
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:221
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:221
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:221
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:224
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:232
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:221
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:224
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:227
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:224
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:224
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:220
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:238
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:220
+msgid "Enable"
+msgstr "启用"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:241
+msgid "I2P Network Configuration"
+msgstr "I2P 连网设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:297
+msgid "Bandwidth limiter"
+msgstr "带宽限制"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:299
+msgid ""
+"I2P will work best if you configure your rates to match the speed of your "
+"internet connection."
+msgstr "与联网环境相符的速度能使I2P以最佳的状态工作。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:303
+msgid "KBps In"
+msgstr "KBps 入站"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:317
+msgid "KBps Out"
+msgstr "KBps 出站"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:333
+msgid "Share"
+msgstr "共享"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:340
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:307
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:303
+msgid "NOTE"
+msgstr "注意"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:342
+#, java-format
+msgid "You have configured I2P to share only {0} KBps."
+msgstr "您设置I2P仅共享 {0} KBps"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:345
+msgid "I2P requires at least 12KBps to enable sharing. "
+msgstr "I2P 需要至少 12KBps 才能进行共享。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:346
+msgid ""
+"Please enable sharing (participating in tunnels) by configuring more "
+"bandwidth. "
+msgstr "请设置更多的带宽以便启用共享功能(加入到其他节点的隧道创建中)。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:347
+msgid ""
+"It improves your anonymity by creating cover traffic, and helps the network."
+msgstr "通过制造混淆流量共享能增强您的匿名性,帮助网络成长。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:350
+#, java-format
+msgid "You have configured I2P to share {0} KBps."
+msgstr "您设置I2P共享 {0} KBps"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:353
+msgid ""
+"The higher the share bandwidth the more you improve your anonymity and help "
+"the network."
+msgstr "共享的带宽越多,您的匿名性越强同时能帮助网络成长。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:359
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:504
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:305
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:324
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:335
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:375
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:343
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:323
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:356
+msgid "Cancel"
+msgstr "取消"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:363
+msgid "IP and Transport Configuration"
+msgstr "IP 与传输设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:365
+msgid "The default settings will work for most people."
+msgstr "默认设置适于大多数人。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:367
+msgid "There is help below."
+msgstr "页面下方有帮助信息"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:369
+msgid "UPnP Configuration"
+msgstr "UPnP 设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:373
+msgid "Enable UPnP to open firewall ports"
+msgstr "启用UPnP以打开防火墙端口"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:375
+msgid "UPnP status"
+msgstr "UPnP 统计"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:377
+msgid "IP Configuration"
+msgstr "IP 设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:379
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:449
+msgid "Externally reachable hostname or IP address"
+msgstr "公网可访问的本机域名或IP"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:383
+msgid "Use all auto-detect methods"
+msgstr "使用全部自动探测方法"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:387
+msgid "Disable UPnP IP address detection"
+msgstr "禁用UPnP IP 地址探测"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:391
+msgid "Ignore local interface IP address"
+msgstr "忽略本地接口的 IP 地址"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:395
+msgid "Use SSU IP address detection only"
+msgstr "仅使用SSU IP 地址探测"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:399
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:467
+msgid "Specify hostname or IP"
+msgstr "指定主机名或IP"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:405
+msgid "Select Interface"
+msgstr "选择网络接口"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:419
+msgid "Hidden mode - do not publish IP"
+msgstr "隐身模式 - 不发布IP"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:421
+msgid "(prevents participating traffic)"
+msgstr "(阻止共享流量)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:423
+msgid "Action when IP changes"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:427
+msgid ""
+"Laptop mode - Change router identity and UDP port when IP changes for "
+"enhanced anonymity"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:429
+msgid "Experimental"
+msgstr ""
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:431
+msgid "UDP Configuration:"
+msgstr "UPnP 设置:"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:433
+msgid "UDP port:"
+msgstr "UDP端口"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:447
+msgid "TCP Configuration"
+msgstr "TCP 连接设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:453
+msgid "Use auto-detected IP address"
+msgstr "使用自动检测得到的 IP 地址"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:455
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:487
+msgid "currently"
+msgstr "目前"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:459
+msgid "if we are not firewalled"
+msgstr "如果没有受到防火墙阻挡"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:463
+msgid "Always use auto-detected IP address (Not firewalled)"
+msgstr "总是使用自动探测到的IP地址(没有防火墙限制)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:473
+msgid "Disable inbound (Firewalled)"
+msgstr "禁止入站连接(受防火墙限制)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:477
+msgid "Completely disable"
+msgstr "完全禁用"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:479
+msgid ""
+"(select only if behind a firewall that throttles or blocks outbound TCP)"
+msgstr "仅在受到防火墙的流量限制或入站连接限制时使用"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:481
+msgid "Externally reachable TCP port"
+msgstr "公网可访问的TCP端口"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:485
+msgid "Use the same port configured for UDP"
+msgstr "使用与UDP相同的端口"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:493
+msgid "Specify Port"
+msgstr "指定端口"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:497
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:342
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:329
+msgid "Note"
+msgstr "注意"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:500
+msgid "Changing these settings will restart your router."
+msgstr "修改这些设置将必须重启路由器。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:506
+msgid "Configuration Help"
+msgstr "设置帮助"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:508
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:557
+msgid ""
+"While I2P will work fine behind most firewalls, your speeds and network "
+"integration will generally improve if the I2P port is forwarded for both UDP "
+"and TCP."
+msgstr ""
+"I2P可以与大多数防火墙共存,如果I2P端口(第一次安装时随机选择)进行了UDP/TCP映"
+"射,您的速度和网络整合度会逐渐提升。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:510
+msgid ""
+"If you can, please poke a hole in your firewall to allow unsolicited UDP and "
+"TCP packets to reach you."
+msgstr "如果可能,请在防火墙中添加端口并允许入站UDP/TCP数据包通过。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:512
+msgid ""
+"If you can't, I2P supports UPnP (Universal Plug and Play) and UDP hole "
+"punching with \"SSU introductions\" to relay traffic."
+msgstr ""
+"如果不能,I2P支持UPnP(Universal Plug and Play)或借助“SSU中介”进行UDP端口穿"
+"透,通过它们也可以中继数据。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:514
+msgid ""
+"Most of the options above are for special situations, for example where UPnP "
+"does not work correctly, or a firewall not under your control is doing harm."
+msgstr ""
+"上述大部分设置仅为特殊情况准备,例如UPnP不能正常工作,或外部防火墙封锁网络。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:516
+msgid "Certain firewalls such as symmetric NATs may not work well with I2P."
+msgstr "在某些防火墙下例如Symmetric,I2P可能无法有效利用NAT工作。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:525
+msgid ""
+"UPnP is used to communicate with Internet Gateway Devices (IGDs) to detect "
+"the external IP address and forward ports."
+msgstr "UPnP与公网网关设备(IGD)通讯可以检测外部IP和映射端口。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:527
+msgid "UPnP support is beta, and may not work for any number of reasons"
+msgstr "UPnP支持仍在测试阶段,可能由于一些原因无法正常工作。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:529
+msgid "No UPnP-compatible device present"
+msgstr "没有发现UPnP兼容设备"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:531
+msgid "UPnP disabled on the device"
+msgstr "设备上的UPnP支持已禁用"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:533
+msgid "Software firewall interference with UPnP"
+msgstr "软件防火墙阻止UPnP"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:535
+msgid "Bugs in the device's UPnP implementation"
+msgstr "设备的UPnP支持有Bug"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:537
+msgid "Multiple firewall/routers in the internet connection path"
+msgstr "公网连接中存在多个防火墙/路由器"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:539
+msgid "UPnP device change, reset, or address change"
+msgstr "UPnP设备改变、重置或地址迁移"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:541
+msgid "Review the UPnP status here."
+msgstr "在这里检查UPnP状态。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:543
+msgid ""
+"UPnP may be enabled or disabled above, but a change requires a router "
+"restart to take effect."
+msgstr "UPnP 的关闭或开启均需要程序重启后生效。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:545
+msgid "Hostnames entered above will be published in the network database."
+msgstr "上面输入的主机名称将在网络数据库(NetDB)中发布。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:547
+msgid "They are <b>not private</b>."
+msgstr "他们并<b>非私有地址</b>。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:549
+msgid ""
+"Also, <b>do not enter a private IP address</b> like 127.0.0.1 or 192.168.1.1."
+msgstr "此外,<b>请勿输入如127.0.0.1或192.168.1.1等私有地址</b>"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:551
+msgid ""
+"If you specify the wrong IP address or hostname, or do not properly "
+"configure your NAT or firewall, your network performance will degrade "
+"substantially."
+msgstr ""
+"如果您设置了错误的IP地址或主机名称,或NAT/防火墙配置不当,您的网络性能将受到"
+"明显影响。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:553
+msgid "When in doubt, leave the settings at the defaults."
+msgstr "如果对设置有疑问,请保留默认设置。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:555
+msgid "Reachability Help"
+msgstr "连通性帮助"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:560
+msgid ""
+"If you think you have opened up your firewall and I2P still thinks you are "
+"firewalled, remember that you may have multiple firewalls, for example both "
+"software packages and external hardware routers."
+msgstr ""
+"如果您认为已经打开了防火墙,但I2P仍然报告您受到防火墙阻隔,请想想您是否可能有"
+"多层防火墙,例如软件防护墙和外部的硬件路由器。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:563
+msgid ""
+"If there is an error, the <a href=\"logs.jsp\">logs</a> may also help "
+"diagnose the problem."
+msgstr "如果存在错误,<a href=\"logs.jsp\">日志</a>可以帮助您诊断问题。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:567
+msgid "Your UDP port does not appear to be firewalled."
+msgstr "您的UDP端口似乎一切正常。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:571
+msgid "Your UDP port appears to be firewalled."
+msgstr "您的UDP端口似乎因防火墙而连接受限。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:573
+msgid ""
+"As the firewall detection methods are not 100% reliable, this may "
+"occasionally be displayed in error."
+msgstr "由于防火墙检测方法并非100%可靠,有时也可能错误地显示此此提示。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:575
+msgid ""
+"However, if it appears consistently, you should check whether both your "
+"external and internal firewalls are open for your port."
+msgstr "然而,如果总是出现此提示,您应检查外部或内部防火墙是否打开了I2P端口。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:577
+msgid ""
+"I2P will work fine when firewalled, there is no reason for concern. When "
+"firewalled, the router uses \"introducers\" to relay inbound connections."
+msgstr ""
+"即使受到防火墙阻拦,I2P也能够正常工作,无需担心。受到防火墙阻隔时,路由器将通"
+"过“中介(Introducers)”中继入站连接。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:579
+msgid ""
+"However, you will get more participating traffic and help the network more "
+"if you can open your firewall(s)."
+msgstr ""
+"然而,如果您能打开防火墙端口,您才能得到的共享流量,更好的帮助I2P网络。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:581
+msgid ""
+"If you think you have already done so, remember that you may have both a "
+"hardware and a software firewall, or be behind an additional, institutional "
+"firewall you cannot control."
+msgstr ""
+"如果您确信已经打开了防火墙,请想想是不是同时存在硬件和软件防火墙,或存在您无"
+"法控制的额外的机构性的防火墙。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:583
+msgid ""
+"Also, some routers cannot correctly forward both TCP and UDP on a single "
+"port, or may have other limitations or bugs that prevent them from passing "
+"traffic through to I2P."
+msgstr ""
+"当然,某些路由器可能无法正确映射同时使用TCP和UDP协议的端口,或存在其他限制或"
+"缺陷,障碍了数据进入I2P网络。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:587
+msgid "The router is currently testing whether your UDP port is firewalled."
+msgstr "路由器正在测试您的UDP端口是否被防火墙阻挡。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:591
+msgid ""
+"The router is not configured to publish its address, therefore it does not "
+"expect incoming connections."
+msgstr "路由器被设置为禁止发布IP地址,因此并不需要入站连接。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:593
+msgid "WARN - Firewalled and Fast"
+msgstr "警告 - 快速节点,因防火墙受限"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:595
+msgid ""
+"You have configured I2P to share more than 128KBps of bandwidth, but you are "
+"firewalled."
+msgstr "您设置I2P共享超过128KBps的带宽,但您的连接因防火墙受阻。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:597
+msgid ""
+"While I2P will work fine in this configuration, if you really have over "
+"128KBps of bandwidth to share, it will be much more helpful to the network "
+"if you open your firewall."
+msgstr ""
+"尽管在此种配置情况下I2P可以正常工作,但如果您的确能够分享超过128kps的带宽,打"
+"开防火墙端口它能工作的更好帮助网络中其他的人。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:599
+msgid "WARN - Firewalled and Floodfill"
+msgstr "警告 - 种子节点,因防火墙受限"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:601
+msgid ""
+"You have configured I2P to be a floodfill router, but you are firewalled."
+msgstr "您已将I2P设置为种子路由,但您的连接已因防火墙受阻。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:603
+msgid ""
+"For best participation as a floodfill router, you should open your firewall."
+msgstr "为了种子路由能够更好的参与到I2P网络中,请您的防火墙中打开端口。"
+
+# 暂不翻译方便反馈
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:605
+msgid "WARN - Firewalled with Inbound TCP Enabled"
+msgstr "警告 - 入站TCP开启,但因防火墙受限"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:607
+msgid ""
+"You have configured inbound TCP, however your UDP port is firewalled, and "
+"therefore it is likely that your TCP port is firewalled as well."
+msgstr ""
+"您设置了使用入站TCP连接,同时您的UDP端口因防火墙受阻,由此看来您的TCP端口也被"
+"防火墙阻挡。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:609
+msgid ""
+"If your TCP port is firewalled with inbound TCP enabled, routers will not be "
+"able to contact you via TCP, which will hurt the network."
+msgstr ""
+"如果您在TCP端口因防火墙受阻的情况下启用入站TCP连接,其他路由器节点将无法与您"
+"建立连接,造成网络受阻。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:611
+msgid "Please open your firewall or disable inbound TCP above."
+msgstr "请打开您的防火墙端口或禁用上面的入站TCP连接。"
+
+# 暂不翻译
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:613
+msgid "WARN - Firewalled with UDP Disabled"
+msgstr "警告 - 因防火墙受限,且UDP被禁用"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:615
+msgid "You have configured inbound TCP, however you have disabled UDP."
+msgstr "您设置了使用TCP连接,然而禁用了UDP连接。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:617
+msgid ""
+"You appear to be firewalled on TCP, therefore your router cannot accept "
+"inbound connections."
+msgstr "您的TCP连接似乎因防火墙受阻,导致您的路由器无法接收入站连接。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:619
+msgid "Please open your firewall or enable UDP."
+msgstr "请打开防火墙端口或启用UDP。"
+
+# 暂不翻译,方便错误反馈
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:621
+msgid "ERR - Clock Skew"
+msgstr "错误 - 系统时滞"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:623
+msgid ""
+"Your system's clock is skewed, which will make it difficult to participate "
+"in the network."
+msgstr "如果您的系统时钟太快或太慢,将影响计算机接入网络。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:625
+msgid "Correct your clock setting if this error persists."
+msgstr "如果错误持续,请校对您的系统时间。"
+
+# 暂不翻译,方便错误反馈
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:627
+msgid "ERR - Private TCP Address"
+msgstr "错误 - 私有TCP地址"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:629
+msgid ""
+"You must never advertise an unroutable IP address such as 127.0.0.1 or "
+"192.168.1.1 as your external address."
+msgstr ""
+"您不能发布一个公网无法访问的 IP 地址,例如127.0.0.1或192.168.1.1一类的内网地"
+"址。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:631
+msgid "Correct the address or disable inbound TCP above."
+msgstr "正确设置IP地址或禁用上面的入站TCP连接。"
+
+# 暂不翻译,方便错误反馈
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:633
+msgid "ERR - SymmetricNAT"
+msgstr "错误 - SymmetricNAT"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:635
+msgid "I2P detected that you are firewalled by a Symmetric NAT."
+msgstr "I2P检测到您受到Symmetic NAT的阻挡。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:637
+msgid ""
+"I2P does not work well behind this type of firewall. You will probably not "
+"be able to accept inbound connections, which will limit your participation "
+"in the network."
+msgstr ""
+"I2P无法与此类防火墙很好的并存。您可能无法接收入站连接,这会障碍您连入I2P网"
+"络。"
+
+# 暂不翻译,方便问题反馈
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:639
+msgid ""
+"ERR - UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config "
+"and restart"
+msgstr ""
+"错误 - UDP端口已占用 - 在高级设置中设置 i2np.udp.internalPort=新端口 并重启程"
+"序"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:641
+msgid "I2P was unable to bind to port 8887 or other configured port."
+msgstr "I2P无法绑定到端口8887或其他指定的端口上。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:643
+msgid ""
+"Check to see if another program is using the configured port. If so, stop "
+"that program or configure I2P to use a different port."
+msgstr ""
+"检查是否有其他程序正在使用了I2P的端口,如果是,关闭此程序或设置I2P使用不同的"
+"端口。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:645
+msgid ""
+"This may be a transient error, if the other program is no longer using the "
+"port."
+msgstr "如果其他程序不再使用此端口,这可能是临时性的错误。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:647
+msgid "However, a restart is always required after this error."
+msgstr "然而,发生此错误后一般需要重启程序才能解决。"
+
+# 暂不翻译,方便错误反馈
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:649
+msgid "ERR - UDP Disabled and Inbound TCP host/port not set"
+msgstr "错误 - UDP已禁用,且TCP入站主机与端口未设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:651
+msgid ""
+"You have not configured inbound TCP with a hostname and port above, however "
+"you have disabled UDP."
+msgstr "您没有设置入站TCP的主机名称和端口,同时又关闭了UDP。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:653
+msgid "Therefore your router cannot accept inbound connections."
+msgstr "因此您的路由器无法接收入站连接。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:655
+msgid "Please configure a TCP host and port above or enable UDP."
+msgstr "请在前面设置TCP主机和端口或启用UDP"
+
+# 错误提示暂不翻译,以便错误反馈。
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:657
+msgid "ERR - Client Manager I2CP Error - check logs"
+msgstr "错误 - 客户程序管理器 I2CP 错误 - 请看日志"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:659
+msgid "This is usually due to a port 7654 conflict. Check the logs to verify."
+msgstr "这通常为7654端口冲突所致,请查看日志确认原因。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:661
+msgid ""
+"Do you have another I2P instance running? Stop the conflicting program and "
+"restart I2P."
+msgstr "您是否已经运行了另一个I2P实例?请关掉冲突的程序并重启I2P。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:107
+msgid "config advanced"
+msgstr "高级设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:242
+msgid "I2P Advanced Configuration"
+msgstr "I2P 高级设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:299
+msgid "Advanced I2P Configuration"
+msgstr "I2P 高级设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:303
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:321
+msgid "Apply"
+msgstr "应用"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:309
+msgid "Some changes may require a restart to take effect."
+msgstr "某些设置需要程序重启后生效。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:106
+msgid "config clients"
+msgstr "升级设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:241
+msgid "I2P Client Configuration"
+msgstr "I2P 客户程序设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:306
+msgid "Client Configuration"
+msgstr "客户程序设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:308
+msgid ""
+"The Java clients listed below are started by the router and run in the same "
+"JVM."
+msgstr "下面列出的Java客户端随路由器启动并运行于同一JVM中。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:312
+msgid "To change other client options, edit the file"
+msgstr "修改其他客户端设置请编辑文件"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:319
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:331
+msgid "All changes require restart to take effect."
+msgstr "所有更改均需要程序重启才能生效。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:323
+msgid "WebApp Configuration"
+msgstr "WebApp 设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:325
+msgid ""
+"The Java web applications listed below are started by the webConsole client "
+"and run in the same JVM as the router. They are usually web applications "
+"accessible through the router console. They may be complete applications (e."
+"g. i2psnark),front-ends to another client or application which must be "
+"separately enabled (e.g. susidns, i2ptunnel), or have no web interface at "
+"all (e.g. addressbook)."
+msgstr ""
+"下面列出的Java Web 程序随客户端“web控制台”一同启动,并与路由运行于同一JVM中。"
+"这些Web程序通常可以通过路由器界面直接访问。他们可能是完整的程序 (例如  "
+"i2psnark/BT客户端),其他客户端程序的前端或必须单独启动的程序(例如. susidns, "
+"i2ptunnel),甚至根本没有Web界面(例如 addressbook)。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:327
+msgid ""
+"A web app may also be disabled by removing the .war file from the webapps "
+"directory; however the .war file and web app will reappear when you update "
+"your router to a newer version, so disabling the web app here is the "
+"preferred method."
+msgstr ""
+"从webapps目录中删除相应的.war文件同样可以禁用Web程序;然而这些 .war 文件和Web"
+"程序在更新I2P后还会再次出现,所以推荐在这里通过设置的方法禁用不用的Web程序。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:106
+msgid "config keyring"
+msgstr "钥匙环设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:228
+msgid "I2P Keyring Configuration"
+msgstr "I2P 钥匙环设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:294
+msgid "The router keyring is used to decrypt encrypted leaseSets."
+msgstr "路由的钥匙环被用来解密和加密赁集."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:297
+msgid ""
+"The keyring may contain keys for local or remote encrypted destinations."
+msgstr "钥匙环可以包含本地和远程的加密目标(Destination)."
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:307
+msgid "Manual Keyring Addition"
+msgstr "手动添加钥匙环"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:309
+msgid "Enter keys for encrypted remote destinations here."
+msgstr "在此处添加远程加密目标的密钥。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:312
+msgid "Keys for local destinations must be entered on the"
+msgstr "输入本地目标的密钥请到"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:314
+msgid "I2PTunnel page"
+msgstr "I2P 隧道页面"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:316
+msgid "Dest. name, hash, or full key"
+msgstr "目标(Dest.)名称, HASH, 或完整公钥"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:318
+msgid "Encryption Key"
+msgstr "加密密钥"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:107
+msgid "config logging"
+msgstr "日志设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:242
+msgid "I2P Logging Configuration"
+msgstr "I2P 记录设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:299
+msgid "Configure I2P Logging Options"
+msgstr "设置 I2P 记录选项"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:301
+msgid "Logging filename"
+msgstr "日志文件名称"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:305
+msgid "(the symbol '@' will be replaced during log rotation)"
+msgstr "(日志轮转时符号'@'将被替换)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:307
+msgid "Log record format"
+msgstr "日志记录格式"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:311
+msgid ""
+"(use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, 'm' = message)"
+msgstr "( 'd' = 日期, 'c' = 类, 't' = 线程, 'p' = 优先级, 'm' = 消息)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:313
+msgid "Log date format"
+msgstr "日志日期格式"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:317
+msgid ""
+"('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' "
+"= millisecond)"
+msgstr ""
+"('MM' = 月, 'dd' = 天, 'HH' = 小时, 'mm' = 分钟, 'ss' = 秒, 'SSS' = 毫秒)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:319
+msgid "Max log file size"
+msgstr "日志最大体积"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:323
+msgid "Default log level"
+msgstr "默认日志等级"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:327
+msgid ""
+"(DEBUG and INFO are not recommended defaults, as they will drastically slow "
+"down your router)"
+msgstr "(建议不要使用 DEBUG 或 INFO 作为默认等级,他们会明显降低程序性能)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:329
+msgid "Log level overrides"
+msgstr "等级外<br>日志项目"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:106
+msgid "config peers"
+msgstr "节点设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:228
+msgid "I2P Peer Configuration"
+msgstr "I2P 节点设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:304
+msgid "Manual Peer Controls"
+msgstr "手动节点控制"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:306
+msgid "Router Hash"
+msgstr "路由器Key(见NetDB)"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:310
+msgid "Manually Ban / Unban a Peer"
+msgstr "手动封杀/解封某个节点"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:312
+msgid ""
+"Banning will prevent the participation of this peer in tunnels you create."
+msgstr "封锁将阻止节点参与您的隧道创建"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:324
+msgid ""
+"Bonuses may be positive or negative, and affect the peer's inclusion in Fast "
+"and High Capacity tiers. Fast peers are used for client tunnels, and High "
+"Capacity peers are used for some exploratory tunnels. Current bonuses are "
+"displayed on the"
+msgstr ""
+"评分(Bonuse)可能为正或为负并影响节点是否评为快速和高容量节点。快速节点用于客"
+"户程序通道,高容量节点用于探索隧道。当前评分显示于"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:326
+msgid "profiles page"
+msgstr "节点信息页面"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:342
+msgid "Adjust peer bonuses"
+msgstr "调整节点评分"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:344
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:253
+msgid "Banned Peers"
+msgstr "已封锁节点"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:366
+msgid "Banned IPs"
+msgstr "已封锁IP"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:106
+msgid "config service"
+msgstr "服务设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:228
+msgid "I2P Service Configuration"
+msgstr "I2P 服务设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:284
+msgid "Shutdown the router"
+msgstr "关闭路由器"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:286
+msgid ""
+"Graceful shutdown lets the router satisfy the agreements it has already made "
+"before shutting down, but may take a few minutes."
+msgstr ""
+"平滑关闭让路由器在关闭前完成已达成的任务,但这可能需要花费几分钟的时间。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:288
+msgid ""
+"If you need to kill the router immediately, that option is available as well."
+msgstr "当然你也可以选择立即关闭路由。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:298
+msgid ""
+"If you want the router to restart itself after shutting down, you can choose "
+"one of the following."
+msgstr "如果你想要路由器关闭后自动重新启动,可以选择下面的选项。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:300
+msgid "This is useful in some situations"
+msgstr "重启在某些情况下有用"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:302
+msgid ""
+"for example, if you changed some settings that client applications only read "
+"at startup, such as the routerconsole password or the interface it listens "
+"on."
+msgstr ""
+"例如当修改了客户程序仅在启动时读取的设置,比如路由器控制界面的密码,监听的接"
+"口。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:304
+msgid ""
+"A graceful restart will take a few minutes (but your peers will appreciate "
+"your patience), while a hard restart does so immediately."
+msgstr ""
+"平滑重启可能会等待几分钟的时间(但你的节点一定会感激你的耐心),硬重启可以立即"
+"完成。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:306
+msgid ""
+"After tearing down the router, it will wait 1 minute before starting back up "
+"again."
+msgstr "路由关闭后将等待1分钟再重新启动。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:316
+msgid "Systray integration"
+msgstr "使用系统托盘"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:318
+msgid ""
+"On the windows platform, there is a small application to sit in the system "
+"tray, allowing you to view the router's status"
+msgstr "Windows 平台允许小程序进驻系统托盘,让你可以查看路由状态"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:320
+msgid ""
+"(later on, I2P client applications will be able to integrate their own "
+"functionality into the system tray as well)."
+msgstr "(以后的 I2P 客户端程序也会将它们的功能集成到系统托盘里)。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:322
+msgid "If you are on windows, you can either enable or disable that icon here."
+msgstr "如果你使用Windows, 可以在这里开启或关闭这个托盘图标。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:328
+msgid "Run on startup"
+msgstr "启动时运行"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:330
+msgid ""
+"You can control whether I2P is run on startup or not by selecting one of the "
+"following options"
+msgstr "这里你可以通过下面的选项来设置开机后 I2P 是否启动"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:332
+msgid "I2P will install (or remove) a service accordingly."
+msgstr "I2P将相应的将自身安装为服务(或卸载服务)。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:334
+msgid "If you prefer the command line, you can also run the "
+msgstr "如果你偏好使用命令行,可以运行"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:344
+msgid ""
+"If you are running I2P as service right now, removing it will shut down your "
+"router immediately."
+msgstr "如果您目前已经以服务形式运行 I2P ,删除 I2P 服务将立刻关闭路由器。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:346
+msgid ""
+"You may want to consider shutting down gracefully, as above, then running "
+"uninstall_i2p_service_winnt.bat."
+msgstr ""
+"您可以考虑先平滑关闭路由,待退出后运行 uninstall_i2p_service_winnt.bat。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:354
+msgid "Debugging"
+msgstr "调试"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:360
+msgid "Launch browser on router startup?"
+msgstr "路由器启动时运行浏览器?"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:362
+msgid ""
+"I2P's main configuration interface is this web console, so for your "
+"convenience I2P can launch a web browser on startup pointing at"
+msgstr ""
+"此Web控制台是I2P的主要设置界面,所以如果您您觉得有必要I2P可以在路由启动时调用"
+"浏览器打开"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:107
+msgid "config stats"
+msgstr "统计设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:229
+msgid "I2P Stats Configuration"
+msgstr "I2P 统计设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:300
+msgid "Configure I2P Stat Collection"
+msgstr "设置 I2P 统计项"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:302
+msgid "Enable full stats?"
+msgstr "启用完整统计?"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:309
+msgid "change requires restart to take effect"
+msgstr "设置需要程序重启后才能生效。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:311
+msgid "Stat file"
+msgstr "统计文件"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:315
+msgid "Filter"
+msgstr "过滤器"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:317
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:326
+msgid "toggle all"
+msgstr "全部切换"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:328
+msgid "Log"
+msgstr "日志"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:330
+msgid "Graph"
+msgstr "图表"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:369
+msgid "Advanced filter"
+msgstr "高级过滤器"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:106
+msgid "config tunnels"
+msgstr "隧道设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:241
+msgid "I2P Tunnel Configuration"
+msgstr "I2P 隧道设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:305
+msgid "The default settings work for most people."
+msgstr "默认设置适于大多数人。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:309
+msgid "There is a fundamental tradeoff between anonymity and performance."
+msgstr "匿名性需要以性能为代价。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:312
+msgid ""
+"Tunnels longer than 3 hops (for example 2 hops + 0-2 hops, 3 hops + 0-1 "
+"hops, 3 hops + 0-2 hops), or a high quantity + backup quantity, may severely "
+"reduce performance or reliability."
+msgstr ""
+"长于3个跳点的隧道(例如 2跳点 + 0-2跳点,3跳点 + 0-1跳点, 3跳点 + 0-2跳点),或"
+"大量常规+大量备用,可能降低性能和稳定性。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:315
+msgid "High CPU and/or high outbound bandwidth usage may result."
+msgstr "导致高CPU占用和/或高上行流量。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:318
+msgid "Change these settings with care, and adjust them if you have problems."
+msgstr "小心更改这些设置。如果遇到问题可以在这里调整。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:332
+msgid ""
+"Exploratory tunnel setting changes are stored in the router.config file."
+msgstr "对探测隧道设置的更改将保存入router.config文件中。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:335
+msgid "Client tunnel changes are temporary and are not saved."
+msgstr "对客户程序隧道的修改是临时的,将不予保存。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:337
+msgid "To make permanent client tunnel changes see the"
+msgstr "要永久性更改客户通道的设置参见"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:339
+msgid "i2ptunnel page"
+msgstr "I2P 隧道页面"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:106
+msgid "config UI"
+msgstr "界面设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:241
+msgid "I2P UI Configuration"
+msgstr "I2P 界面设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:291
+msgid "Router Console Theme"
+msgstr "路由控制台主题"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:309
+msgid "Theme selection disabled for Internet Explorer, sorry."
+msgstr "抱歉,主题功能在InternetExplorer中已禁用。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:311
+msgid ""
+"If you're not using IE, it's likely that your browser is pretending to be "
+"IE; please configure your browser (or proxy) to use a different User Agent "
+"string if you'd like to access the console themes."
+msgstr ""
+"如果您没使用IE,您的浏览器可能正在伪装IE的UserAgent;您需要设置浏览器(或过滤"
+"式代理)使用不同的UserAgent,才能访问路由控制台的主题功能。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:315
+msgid "Router Console Language"
+msgstr "路由控制台语言"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:319
+msgid ""
+"Please contribute to the router console translation project! Contact the "
+"developers on IRC #i2p to help."
+msgstr ""
+"欢迎加入路由控制台翻译项目!提供帮助请通过IRC到#i2p房间与开发人员联系。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:106
+msgid "config update"
+msgstr "升级设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:228
+msgid "I2P Update Configuration"
+msgstr "I2P 更新设置"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:300
+msgid "Check for I2P and news updates"
+msgstr "检查I2P软件及新闻更新"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:302
+msgid "News &amp; I2P Updates"
+msgstr "软件及新闻更新"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:306
+msgid "Update In Progress"
+msgstr "更新中"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:314
+msgid "News URL"
+msgstr "新闻链接"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:318
+msgid "Refresh frequency"
+msgstr "更新频率"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:322
+msgid "Update policy"
+msgstr "升级策略"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:326
+msgid "Update through the eepProxy?"
+msgstr "通过I2P代理更新?"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:330
+msgid "eepProxy host"
+msgstr "I2P代理主机"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:334
+msgid "eepProxy port"
+msgstr "I2P代理端口"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:338
+msgid "Update URLs"
+msgstr "更新链接"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:342
+msgid "Trusted keys"
+msgstr "可信公钥"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:346
+msgid "Update with unsigned development builds?"
+msgstr "更新包括未签名的开发版?"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:350
+msgid "Unsigned Build URL"
+msgstr "未签名软件链接"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:354
+msgid "Save"
+msgstr "保存"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:117
+msgid "Page Not Found"
+msgstr "页面未找到"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:243
+msgid ""
+"Sorry! You appear to be requesting a non-existent Router Console page or "
+"resource."
+msgstr "抱歉!您请求的页面或资源不存在。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:245
+msgid "Error 404"
+msgstr "错误 404"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:250
+msgid "not found"
+msgstr "未找到"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:106
+msgid "graphs"
+msgstr "图表"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:228
+msgid "I2P Performance Graphs"
+msgstr "I2P 性能图表"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:105
+msgid "home"
+msgstr "主页"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:105
+msgid "job queue"
+msgstr "作业队列"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:227
+msgid "I2P Router Job Queue"
+msgstr "I2P 路由器作业队列"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:105
+msgid "logs"
+msgstr "日志"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:227
+msgid "I2P Router Logs"
+msgstr "I2P 路由器日志"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:229
+msgid "I2P Version & Running Environment"
+msgstr "I2P 版本及运行环境"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:231
+msgid "Please include this information in bug reports"
+msgstr "报告问题时请包括以下信息"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:267
+msgid "Critical Logs"
+msgstr "关键日志"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:271
+msgid "Router Logs"
+msgstr "路由器日志"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:277
+msgid "Service (Wrapper) Logs"
+msgstr "服务(封装)日志"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:105
+msgid "network database summary"
+msgstr "I2P 网络数据库概况"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:227
+msgid "I2P Network Database Summary"
+msgstr "I2P 网络数据库概况"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:109
+msgid "WebApp Not Found"
+msgstr "Web程序(war)未找到"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:231
+msgid "Web Application Not Running"
+msgstr "Web程序(.war)未运行"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:233
+msgid "The requested web application is not running."
+msgstr "您所访问的Web程序未启动。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:235
+msgid ""
+"Please visit the <a href=\"/configclients.jsp#webapp\">config clients page</"
+"a> to start it."
+msgstr ""
+"请先在<a href=\"/configclients.jsp#webapp\">配置客户端页面</a>中启动它。"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:105
+msgid "peer connections"
+msgstr "节点连接"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:227
+msgid "I2P Network Peers"
+msgstr "I2P 网络节点"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:105
+msgid "peer profiles"
+msgstr "节点信息"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:227
+msgid "I2P Network Peer Profiles"
+msgstr "I2P 网络节点信息"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:105
+msgid "statistics"
+msgstr "统计"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:242
+msgid "I2P Router Statistics"
+msgstr "I2P 路由器统计数据"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:244
+#, java-format
+msgid "Disable {0}s Refresh"
+msgstr "停止 {0}秒 刷新"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:105
+msgid "tunnel summary"
+msgstr "隧道概况"
+
+#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:227
+msgid "I2P Tunnel Summary"
+msgstr "I2P 隧道概况"
+
+#~ msgid "skew"
+#~ msgstr "时滞"
+
+#~ msgid "Expl. + Client"
+#~ msgstr "探测+客户"
+
+#~ msgid "Part. from + to"
+#~ msgstr "相邻共享节点"
+
+#~ msgid "Depth"
+#~ msgstr "深度"
+
+#~ msgid "Addresses"
+#~ msgstr "地址"
+
+#~ msgid "view without"
+#~ msgstr "查看不含"
+
+#~ msgid "view with"
+#~ msgstr "查看含"
+
+#~ msgid "stats"
+#~ msgstr "统计"
+
+#~ msgid "View"
+#~ msgstr "查看"
+
+#~ msgid "Not Failing"
+#~ msgstr "标准"
+
+#~ msgid ""
+#~ "If you want the router to restart itself after shutting down, you can "
+#~ "choose one of the following.  This is useful in some situations - for "
+#~ "example, if you changed some settings that client applications only read "
+#~ "at startup, such as the routerconsole password or the interface it "
+#~ "listens on.  A graceful restart will take a few minutes (but your peers "
+#~ "will appreciate your patience), while a hard restart does so "
+#~ "immediately.  After tearing down the router, it will wait 1 minute before "
+#~ "starting back up again."
+#~ msgstr ""
+#~ "如果你想要路由器关闭后重新启动,可以选择下面的选项。重启在某些情况下有用 "
+#~ "- 例如当修改了客户程序仅在启动时读取的设置比如路由器控制界面的密码,监听的"
+#~ "接口。平滑重启可能会等待几分钟的时间 (但其他节点一定会感激你的耐心),硬重"
+#~ "启可以立即完成。 路由关闭后将等待1分钟再重新启动。"
+
+#~ msgid ""
+#~ "On the windows platform, there is a small application to sit in the "
+#~ "system tray, allowing you to view the router's status (later on, I2P "
+#~ "client applications will be able to integrate their own functionality "
+#~ "into the system tray as well). If you are on windows, you can either "
+#~ "enable or disable that icon here."
+#~ msgstr ""
+#~ "windows 平台允许小程序进驻系统托盘,让你可以查看路由状态,(以后的 I2P 客户"
+#~ "端程序也会将它们的功能集成到系统托盘里)。如果你使用Windows, 可以在这里开启"
+#~ "或关闭这个托盘图标。"
diff --git a/apps/streaming/java/src/net/i2p/client/streaming/MessageInputStream.java b/apps/streaming/java/src/net/i2p/client/streaming/MessageInputStream.java
index ad4795c07918126abef625f181895d30f6620664..38537bc7f37189c55104f4208a74e7839053dc1f 100644
--- a/apps/streaming/java/src/net/i2p/client/streaming/MessageInputStream.java
+++ b/apps/streaming/java/src/net/i2p/client/streaming/MessageInputStream.java
@@ -99,9 +99,9 @@ public class MessageInputStream extends InputStream {
         }
     }
     private long[] locked_getNacks() {
-        List ids = null;
+        List<Long> ids = null;
         for (long i = _highestReadyBlockId + 1; i < _highestBlockId; i++) {
-            Long l = new Long(i);
+            Long l = Long.valueOf(i);
             if (_notYetReadyBlocks.containsKey(l)) {
                 // ACK
             } else {
@@ -113,7 +113,7 @@ public class MessageInputStream extends InputStream {
         if (ids != null) {
             long rv[] = new long[ids.size()];
             for (int i = 0; i < rv.length; i++)
-                rv[i] = ((Long)ids.get(i)).longValue();
+                rv[i] = ids.get(i).longValue();
             return rv;
         } else {
             return null;
diff --git a/apps/susidns/locale/messages_ru.po b/apps/susidns/locale/messages_ru.po
new file mode 100644
index 0000000000000000000000000000000000000000..3f06543d1bc4afb2a6134f37f90da084907c083b
--- /dev/null
+++ b/apps/susidns/locale/messages_ru.po
@@ -0,0 +1,395 @@
+# I2P
+# Copyright (C) 2009 The I2P Project
+# This file is distributed under the same license as the susidns package.
+# To contribute translations, see http://www.i2p2.de/newdevelopers
+# foo <foo@bar>, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: I2P susidns\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-12-19 11:30+0000\n"
+"PO-Revision-Date: 2009-12-20 07:03+0000\n"
+"Last-Translator: 4get <forget@mail.i2p>\n"
+"Language-Team: foo <foo@bar>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Russian\n"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:197
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:188
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:192
+msgid "Search"
+msgstr "Поиск"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:201
+msgid "Search within filtered list"
+msgstr "Поиск в отфильтрованном списке"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:203
+msgid "Filtered list"
+msgstr "Отфильтрованный список"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:207
+msgid "no matches"
+msgstr "ничего не найдено"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:210
+msgid "Addressbook"
+msgstr "Адресная книга"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:212
+msgid "contains no entries"
+msgstr "не содержит записей"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:214
+msgid "contains 1 entry"
+msgstr "содержит одну запись"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:216
+#, java-format
+msgid "contains {0} entries"
+msgstr "содержит {0} записей"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:226
+#, java-format
+msgid "Showing {0} of {1}"
+msgstr "Показаны {0} из {1}"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:257
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:359
+msgid "Add"
+msgstr "Добавить"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:261
+msgid "Destination added."
+msgstr "Адрес добавлен."
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:265
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:307
+msgid "Delete"
+msgstr "Удалить"
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:275
+#, java-format
+msgid "Destination {0} deleted."
+msgstr "Адрес {0} удален."
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:277
+#, java-format
+msgid "{0} destinations deleted."
+msgstr "{0} адресов удалено."
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:283
+msgid "Addressbook saved."
+msgstr "Адресная книга сохранена."
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:286
+msgid "ERROR: Could not write addressbook file."
+msgstr "ОШИБКА: Не удалось сохранить файл адресной книги."
+
+#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:291
+#: ../src/java/src/i2p/susi/dns/ConfigBean.java:148
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:150
+msgid "Invalid form submission, probably because you used the \"back\" or \"reload\" button on your browser. Please resubmit."
+msgstr "Форма не принята, скорее всего это произошло из-за того, что Вы нажимали кнопку \"Назад\" или \"Обновить\" в браузере. Пожалуйста, заполните форму заново."
+
+#: ../src/java/src/i2p/susi/dns/ConfigBean.java:139
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:129
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:123
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:123
+msgid "Save"
+msgstr "Сохранить"
+
+#: ../src/java/src/i2p/susi/dns/ConfigBean.java:141
+msgid "Configuration saved."
+msgstr "Настройки сохранены."
+
+#: ../src/java/src/i2p/susi/dns/ConfigBean.java:142
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:144
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:125
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:125
+msgid "Reload"
+msgstr "Перезагрузить"
+
+#: ../src/java/src/i2p/susi/dns/ConfigBean.java:144
+msgid "Configuration reloaded."
+msgstr "Настройки перезагружены."
+
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:138
+msgid "Subscriptions saved, updating addressbook from subscription sources now."
+msgstr "Подписки сохранены, запущена загрузка подписок и обновление адресной книги."
+
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:142
+msgid "Subscriptions saved."
+msgstr "Подписки сохранены."
+
+#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:146
+msgid "Subscriptions reloaded."
+msgstr "Подписки перезагружены."
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:120
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:140
+msgid "addressbook"
+msgstr "адресная книга"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:122
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:99
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:88
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:99
+msgid "addressbooks"
+msgstr "адресные книги"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:124
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:101
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:90
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:101
+msgid "private"
+msgstr "приватная"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:126
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:103
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:92
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:103
+msgid "master"
+msgstr "основная"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:128
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:105
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:94
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:105
+msgid "router"
+msgstr "маршрутизатор"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:130
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:107
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:96
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:107
+msgid "published"
+msgstr "публикуемая"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:132
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:109
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:98
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:97
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:109
+msgid "subscriptions"
+msgstr "подписки"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:134
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:97
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:111
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:100
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:111
+msgid "configuration"
+msgstr "настройки"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:136
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:113
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:102
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:113
+msgid "overview"
+msgstr "введение"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:158
+msgid "Filter"
+msgstr "Фильтр"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:161
+msgid "all"
+msgstr "[без фильтра]"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:172
+msgid "Current filter"
+msgstr "Текущий фильтр"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:177
+msgid "clear filter"
+msgstr "сбросить фильтр"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:219
+msgid "Name"
+msgstr "Имя"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:221
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:355
+msgid "Destination"
+msgstr "Адрес назначения"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:252
+msgid "Mark for deletion"
+msgstr "Пометить для удаления"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:274
+msgid "address helper link"
+msgstr "addresshelper-ссылка"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:338
+msgid "This addressbook is empty."
+msgstr "Эта адресная книга пуста."
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:349
+msgid "Add new destination"
+msgstr "Добавить новый адрес"
+
+#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:351
+msgid "Hostname"
+msgstr "Имя узла"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:127
+msgid "Hints"
+msgstr "Примечания"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:129
+msgid "File and directory paths here are relative to the addressbook's working directory, which is normally ~/.i2p/addressbook/ (Linux) or %APPDATA%\\I2P\\addressbook\\ (Windows)."
+msgstr "Пути указываются относительно домашней директории адресной книги, которая обычно расположена в ~/.i2p/addressbook/ (под Linux) или в %APPDATA%\\I2P\\addressbook\\ (под Windows)."
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:131
+msgid "If you want to manually add lines to an addressbook, add them to the private or master addressbooks."
+msgstr "Если Вы хотите вручную добавлять записи в адресную книгу, то добавляйте их в «приватную» или «основную»."
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:133
+msgid "The router addressbook and the published addressbook are updated by the addressbook application."
+msgstr "Адресные книги «маршрутизатор» и «публикуемая» создаются/перезаписываются автоматически."
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:135
+msgid "When you publish your addressbook, ALL destinations from the master and router addressbooks appear there."
+msgstr "Когда Вы публикуете свою адресную книгу, то публикуются ВСЕ записи из адресных книг «основная» и «маршрутизатор»."
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:137
+msgid "Use the private addressbook for private destinations, these are not published."
+msgstr "Пользуйтесь «приватной» адресной книгой для адресов, которые Вы не хотите публиковать."
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:139
+msgid "Options"
+msgstr "Параметры"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:141
+msgid "File containing the list of subscriptions URLs (no need to change)"
+msgstr "Файл для хранения списка URL подписок (перенастраивать нет необходимости)"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:143
+msgid "Update interval in hours"
+msgstr "Интервал обновления (часы)"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:145
+msgid "Your public hosts.txt file (choose a path within your webserver document root)"
+msgstr "hosts.txt для публикации (по умолчанию сохраняется в корневой директории встроенного в I2P маршутизатор вебсервера)"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:147
+msgid "Your hosts.txt (don't change)"
+msgstr "hosts.txt используемый маршрутизатором (перенастраивать не надо)"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:149
+msgid "Your personal addressbook, these hosts will be published"
+msgstr "Ваша публичная адресная книга, эти записи будут публиковаться"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:151
+msgid "Your private addressbook, it is never published"
+msgstr "Ваша приватная адресная книга, она никогда не публикуется"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:153
+msgid "Port for your eepProxy (no need to change)"
+msgstr "Порт eepProxy  (перенастраивать нет необходимости)"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:155
+msgid "Hostname for your eepProxy (no need to change)"
+msgstr "Адрес eepProxy (перенастраивать нет необходимости)"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:157
+msgid "Whether to update the published addressbook"
+msgstr "Обновлять ли публикуемую адресную книгу (true/false)"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:159
+msgid "File containing the etags header from the fetched subscription URLs (no need to change)"
+msgstr "Файл для хранения etags-заголовков от загруженных адресов подписок (перенастраивать нет необходимости)"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:161
+msgid "File containing the modification timestamp for each fetched subscription URL (no need to change)"
+msgstr "Файл для хранения даты/времени модификации каждого загруженного адреса подписки (перенастраивать нет необходимости)"
+
+#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:163
+msgid "File to log activity to (change to /dev/null if you like)"
+msgstr "Файл для записи журнала действий"
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:86
+msgid "Introduction"
+msgstr "Введение - SusiDNS"
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:104
+msgid "What is the addressbook?"
+msgstr "Что такое адресная книга?"
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:106
+msgid "The addressbook application is part of your i2p installation."
+msgstr "Адресная книга — это приложение в составе Вашего I2P маршрутизатора."
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:108
+msgid "It regularly updates your hosts.txt file from distributed sources or \"subscriptions\"."
+msgstr "Его задача регулярно пополнять Ваш hosts.txt адресами из настраиваемых источников («подписок»)."
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:110
+msgid "In the default configuration, the addressbook is only subscribed to www.i2p2.i2p."
+msgstr "По умолчанию в адресной книге настроена лишь одна подписка — на www.i2p2.i2p."
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:112
+msgid "Subscribing to additional sites is easy, just add them to your <a href=\"subscriptions.jsp\">subscriptions</a> file."
+msgstr "Добавить другие подписки просто, достаточно вписать их URL в <a href=\"subscriptions.jsp\">файл подписок</a>."
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:114
+msgid "For more information on naming in i2p, see <a href=\"http://www.i2p2.i2p/naming.html\">the overview on www.i2p2.i2p</a>."
+msgstr "Подробнее о механизме доменных имен в I2P читайте на странице <a href=\"http://www.i2p2.i2p/naming.html\">Naming in I2P</a>."
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:116
+msgid "How does the addressbook work?"
+msgstr "Как работает адресная книга?"
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:118
+msgid "The addressbook application regularly polls your subscriptions and merges their content into your \"router\" addressbook, stored in the hosts.txt file."
+msgstr "Адресная книга периодически опрашивает Ваши подписки и добавляет их содержимое в Вашу «маршрутизаторную» адресную книгу, которая хранится в файле hosts.txt."
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:120
+msgid "Then it merges your \"master\" addressbook (userhosts.txt) into the router addressbook as well."
+msgstr "После этого туда добавляется содержимое Вашей «основной» адресной книги (userhosts.txt)."
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:122
+msgid "If configured, the router addressbook is now written to the \"published\" addressbook, which will be publicly available if you are running an eepsite."
+msgstr "Если разрешена публикация, то «маршрутизаторная» адресная книга копируется в «публикуемую» адресную книгу. «Публикуемая» адресная книга доступна публично, если у Вас запущен Ваш I2P-сайт."
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:124
+msgid "The router also uses a private addressbook (privatehosts.txt, not shown in the picture), which is not merged or published."
+msgstr "Маршрутизатор также использует приватную адресную книгу (privatehosts.txt, на иллюстрации не показано), которая никуда не копируется и не публикуется."
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:126
+msgid "Hosts in the private addressbook can be accessed by you but their addresses are never distributed to others."
+msgstr "Таким образом Вы можете пользоваться адресами из этой адресной книги, не раскрывая другим её содержимое."
+
+#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:128
+msgid "The private addressbook can also be used for aliases of hosts in your other addressbooks."
+msgstr "Приватную адресную книгу также удобно иcпользовать для хранения альтернативных/коротких адресов."
+
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:127
+msgid "The subscription file contains a list of i2p URLs."
+msgstr "Файл подписок содержит список i2p URL."
+
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:129
+msgid "The addressbook application regularly checks this list for new eepsites."
+msgstr "Адресная книга периодически проверяет этот список на наличие новых адресов I2P-сайтов."
+
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:131
+msgid "Those URLs refer to published hosts.txt files."
+msgstr "Каждый URL указывает на опубликованный hosts.txt файл."
+
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:133
+msgid "The default subscription is the hosts.txt from www.i2p2.i2p, which is updated infrequently."
+msgstr "По умолчанию в списке задана только ссылка на hosts.txt с www.i2p2.i2p, который обновляется очень редко."
+
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:135
+msgid "So it is a good idea to add additional subscriptions to sites that have the latest addresses."
+msgstr "Поэтому не помешает дополнительно подписаться на hosts.txt с более часто обновляемых сайтов."
+
+#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:137
+msgid "See the FAQ for a list of subscription URLs."
+msgstr "В соответствующем разделе FAQ можно найти несколько таких адресов."
+
diff --git a/apps/susidns/src/bundle-messages.sh b/apps/susidns/src/bundle-messages.sh
index e21706e880900dab3ac4c663a8aacdb4059eef43..e46eccd73f6816d61c1293aea9223a9df9cd4c32 100755
--- a/apps/susidns/src/bundle-messages.sh
+++ b/apps/susidns/src/bundle-messages.sh
@@ -75,7 +75,7 @@ do
 	echo "Generating ${CLASS}_$LG ResourceBundle..."
 
 	# convert to class files in build/obj
-	msgfmt --java -r $CLASS -l $LG -d WEB-INF/classes $i
+	msgfmt --java --statistics -r $CLASS -l $LG -d WEB-INF/classes $i
 	if [ $? -ne 0 ]
 	then
 		echo 'Warning - msgfmt failed, not updating translations'
diff --git a/apps/susidns/src/css.css b/apps/susidns/src/css.css
index 0ee2432d62a6c67a8b03eb49a7236680c12e4646..fae4f94a0bfb11ae7588e01ac1faed6a8d85e630 100644
--- a/apps/susidns/src/css.css
+++ b/apps/susidns/src/css.css
@@ -121,4 +121,32 @@ p.footer {
   font-size: 10pt !important;
   line-height: 160% !important;
   -moz-box-shadow: inset 0px 0px 1px 0px #002;
-}
\ No newline at end of file
+}
+
+input[type=submit] {
+     border: 1px outset #999;
+     background: #ddf;
+     color: #001;
+     margin: 5px;
+     font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
+     padding: 1px 2px;
+     text-decoration: none;
+     min-width: 110px;
+     border-radius: 4px;
+     -moz-border-radius: 4px;
+     -khtml-border-radius: 4px;
+     -moz-box-shadow: inset 0px 2px 8px 0px #fff;
+     color: #006;
+     opacity: 0.9;
+}
+
+
+input[type=submit]:hover {
+     background: #22a;
+     color: #fff;
+     border: 1px solid #f60;
+     opacity: 1.0;
+     -moz-box-shadow: inset 0px 0px 0px 1px #fff;
+
+}
+
diff --git a/apps/susidns/src/images/add.png b/apps/susidns/src/images/add.png
deleted file mode 100644
index 8ea13225a551f454a71f088df341f880bbacf2e4..0000000000000000000000000000000000000000
Binary files a/apps/susidns/src/images/add.png and /dev/null differ
diff --git a/apps/susidns/src/images/delete.png b/apps/susidns/src/images/delete.png
deleted file mode 100644
index 736eaf24676b37173e09a874309258ff32194d33..0000000000000000000000000000000000000000
Binary files a/apps/susidns/src/images/delete.png and /dev/null differ
diff --git a/apps/susidns/src/images/reload.png b/apps/susidns/src/images/reload.png
deleted file mode 100644
index b0503ac5b3919a7c30f468d1d57f07de53314b2a..0000000000000000000000000000000000000000
Binary files a/apps/susidns/src/images/reload.png and /dev/null differ
diff --git a/apps/susidns/src/images/save.png b/apps/susidns/src/images/save.png
deleted file mode 100644
index 0743f3879efe9d0f876da3d7f505b06110c51d22..0000000000000000000000000000000000000000
Binary files a/apps/susidns/src/images/save.png and /dev/null differ
diff --git a/apps/susidns/src/images/search.png b/apps/susidns/src/images/search.png
deleted file mode 100644
index ce46f1d378e455b2ed5d0bc82afd12bcc3878425..0000000000000000000000000000000000000000
Binary files a/apps/susidns/src/images/search.png and /dev/null differ
diff --git a/apps/susidns/src/java/src/i2p/susi/dns/AddressbookBean.java b/apps/susidns/src/java/src/i2p/susi/dns/AddressbookBean.java
index 4036462bdcfba2f7aa72bcc02e8826ddf734e048..ce53d99d45be40a0a6feefa79654221a7176acc4 100644
--- a/apps/susidns/src/java/src/i2p/susi/dns/AddressbookBean.java
+++ b/apps/susidns/src/java/src/i2p/susi/dns/AddressbookBean.java
@@ -194,20 +194,27 @@ public class AddressbookBean
 			// addressbook.jsp catches the case where the whole book is empty.
 			String filterArg = "";
 			if( search != null && search.length() > 0 ) {
-				message = "Search ";
+				message = _("Search") + ' ';
 			}
 			if( filter != null && filter.length() > 0 ) {
 				if( search != null && search.length() > 0 )
-					message += "within ";
-				message += "Filtered list ";
+					message = _("Search within filtered list") + ' ';
+				else
+					message = _("Filtered list") + ' ';
 				filterArg = "&filter=" + filter;
 			}
 			if (entries.length == 0) {
-				message += "- no matches";
+				message += "- " + _("no matches") + '.';
 			} else if (getBeginInt() == 0 && getEndInt() == entries.length - 1) {
 				if (message.length() == 0)
-					message = "Addressbook ";
-				message += "contains " + entries.length + " entries";
+					message = _("Addressbook") + ' ';
+				if (entries.length <= 0)
+					message += _("contains no entries");
+				else if (entries.length == 1)
+					message += _("contains 1 entry");
+				else
+					message += _("contains {0} entries", entries.length);
+				message += '.';
 			} else {
 				if (getBeginInt() > 0) {
 					int newBegin = Math.max(0, getBeginInt() - DISPLAY_SIZE);
@@ -216,7 +223,7 @@ public class AddressbookBean
 					           "&begin=" + newBegin + "&end=" + newEnd + "\">" + newBegin +
 					           '-' + newEnd + "</a> | ";
 		       		}
-				message += "Showing " + getBegin() + '-' + getEnd() + " of " + entries.length;
+				message += _("Showing {0} of {1}", "" + getBegin() + '-' + getEnd(), entries.length);
 				if (getEndInt() < entries.length - 1) {
 					int newBegin = Math.min(entries.length - 1, getEndInt() + 1);
 					int newEnd = Math.min(entries.length, getEndInt() + DISPLAY_SIZE);
@@ -245,38 +252,43 @@ public class AddressbookBean
 		if( action != null ) {
 			if( lastSerial != null && serial != null && serial.compareTo( lastSerial ) == 0 ) {
 				boolean changed = false;
-				if( action.compareToIgnoreCase( "add") == 0 ) {
+				int deleted = 0;
+				String name = null;
+				if (action.equals(_("Add"))) {
 					if( addressbook != null && hostname != null && destination != null ) {
 						addressbook.put( hostname, destination );
 						changed = true;
-						message += "Destination added.<br/>";
+						message = _("Destination added.");
+						// clear search when adding
+						search = null;
 					}
-				}
-				if( action.compareToIgnoreCase( "delete" ) == 0 ) {
+				} else if (action.equals(_("Delete"))) {
 					Iterator it = deletionMarks.iterator();
-					int deleted = 0;
 					while( it.hasNext() ) {
-						String name = (String)it.next();
+						name = (String)it.next();
 						addressbook.remove( name );
 						changed = true;
 						deleted++;
 					}
 					if( changed ) {
-						message += "" + deleted + " destination(s) deleted.<br/>";
+						if (deleted == 1)
+							message = _("Destination {0} deleted.", name);
+						else
+							message = _("{0} destinations deleted.", deleted);
 					}
 				}
 				if( changed ) {
 					try {
 						save();
-						message += "Addressbook saved.<br/>";
+						message += "<br>" + _("Addressbook saved.");
 					} catch (Exception e) {
 						Debug.debug( e.getClass().getName() + ": " + e.getMessage() );
-						message += "ERROR: Could not write addressbook file.<br/>";
+						message += "<br>" + _("ERROR: Could not write addressbook file.");
 					}
 				}
 			}			
 			else {
-				message = "Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit.";
+				message = _("Invalid form submission, probably because you used the \"back\" or \"reload\" button on your browser. Please resubmit.");
 			}
 		}
 		
@@ -364,4 +376,19 @@ public class AddressbookBean
 			endIndex = Integer.parseInt(s);
 		} catch (NumberFormatException nfe) {}
 	}
+
+	/** translate */
+	private static String _(String s) {
+		return Messages.getString(s);
+	}
+
+	/** translate */
+	private static String _(String s, Object o) {
+		return Messages.getString(s, o);
+	}
+
+	/** translate */
+	private static String _(String s, Object o, Object o2) {
+		return Messages.getString(s, o, o2);
+	}
 }
diff --git a/apps/susidns/src/java/src/i2p/susi/dns/ConfigBean.java b/apps/susidns/src/java/src/i2p/susi/dns/ConfigBean.java
index 7dad7a25006a68ee7d42af425825d8a7aa2d4bd6..f6655757d8318977ee667baf4c8cbf013948fb05 100644
--- a/apps/susidns/src/java/src/i2p/susi/dns/ConfigBean.java
+++ b/apps/susidns/src/java/src/i2p/susi/dns/ConfigBean.java
@@ -136,17 +136,16 @@ public class ConfigBean implements Serializable {
 		String message = "";
 		if( action != null ) {
 			if( lastSerial != null && serial != null && serial.compareTo( lastSerial ) == 0 ) {
-				if( action.compareToIgnoreCase( "save") == 0 ) {
+				if(action.equals(_("Save"))) {
 					save();
-					message = "Configuration saved.";
-				}
-				else if( action.compareToIgnoreCase( "reload") == 0 ) {
+					message = _("Configuration saved.");
+				} else if (action.equals(_("Reload"))) {
 					reload();
-					message = "Configuration reloaded.";
+					message = _("Configuration reloaded.");
 				}
 			}			
 			else {
-				message = "Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit.";
+				message = _("Invalid form submission, probably because you used the \"back\" or \"reload\" button on your browser. Please resubmit.");
 			}
 		}
 		if( message.length() > 0 )
@@ -162,4 +161,9 @@ public class ConfigBean implements Serializable {
 	public void setSerial(String serial ) {
 		this.serial = serial;
 	}
+
+	/** translate */
+	private static String _(String s) {
+		return Messages.getString(s);
+	}
 }
diff --git a/apps/susidns/src/java/src/i2p/susi/dns/Messages.java b/apps/susidns/src/java/src/i2p/susi/dns/Messages.java
new file mode 100644
index 0000000000000000000000000000000000000000..b596a3be9a3e7c28c25c6c34816846bfd9fe1ecd
--- /dev/null
+++ b/apps/susidns/src/java/src/i2p/susi/dns/Messages.java
@@ -0,0 +1,34 @@
+package i2p.susi.dns;
+
+import net.i2p.I2PAppContext;
+import net.i2p.util.Translate;
+
+/**
+ * Translate strings for this package.
+ * @since 0.7.9
+ */
+public class Messages {
+    private static final String BUNDLE_NAME = "i2p.susi.dns.messages";
+    private final I2PAppContext _context;
+
+    public Messages() {
+        _context = I2PAppContext.getGlobalContext();
+    }
+
+    /** lang in routerconsole.lang property, else current locale */
+    public String _(String key) {
+        return Translate.getString(key, _context, BUNDLE_NAME);
+    }
+
+    public static String getString(String s) {
+        return Translate.getString(s, I2PAppContext.getGlobalContext(), BUNDLE_NAME);
+    }
+
+    public static String getString(String s, Object o) {
+        return Translate.getString(s, o, I2PAppContext.getGlobalContext(), BUNDLE_NAME);
+    }
+
+    public static String getString(String s, Object o, Object o2) {
+        return Translate.getString(s, o, o2, I2PAppContext.getGlobalContext(), BUNDLE_NAME);
+    }
+}
diff --git a/apps/susidns/src/java/src/i2p/susi/dns/SubscriptionsBean.java b/apps/susidns/src/java/src/i2p/susi/dns/SubscriptionsBean.java
index b860e23930f5ed6c3112b2b868ccc643e02b5c54..cc983b54bf0c78ae105eae908304fb4abf54c047 100644
--- a/apps/susidns/src/java/src/i2p/susi/dns/SubscriptionsBean.java
+++ b/apps/susidns/src/java/src/i2p/susi/dns/SubscriptionsBean.java
@@ -126,7 +126,7 @@ public class SubscriptionsBean
 		String message = "";
 		if( action != null ) {
 			if( lastSerial != null && serial != null && serial.compareTo( lastSerial ) == 0 ) {
-				if( action.compareToIgnoreCase( "save") == 0 ) {
+				if (action.equals(_("Save"))) {
 					save();
 					String nonce = System.getProperty("addressbook.nonce");
 					if (nonce != null) {	
@@ -135,20 +135,19 @@ public class SubscriptionsBean
 						// Fetching from the addressbook servlet
 						// with the correct parameters will kick off a
 						// config reload and fetch.
-						message = "Subscriptions saved, updating addressbook from subscription sources now." +
+						message = _("Subscriptions saved, updating addressbook from subscription sources now.") +
 						          "<img height=\"1\" width=\"1\" alt=\"\" " +
 						          "src=\"/addressbook/?wakeup=1&nonce=" + nonce + "\">";
 					} else {
-						message = "Subscriptions saved.";
+						message = _("Subscriptions saved.");
 					}
-				}
-				else if( action.compareToIgnoreCase( "reload") == 0 ) {
+				} else if (action.equals(_("Reload"))) {
 					reload();
-					message = "Subscriptions reloaded.";
+					message = _("Subscriptions reloaded.");
 				}
 			}			
 			else {
-				message = "Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit.";
+				message = _("Invalid form submission, probably because you used the \"back\" or \"reload\" button on your browser. Please resubmit.");
 			}
 		}
 		if( message.length() > 0 )
@@ -183,4 +182,9 @@ public class SubscriptionsBean
 		
 		return content;
 	}
+
+	/** translate */
+	private static String _(String s) {
+		return Messages.getString(s);
+	}
 }
diff --git a/apps/susidns/src/jsp/addressbook.jsp b/apps/susidns/src/jsp/addressbook.jsp
index 2bcf298ed29920d0a04ce5af0c49c083e73e5c9b..ff09b41e023b50048d328729f156c781beaae781 100644
--- a/apps/susidns/src/jsp/addressbook.jsp
+++ b/apps/susidns/src/jsp/addressbook.jsp
@@ -22,11 +22,18 @@
  *  
  * $Revision: 1.3 $
  */
+
+    // http://www.crazysquirrel.com/computing/general/form-encoding.jspx
+    if (request.getCharacterEncoding() == null)
+        request.setCharacterEncoding("UTF-8");
+
 %>
+<%@page pageEncoding="UTF-8"%>
 <%@ page contentType="text/html"%>
 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
 <jsp:useBean id="version" class="i2p.susi.dns.VersionBean" scope="application" />
 <jsp:useBean id="book" class="i2p.susi.dns.AddressbookBean" scope="session" />
+<jsp:useBean id="intl" class="i2p.susi.dns.Messages" scope="application" />
 <jsp:setProperty name="book" property="*" />
 <jsp:setProperty name="book" property="resetDeletionMarks" value="1"/>
 <c:forEach items="${paramValues.checked}" var="checked">
@@ -35,7 +42,8 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html>
 <head>
-<title>${book.book} addressbook - susidns v${version.version}</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>${book.book} <%=intl._("addressbook")%> - susidns</title>
 <link rel="stylesheet" type="text/css" href="css.css">
 </head>
 <body>
@@ -45,19 +53,20 @@
 </div>
 <hr>
 <div id="navi">
-<p>addressbooks
-<a href="addressbook.jsp?book=master&filter=none&begin=0&end=99">master</a> |
-<a href="addressbook.jsp?book=router&filter=none&begin=0&end=99">router</a> |
-<a href="addressbook.jsp?book=published&filter=none&begin=0&end=99">published</a> |
-<a href="addressbook.jsp?book=private&filter=none&begin=0&end=99">private</a> *
-<a href="subscriptions.jsp">subscriptions</a> *
-<a href="config.jsp">configuration</a> *
-<a href="index.jsp">overview</a>
+<p>
+<%=intl._("addressbooks")%>
+<a href="addressbook.jsp?book=private&filter=none&begin=0&end=99"><%=intl._("private")%></a> |
+<a href="addressbook.jsp?book=master&filter=none&begin=0&end=99"><%=intl._("master")%></a> |
+<a href="addressbook.jsp?book=router&filter=none&begin=0&end=99"><%=intl._("router")%></a> |
+<a href="addressbook.jsp?book=published&filter=none&begin=0&end=99"><%=intl._("published")%></a> *
+<a href="subscriptions.jsp"><%=intl._("subscriptions")%></a> *
+<a href="config.jsp"><%=intl._("configuration")%></a> *
+<a href="index.jsp"><%=intl._("overview")%></a>
 </p>
 </div>
 <hr>
 <div id="headline">
-<h3>${book.book} addressbook at ${book.fileName}</h3>
+<h3><%=intl._(book.getBook())%> <%=intl._("addressbook")%>: ${book.fileName}</h3>
 </div>
 
 <div id="messages">${book.messages}</div>
@@ -66,7 +75,7 @@
 
 <c:if test="${book.notEmpty}">
 <div id="filter">
-<p>Filter:
+<p><%=intl._("Filter")%>:
 <a href="addressbook.jsp?filter=a&begin=0&end=99">a</a>
 <a href="addressbook.jsp?filter=b&begin=0&end=99">b</a>
 <a href="addressbook.jsp?filter=c&begin=0&end=99">c</a> 
@@ -94,10 +103,10 @@
 <a href="addressbook.jsp?filter=y&begin=0&end=99">y</a>
 <a href="addressbook.jsp?filter=z&begin=0&end=99">z</a>
 <a href="addressbook.jsp?filter=0-9&begin=0&end=99">0-9</a>
-<a href="addressbook.jsp?filter=none&begin=0&end=99">all</a></p>
+<a href="addressbook.jsp?filter=none&begin=0&end=99"><%=intl._("all")%></a></p>
 <c:if test="${book.hasFilter}">
-<p>Current filter: ${book.filter}
-(<a href="addressbook.jsp?filter=none&begin=0&end=99">clear filter</a>)</p>
+<p><%=intl._("Current filter")%>: ${book.filter}
+(<a href="addressbook.jsp?filter=none&begin=0&end=99"><%=intl._("clear filter")%></a>)</p>
 </c:if>
 </div>
 
@@ -106,8 +115,8 @@
 <input type="hidden" name="end" value="99">
 <div id="search">
 <table><tr>
-<td class="search">Search: <input type="text" name="search" value="${book.search}" size="20" ></td>
-<td class="search"><input type="image" src="images/search.png" name="submitsearch" value="search" alt="Search" ></td>
+<td class="search"><%=intl._("Search")%>: <input type="text" name="search" value="${book.search}" size="20" ></td>
+<td class="search"><input type="submit" name="submitsearch" value="<%=intl._("Search")%>" ></td>
 </tr>
 </table>
 </div>
@@ -131,17 +140,17 @@
 <th>&nbsp;</th>
 </c:if>
 
-<th>Name</th>
-<th>Destination</th>
+<th><%=intl._("Name")%></th>
+<th><%=intl._("Destination")%></th>
 </tr>
 <!-- limit iterator, or "Form too large" may result on submit, and is a huge web page if we don't -->
 <c:forEach items="${book.entries}" var="addr" begin="${book.begin}" end="${book.end}">
 <tr class="list${book.trClass}">
 <c:if test="${book.master || book.router || book.published || book.private}">
-<td class="checkbox"><input type="checkbox" name="checked" value="${addr.name}" alt="Mark for deletion"></td>
+<td class="checkbox"><input type="checkbox" name="checked" value="${addr.name}" title="<%=intl._("Mark for deletion")%>"></td>
 </c:if>
 <td class="names"><a href="http://${addr.name}/">${addr.name}</a> -
-<span class="addrhlpr"><a href="http://${addr.name}/?i2paddresshelper=${addr.destination}">(addrhlpr)</a></span>
+<span class="addrhlpr">(<a href="http://${addr.name}/?i2paddresshelper=${addr.destination}"><%=intl._("address helper link")%></a>)</span>
 </td>
 <td class="destinations"><textarea rows="1" style="height: 3em;" cols="40" wrap="off" readonly="readonly" name="dest_${addr.name}" >${addr.destination}</textarea></td>
 </tr>
@@ -151,7 +160,7 @@
 
 <c:if test="${book.master || book.router || book.published || book.private}">
 <div id="buttons">
-<p class="buttons"><input type="image" name="action" value="delete" src="images/delete.png" alt="Delete checked" >
+<p class="buttons"><input type="submit" name="action" value="<%=intl._("Delete")%>" >
 </p>
 </div>
 </c:if>
@@ -160,17 +169,17 @@
 
 <c:if test="${book.isEmpty}">
 <div id="book">
-<p class="book">The ${book.book} addressbook is empty.</p>
+<p class="book"><%=intl._("This addressbook is empty.")%></p>
 </div>
 </c:if>
 
 <div id="add">
 <p class="add">
-<h3>Add new destination:</h3>
-<b>Hostname:</b> <input type="text" name="hostname" value="${book.hostname}" size="20">
-<b>Destination:</b> <textarea name="destination" rows="1" style="height: 3em;" cols="40" wrap="off" >${book.destination}</textarea><br/>
+<h3><%=intl._("Add new destination")%>:</h3>
+<b><%=intl._("Hostname")%>:</b> <input type="text" name="hostname" value="${book.hostname}" size="20">
+<b><%=intl._("Destination")%>:</b> <textarea name="destination" rows="1" style="height: 3em;" cols="40" wrap="off" >${book.destination}</textarea><br/>
 </p><p>
-<input type="image" name="action" value="add" src="images/add.png" alt="Add destination" >
+<input type="submit" name="action" value="<%=intl._("Add")%>" >
 </p>
 </div>
 
diff --git a/apps/susidns/src/jsp/config.jsp b/apps/susidns/src/jsp/config.jsp
index fd755300c6c7004624f462fe6f3c2cc963417164..f8b47ab003950fbd3a914cb41049d4615901572a 100644
--- a/apps/susidns/src/jsp/config.jsp
+++ b/apps/susidns/src/jsp/config.jsp
@@ -22,16 +22,24 @@
  *  
  * $Revision: 1.1 $
  */
+
+    // http://www.crazysquirrel.com/computing/general/form-encoding.jspx
+    if (request.getCharacterEncoding() == null)
+        request.setCharacterEncoding("UTF-8");
+
 %>
+<%@page pageEncoding="UTF-8"%>
 <%@ page contentType="text/html" %>
 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 <jsp:useBean id="version" class="i2p.susi.dns.VersionBean" scope="application"/>
 <jsp:useBean id="cfg" class="i2p.susi.dns.ConfigBean" scope="session"/>
+<jsp:useBean id="intl" class="i2p.susi.dns.Messages" scope="application" />
 <jsp:setProperty name="cfg" property="*" />
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html>
 <head>
-<title>configuration - susidns v${version.version}</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title><%=intl._("configuration")%> - susidns</title>
 <link rel="stylesheet" type="text/css" href="css.css">
 </head>
 <body>
@@ -41,14 +49,14 @@
 </div><hr>
 <div id="navi">
 <p>
-addressbooks
-<a href="addressbook.jsp?book=master">master</a> |
-<a href="addressbook.jsp?book=router">router</a> |
-<a href="addressbook.jsp?book=published">published</a> |
-<a href="addressbook.jsp?book=private">private</a> *
-<a href="subscriptions.jsp">subscriptions</a> *
-configuration *
-<a href="index.jsp">overview</a>
+<%=intl._("addressbooks")%>
+<a href="addressbook.jsp?book=private"><%=intl._("private")%></a> |
+<a href="addressbook.jsp?book=master"><%=intl._("master")%></a> |
+<a href="addressbook.jsp?book=router"><%=intl._("router")%></a> |
+<a href="addressbook.jsp?book=published"><%=intl._("published")%></a> *
+<a href="subscriptions.jsp"><%=intl._("subscriptions")%></a> *
+<%=intl._("configuration")%> *
+<a href="index.jsp"><%=intl._("overview")%></a>
 </p>
 </div><hr>
 <div id="headline">
@@ -61,35 +69,63 @@ configuration *
 <textarea name="config" rows="10" cols="80">${cfg.config}</textarea>
 </div>
 <div id="buttons">
-<input type="image" src="images/save.png" name="action" value="save" alt="Save Config">
-<input type="image" src="images/reload.png" name="action" value="reload" alt="Reload Config">
+<input type="submit" name="action" value="<%=intl._("Save")%>" >
+<input type="submit" name="action" value="<%=intl._("Reload")%>" >
 </div>
 </form>
 <div id="help">
-<h3>Hints</h3>
+<h3><%=intl._("Hints")%></h3>
 <ol>
-<li>All file or directory paths here are relative to the addressbook's working directory, which normally
-is located at $I2P/addressbook/.</li>
-<li>If you want to manually add lines to an addressbook, add them to the private or master addressbooks. The router
-addressbook and the published addressbook are overwritten by the addressbook application.</li>
-<li><b>Important:</b>When you publish your addressbook, <b>ALL</b> destinations from the master and router addressbooks appear there.
-Use the private addressbook for private destinations, these are not published.
+<li>
+<%=intl._("File and directory paths here are relative to the addressbook's working directory, which is normally ~/.i2p/addressbook/ (Linux) or %APPDATA%\\I2P\\addressbook\\ (Windows).")%>
+</li>
+<li>
+<%=intl._("If you want to manually add lines to an addressbook, add them to the private or master addressbooks.")%>
+<%=intl._("The router addressbook and the published addressbook are updated by the addressbook application.")%>
+</li>
+<li>
+<%=intl._("When you publish your addressbook, ALL destinations from the master and router addressbooks appear there.")%>
+<%=intl._("Use the private addressbook for private destinations, these are not published.")%>
 </li>
 </ol>
-<h3>Options</h3>
+<h3><%=intl._("Options")%></h3>
 <ul>
-<li><b>subscriptions</b> - file containing the list of subscriptions URLs (no need to change)</li>
-<li><b>update_delay</b> - update interval in hours (no need to change)</li>
-<li><b>published_addressbook</b> - your public hosts.txt file (choose a path within your webserver document root)</li>
-<li><b>router_addressbook</b> - your hosts.txt (don't change)</li>
-<li><b>master_addressbook</b> - your personal addressbook, it never gets overwritten by the addressbook (don't change)</li>
-<li><b>private_addressbook</b> - your private addressbook, it is never published (defaults to ../privatehosts.txt, don't change)</li>
-<li><b>proxy_port</b> - http port for your eepProxy (no need to change)</li>
-<li><b>proxy_host</b> - hostname for your eepProxy (no need to change)</li>
-<li><b>should_publish</b> - true/false whether to write the published addressbook</li>
-<li><b>etags</b> - file containing the etags header from the fetched subscription URLs (no need to change)</li>
-<li><b>last_modified</b> - file containing the modification timestamp for each fetched subscription URL (no need to change)</li>
-<li><b>log</b> - file to log activity to (change to /dev/null if you like)</li>
+<li><b>subscriptions</b> -
+<%=intl._("File containing the list of subscriptions URLs (no need to change)")%>
+</li>
+<li><b>update_delay</b> -
+<%=intl._("Update interval in hours")%>
+</li>
+<li><b>published_addressbook</b> -
+<%=intl._("Your public hosts.txt file (choose a path within your webserver document root)")%>
+</li>
+<li><b>router_addressbook</b> -
+<%=intl._("Your hosts.txt (don't change)")%>
+</li>
+<li><b>master_addressbook</b> -
+<%=intl._("Your personal addressbook, these hosts will be published")%>
+</li>
+<li><b>private_addressbook</b> -
+<%=intl._("Your private addressbook, it is never published")%>
+</li>
+<li><b>proxy_port</b> -
+<%=intl._("Port for your eepProxy (no need to change)")%>
+</li>
+<li><b>proxy_host</b> -
+<%=intl._("Hostname for your eepProxy (no need to change)")%>
+</li>
+<li><b>should_publish</b> -
+<%=intl._("Whether to update the published addressbook")%>
+</li>
+<li><b>etags</b> -
+<%=intl._("File containing the etags header from the fetched subscription URLs (no need to change)")%>
+</li>
+<li><b>last_modified</b> -
+<%=intl._("File containing the modification timestamp for each fetched subscription URL (no need to change)")%>
+</li>
+<li><b>log</b> -
+<%=intl._("File to log activity to (change to /dev/null if you like)")%>
+</li>
 </ul>
 </div><hr>
 <div id="footer">
diff --git a/apps/susidns/src/jsp/index.jsp b/apps/susidns/src/jsp/index.jsp
index 795dd7373b7d24cb8f6a2e96734ff41463137044..3c55f1bbc5aa9c8845bcc8aea3c7ec33ec385ec4 100644
--- a/apps/susidns/src/jsp/index.jsp
+++ b/apps/susidns/src/jsp/index.jsp
@@ -22,7 +22,13 @@
  *  
  * $Revision: 1.2 $
  */
+
+    // http://www.crazysquirrel.com/computing/general/form-encoding.jspx
+    if (request.getCharacterEncoding() == null)
+        request.setCharacterEncoding("UTF-8");
+
 %>
+<%@page pageEncoding="UTF-8"%>
 <%@ page contentType="text/html"%>
 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
 <jsp:useBean id="version" class="i2p.susi.dns.VersionBean" scope="application" />
@@ -30,7 +36,8 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html>
 <head>
-<title><%=intl._("Introduction - SusiDNS")%> v${version.version}</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title><%=intl._("Introduction")%> - SusiDNS</title>
 <link rel="stylesheet" type="text/css" href="css.css">
 </head>
 <body>
@@ -40,40 +47,40 @@
 </div>
 <hr>
 <div id="navi">
-<p>addressbooks
-<a href="addressbook.jsp?book=master">master</a> |
-<a href="addressbook.jsp?book=router">router</a> |
-<a href="addressbook.jsp?book=published">published</a> |
-<a href="addressbook.jsp?book=private">private</a> *
-<a href="subscriptions.jsp">subscriptions</a> *
-<a href="config.jsp">configuration</a> *
-overview
+<p>
+<%=intl._("addressbooks")%>
+<a href="addressbook.jsp?book=private"><%=intl._("private")%></a> |
+<a href="addressbook.jsp?book=master"><%=intl._("master")%></a> |
+<a href="addressbook.jsp?book=router"><%=intl._("router")%></a> |
+<a href="addressbook.jsp?book=published"><%=intl._("published")%></a> *
+<a href="subscriptions.jsp"><%=intl._("subscriptions")%></a> *
+<a href="config.jsp"><%=intl._("configuration")%></a> *
+<%=intl._("overview")%>
 </p>
 </div>
 <hr>
 <div id="content">
-<h3>Huh? what addressbook?</h3>
+<h3><%=intl._("What is the addressbook?")%></h3>
+<p>
+<%=intl._("The addressbook application is part of your i2p installation.")%>
+<%=intl._("It regularly updates your hosts.txt file from distributed sources or \"subscriptions\".")%>
+</p>
 <p>
-The addressbook application is part of your i2p installation. It regularly updates your hosts.txt file
-from distributed sources. It keeps your hosts.txt up to date, so it can automatically add
-eepsites announced on other sites if you subscribe to those sites' addressbooks.
+<%=intl._("In the default configuration, the addressbook is only subscribed to www.i2p2.i2p.")%>
+<%=intl._("Subscribing to additional sites is easy, just add them to your <a href=\"subscriptions.jsp\">subscriptions</a> file.")%>
 </p>
 <p>
-(To speak the truth: In its default configuration the addressbook does not poll
-additional sites, but www.i2p2.i2p only. Subscribing to additional sites is an easy task,
-just add them to your <a href="subscriptions.jsp">subscriptions</a> file.)
+<%=intl._("For more information on naming in i2p, see <a href=\"http://www.i2p2.i2p/naming.html\">the overview on www.i2p2.i2p</a>.")%>
 </p>
-<p>If you have questions about naming in i2p, there is an excellent <a href="http://forum.i2p/viewtopic.php?t=134">introduction</a>
-from duck in the forum and <a href="http://www.i2p2.i2p/naming.html">additional information on www.i2p2.i2p</a>.</p>
-<h3>How does the addressbook work?</h3>
-<p>The addressbook application regularly (normally once per hour) polls your subscriptions and merges their content
-into your so-called router addressbook (normally your plain hosts.txt). Then it merges your so-called master addressbook (normally
-your userhosts.txt) into the router addressbook as well. If configured, the router addressbook is now written to the published addressbook, 
-which is a publicly available copy of your hosts.txt somewhere in your eepsite's document root.
+<h3><%=intl._("How does the addressbook work?")%></h3>
+<p>
+<%=intl._("The addressbook application regularly polls your subscriptions and merges their content into your \"router\" addressbook, stored in the hosts.txt file.")%>
+<%=intl._("Then it merges your \"master\" addressbook (userhosts.txt) into the router addressbook as well.")%>
+<%=intl._("If configured, the router addressbook is now written to the \"published\" addressbook, which will be publicly available if you are running an eepsite.")%>
 </p><p>
-The router also uses a private addressbook (privatehosts.txt, not shown in the picture), which is not merged or published.
-Hosts in the private addressbook can be accessed by you but their addresses are never distributed to others.
-The private addressbook can also be used for aliases of hosts in your other addressbooks.
+<%=intl._("The router also uses a private addressbook (privatehosts.txt, not shown in the picture), which is not merged or published.")%>
+<%=intl._("Hosts in the private addressbook can be accessed by you but their addresses are never distributed to others.")%>
+<%=intl._("The private addressbook can also be used for aliases of hosts in your other addressbooks.")%>
 </p>
 <p><center><img src="images/how.png" border="0" alt="addressbook working scheme" title="How the addressbook works" class="illustrate" /></center></p>
 </div>	
diff --git a/apps/susidns/src/jsp/subscriptions.jsp b/apps/susidns/src/jsp/subscriptions.jsp
index 75542d57dab18723799e4dd4b9ceecfb465cb803..29bad172459f9ed21172bcab51fe6436ad4c19eb 100644
--- a/apps/susidns/src/jsp/subscriptions.jsp
+++ b/apps/susidns/src/jsp/subscriptions.jsp
@@ -22,16 +22,24 @@
  *  
  * $Revision: 1.2 $
  */
+
+    // http://www.crazysquirrel.com/computing/general/form-encoding.jspx
+    if (request.getCharacterEncoding() == null)
+        request.setCharacterEncoding("UTF-8");
+
 %>
+<%@page pageEncoding="UTF-8"%>
 <%@ page contentType="text/html"%>
 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
 <jsp:useBean id="version" class="i2p.susi.dns.VersionBean" scope="application" />
 <jsp:useBean id="subs" class="i2p.susi.dns.SubscriptionsBean" scope="session" />
+<jsp:useBean id="intl" class="i2p.susi.dns.Messages" scope="application" />
 <jsp:setProperty name="subs" property="*" />
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html>
 <head>
-<title>subscriptions - susidns v${version.version}</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title><%=intl._("subscriptions")%> - susidns</title>
 <link rel="stylesheet" type="text/css" href="css.css">
 </head>
 <body>
@@ -40,14 +48,15 @@
 <img src="images/logo.png" alt="susidns logo" border="0"/>
 </div><hr>
 <div id="navi">
-<p>addressbooks
-<a href="addressbook.jsp?book=master">master</a> |
-<a href="addressbook.jsp?book=router">router</a> |
-<a href="addressbook.jsp?book=published">published</a> |
-<a href="addressbook.jsp?book=private">private</a> *
-subscriptions *
-<a href="config.jsp">configuration</a> *
-<a href="index.jsp">overview</a>
+<p>
+<%=intl._("addressbooks")%>
+<a href="addressbook.jsp?book=private"><%=intl._("private")%></a> |
+<a href="addressbook.jsp?book=master"><%=intl._("master")%></a> |
+<a href="addressbook.jsp?book=router"><%=intl._("router")%></a> |
+<a href="addressbook.jsp?book=published"><%=intl._("published")%></a> *
+<%=intl._("subscriptions")%> *
+<a href="config.jsp"><%=intl._("configuration")%></a> *
+<a href="index.jsp"><%=intl._("overview")%></a>
 </p>
 </div><hr>
 <div id="headline">
@@ -60,18 +69,18 @@ subscriptions *
 <textarea name="content" rows="10" cols="80">${subs.content}</textarea>
 </div>
 <div id="buttons">
-<input type="image" src="images/save.png" name="action" value="save" alt="Save Subscriptions" >
-<input type="image" src="images/reload.png" name="action" value="reload" alt="Reload Subscriptions" >
+<input type="submit" name="action" value="<%=intl._("Save")%>" >
+<input type="submit" name="action" value="<%=intl._("Reload")%>" >
 </div>
 </form>
 <div id="help">
-<h3>Explanation</h3>
 <p class="help">
-The subscription file contains a list of (i2p) URLs. The addressbook application
-regularly (once per hour) checks this list for new eepsites. Those URLs simply contain the published hosts.txt
-file of other people. The default subscription is the hosts.txt from www.i2p2.i2p, which is updated infrequently.
-So it is a good idea to add additional subscriptions to sites that have the latest addresses.
-<a href="http://www.i2p2.i2p/faq.html#subscriptions">See the FAQ for a list of subscription URLs.</a>
+<%=intl._("The subscription file contains a list of i2p URLs.")%>
+<%=intl._("The addressbook application regularly checks this list for new eepsites.")%>
+<%=intl._("Those URLs refer to published hosts.txt files.")%>
+<%=intl._("The default subscription is the hosts.txt from www.i2p2.i2p, which is updated infrequently.")%>
+<%=intl._("So it is a good idea to add additional subscriptions to sites that have the latest addresses.")%>
+<a href="http://www.i2p2.i2p/faq.html#subscriptions"><%=intl._("See the FAQ for a list of subscription URLs.")%></a>
 </p>
 </div><hr>
 <div id="footer">
diff --git a/build.xml b/build.xml
index d04cb4ad42961cf2e2470918251368bf2529347b..ff1b7ff7376566b36f84d9224d4bf9dc61bfd3ce 100644
--- a/build.xml
+++ b/build.xml
@@ -25,6 +25,7 @@
         <echo message="  distclean: clean up all derived files" />
         <echo message="  syndie:    generate a standalone syndie install" />
         <echo message="  i2psnark:  generate a standalone i2psnark install" />
+        <echo message="  justBOB:  generate a standalone BOB-one.jar" />
         <echo message="  javadoc:   generate javadoc for the entire project into ./build/javadoc" />
         <echo message="  slackpkg:  generate Slackware packages in ./Slackware/i2p and ./Slackware/i2p-base" />
         <echo message="  debianhowto: instructions on building Debian packages" />
@@ -193,6 +194,7 @@
         <delete file="i2p.exe" failonerror="false" quiet="true" />
         <delete file="syndie-standalone.zip" failonerror="false" quiet="true" />
         <delete file="i2psnark-standalone.zip" failonerror="false" quiet="true" />
+        <delete file="BOB-one.jar" failonerror="false" quiet="true" />	
     </target>
     <target name="distclean" depends="clean">
         <ant dir="core/java/" target="distclean" />
@@ -209,10 +211,51 @@
         <ant dir="apps/systray/java/" target="distclean" />
         <ant dir="apps/i2psnark/java/" target="distclean" />
         <ant dir="apps/jetty/" target="distclean" />
+	<!-- 
+		NOTE! We need to turn off the default excludes for these
+		patterns to work. 
+		These are the defaultexcludes in Ant as seen on
+		http://ant.apache.org/manual/CoreTasks/defaultexcludes.html
+		     **/*~
+                     **/#*#
+                     **/.#*
+                     **/%*%
+                     **/._*
+                     **/CVS
+                     **/CVS/**
+                     **/.cvsignore
+                     **/SCCS
+                     **/SCCS/**
+                     **/vssver.scc
+                     **/.svn
+                     **/.svn/**
+                     **/.DS_Store
+		The only recourse is to remove the offending ones.
+		We do this here, as we only need one change, and then put it
+		back after we are done with it.
+	-->
+	<defaultexcludes remove="**/*~"/>
+
         <delete>
             <fileset dir="." includes="**/*.class" />
             <fileset dir="." includes="**/*.java~" />
+	    <!-- 
+	    	Less common, but they pollute my workspace here, so we
+            	might as well nuke these as well. Are there any others?
+            	
+            	!!??? Why don't we just nuke "**/*~" ???!!
+
+            	++Sponge
+            -->
+            <fileset dir="." includes="**/*.txt~" />
+            <fileset dir="." includes="**/*.xml~"  />
+            <fileset dir="." includes="**/*.sh~"  />
+            <fileset dir="." includes="**/*.SlackBuild~" />
         </delete>
+	<!--
+		Now we put the defaults back
+	-->
+	<defaultexcludes default="true"/>
     </target>
     <target name="pkg" depends="distclean, updater, preppkg, installer" />
     <target name="pkgclean" depends="deletepkg-temp">
@@ -532,6 +575,10 @@
         <ant dir="Slackware/i2p/" target="slackpkg" />
         <ant dir="Slackware/i2p-base/" target="slackpkg" />
     </target>
+    <target name="justBOB" depends="builddepSmall">
+        <ant dir="apps/BOB/" target="onejar" />
+        <copy file="apps/BOB/dist/BOB-one.jar" todir="." />
+    </target>
     <target name="findbugs" depends="build2">
         <echo message="Starting findbugs, this will take a while..." />
         <exec executable="nice">
diff --git a/core/java/src/net/i2p/I2PAppContext.java b/core/java/src/net/i2p/I2PAppContext.java
index 1cdb6b29709789c43700487370bb2615b8895aa9..974b69b84d79362fd37cabaf2a9cce8ef005972e 100644
--- a/core/java/src/net/i2p/I2PAppContext.java
+++ b/core/java/src/net/i2p/I2PAppContext.java
@@ -722,4 +722,11 @@ public class I2PAppContext {
         return new HashSet(_shutdownTasks);
     }
     
+    /**
+     *  Use this instead of context instanceof RouterContext
+     *  @since 0.7.9
+     */
+    public boolean isRouterContext() {
+        return false;
+    }
 }
diff --git a/core/java/src/net/i2p/client/ClientWriterRunner.java b/core/java/src/net/i2p/client/ClientWriterRunner.java
new file mode 100644
index 0000000000000000000000000000000000000000..056208fb5a021470a0766c3205eda71cf8bc8ad6
--- /dev/null
+++ b/core/java/src/net/i2p/client/ClientWriterRunner.java
@@ -0,0 +1,97 @@
+package net.i2p.client;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+
+import net.i2p.data.i2cp.I2CPMessage;
+import net.i2p.data.i2cp.I2CPMessageImpl;
+import net.i2p.data.i2cp.I2CPMessageException;
+import net.i2p.util.I2PAppThread;
+
+/**
+ * Copied from net.i2p.router.client
+ * We need a single thread that writes so we don't have issues with
+ * the Piped Streams used in InternalSocket.
+ *
+ * @author zzz from net.i2p.router.client.ClientWriterRunner
+ */
+class ClientWriterRunner implements Runnable {
+    private OutputStream _out;
+    private I2PSessionImpl _session;
+    private BlockingQueue<I2CPMessage> _messagesToWrite;
+    private static volatile long __Id = 0;
+    
+    /** starts the thread too */
+    public ClientWriterRunner(OutputStream out, I2PSessionImpl session) {
+        _out = out;
+        _session = session;
+        _messagesToWrite = new LinkedBlockingQueue();
+        Thread t = new I2PAppThread(this, "I2CP Client Writer " + (++__Id), true);
+        t.start();
+    }
+
+    /**
+     * Add this message to the writer's queue
+     *
+     */
+    public void addMessage(I2CPMessage msg) {
+        try {
+            _messagesToWrite.put(msg);
+        } catch (InterruptedException ie) {}
+    }
+
+    /**
+     * No more messages - dont even try to send what we have
+     *
+     */
+    public void stopWriting() {
+        _messagesToWrite.clear();
+        try {
+            _messagesToWrite.put(new PoisonMessage());
+        } catch (InterruptedException ie) {}
+    }
+
+    public void run() {
+        I2CPMessage msg;
+        while (!_session.isClosed()) {
+            try {
+                msg = _messagesToWrite.take();
+            } catch (InterruptedException ie) {
+                continue;
+            }
+            if (msg.getType() == PoisonMessage.MESSAGE_TYPE)
+                break;
+            // only thread, we don't need synchronized
+            try {
+                msg.writeMessage(_out);
+                _out.flush();
+            } catch (I2CPMessageException ime) {
+                _session.propogateError("Error writing out the message", ime);
+                _session.disconnect();
+                break;
+            } catch (IOException ioe) {
+                _session.propogateError("Error writing out the message", ioe);
+                _session.disconnect();
+                break;
+            }
+        }
+        _messagesToWrite.clear();
+    }
+
+    /**
+     * End-of-stream msg used to stop the concurrent queue
+     * See http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/BlockingQueue.html
+     *
+     */
+    private static class PoisonMessage extends I2CPMessageImpl {
+        public static final int MESSAGE_TYPE = 999999;
+        public int getType() {
+            return MESSAGE_TYPE;
+        }
+        public void doReadMessage(InputStream buf, int size) throws I2CPMessageException, IOException {}
+        public byte[] doWriteMessage() throws I2CPMessageException, IOException { return null; }
+    }
+}
diff --git a/core/java/src/net/i2p/client/I2PSessionImpl.java b/core/java/src/net/i2p/client/I2PSessionImpl.java
index c11c71549a4099fc3102599452370c5aeb577e2f..b1fc2b2266e12d9bf1dc8757e7f350d1c744e5d7 100644
--- a/core/java/src/net/i2p/client/I2PSessionImpl.java
+++ b/core/java/src/net/i2p/client/I2PSessionImpl.java
@@ -73,6 +73,8 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa
     protected Socket _socket;
     /** reader that always searches for messages */
     protected I2CPMessageReader _reader;
+    /** writer message queue */
+    protected ClientWriterRunner _writer;
     /** where we pipe our messages */
     protected /* FIXME final FIXME */OutputStream _out;
 
@@ -277,11 +279,11 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa
                 _out.write(I2PClient.PROTOCOL_BYTE);
                 _out.flush();
             }
+            _writer = new ClientWriterRunner(_out, this);
             InputStream in = _socket.getInputStream();
             _reader = new I2CPMessageReader(in, this);
             if (_log.shouldLog(Log.DEBUG)) _log.debug(getPrefix() + "before startReading");
             _reader.startReading();
-
             if (_log.shouldLog(Log.DEBUG)) _log.debug(getPrefix() + "Before getDate");
             sendMessage(new GetDateMessage());
             if (_log.shouldLog(Log.DEBUG)) _log.debug(getPrefix() + "After getDate / begin waiting for a response");
@@ -543,34 +545,14 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa
      * @throws I2PSessionException if the message is malformed or there is an error writing it out
      */
     void sendMessage(I2CPMessage message) throws I2PSessionException {
-        if (isClosed()) throw new I2PSessionException("Already closed");
-
-        long beforeSync = _context.clock().now();
-        long inSync = 0;
-        if (_log.shouldLog(Log.DEBUG)) _log.debug("before sync to write");
-        try {
-            synchronized (_out) {
-                inSync = _context.clock().now();
-                if (_log.shouldLog(Log.DEBUG)) _log.debug("before writeMessage");
-                message.writeMessage(_out);
-                if (_log.shouldLog(Log.DEBUG)) _log.debug("after writeMessage");
-                _out.flush();
-                if (_log.shouldLog(Log.DEBUG)) _log.debug("after flush");
-            }
-        } catch (I2CPMessageException ime) {
-            throw new I2PSessionException(getPrefix() + "Error writing out the message", ime);
-        } catch (IOException ioe) {
-            throw new I2PSessionException(getPrefix() + "Error writing out the message", ioe);
-        }
-        long afterSync = _context.clock().now();
-        if (_log.shouldLog(Log.DEBUG)) 
-            _log.debug(getPrefix() + "Message written out and flushed w/ " 
-                       + (inSync-beforeSync) + "ms to sync and "
-                       + (afterSync-inSync) + "ms to send");
+        if (isClosed() || _writer == null)
+            throw new I2PSessionException("Already closed");
+        _writer.addMessage(message);
     }
 
     /**
      * Pass off the error to the listener
+     * Misspelled, oh well.
      */
     void propogateError(String msg, Throwable error) {
         if (_log.shouldLog(Log.ERROR)) 
@@ -629,8 +611,14 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa
     private void closeSocket() {
         if (_log.shouldLog(Log.INFO)) _log.info(getPrefix() + "Closing the socket", new Exception("closeSocket"));
         _closed = true;
-        if (_reader != null) _reader.stopReading();
-        _reader = null;
+        if (_reader != null) {
+            _reader.stopReading();
+            _reader = null;
+        }
+        if (_writer != null) {
+            _writer.stopWriting();
+            _writer = null;
+        }
 
         if (_socket != null) {
             try {
diff --git a/core/java/src/net/i2p/client/I2PSimpleSession.java b/core/java/src/net/i2p/client/I2PSimpleSession.java
index 933a9578c3ba0fb248fd58b9a1a0289547b717ca..af5ab9a75b08dc91990e32c8e5669d5fea6a738a 100644
--- a/core/java/src/net/i2p/client/I2PSimpleSession.java
+++ b/core/java/src/net/i2p/client/I2PSimpleSession.java
@@ -79,6 +79,7 @@ class I2PSimpleSession extends I2PSessionImpl2 {
                 _out.write(I2PClient.PROTOCOL_BYTE);
                 _out.flush();
             }
+            _writer = new ClientWriterRunner(_out, this);
             InputStream in = _socket.getInputStream();
             _reader = new I2CPMessageReader(in, this);
             _reader.startReading();
diff --git a/core/java/src/net/i2p/client/naming/EepGetAndAddNamingService.java b/core/java/src/net/i2p/client/naming/EepGetAndAddNamingService.java
index cf282f71928015d49364dc54c17accbba6b89944..085fe17290f6f57760d8cc831cb88e887253cd1e 100644
--- a/core/java/src/net/i2p/client/naming/EepGetAndAddNamingService.java
+++ b/core/java/src/net/i2p/client/naming/EepGetAndAddNamingService.java
@@ -30,6 +30,7 @@ import net.i2p.data.Destination;
  * i2p.naming.eepget.list=http://stats.i2p/cgi-bin/hostquery.cgi?a=,http://i2host.i2p/cgi-bin/i2hostquery?
  *
  * @author zzz
+ * @since 0.7.9
  */
 public class EepGetAndAddNamingService extends EepGetNamingService {
 
diff --git a/core/java/src/net/i2p/crypto/TrustedUpdate.java b/core/java/src/net/i2p/crypto/TrustedUpdate.java
index 4d8376c13d86134e01f15fd34d75ec46ad0fbf60..8729f128f86264e646d832c4cd6e52172105e837 100644
--- a/core/java/src/net/i2p/crypto/TrustedUpdate.java
+++ b/core/java/src/net/i2p/crypto/TrustedUpdate.java
@@ -452,7 +452,8 @@ D8usM7Dxp5yrDrCYZ5AIijc=
             while ( (bytesRead = fileInputStream.read(buffer)) != -1) 
                 fileOutputStream.write(buffer, 0, bytesRead);
         } catch (IOException ioe) {
-            return "I/O Exception during file extraction";
+            // probably permissions or disk full, so bring the message out to the console
+            return "Error copying update: " + ioe;
         } finally {
             if (fileInputStream != null)
                 try {
diff --git a/core/java/src/net/i2p/data/Hash.java b/core/java/src/net/i2p/data/Hash.java
index ddf210c5415d733b2dbe26095dd983beff2d9b57..a57f1ef28c86f8388b1589bf01f5db92ce382c2f 100644
--- a/core/java/src/net/i2p/data/Hash.java
+++ b/core/java/src/net/i2p/data/Hash.java
@@ -22,7 +22,7 @@ import net.i2p.util.Log;
 
 /**
  * Defines the hash as defined by the I2P data structure spec.
- * AA hash is the SHA-256 of some data, taking up 32 bytes.
+ * A hash is the SHA-256 of some data, taking up 32 bytes.
  *
  * @author jrandom
  */
diff --git a/core/java/src/net/i2p/data/i2cp/AbuseReason.java b/core/java/src/net/i2p/data/i2cp/AbuseReason.java
index db69fedd9169be52967cea81119ede34b6732d5e..58c23d5e83b9dbceefd3c1e71f44e74e923e51f1 100644
--- a/core/java/src/net/i2p/data/i2cp/AbuseReason.java
+++ b/core/java/src/net/i2p/data/i2cp/AbuseReason.java
@@ -16,7 +16,6 @@ import java.io.OutputStream;
 import net.i2p.data.DataFormatException;
 import net.i2p.data.DataHelper;
 import net.i2p.data.DataStructureImpl;
-import net.i2p.util.Log;
 
 /**
  * Defines the structure for why abuse was reported either by the client to
@@ -25,7 +24,6 @@ import net.i2p.util.Log;
  * @author jrandom
  */
 public class AbuseReason extends DataStructureImpl {
-    private final static Log _log = new Log(AbuseReason.class);
     private String _reason;
 
     public AbuseReason() {
@@ -64,4 +62,4 @@ public class AbuseReason extends DataStructureImpl {
     public String toString() {
         return "[AbuseReason: " + getReason() + "]";
     }
-}
\ No newline at end of file
+}
diff --git a/core/java/src/net/i2p/data/i2cp/AbuseSeverity.java b/core/java/src/net/i2p/data/i2cp/AbuseSeverity.java
index 2f9140e08dab2732720c7fac7252db8710381b68..0bdc4805c023705f9df697f199a92c2324b5b40b 100644
--- a/core/java/src/net/i2p/data/i2cp/AbuseSeverity.java
+++ b/core/java/src/net/i2p/data/i2cp/AbuseSeverity.java
@@ -16,7 +16,6 @@ import java.io.OutputStream;
 import net.i2p.data.DataFormatException;
 import net.i2p.data.DataHelper;
 import net.i2p.data.DataStructureImpl;
-import net.i2p.util.Log;
 
 /**
  * Provides a severity level (larger numbers are more severe) in association with
@@ -26,7 +25,6 @@ import net.i2p.util.Log;
  * @author jrandom
  */
 public class AbuseSeverity extends DataStructureImpl {
-    private final static Log _log = new Log(AbuseSeverity.class);
     private int _severityId;
 
     public AbuseSeverity() {
@@ -65,4 +63,4 @@ public class AbuseSeverity extends DataStructureImpl {
     public String toString() {
         return "[AbuseSeverity: " + getSeverity() + "]";
     }
-}
\ No newline at end of file
+}
diff --git a/core/java/src/net/i2p/data/i2cp/BandwidthLimitsMessage.java b/core/java/src/net/i2p/data/i2cp/BandwidthLimitsMessage.java
index 02308c7b4369051fd41b5db2a75c6f241ae4b16f..bd8a2ff0e6be3c404073c900418d6a9d405f81bb 100644
--- a/core/java/src/net/i2p/data/i2cp/BandwidthLimitsMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/BandwidthLimitsMessage.java
@@ -11,7 +11,6 @@ import java.io.InputStream;
 
 import net.i2p.data.DataFormatException;
 import net.i2p.data.DataHelper;
-import net.i2p.util.Log;
 
 /**
  * Tell the other side the limits
@@ -19,7 +18,6 @@ import net.i2p.util.Log;
  * @author zzz
  */
 public class BandwidthLimitsMessage extends I2CPMessageImpl {
-    private final static Log _log = new Log(BandwidthLimitsMessage.class);
     public final static int MESSAGE_TYPE = 23;
     private static final int LIMITS = 16;
     private int[] data;
diff --git a/core/java/src/net/i2p/data/i2cp/CreateLeaseSetMessage.java b/core/java/src/net/i2p/data/i2cp/CreateLeaseSetMessage.java
index 75818f4837b11e2d320fc501891219f9529a217e..cf6759a26b441c6bba0be3e7e46a462e9748cbf8 100644
--- a/core/java/src/net/i2p/data/i2cp/CreateLeaseSetMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/CreateLeaseSetMessage.java
@@ -18,7 +18,6 @@ import net.i2p.data.DataHelper;
 import net.i2p.data.LeaseSet;
 import net.i2p.data.PrivateKey;
 import net.i2p.data.SigningPrivateKey;
-import net.i2p.util.Log;
 
 /**
  * Defines the message a client sends to a router when authorizing
@@ -27,7 +26,6 @@ import net.i2p.util.Log;
  * @author jrandom
  */
 public class CreateLeaseSetMessage extends I2CPMessageImpl {
-    private final static Log _log = new Log(CreateLeaseSetMessage.class);
     public final static int MESSAGE_TYPE = 4;
     private SessionId _sessionId;
     private LeaseSet _leaseSet;
@@ -138,4 +136,4 @@ public class CreateLeaseSetMessage extends I2CPMessageImpl {
         buf.append("]");
         return buf.toString();
     }
-}
\ No newline at end of file
+}
diff --git a/core/java/src/net/i2p/data/i2cp/CreateSessionMessage.java b/core/java/src/net/i2p/data/i2cp/CreateSessionMessage.java
index 1de5dfdbd9cff6f14f5384e5a36c23c59813225b..1b8004ce00a61930801b81662bd49011471f0bbe 100644
--- a/core/java/src/net/i2p/data/i2cp/CreateSessionMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/CreateSessionMessage.java
@@ -15,7 +15,6 @@ import java.io.InputStream;
 
 import net.i2p.data.DataFormatException;
 import net.i2p.data.DataHelper;
-import net.i2p.util.Log;
 
 /**
  * Defines the message a client sends to a router when establishing a new 
@@ -24,7 +23,6 @@ import net.i2p.util.Log;
  * @author jrandom
  */
 public class CreateSessionMessage extends I2CPMessageImpl {
-    private final static Log _log = new Log(CreateSessionMessage.class);
     public final static int MESSAGE_TYPE = 1;
     private SessionConfig _sessionConfig;
 
@@ -91,4 +89,4 @@ public class CreateSessionMessage extends I2CPMessageImpl {
         buf.append("]");
         return buf.toString();
     }
-}
\ No newline at end of file
+}
diff --git a/core/java/src/net/i2p/data/i2cp/DestroySessionMessage.java b/core/java/src/net/i2p/data/i2cp/DestroySessionMessage.java
index 3cd535afed85f9d1185f16fb5db6d5319b2ba7ce..630e0e71860cc0f6dd879ac82204a23f0bcbabab 100644
--- a/core/java/src/net/i2p/data/i2cp/DestroySessionMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/DestroySessionMessage.java
@@ -15,7 +15,6 @@ import java.io.InputStream;
 
 import net.i2p.data.DataFormatException;
 import net.i2p.data.DataHelper;
-import net.i2p.util.Log;
 
 /**
  * Defines the message a client sends to a router when destroying
@@ -24,7 +23,6 @@ import net.i2p.util.Log;
  * @author jrandom
  */
 public class DestroySessionMessage extends I2CPMessageImpl {
-    private final static Log _log = new Log(DestroySessionMessage.class);
     public final static int MESSAGE_TYPE = 3;
     private SessionId _sessionId;
 
@@ -93,4 +91,4 @@ public class DestroySessionMessage extends I2CPMessageImpl {
         buf.append("]");
         return buf.toString();
     }
-}
\ No newline at end of file
+}
diff --git a/core/java/src/net/i2p/data/i2cp/DisconnectMessage.java b/core/java/src/net/i2p/data/i2cp/DisconnectMessage.java
index 08f08f5e62b843b18dcbf577318f3eda4a1bad01..f9c32810d720bcd1fd8386436e13de3e95613f7a 100644
--- a/core/java/src/net/i2p/data/i2cp/DisconnectMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/DisconnectMessage.java
@@ -15,7 +15,6 @@ import java.io.InputStream;
 
 import net.i2p.data.DataFormatException;
 import net.i2p.data.DataHelper;
-import net.i2p.util.Log;
 
 /**
  * Defines the message a client sends to a router when destroying
@@ -24,7 +23,6 @@ import net.i2p.util.Log;
  * @author jrandom
  */
 public class DisconnectMessage extends I2CPMessageImpl {
-    private final static Log _log = new Log(DisconnectMessage.class);
     public final static int MESSAGE_TYPE = 30;
     private String _reason;
 
@@ -83,4 +81,4 @@ public class DisconnectMessage extends I2CPMessageImpl {
         buf.append("]");
         return buf.toString();
     }
-}
\ No newline at end of file
+}
diff --git a/core/java/src/net/i2p/data/i2cp/GetBandwidthLimitsMessage.java b/core/java/src/net/i2p/data/i2cp/GetBandwidthLimitsMessage.java
index 64a89824d44afe1a8c075ae267638c16c65bdaf4..35f44b522223983ae39dde69c574e09361b3ba53 100644
--- a/core/java/src/net/i2p/data/i2cp/GetBandwidthLimitsMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/GetBandwidthLimitsMessage.java
@@ -8,15 +8,12 @@ package net.i2p.data.i2cp;
 import java.io.IOException;
 import java.io.InputStream;
 
-import net.i2p.util.Log;
-
 /**
  * Request the router tells us the current bw limits
  *
  * @author zzz
  */
 public class GetBandwidthLimitsMessage extends I2CPMessageImpl {
-    private final static Log _log = new Log(GetBandwidthLimitsMessage.class);
     public final static int MESSAGE_TYPE = 8;
 
     public GetBandwidthLimitsMessage() {
diff --git a/core/java/src/net/i2p/data/i2cp/GetDateMessage.java b/core/java/src/net/i2p/data/i2cp/GetDateMessage.java
index 76ee1a58fcfd9e692d6b519d499fee055e78ac5f..f36ec02d921d112d46155cbc602ef0f45937de83 100644
--- a/core/java/src/net/i2p/data/i2cp/GetDateMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/GetDateMessage.java
@@ -12,14 +12,11 @@ package net.i2p.data.i2cp;
 import java.io.IOException;
 import java.io.InputStream;
 
-import net.i2p.util.Log;
-
 /**
  * Request the other side to send us what they think the current time is
  *
  */
 public class GetDateMessage extends I2CPMessageImpl {
-    private final static Log _log = new Log(GetDateMessage.class);
     public final static int MESSAGE_TYPE = 32;
 
     public GetDateMessage() {
@@ -57,4 +54,4 @@ public class GetDateMessage extends I2CPMessageImpl {
         buf.append("[GetDateMessage]");
         return buf.toString();
     }
-}
\ No newline at end of file
+}
diff --git a/core/java/src/net/i2p/data/i2cp/I2CPMessageException.java b/core/java/src/net/i2p/data/i2cp/I2CPMessageException.java
index b4902873136e3fc5dcd1971ff8677d6f136b3a87..63d13b040128c7fe63df1e2a7f07d8f8eb23c452 100644
--- a/core/java/src/net/i2p/data/i2cp/I2CPMessageException.java
+++ b/core/java/src/net/i2p/data/i2cp/I2CPMessageException.java
@@ -10,7 +10,6 @@ package net.i2p.data.i2cp;
  */
 
 import net.i2p.I2PException;
-import net.i2p.util.Log;
 
 /**
  * Represent an error serializing or deserializing an APIMessage
@@ -18,7 +17,6 @@ import net.i2p.util.Log;
  * @author jrandom
  */
 public class I2CPMessageException extends I2PException {
-    private final static Log _log = new Log(I2CPMessageException.class);
 
     public I2CPMessageException(String message, Throwable parent) {
         super(message, parent);
@@ -27,4 +25,4 @@ public class I2CPMessageException extends I2PException {
     public I2CPMessageException(String message) {
         super(message);
     }
-}
\ No newline at end of file
+}
diff --git a/core/java/src/net/i2p/data/i2cp/I2CPMessageHandler.java b/core/java/src/net/i2p/data/i2cp/I2CPMessageHandler.java
index 04da546f782f2bece1287062f972b8930f27598f..739f7823ebb110b861e3cbc732a862cbacacd7ad 100644
--- a/core/java/src/net/i2p/data/i2cp/I2CPMessageHandler.java
+++ b/core/java/src/net/i2p/data/i2cp/I2CPMessageHandler.java
@@ -15,14 +15,12 @@ import java.io.InputStream;
 
 import net.i2p.data.DataFormatException;
 import net.i2p.data.DataHelper;
-import net.i2p.util.Log;
 
 /**
  * Handle messages from the server for the client or vice versa
  *
  */
 public class I2CPMessageHandler {
-    private final static Log _log = new Log(I2CPMessageHandler.class);
 
     /**
      * Read an I2CPMessage from the stream and return the fully populated object.
diff --git a/core/java/src/net/i2p/data/i2cp/I2CPMessageImpl.java b/core/java/src/net/i2p/data/i2cp/I2CPMessageImpl.java
index af86863d214be3ee3cba3afe9fe8b681e09d0874..3ace5df9d3d65c4337862729989558549e99c308 100644
--- a/core/java/src/net/i2p/data/i2cp/I2CPMessageImpl.java
+++ b/core/java/src/net/i2p/data/i2cp/I2CPMessageImpl.java
@@ -16,7 +16,6 @@ import java.io.OutputStream;
 import net.i2p.data.DataFormatException;
 import net.i2p.data.DataHelper;
 import net.i2p.data.DataStructureImpl;
-import net.i2p.util.Log;
 
 /**
  * Defines the base message implementation.
@@ -24,7 +23,6 @@ import net.i2p.util.Log;
  * @author jrandom
  */
 public abstract class I2CPMessageImpl extends DataStructureImpl implements I2CPMessage {
-    private final static Log _log = new Log(I2CPMessageImpl.class);
 
     public I2CPMessageImpl() { // nop
     }
@@ -129,4 +127,4 @@ public abstract class I2CPMessageImpl extends DataStructureImpl implements I2CPM
             throw new DataFormatException("Error writing the message", ime);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/core/java/src/net/i2p/data/i2cp/MessageId.java b/core/java/src/net/i2p/data/i2cp/MessageId.java
index d31d478f102aad390aad760ac61db75dec122b14..84bfa0dfe921a1fd40d167df749a766bc384e6f1 100644
--- a/core/java/src/net/i2p/data/i2cp/MessageId.java
+++ b/core/java/src/net/i2p/data/i2cp/MessageId.java
@@ -16,7 +16,6 @@ import java.io.OutputStream;
 import net.i2p.data.DataFormatException;
 import net.i2p.data.DataHelper;
 import net.i2p.data.DataStructureImpl;
-import net.i2p.util.Log;
 
 /**
  * Defines the message ID of a message delivered between a router and a client
@@ -25,7 +24,6 @@ import net.i2p.util.Log;
  * @author jrandom
  */
 public class MessageId extends DataStructureImpl {
-    private final static Log _log = new Log(MessageId.class);
     private long _messageId;
 
     public MessageId() {
@@ -67,4 +65,4 @@ public class MessageId extends DataStructureImpl {
     public String toString() {
         return "[MessageId: " + getMessageId() + "]";
     }
-}
\ No newline at end of file
+}
diff --git a/core/java/src/net/i2p/data/i2cp/MessagePayloadMessage.java b/core/java/src/net/i2p/data/i2cp/MessagePayloadMessage.java
index 37b7828f940b64aedc5fd90165cd7e6099ea8d7f..fd0327d1c494ca1ec6bede698f396bb555dcbec1 100644
--- a/core/java/src/net/i2p/data/i2cp/MessagePayloadMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/MessagePayloadMessage.java
@@ -16,7 +16,6 @@ import java.io.OutputStream;
 import net.i2p.data.DataFormatException;
 import net.i2p.data.DataHelper;
 import net.i2p.data.Payload;
-import net.i2p.util.Log;
 
 /**
  * Defines the payload message a router sends to the client
@@ -24,7 +23,6 @@ import net.i2p.util.Log;
  * @author jrandom
  */
 public class MessagePayloadMessage extends I2CPMessageImpl {
-    private final static Log _log = new Log(MessagePayloadMessage.class);
     public final static int MESSAGE_TYPE = 31;
     private long _sessionId;
     private long _messageId;
diff --git a/core/java/src/net/i2p/data/i2cp/MessageStatusMessage.java b/core/java/src/net/i2p/data/i2cp/MessageStatusMessage.java
index 54ecad07caa291442f0e7b8ac4d15a87bf8a086d..b246aadb4ab029e3044c49fad2b1f6b57a58f791 100644
--- a/core/java/src/net/i2p/data/i2cp/MessageStatusMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/MessageStatusMessage.java
@@ -15,7 +15,6 @@ import java.io.OutputStream;
 
 import net.i2p.data.DataFormatException;
 import net.i2p.data.DataHelper;
-import net.i2p.util.Log;
 
 /**
  * Defines the message a client sends to a router when destroying
@@ -24,7 +23,6 @@ import net.i2p.util.Log;
  * @author jrandom
  */
 public class MessageStatusMessage extends I2CPMessageImpl {
-    private final static Log _log = new Log(SessionStatusMessage.class);
     public final static int MESSAGE_TYPE = 22;
     private long _sessionId;
     private long _messageId;
@@ -179,4 +177,4 @@ public class MessageStatusMessage extends I2CPMessageImpl {
         buf.append("]");
         return buf.toString();
     }
-}
\ No newline at end of file
+}
diff --git a/core/java/src/net/i2p/data/i2cp/ReceiveMessageBeginMessage.java b/core/java/src/net/i2p/data/i2cp/ReceiveMessageBeginMessage.java
index 1b3a41655f70667a5f1ff92df1048c67147039ab..8c6e0b2f1caa2cf97f35f82899aaa0de2eab4ff4 100644
--- a/core/java/src/net/i2p/data/i2cp/ReceiveMessageBeginMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/ReceiveMessageBeginMessage.java
@@ -15,7 +15,6 @@ import java.io.OutputStream;
 
 import net.i2p.data.DataFormatException;
 import net.i2p.data.DataHelper;
-import net.i2p.util.Log;
 
 /**
  * Defines the message a client sends to a router when asking the 
@@ -24,7 +23,6 @@ import net.i2p.util.Log;
  * @author jrandom
  */
 public class ReceiveMessageBeginMessage extends I2CPMessageImpl {
-    private final static Log _log = new Log(ReceiveMessageBeginMessage.class);
     public final static int MESSAGE_TYPE = 6;
     private long _sessionId;
     private long _messageId;
@@ -110,4 +108,4 @@ public class ReceiveMessageBeginMessage extends I2CPMessageImpl {
         buf.append("]");
         return buf.toString();
     }
-}
\ No newline at end of file
+}
diff --git a/core/java/src/net/i2p/data/i2cp/ReceiveMessageEndMessage.java b/core/java/src/net/i2p/data/i2cp/ReceiveMessageEndMessage.java
index 0ca0253e521bda1f006ddf375eb54d6a4cfcc94e..cf1325cc8b766b07832ef5006fc99fa7f86dc715 100644
--- a/core/java/src/net/i2p/data/i2cp/ReceiveMessageEndMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/ReceiveMessageEndMessage.java
@@ -14,7 +14,6 @@ import java.io.InputStream;
 
 import net.i2p.data.DataFormatException;
 import net.i2p.data.DataHelper;
-import net.i2p.util.Log;
 
 /**
  * Defines the message a client sends to a router when asking the 
@@ -23,7 +22,6 @@ import net.i2p.util.Log;
  * @author jrandom
  */
 public class ReceiveMessageEndMessage extends I2CPMessageImpl {
-    private final static Log _log = new Log(ReceiveMessageEndMessage.class);
     public final static int MESSAGE_TYPE = 7;
     private long _sessionId;
     private long _messageId;
@@ -94,4 +92,4 @@ public class ReceiveMessageEndMessage extends I2CPMessageImpl {
         buf.append("]");
         return buf.toString();
     }
-}
\ No newline at end of file
+}
diff --git a/core/java/src/net/i2p/data/i2cp/ReconfigureSessionMessage.java b/core/java/src/net/i2p/data/i2cp/ReconfigureSessionMessage.java
index 5b5ad638c22ae49c69a7a2336f73115adec24cdf..5f7314d648cd2f235d5fff309588ca9dc15df7f0 100644
--- a/core/java/src/net/i2p/data/i2cp/ReconfigureSessionMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/ReconfigureSessionMessage.java
@@ -15,7 +15,6 @@ import java.io.InputStream;
 
 import net.i2p.data.DataFormatException;
 import net.i2p.data.DataHelper;
-import net.i2p.util.Log;
 
 /**
  * Defines the message a client sends to a router when
@@ -24,7 +23,6 @@ import net.i2p.util.Log;
  * @author zzz
  */
 public class ReconfigureSessionMessage extends I2CPMessageImpl {
-    private final static Log _log = new Log(ReconfigureSessionMessage.class);
     public final static int MESSAGE_TYPE = 2;
     private SessionId _sessionId;
     private SessionConfig _sessionConfig;
diff --git a/core/java/src/net/i2p/data/i2cp/ReportAbuseMessage.java b/core/java/src/net/i2p/data/i2cp/ReportAbuseMessage.java
index fd11ec142acc32df81cd1f8812041ee83eab9389..54b90292e7dffbccbc5b4ff81a2a3c0b598b70fa 100644
--- a/core/java/src/net/i2p/data/i2cp/ReportAbuseMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/ReportAbuseMessage.java
@@ -15,7 +15,6 @@ import java.io.InputStream;
 
 import net.i2p.data.DataFormatException;
 import net.i2p.data.DataHelper;
-import net.i2p.util.Log;
 
 /**
  * Defines the message a client sends to a router when asking the 
@@ -24,7 +23,6 @@ import net.i2p.util.Log;
  * @author jrandom
  */
 public class ReportAbuseMessage extends I2CPMessageImpl {
-    private final static Log _log = new Log(ReportAbuseMessage.class);
     public final static int MESSAGE_TYPE = 29;
     private SessionId _sessionId;
     private AbuseSeverity _severity;
@@ -133,4 +131,4 @@ public class ReportAbuseMessage extends I2CPMessageImpl {
         buf.append("]");
         return buf.toString();
     }
-}
\ No newline at end of file
+}
diff --git a/core/java/src/net/i2p/data/i2cp/RequestLeaseSetMessage.java b/core/java/src/net/i2p/data/i2cp/RequestLeaseSetMessage.java
index 46f62d264d943dfb1a71c73da54969f1c86717cd..e4db066cbf40696ac07899746518a7e9d6149c95 100644
--- a/core/java/src/net/i2p/data/i2cp/RequestLeaseSetMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/RequestLeaseSetMessage.java
@@ -20,7 +20,6 @@ import net.i2p.data.DataFormatException;
 import net.i2p.data.DataHelper;
 import net.i2p.data.Hash;
 import net.i2p.data.TunnelId;
-import net.i2p.util.Log;
 
 /**
  * Defines the message a client sends to a router when destroying
@@ -29,7 +28,6 @@ import net.i2p.util.Log;
  * @author jrandom
  */
 public class RequestLeaseSetMessage extends I2CPMessageImpl {
-    private final static Log _log = new Log(RequestLeaseSetMessage.class);
     public final static int MESSAGE_TYPE = 21;
     private SessionId _sessionId;
     private List _endpoints;
diff --git a/core/java/src/net/i2p/data/i2cp/SendMessageExpiresMessage.java b/core/java/src/net/i2p/data/i2cp/SendMessageExpiresMessage.java
index 81271b1507f357b8ce133e6337075b22d3646063..770a6777b4552b20f9554008b43ad68e38a195b9 100644
--- a/core/java/src/net/i2p/data/i2cp/SendMessageExpiresMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/SendMessageExpiresMessage.java
@@ -18,7 +18,6 @@ import net.i2p.data.DataFormatException;
 import net.i2p.data.DataHelper;
 import net.i2p.data.Destination;
 import net.i2p.data.Payload;
-import net.i2p.util.Log;
 
 /**
  * Same as SendMessageMessage, but with an expiration to be passed to the router
@@ -26,7 +25,6 @@ import net.i2p.util.Log;
  * @author zzz
  */
 public class SendMessageExpiresMessage extends SendMessageMessage {
-    private final static Log _log = new Log(SendMessageExpiresMessage.class);
     /* FIXME hides another field FIXME */
     public final static int MESSAGE_TYPE = 36;
     private SessionId _sessionId;
diff --git a/core/java/src/net/i2p/data/i2cp/SendMessageMessage.java b/core/java/src/net/i2p/data/i2cp/SendMessageMessage.java
index 9abd7f42635ac16156fa56751263e0d88730bd39..237306f0dcab756b133b8abbde5e507c42a5c3f7 100644
--- a/core/java/src/net/i2p/data/i2cp/SendMessageMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/SendMessageMessage.java
@@ -17,7 +17,6 @@ import net.i2p.data.DataFormatException;
 import net.i2p.data.DataHelper;
 import net.i2p.data.Destination;
 import net.i2p.data.Payload;
-import net.i2p.util.Log;
 
 /**
  * Defines the message a client sends to a router to ask it to deliver
@@ -26,7 +25,6 @@ import net.i2p.util.Log;
  * @author jrandom
  */
 public class SendMessageMessage extends I2CPMessageImpl {
-    private final static Log _log = new Log(SendMessageMessage.class);
     public final static int MESSAGE_TYPE = 5;
     private SessionId _sessionId;
     private Destination _destination;
@@ -159,4 +157,4 @@ public class SendMessageMessage extends I2CPMessageImpl {
         buf.append("]");
         return buf.toString();
     }
-}
\ No newline at end of file
+}
diff --git a/core/java/src/net/i2p/data/i2cp/SessionId.java b/core/java/src/net/i2p/data/i2cp/SessionId.java
index d4c75ea5f878fd8de3e8423194df1251fc5a9769..f79589c42b25dcd6ba50abc72f98fbac03364bba 100644
--- a/core/java/src/net/i2p/data/i2cp/SessionId.java
+++ b/core/java/src/net/i2p/data/i2cp/SessionId.java
@@ -1,5 +1,4 @@
 package net.i2p.data.i2cp;
-
 /*
  * free (adj.): unencumbered; not under the control of others
  * Written by jrandom in 2003 and released into the public domain 
@@ -16,7 +15,6 @@ import java.io.OutputStream;
 import net.i2p.data.DataFormatException;
 import net.i2p.data.DataHelper;
 import net.i2p.data.DataStructureImpl;
-import net.i2p.util.Log;
 
 /**
  * Defines the token passed between the router and client to associate messages
@@ -25,7 +23,6 @@ import net.i2p.util.Log;
  * @author jrandom
  */
 public class SessionId extends DataStructureImpl {
-    private final static Log _log = new Log(SessionId.class);
     private int _sessionId;
 
     public SessionId() {
@@ -64,4 +61,4 @@ public class SessionId extends DataStructureImpl {
     public String toString() {
         return "[SessionId: " + getSessionId() + "]";
     }
-}
\ No newline at end of file
+}
diff --git a/core/java/src/net/i2p/data/i2cp/SessionStatusMessage.java b/core/java/src/net/i2p/data/i2cp/SessionStatusMessage.java
index d3775db0fe064b6bf38188d9f2a7dd193edbc9a1..490e7e426ad21776e54ddc9438a5bb5680c7fd7e 100644
--- a/core/java/src/net/i2p/data/i2cp/SessionStatusMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/SessionStatusMessage.java
@@ -15,7 +15,6 @@ import java.io.InputStream;
 
 import net.i2p.data.DataFormatException;
 import net.i2p.data.DataHelper;
-import net.i2p.util.Log;
 
 /**
  * Defines the message a client sends to a router when destroying
@@ -24,7 +23,6 @@ import net.i2p.util.Log;
  * @author jrandom
  */
 public class SessionStatusMessage extends I2CPMessageImpl {
-    private final static Log _log = new Log(SessionStatusMessage.class);
     public final static int MESSAGE_TYPE = 20;
     private SessionId _sessionId;
     private int _status;
@@ -104,4 +102,4 @@ public class SessionStatusMessage extends I2CPMessageImpl {
         buf.append("]");
         return buf.toString();
     }
-}
\ No newline at end of file
+}
diff --git a/core/java/src/net/i2p/data/i2cp/SetDateMessage.java b/core/java/src/net/i2p/data/i2cp/SetDateMessage.java
index ff308c5d00cca4a6d34ac928a74a1eef90b15673..f0abce1a51d57847e1caabf8540737ca214e9112 100644
--- a/core/java/src/net/i2p/data/i2cp/SetDateMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/SetDateMessage.java
@@ -17,14 +17,12 @@ import java.util.Date;
 import net.i2p.data.DataFormatException;
 import net.i2p.data.DataHelper;
 import net.i2p.util.Clock;
-import net.i2p.util.Log;
 
 /**
  * Tell the other side what time it is
  *
  */
 public class SetDateMessage extends I2CPMessageImpl {
-    private final static Log _log = new Log(SetDateMessage.class);
     public final static int MESSAGE_TYPE = 33;
     private Date _date;
 
@@ -86,4 +84,4 @@ public class SetDateMessage extends I2CPMessageImpl {
         buf.append("]");
         return buf.toString();
     }
-}
\ No newline at end of file
+}
diff --git a/core/java/src/net/i2p/stat/RateStat.java b/core/java/src/net/i2p/stat/RateStat.java
index b021d59f4ef0eeec4aa1a2ea2650835a14721894..79ddec51980efdcf689f9f95b4cade1f25223d18 100644
--- a/core/java/src/net/i2p/stat/RateStat.java
+++ b/core/java/src/net/i2p/stat/RateStat.java
@@ -170,6 +170,7 @@ public class RateStat {
         }
     }
 
+/*********
     public static void main(String args[]) {
         RateStat rs = new RateStat("moo", "moo moo moo", "cow trueisms", new long[] { 60 * 1000, 60 * 60 * 1000,
                                                                                      24 * 60 * 60 * 1000});
@@ -206,4 +207,5 @@ public class RateStat {
         } catch (InterruptedException ie) { // nop
         }
     }
+*********/
 }
diff --git a/core/java/src/net/i2p/stat/StatManager.java b/core/java/src/net/i2p/stat/StatManager.java
index 9670048d300ca0ebce9c428482329def41104d3d..139c63b1b7cfeebe1945cb0a1d3350a25e8f8edf 100644
--- a/core/java/src/net/i2p/stat/StatManager.java
+++ b/core/java/src/net/i2p/stat/StatManager.java
@@ -51,7 +51,7 @@ public class StatManager {
      */
     public static final String DEFAULT_STAT_REQUIRED =
         "bw.recvRate,bw.sendBps,bw.sendRate,client.sendAckTime,clock.skew,crypto.elGamal.encrypt," +
-        "jobQueue.jobLag,netDb.successTime,router.fastPeers," +
+        "jobQueue.jobLag,netDb.successTime,peer.failedLookupRate,router.fastPeers," +
         "prng.bufferFillTime,prng.bufferWaitTime,router.memoryUsed," +
         "transport.receiveMessageSize,transport.sendMessageSize,transport.sendProcessingTime," +
         "tunnel.acceptLoad,tunnel.buildRequestTime,tunnel.rejectOverloaded,tunnel.rejectTimeout" +
diff --git a/core/java/src/net/i2p/time/Timestamper.java b/core/java/src/net/i2p/time/Timestamper.java
index e47ecd2599ca66c26f2129d6e37d5946a5e4c483..b1d763a3a731af949e1ab1bc73f77f53d19d012e 100644
--- a/core/java/src/net/i2p/time/Timestamper.java
+++ b/core/java/src/net/i2p/time/Timestamper.java
@@ -189,7 +189,10 @@ public class Timestamper implements Runnable {
         long expectedDelta = 0;
         _wellSynced = false;
         for (int i = 0; i < _concurringServers; i++) {
-            try { Thread.sleep(10*1000); } catch (InterruptedException ie) {}
+            if (i > 0) {
+                // this delays startup when net is disconnected or the timeserver list is bad, don't make it too long
+                try { Thread.sleep(2*1000); } catch (InterruptedException ie) {}
+            }
             now = NtpClient.currentTime(serverList);
             long delta = now - _context.clock().now();
             found[i] = delta;
diff --git a/core/java/src/net/i2p/util/CachingByteArrayOutputStream.java b/core/java/src/net/i2p/util/CachingByteArrayOutputStream.java
index e1d3354d21cddaa64ec632838e543ac6cddadc56..f3c0f8fc4e62744c0381a2822dfec56a9083b7c1 100644
--- a/core/java/src/net/i2p/util/CachingByteArrayOutputStream.java
+++ b/core/java/src/net/i2p/util/CachingByteArrayOutputStream.java
@@ -11,6 +11,7 @@ import net.i2p.data.ByteArray;
  * needs to be done (e.g. write(foo); toByteArray();), call releaseBuffer
  * to put the buffer back into the cache.
  * 
+ * @deprecated unused
  */
 public class CachingByteArrayOutputStream extends ByteArrayOutputStream {
     private ByteCache _cache;
diff --git a/core/java/src/net/i2p/util/HTTPSendData.java b/core/java/src/net/i2p/util/HTTPSendData.java
index 18d072db81a9376c7c059304d111621edd6b550e..6bf9b84952762cac7cd6904007ac8450a6776824 100644
--- a/core/java/src/net/i2p/util/HTTPSendData.java
+++ b/core/java/src/net/i2p/util/HTTPSendData.java
@@ -12,6 +12,7 @@ import java.util.zip.GZIPOutputStream;
 /**
  * Simple helper class to submit data via HTTP Post
  *
+ * @deprecated unused
  */
 public class HTTPSendData {
     private final static Log _log = new Log(HTTPSendData.class);
@@ -87,4 +88,4 @@ public class HTTPSendData {
         } catch (InterruptedException ie) { // nop
         }
     }
-}
\ No newline at end of file
+}
diff --git a/core/java/src/net/i2p/util/InternalServerSocket.java b/core/java/src/net/i2p/util/InternalServerSocket.java
index 00d8352ee46769871ddb549198320fcf0f2b719a..1aa7942411196f9b9e662c2fcf94eba8795ff886 100644
--- a/core/java/src/net/i2p/util/InternalServerSocket.java
+++ b/core/java/src/net/i2p/util/InternalServerSocket.java
@@ -21,6 +21,12 @@ import net.i2p.I2PAppContext;
  *  A simple in-JVM ServerSocket using Piped Streams.
  *  We use port numbers just like regular sockets.
  *  Can only be connected by InternalSocket.
+ *
+ *  Warning - this uses Piped Streams, which don't like multiple writers from threads
+ *  that may vanish. If you do use multipe writers,
+ *  you may get intermittent 'write end dead' or 'pipe broken' IOExceptions on the reader side.
+ *  See http://techtavern.wordpress.com/2008/07/16/whats-this-ioexception-write-end-dead/
+ * @since 0.7.9
  */
 public class InternalServerSocket extends ServerSocket {
     private static final ConcurrentHashMap<Integer, InternalServerSocket> _sockets = new ConcurrentHashMap(4);
diff --git a/core/java/src/net/i2p/util/InternalSocket.java b/core/java/src/net/i2p/util/InternalSocket.java
index 26280f254554ae56860c90fca076340f59ef5233..1d94d96945715cf24737f96acd338bb53b6ab646 100644
--- a/core/java/src/net/i2p/util/InternalSocket.java
+++ b/core/java/src/net/i2p/util/InternalSocket.java
@@ -12,6 +12,7 @@ import java.nio.channels.SocketChannel;
  *  A simple in-JVM Socket using Piped Streams.
  *  We use port numbers just like regular sockets.
  *  Can only connect to InternalServerSocket.
+ * @since 0.7.9
  */
 public class InternalSocket extends Socket {
     private InputStream _is;
@@ -36,10 +37,12 @@ public class InternalSocket extends Socket {
     public static Socket getSocket(String host, int port) throws IOException {
         if (System.getProperty("router.version") != null &&
             (host.equals("127.0.0.1") || host.equals("localhost"))) {
-            return new InternalSocket(port);
-        } else {
-            return new Socket(host, port);
+            try {
+                return new InternalSocket(port);
+            } catch (IOException ioe) {}
+            // guess it wasn't really internal...
         }
+        return new Socket(host, port);
     }
 
     @Override
diff --git a/core/java/src/net/i2p/util/LogManager.java b/core/java/src/net/i2p/util/LogManager.java
index ae6fbfc23d8ccb3549cbf9125bea6ca3960f44db..c776a6583a6543f581f96ed12d08bee7f71c6053 100644
--- a/core/java/src/net/i2p/util/LogManager.java
+++ b/core/java/src/net/i2p/util/LogManager.java
@@ -641,6 +641,7 @@ public class LogManager {
     public void shutdown() {
         _log.log(Log.WARN, "Shutting down logger");
         _writer.flushRecords(false);
+        _writer.stopWriting();
     }
 
     private static int __id = 0;
diff --git a/core/java/src/net/i2p/util/LogWriter.java b/core/java/src/net/i2p/util/LogWriter.java
index 829b91d7b2b2b915fd29cbe2615dc323f007fb1b..eeb22d56cf9e154ad7d2028bc3958d0b414f19a9 100644
--- a/core/java/src/net/i2p/util/LogWriter.java
+++ b/core/java/src/net/i2p/util/LogWriter.java
@@ -9,10 +9,13 @@ package net.i2p.util;
  *
  */
 
+import java.io.BufferedWriter;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
 import java.util.List;
 
 import net.i2p.I2PAppContext;
@@ -28,7 +31,7 @@ class LogWriter implements Runnable {
     private final static long CONFIG_READ_ITERVAL = 10 * 1000;
     private long _lastReadConfig = 0;
     private long _numBytesInCurrentFile = 0;
-    private OutputStream _currentOut; // = System.out
+    private Writer _currentOut;
     private int _rotationNum = -1;
     private String _logFilenamePattern;
     private File _currentFile;
@@ -56,11 +59,12 @@ class LogWriter implements Runnable {
                 flushRecords();
                 rereadConfig();
             }
-            System.err.println("Done writing");
+            //System.err.println("Done writing");
         } catch (Exception e) {
             System.err.println("Error writing the logs: " + e.getMessage());
             e.printStackTrace();
         }
+        closeFile();
     }
 
     public void flushRecords() { flushRecords(true); }
@@ -124,12 +128,10 @@ class LogWriter implements Runnable {
         if (val == null) return;
         if (_currentOut == null) rotateFile();
 
-        byte b[] = new byte[val.length()];
-        for (int i = 0; i < b.length; i++)
-            b[i] = (byte)val.charAt(i);
         try {
-            _currentOut.write(b);
-            _numBytesInCurrentFile += b.length;
+            _currentOut.write(val);
+            // may be a little off if a lot of multi-byte chars, but unlikely
+            _numBytesInCurrentFile += val.length();
         } catch (Throwable t) {
             System.err.println("Error writing record, disk full?");
             t.printStackTrace();
@@ -162,14 +164,24 @@ class LogWriter implements Runnable {
                 //System.exit(0);
             }
         }
+        closeFile();
         try {
-            _currentOut = new FileOutputStream(f);
+            _currentOut = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f), "UTF-8"));
         } catch (IOException ioe) {
             System.err.println("Error rotating into [" + f.getAbsolutePath() + "]");
             ioe.printStackTrace();
         }
     }
 
+    private void closeFile() {
+        Writer out = _currentOut;
+        if (out != null) {
+            try {
+                out.close();
+            } catch (IOException ioe) {}
+        }
+    }
+
     /**
      * Get the next file in the rotation
      *
diff --git a/core/java/src/net/i2p/util/Translate.java b/core/java/src/net/i2p/util/Translate.java
index 75803968a771472d30662d705fda745ee9a83cc8..4ff97437d66a89c73f0239663b3642aef29f4f89 100644
--- a/core/java/src/net/i2p/util/Translate.java
+++ b/core/java/src/net/i2p/util/Translate.java
@@ -18,6 +18,7 @@ import net.i2p.util.ConcurrentHashSet;
  * Support real-time language changing with the routerconsole.lang property.
  *
  * @author zzz, from a base generated by eclipse.
+ * @since 0.7.9
  */
 public abstract class Translate {
     public static final String PROP_LANG = "routerconsole.lang";
@@ -112,9 +113,8 @@ public abstract class Translate {
         ResourceBundle rv = _bundles.get(key);
         if (rv == null && !_missing.contains(key)) {
             try {
-                // Would it be faster to specify a class loader?
-                // No matter we only do this once per lang.
-                rv = ResourceBundle.getBundle(bun, new Locale(lang));
+                // We must specify the class loader so that a webapp can find the bundle in the .war
+                rv = ResourceBundle.getBundle(bun, new Locale(lang), Thread.currentThread().getContextClassLoader());
                 if (rv != null)
                     _bundles.put(key, rv);
             } catch (MissingResourceException e) {
diff --git a/history.txt b/history.txt
index 7e4a661b0b72c7a2990e005066cdf30545ac729a..1408fa14921b88a7f0cee44ed4d6de180123a5e6 100644
--- a/history.txt
+++ b/history.txt
@@ -1,3 +1,172 @@
+2010-01-06 zzz
+    * Summary bar tweaks
+
+2010-01-02 sponge
+    * Fix one last stupid mistake in build.xml, my fault.
+
+2010-01-02 sponge
+    * Fix NB 6.8 goofyness... 'till ant 1.7.1 or > is needed, stay with NB
+	6.5, as the newer ones place a check for 1.7.1. We require 1.7.0
+
+2010-01-02 sponge
+    * Fix build.xml target for justBOB
+    * Fix Main build.xml so that it actually deletes backup files and add a
+      few extra types that should be commonly needed... atleast by me.
+
+2010-01-02 zzz
+    * Console: Save refresh setting
+    * i2psnark:
+      - Don't URL-encode chars we don't have to
+      - CSS tweaks
+    * Transport: Implement 'laptop mode' to change ident and port
+      when the IP changes
+
+2010-01-01 sponge
+    * Happy New year everyone!
+    * Added a target to generate a stand-alone BOB jar file.
+
+2009-12-31 zzz
+    * BuildResponseRecord: Make static
+    * i2np: Remove unused logs
+    * i2psnark: Fix message box, was a little too small
+    * InternalSocket: Fallback to external socket on fail
+    * NetDb: Fix exploration by adding a null hash to mean
+      "don't give me floodfills"
+    * PeerSelector: Downgrade floodfills with high fail rate
+
+2009-12-26 zzz
+    * Console:
+      - Tag the rest of logs.jsp
+    * Tunnels, Transports:
+      - Lots of code to detect improper reuse of cached objects
+        after release
+      - Prevent release of TunnelDataMessage cached ByteArray,
+        as it may be reused if retried in another transport;
+        a nasty bug causing corrupt messages
+      - Prevent race with released resources in UDP OutboundMessageState;
+        a nasty bug causing corrupt messages
+      - More cleanups and comments
+    * UDP: Bid lower than NTCP when we need introducers and don't
+      have enough
+
+2009-12-22 zzz
+    * Tunnels:
+      - Do RED dropping before the IBGW fragmenter, not after
+      - Change batch time to 250ms for IBGWs (was 100ms)
+      - Change batch time to 150ms for exploratory OBGWs (was 100ms)
+      - Start a new message in the fragmenter if almost full
+      - Fix a major, longstanding synchronization bug in the FragmentHandler
+        which led to corrupt messages at the endpoints
+      - More cleanups and comments
+
+2009-12-20 zzz
+    * Console:
+      - Fix status to show a disconnected network error rather than
+        clock skew or UDP error when disconnected
+      - Use peer clock skew rather than clock offset for determining
+        whether to display clock skew error
+      - tunnels.jsp: Clarify tunnel table headings
+    * Contexts: Add isRouterContext() method
+    * Profile, DBHistory:
+      - Tweak the rate periods
+      - Add a global fail rate stat
+      - Increase the HashMap sizes
+    * Router: Move some more threads to I2PAppThread so an OOM won't
+      crash the router
+    * Timestamper: Reduce delays (cuts 10s out of router startup)
+    * Transport: Rework peer clock skew method to always return a value
+    * Tunnels:
+      - Reduce the drop probability for TunnelBuildMessages at the OBEP
+      - Schedule outbound startup instead of hanging the thread for 3s
+      - Cleanup preprocessor code, add comments
+
+2009-12-18 zzz
+    * Console: Fix spacing in update section
+    * I2CP:
+      - Move client-side writes to their own thread
+      - Reenable InternalSockets
+    * i2ptunnel: Fix bundle script
+    * InNetMessagePool: Cleanup
+    * Log:
+      - Close old file on rotate
+      - Buffer writes
+      - Write in UTF-8
+    * SusiDNS:
+      - Remove untranslatable button images (-15KB)
+      - Tag buttons and messages
+      - Add some button CSS
+    * Tunnel building:
+      - Increase timeout to 13s (was 10s)
+      - Fix tunnel.buildReplyTooSlow stat
+      - Tweak logging
+      - Prioritize expl. builds over client builds
+      - Code cleanups
+    * TunnelSettings: Drop, unused
+
+2009-12-15 zzz
+    * HTTP Proxy: Make jump server list configurable
+    * I2CP: Remove unused logs
+    * i2psnark: Fix stop/start, cleanups
+    * i2ptunnel: Fix bundle location
+    * SusiDNS:
+      - Rewrite and correct a lot of the text, tag jsps
+      - UTF-8 fixes
+    * TunnelManager: Fix a locking bug
+    * Update: Improve error message
+
+2009-12-13 zzz
+    * Find ResourceBundles in wars
+    * Fix restart from config.jsp if no wrapper
+    * i2psnark: Elaborate popups
+
+2009-12-12 welterde
+    * Sort peers on tunnels.jsp by country
+    * fix NPE in ^^
+
+2009-12-12 zzz
+    * Disable InternalSockets until it's fixed
+
+2009-12-11 zzz
+    * Addressbook, susidns: Rework addressbook into a
+      HttpServlet, so susidns can kick it when the subscription
+      list changes
+    * Build: Truncate the history in the updater (-80KB)
+    * Console:
+      - Add a nicer handler for missing webapps
+      - Restore the restart message
+      - Change "depth" to "length"
+    * Data: Cache the Hash hashcode
+    * EepGet: Use InternalSocket if available
+    * Fragmenter: Pull the new comments, new stats, and
+      debug log fix from i2p.i2p.zzz.batch in - but not the
+      batching mods, which need a fresh look.
+    * I2CP: Implement an internal "socket" class that
+      allows clients in the same JVM to connect to the
+      router without going through the kernel
+    * I2NP: Drop unused classes
+    * i2psnark:
+      - Translation support
+      - Tweak torrent name popup
+    * I2PTunnel:
+      - Translation support
+      - Switch all I2PThreads to I2PAppThreads
+      - Run an InternalSocket as well for the HTTP Proxy
+    * Naming Services:
+      - New EepGetAndAddNamingService that appends new
+        hosts to hosts.txt
+      - Move default reverseLookup to base class
+      - Deprecate unused services
+    * NetDb:
+      - Switch from ArrayList to ConcurrentHashSet in
+        KBucketImpl to reduce chance of deadlock;
+        remove periodic shuffling of the bucket,
+        needs to be addressed elsewhere
+    * SusiDNS:
+      - Translation support
+      - Remove jsp's from the war
+    * Translation: Move code from routerconsole to core,
+      to support translation of other webapps
+
 * 2009-12-08  0.7.8 released
 
 2009-12-08 zzz
diff --git a/installer/resources/proxy/ahelper-conflict-header_ru.ht b/installer/resources/proxy/ahelper-conflict-header_ru.ht
new file mode 100644
index 0000000000000000000000000000000000000000..04c106be2a3f14685354816c2c2c8bf88f1ef5b2
--- /dev/null
+++ b/installer/resources/proxy/ahelper-conflict-header_ru.ht
@@ -0,0 +1,24 @@
+HTTP/1.1 409 Conflict
+Content-Type: text/html; charset=UTF-8
+Cache-control: no-cache
+Connection: close
+Proxy-Connection: close
+
+<html><head>
+<title>Предупреждение I2P: Конфликт ключей адреса назначения</title>
+<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" >
+<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" >
+</head>
+<body>
+<div class=logo>
+ <a href="http://127.0.0.1:7657/index.jsp" title="Консоль маршрутизатора"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="I2P Router Console" border="0"></a><hr>
+ <a href="http://127.0.0.1:7657/config.jsp">Настройки</a> <a href="http://127.0.0.1:7657/help.jsp">Справка</a> <a href="http://127.0.0.1:7657/susidns/">Адресная книга</a>
+</div>
+
+<div class=warning id=warning>
+<h3>Предупреждение: Конфликт ключей для адреса назначения</h3>
+
+Addresshelper-ссылка, по которой вы перешли, задает ключ адреса назначения, отличающийся от ключа в Вашей адресной книге. Возможно это чья-то попытка выдать себя за чужой сайт. Или же это случайное совпадение, в результате которого два сайта получили идентичные названия.
+<p>
+Решите для себя, которому из ключей Вы доверяете. Затем устраните конфликт: либо проигнорируйте новую addresshelper-ссылку, либо переименуйте её при добавлении в адресную книгу.
+<p>
diff --git a/installer/resources/proxy/denied-header_ru.ht b/installer/resources/proxy/denied-header_ru.ht
new file mode 100644
index 0000000000000000000000000000000000000000..1e524b29b6e2fc366f696d85d1d8b17a507dce9b
--- /dev/null
+++ b/installer/resources/proxy/denied-header_ru.ht
@@ -0,0 +1,22 @@
+HTTP/1.1 403 Request Denied
+Content-Type: text/html; charset=UTF-8
+Cache-control: no-cache
+Connection: close
+Proxy-Connection: close
+
+<html><head>
+<title>Предупреждение I2P: Запрос запрещен</title>
+<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" >
+<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" >
+</head>
+<body>
+<div class=logo>
+ <a href="http://127.0.0.1:7657/index.jsp" title="Консоль маршрутизатора"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="I2P Router Console" border="0"></a><hr>
+ <a href="http://127.0.0.1:7657/config.jsp">Настройки</a> <a href="http://127.0.0.1:7657/help.jsp">Справка</a> <a href="http://127.0.0.1:7657/susidns/">Адресная книга</a>
+</div>
+
+<div class=warning id=warning>
+<h3>Предупреждение: Запрос запрещен</h3>
+
+Неправильно сформированный HTTP-запрос.
+</div>
diff --git a/installer/resources/proxy/dnf-header_ru.ht b/installer/resources/proxy/dnf-header_ru.ht
new file mode 100644
index 0000000000000000000000000000000000000000..2b826e8f05ae1db8d65f547ed6a42b45181bffe8
--- /dev/null
+++ b/installer/resources/proxy/dnf-header_ru.ht
@@ -0,0 +1,25 @@
+HTTP/1.1 504 Gateway Timeout
+Content-Type: text/html; charset=UTF-8
+Cache-control: no-cache
+Connection: close
+Proxy-Connection: close
+
+<html><head>
+<title>Предупреждение I2P: Сайт недоступен</title>
+<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" >
+<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" >
+</head>
+<body>
+<div class=logo>
+ <a href="http://127.0.0.1:7657/index.jsp" title="Консоль маршрутизатора"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="I2P Router Console" border="0"></a><hr>
+ <a href="http://127.0.0.1:7657/config.jsp">Настройки</a> <a href="http://127.0.0.1:7657/help.jsp">Справка</a> <a href="http://127.0.0.1:7657/susidns/index.jsp">Адресная книга</a>
+</div>
+
+<div class=warning id=warning>
+<h3>Предупреждение: I2P-сайт недоступен</h3>
+
+Не удалось открыть I2P-сайт. Он либо в офлайне, либо сеть сейчас перегружена, либо ваш I2P-маршрутизатор ещё недостаточно интегрирован с другими пирами.
+<BR><BR>
+Вы можете попробовать <a href="javascript: window.location.reload()">повторить запрос</a>. 
+
+<hr><b>Не удается открыть следующий адрес:</b><BR><BR>
diff --git a/installer/resources/proxy/dnfb-header_ru.ht b/installer/resources/proxy/dnfb-header_ru.ht
new file mode 100644
index 0000000000000000000000000000000000000000..fea946916f442edbb8609670dafdfdc802a3fb3f
--- /dev/null
+++ b/installer/resources/proxy/dnfb-header_ru.ht
@@ -0,0 +1,25 @@
+HTTP/1.1 400 Destination Not Found
+Content-Type: text/html; charset=UTF-8
+Cache-control: no-cache
+Connection: close
+Proxy-Connection: close
+
+<html><head>
+<title>Предупреждение I2P: Неверный адрес назначения</title>
+<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" >
+<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" >
+</head>
+<body>
+<div class=logo>
+ <a href="http://127.0.0.1:7657/index.jsp" title="Консоль маршрутизатора"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="I2P Router Console" border="0"></a><hr>
+ <a href="http://127.0.0.1:7657/config.jsp">Настройки</a> <a href="http://127.0.0.1:7657/help.jsp">Справка</a> <a href="http://127.0.0.1:7657/susidns/">Адресная книга</a>
+</div>
+
+<div class=warning id=warning>
+<h3>Предупреждение: Неверный адрес назначения для I2P-сайта</h3>
+
+Указанный I2P-адрес либо неверен, либо недоступен. Возможно Вы скопировали поврежденную BASE64-строчку или перешли по битой ссылке. Также возможно, что I2P-хост в офлайне.
+<BR><BR>
+Вы можете попробовать <a href="javascript: window.location.reload()">повторить запрос</a>. 
+
+<hr><b>Не удается открыть следующий адрес:</b><BR><BR>
diff --git a/installer/resources/proxy/dnfh-header_ru.ht b/installer/resources/proxy/dnfh-header_ru.ht
new file mode 100644
index 0000000000000000000000000000000000000000..8e7482b3fa5e89548d4d7bf1c3a674415532f38a
--- /dev/null
+++ b/installer/resources/proxy/dnfh-header_ru.ht
@@ -0,0 +1,29 @@
+HTTP/1.1 404 Domain Not Found
+Content-Type: text/html; charset=UTF-8
+Cache-control: no-cache
+Connection: close
+Proxy-Connection: close
+
+<html><head>
+<title>Предупреждение I2P: неизвестный I2P-сайт</title>
+<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" >
+<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" >
+</head>
+<body>
+<div class=logo>
+ <a href="http://127.0.0.1:7657/index.jsp" title="Консоль маршрутизатора"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="I2P Router Console" border="0"></a><hr>
+ <a href="http://127.0.0.1:7657/config.jsp">Настройки</a> <a href="http://127.0.0.1:7657/help.jsp">Справка</a> <a href="http://127.0.0.1:7657/susidns/index.jsp">Адресная книга</a>
+</div>
+
+<div class=warning id=warning>
+<h3>Предупреждение: I2P-сайт не найден в адресной книге</h3>
+
+Вы попытались открыть I2P-сайт, которого нет в адресной книге Вашего I2P-маршрутизатора. Проверьте, что ссылка введена без ошибок.
+<br><br>
+Попробуйте воспользоваться  jump-сервисами (блок ссылок в конце этой страницы). Если кто-то уже добавил этот сайт в jump-сервис, Вы получите addresshelper-ссылку, по которой сможете перейти на сайт.
+<br><br>
+Если ни один из jump-сервисов не помог, попробуйте найти BASE64-адрес этого сайта. Добавьте BASE64-адрес в Ваш файл userhosts.txt используя <a href="http://127.0.0.1:7657/susidns/addressbook.jsp?book=master">SusiDNS</a>.
+<br><br>
+Часто видите эту страницу? Загляните в <a href="http://www.i2p2.i2p/faq.html#subscriptions">соответствующий раздел FAQ</a> за помощью по <a href="http://127.0.0.1:7657/susidns/config.jsp">настройке автоматической подписки</a> на адреса новых сайтов.
+<hr>
+<b>Не удается открыть следующий адрес:</b><BR><BR>
diff --git a/installer/resources/proxy/dnfp-header_ru.ht b/installer/resources/proxy/dnfp-header_ru.ht
new file mode 100644
index 0000000000000000000000000000000000000000..45640c566544c9f7c23aca18948c9751f3b54f92
--- /dev/null
+++ b/installer/resources/proxy/dnfp-header_ru.ht
@@ -0,0 +1,25 @@
+HTTP/1.1 504 Gateway Timeout
+Content-Type: text/html; charset=UTF-8
+Cache-control: no-cache
+Connection: close
+Proxy-Connection: close
+
+<html><head>
+<title>Предупреждение I2P: Outproxy не найден</title>
+<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" >
+<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" >
+</head>
+<body>
+<div class=logo>
+ <a href="http://127.0.0.1:7657/index.jsp" title="Консоль маршрутизатора"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="I2P Router Console" border="0"></a><hr>
+ <a href="http://127.0.0.1:7657/config.jsp">Настройки</a> <a href="http://127.0.0.1:7657/help.jsp">Справка</a> <a href="http://127.0.0.1:7657/susidns/">Адресная книга</a>
+</div>
+<div class=warning id=warning>
+<h3>Предупреждение: Outproxy не найден</h3>
+
+Outproxy для www не найден. Он либо в офлайне, либо сеть сейчас перегружена, либо ваш I2P-маршрутизатор ещё недостаточно интегрирован с другими пирами.
+<BR><BR>
+Вы можете попробовать <a href="javascript: parent.window.location.reload()">повторить запрос</a>, при этом outproxy будет случайным образом выбран из списка, который Вы 
+<a href="http://127.0.0.1:7657/i2ptunnel/index.jsp">настроили</a> (если в списке более одного прокси). Если проблемы будут продолжаться, Вы можете отредактировать список outproxy на <a href="http://127.0.0.1:7657/i2ptunnel/edit.jsp?tunnel=0">этой странице</a>. 
+
+<hr><b>Не удается открыть следующий адрес:</b><BR><BR>
diff --git a/installer/resources/proxy/localhost-header_ru.ht b/installer/resources/proxy/localhost-header_ru.ht
new file mode 100644
index 0000000000000000000000000000000000000000..d9ff0b7bccfede96fb2687ec6327457f3515be05
--- /dev/null
+++ b/installer/resources/proxy/localhost-header_ru.ht
@@ -0,0 +1,24 @@
+HTTP/1.1 403 Access Denied
+Content-Type: text/html; charset=UTF-8
+Cache-control: no-cache
+Connection: close
+Proxy-Connection: close
+
+<html><head>
+<title>Предупреждение I2P: Запрос запрещен</title>
+<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" >
+<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" >
+</head>
+<body>
+<!-----------------------------
+  Let's not infinite loop here....
+<div class=logo>
+ <a href="http://127.0.0.1:7657/index.jsp" title="Router Console"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="I2P Router Console" border="0"></a><hr>
+ <a href="http://127.0.0.1:7657/config.jsp">Configuration</a> <a href="http://127.0.0.1:7657/help.jsp">Help</a> <a href="http://127.0.0.1:7657/susidns/">Addressbook</a>
+</div>
+------------------------------>
+<div class=warning id=warning>
+<h3>Предупреждение: Доступ к localhost</h3>
+
+Ваш браузер неправильно настроен. Не нужно использовать прокси для доступа к консоли I2P-маршрутизатора и другим ресурсам на localhost.
+</div>
diff --git a/installer/resources/proxy/noproxy-header_ru.ht b/installer/resources/proxy/noproxy-header_ru.ht
new file mode 100644
index 0000000000000000000000000000000000000000..f036e5a4ea36f42652639090dfcc98494db8226b
--- /dev/null
+++ b/installer/resources/proxy/noproxy-header_ru.ht
@@ -0,0 +1,22 @@
+HTTP/1.1 503 Service Unavailable
+Content-Type: text/html; charset=UTF-8
+Cache-control: no-cache
+Connection: close
+Proxy-Connection: close
+
+<html><head>
+<title>Предупреждение I2P: Не настроен outproxy</title>
+<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" >
+<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" >
+</head>
+<body>
+<div class=logo>
+ <a href="http://127.0.0.1:7657/index.jsp" title="Консоль маршрутизатора"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="I2P Router Console" border="0"></a><hr>
+ <a href="http://127.0.0.1:7657/config.jsp">Настройки</a> <a href="http://127.0.0.1:7657/help.jsp">Справка</a> <a href="http://127.0.0.1:7657/susidns/">Адресная книга</a>
+</div>
+
+<div class=warning id=warning>
+<h3>Предупреждение: Не настроен outproxy</h3>
+
+Вы попытались открыть сайт вне сети I2P, но у Вас не настроен HTTP-outproxy. Пожалуйста, настройте outproxy в <a href="http://127.0.0.1:7657/i2ptunnel/">менеджере туннелей</a>.
+</div>
diff --git a/installer/resources/proxy/protocol-header_ru.ht b/installer/resources/proxy/protocol-header_ru.ht
new file mode 100644
index 0000000000000000000000000000000000000000..39d40b66d2bbbfb5dbac3186ea64864ac748b60f
--- /dev/null
+++ b/installer/resources/proxy/protocol-header_ru.ht
@@ -0,0 +1,22 @@
+HTTP/1.1 403 Bad Protocol
+Content-Type: text/html; charset=UTF-8
+Cache-control: no-cache
+Connection: close
+Proxy-Connection: close
+
+<html><head>
+<title>Предупреждение I2P: Не-HTTP протокол</title>
+<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" >
+<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" >
+</head>
+<body>
+<div class=logo>
+ <a href="http://127.0.0.1:7657/index.jsp" title="Консоль маршрутизатора"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="I2P Router Console" border="0"></a><hr>
+ <a href="http://127.0.0.1:7657/config.jsp">Настройки</a> <a href="http://127.0.0.1:7657/help.jsp">Справка</a> <a href="http://127.0.0.1:7657/susidns/">Адресная книга</a>
+</div>
+
+<div class=warning id=warning>
+<h3>Предупреждение: Не-HTTP протокол</h3>
+
+В запросе использован неподдерживаемый протокол. I2P-HTTP прокси поддерживает ТОЛЬКО http:// запросы. Другие протоколы, такие как https:// или ftp://, не допускаются.
+</div>
diff --git a/installer/resources/readme/readme_ru.html b/installer/resources/readme/readme_ru.html
index 57e030ede6c080dc50f3c7c0c9a54f0efa22c5fa..aa8f65ba0a5f082fa82f61f9a606c9e83944b8dc 100644
--- a/installer/resources/readme/readme_ru.html
+++ b/installer/resources/readme/readme_ru.html
@@ -1,8 +1,8 @@
 <div align="right"> 
   <div class="langbox" align="right"><a href="/index.jsp?lang=en"><img src="/flags.jsp?c=us" title="English" alt="English"></a> 
-    <a href="/index.jsp?lang=zh"><img src="/flags.jsp?c=cn" title="Chinese" alt="Chinese"></a> 
+    <a href="/index.jsp?lang=zh"><img src="/flags.jsp?c=cn" title="中文" alt="中文"></a> 
     <a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a> 
-    <a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Fran&ccedil;ais" alt="Fran&ccedil;ais"></a> 
+    <a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Français" alt="Français"></a> 
     <a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a> 
     <a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a> 
     <a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div>
@@ -55,7 +55,7 @@
 <h2><a name="trouble">Поиск и устранение неполадок</a></h2>
 <p>Наберитесь терпения — первый старт I2P может занять до получаса из-за начального поиска пиров.
 
-<p>Если через 30 минут в графе «Active» все еще меньше 10 подсоединенных пиров, то для повышения качества соединения Вам нужно открыть порт для I2P на Вашем файерволе или роутере (по умолчанию I2P использует порт 8887).</p>
+<p>Если через 30 минут в графе «Active» все еще меньше 10 подсоединенных пиров, то для повышения качества соединения Вам нужно открыть порт для I2P на Вашем файерволе или роутере (используемый номер порта можно посмотреть на <a href="/config.jsp">странице настроек</a>).</p>
 
 <p>Если Вы не можете соединиться ни с одним I2P-сайтом (даже <a href="http://www.i2p2.i2p/">www.i2p2.i2p</a>), проверьте, включен ли в Вашем браузере HTTP-прокси 127.0.0.1 порт 4444.</p>
 
diff --git a/installer/resources/readme/readme_zh.html b/installer/resources/readme/readme_zh.html
index b6f8e02611711471fc8eee9b5e174fa51ff9d050..c6b01f1aae846c768a10611352aab481d2b42f4f 100644
--- a/installer/resources/readme/readme_zh.html
+++ b/installer/resources/readme/readme_zh.html
@@ -8,31 +8,33 @@
     <a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div>
 </div>
 <div class="welcome"><h2>欢迎使用 I2P!</h2></div>
-<p>I2P 运行后,未来的几分钟里控制台左侧的【活动节点】数量将会增加,并会出现名为【共享客户端】("shared clients") 的本地目标。(如果没有出现,参见 <a href="#trouble">疑难解答</a>)。待出现以上共享客户端后,您可以:</p>
+<p>I2P 运行后的几分钟里控制台左侧的【活动节点】数量会逐渐增加,
+<b>在【本地目标】中出现【共享客户端】后,表示I2P已建立连接</b>(没有出现?见 <a href="#trouble">疑难解答</a>)。
+然后您可以:</p>
 <ul>
- <li><B>浏览 I2P 站点 "eepsites"</B> -  I2P 网络内匿名运行的小站 - 您要首先设置浏览器的 <b>HTTP 代理</b> 为 127.0.0.1:4444, 然后才能浏览 I2P 站点 - <ul class="links">
-         <li><a href="http://inproxy.tino.i2p/status.php">inproxy.tino.i2p</a> 和 <a href="http://perv.i2p/stats.cgi">perv.i2p</a>:&nbsp;这两个站点用于跟踪哪些 I2P 站点在线。</li>
+ <li><B>浏览 I2P 匿名站点</B> -  I2P 网络内匿名运行的小站(EepSite) - 您要首先设置浏览器的 <b>HTTP 代理</b> 为 127.0.0.1:4444, 然后才能浏览 I2P 站点 - <ul class="links">
+         <li><a href="http://inproxy.tino.i2p/status.php">inproxy.tino.i2p</a> 和 <a href="http://perv.i2p/stats.cgi">perv.i2p</a>:&nbsp;这两个站点跟踪哪些 I2P 站点最近在线。</li>
          <li><a href="http://forum.i2p/">forum.i2p</a>:I2P官方论坛 <a href="http://forum.i2p2.de/">forum.i2p2.de</a>&nbsp;的匿名入口&nbsp;(个人的I2P站点会在论坛的EEPSITE讨论区发布)</li>
          <li><a href="http://www.i2p2.i2p/index_zh.html">www.i2p2.i2p</a> 与镜像 <a href="http://i2p-projekt.i2p/index_zh.html">i2p-projekt.i2p</a>:&nbsp;可以安全匿名的访问I2P官网 <a href="http://www.i2p2.de/index_zh.html">www.i2p2.de</a></li>
          <li><a href="http://eepsites.i2p/">eepsites.i2p</a>:&nbsp;I2P网络里的 “Google” 可以用来搜索各个匿名小站</li>
-         <li><a href="http://ugha.i2p/">ugha.i2p</a>:UGHA 的 I2P 小站,任何人都可以编辑的WIKI,有丰富的链接</li>
+         <li><a href="http://ugha.i2p/">ugha.i2p</a>:UGHA 的 I2P 小站,开放编辑的WIKI,有丰富的链接</li>
          <li><a href="http://fproxy.tino.i2p/">fproxy.tino.i2p</a>:FREENET 代理</li>
          <li><a href="http://echelon.i2p/">echelon.i2p</a>:软件存档及有关I2P的相关文档&nbsp;(例如 I2P&nbsp;Messenger 基于I2P的匿名聊天工具等)&nbsp;</li>
          <li><a href="http://paste.i2p2.i2p/">paste.i2p2.i2p</a>:安全匿名的公共剪贴板</li>
      </ul> <br>
-      I2P网络中还有很多其他网站(EEPSITE) - 访问上面的网站你会找到更多,收藏你喜爱的 I2P 网站,别忘了常去看看!</li><br>
- <li><b>浏览 Web 网页</b> - 目前 IP2 网络中的出口代理("Outproxy")只有一个,它以HTTP代理的形式挂接在本地计算机的4444端口上。- 将浏览器的代理设置指向为上述地址(127.0.0.1:4444)后,访问任何普通链接即可 - 您的HTTP请求将在 I2P 网络内部传递。</li>
+      I2P网络中还有很多其他站点 - 访问上面的网站你会找到更多,别忘了收藏你喜爱的 I2P 网站方便访问。</li><br>
+ <li><b>浏览 Web 网页</b> - 目前 IP2 网络中的出口代理("Outproxy")只有一个,它的HTTP代理映射在本机的4444端口上。- 将浏览器的代理设置指向为上述地址(127.0.0.1:4444)后,访问任何普通链接即可 - 您的HTTP请求将在 I2P 网络内部传递。</li>
  <li><b>文件交换</b> - I2P的其中一个本地&nbsp;<a href="/i2psnark">端口</a>&nbsp;用于内置的&nbsp;<a href="http://www.klomp.org/snark/">Snark</a> <a href="http://www.bittorrent.com/">BitTorrent</a> 客户端。</li>
- <li><b>匿名电邮</b> - POSTMAN 建立了兼容普通邮件客户端 (POP3 / SMTP)的邮件系统,这个系统可以在 I2P 网络内部收发 Email 也可以收发来自外部 Internet 的邮件!I2P的邮件帐户请到 <a href="http://hq.postman.i2p/">hq.postman.i2p</a> 申请。I2P中集成了Web界面的pop3/stmp邮件客户端 <a href="/susimail/susimail">SUSIMail</a>,并已设置好使用POSTMAN 的邮件服务。</li>
- <li><b>匿名聊天</b> - 打开你的 IRC 聊天程序,连接至 <b>127.0.0.1:6668&nbsp;</b>即可访问I2P的匿名 IRC 聊天室,但无论你还是服务器都不知道聊天的人在哪里。</li>
+ <li><b>匿名电邮</b> - 由POSTMAN维护的邮件系统支持普通邮件客户端(POP3 / SMTP),这个系统可以在 I2P 网络内部收发 Email 也可以收发来自外部 Internet 的邮件!建立I2P邮件帐户请到 <a href="http://hq.postman.i2p/">hq.postman.i2p</a> 申请。I2P中集成有Web界面的pop3/stmp邮件客户端 <a href="/susimail/susimail">SUSIMail</a>,并配置为使用POSTMAN 的邮件服务。</li>
+ <li><b>匿名聊天</b> - 打开你的 IRC 聊天程序,连接至 <b>127.0.0.1:6668&nbsp;</b>即可访问I2P的匿名聊天室,如果您的聊天客户端配置错误泄露IP(DDC,MSG)我们的匿名服务器会自动过滤掉这些数据不让对方发现你,如果您的IRC设置正确无论服务器还是其他聊天的人都不知道您在哪里。</li>
  <li><b>匿名博客</b> - 参见 <a href="http://syndie.i2p2.de/">Syndie</a></li>
  <li>以及其他服务。</li>
 </ul>
 
-<h2>想创建属于自己的 I2P 站点(EEPSITE)?</h2>
+<h2>想创建属于自己的 I2P 站点?</h2>
 
-<p>I2P 已经集成了一些软件来帮助你运行自己的匿名小站 - 有一个&nbsp;<a href="http://jetty.mortbay.org/">Jetty</a> 实例运行于本机 <a href="http://127.0.0.1:7658/">http://127.0.0.1:7658/</a>上。只要将你的文件放在 I2P目录下的&nbsp;<code>eepsite/docroot/</code> 文件夹中 (或将任何标准的 JSP/Servlet <code>.war</code> 文件放置于 <code>eepsite/webapps</code> 中, 或标准的 CGI 脚本置于 <code>eepsite/cgi-bin</code> 目录内) ,通过上面的地址就可以浏览啦。此后创建一个&nbsp;<a href="/i2ptunnel/">I2P站点隧道(EEPSITE TUNNEL)</a> 将其指向上面的本地端口, 您的匿名站点就可以供人们访问了。创建 I2P站点的具体操作参见 <a href="http://127.0.0.1:7658/">您的临时EEPSITE页面</a>。</p>
+<p>I2P 已经集成了Jetty服务器来帮助你运行自己的匿名站点 - &nbsp;<a href="http://jetty.mortbay.org/">Jetty</a> 实例运行于本机 <a href="http://127.0.0.1:7658/">http://127.0.0.1:7658/</a>上。只要将你的文件放在 I2P目录下的&nbsp;<code>eepsite/docroot/</code> 文件夹中 (或将任何标准的 JSP/Servlet <code>.war</code> 文件放置于 <code>eepsite/webapps</code> 中, 标准的 CGI 脚本请置于 <code>eepsite/cgi-bin</code> 目录内) ,通过上面的地址就可以浏览啦。然后&nbsp;<a href="/i2ptunnel/">在I2PTunnel中创建一个I2P站点隧道</a> 将其指向上面的本地端口, 您的匿名站点就可以供他人访问了。创建 I2P站点的具体操作参见 <a href="http://127.0.0.1:7658/">您的I2P站点临时页面</a>。</p>
 
 <h2><a name="trouble">疑难解答</a></h2>
 
-<p>保持耐心 - I2P 第一次启动时需要搜索节点,可能比较缓慢。如果30分钟后,您的活动节点计数仍在 10 个节点以下, 请在防火墙中打开 8887 端口改善连接性能。如果您根本无法打开任何EEPSITE(甚至 <a href="http://www.i2p2.i2p/index_zh.html">www.i2p2.i2p</a>),检查您的浏览器代理设置是否为本地的 127.0.0.1:4444。你也可以到&nbsp;<a href="http://www.i2p2.i2p/index_zh.html">I2P 网站</a>&nbsp;查找信息, 在 <a href="http://forum.i2p2.de/">I2P 论坛</a> 中发帖, 来 <a href="irc://irc.freenode.net/#i2p">irc.freenode.net</a> , irc.postman.i2p 或 irc.freshcoffee.i2p 上的 #i2p 或 #i2p-chat 这两个 IRC 频道上询问。 (这些服务器上的这两个频道是相通的)。</p><hr>
+<p>保持耐心 - I2P 第一次启动时需要搜索节点,可能比较缓慢。如果30分钟后,您的活动节点计数仍在 10 个节点以下, 请在防火墙中打开 I2P端口(见【I2P内部设置】>【网络】中的IP与传输部分的设置)改善连接性能。如果您根本无法打开任何I2P匿名站点(甚至 <a href="http://www.i2p2.i2p/index_zh.html">www.i2p2.i2p</a>),检查您的浏览器代理设置是否为本地的 127.0.0.1:4444。你也可以到&nbsp;<a href="http://www.i2p2.i2p/index_zh.html">I2P 网站</a>&nbsp;查找信息, 在 <a href="http://forum.i2p2.de/">I2P 论坛</a> 中发帖, 来 <a href="irc://irc.freenode.net/#i2p">irc.freenode.net</a> , irc.postman.i2p 或 irc.freshcoffee.i2p 上的 #i2p 或 #i2p-chat 这两个 IRC 频道上询问。 (这些服务器上的这两个频道是相通的)。</p><hr>
diff --git a/installer/resources/themes/console/snark.css b/installer/resources/themes/console/snark.css
index 8b2a82673e6bfacd29cdc8711c06e8da92db3c21..25872cb55dba346ee0398904c005e1ce2cd5ebe5 100644
--- a/installer/resources/themes/console/snark.css
+++ b/installer/resources/themes/console/snark.css
@@ -20,7 +20,6 @@ body {
      font-weight: bold;
      font-size: 11pt;
      color: #005;
-     text-shadow: 0px 0px 1px rgba(0,0,148,0.9);
 }
 
 .snarkRefresh:hover {
@@ -33,7 +32,6 @@ body {
      color: #f60;
      border-bottom: 3px solid #f60;
      border-top: 3px solid #f60;
-     text-shadow: 0px 0px 1px rgba(255,128,0,0.9);
 }
 
 .snarkRefresh:active {
@@ -46,7 +44,6 @@ body {
      color: #f30;
      border-bottom: 3px solid #f30;
      border-top: 3px solid #f30;
-     text-shadow: 0px 0px 1px rgba(255,32,0,0.5);
 }
 
 .snarkMessages {
@@ -61,9 +58,9 @@ body {
      border: 2px solid #930;
      overflow: auto;
      color: #531;
-     height: 64px;
+     height: 79px;
      width: auto;
-     background: #f83 url('../console/images/orangetile.png');
+     background: #f0dea0;
 }
 
 pre {
@@ -84,10 +81,10 @@ table {
 
 th {
      padding: 4px;
-     font-size: 8pt;
+     font-size: 9pt;
      border-top: 1px outset #001;
      border-bottom: 1px inset #001;
-     background: #f60 url('/themes/console/images/tabletitleorange.png') repeat-x;
+     background: #fda;
      whitespace: nowrap;
 }
 
@@ -102,13 +99,13 @@ td {
 }
 
 .snarkTorrentEven {
-     background: #fb1;
-     font-size: 7pt;
+     background: #fea;
+     font-size: 8pt;
 }
 
 .snarkTorrentOdd {
-     background: #fa1;
-     font-size: 7pt;
+     background: #f0dea0;
+     font-size: 8pt;
 }
 
 .snarkNewTorrent {
@@ -123,9 +120,7 @@ td {
 .snarkConfigTitle {
      font-size: 11pt;
      font-weight: bold;
-     text-decoration: underline;
      text-transform: uppercase;
-     text-shadow: 0px 0px 2px rgba(172,172,192,0.9);
 }
 
 .snarkConfig {
@@ -273,6 +268,10 @@ div.configsection {
      font-weight: bold;/* red tile needs bold text! */
 }
 
+div.configsection table{
+     color: #ffb;
+}
+
 div.configsection a {
      color: #f90;
 }
@@ -296,5 +295,4 @@ div.configsection a: hover {
      font-weight: bold;
      font-size: 11pt;
      color: #001;
-     text-shadow: 0px 0px 1px rgba(0,0,148,0.9);
  }
diff --git a/router/java/src/net/i2p/data/i2np/BuildResponseRecord.java b/router/java/src/net/i2p/data/i2np/BuildResponseRecord.java
index 562f082bad4df1979d028cea87ca551a6bc25561..d8726fb29ee51a17c3f98cd847e9882f3d77af32 100644
--- a/router/java/src/net/i2p/data/i2np/BuildResponseRecord.java
+++ b/router/java/src/net/i2p/data/i2np/BuildResponseRecord.java
@@ -5,28 +5,36 @@ import net.i2p.data.Base64;
 import net.i2p.data.DataHelper;
 import net.i2p.data.Hash;
 import net.i2p.data.SessionKey;
-import net.i2p.util.Log;
+//import net.i2p.util.Log;
 
 /**
  * Read and write the reply to a tunnel build message record.
  *
+ * The reply record is the same size as the request record (528 bytes).
+ * Bytes 0-526 contain random data.
+ * Byte 527 contains the reply.
  */
 public class BuildResponseRecord {
+
     /**
      * Create a new encrypted response
+     *
+     * @param status the response
+     * @param responseMessageId unused except for debugging
+     * @return a 528-byte response record
      */
-    public byte[] create(I2PAppContext ctx, int status, SessionKey replyKey, byte replyIV[], long responseMessageId) {
-        Log log = ctx.logManager().getLog(BuildResponseRecord.class);
+    public static byte[] create(I2PAppContext ctx, int status, SessionKey replyKey, byte replyIV[], long responseMessageId) {
+        //Log log = ctx.logManager().getLog(BuildResponseRecord.class);
         byte rv[] = new byte[TunnelBuildReplyMessage.RECORD_SIZE];
         ctx.random().nextBytes(rv);
         DataHelper.toLong(rv, TunnelBuildMessage.RECORD_SIZE-1, 1, status);
         // rv = AES(SHA256(padding+status) + padding + status, replyKey, replyIV)
         ctx.sha().calculateHash(rv, Hash.HASH_LENGTH, rv.length - Hash.HASH_LENGTH, rv, 0);
-        if (log.shouldLog(Log.DEBUG))
-            log.debug(responseMessageId + ": before encrypt: " + Base64.encode(rv, 0, 128) + " with " + replyKey.toBase64() + "/" + Base64.encode(replyIV));
+        //if (log.shouldLog(Log.DEBUG))
+        //    log.debug(responseMessageId + ": before encrypt: " + Base64.encode(rv, 0, 128) + " with " + replyKey.toBase64() + "/" + Base64.encode(replyIV));
         ctx.aes().encrypt(rv, 0, rv, 0, replyKey, replyIV, rv.length);
-        if (log.shouldLog(Log.DEBUG))
-            log.debug(responseMessageId + ": after encrypt: " + Base64.encode(rv, 0, 128));
+        //if (log.shouldLog(Log.DEBUG))
+        //    log.debug(responseMessageId + ": after encrypt: " + Base64.encode(rv, 0, 128));
         return rv;
     }
 }
diff --git a/router/java/src/net/i2p/data/i2np/DataMessage.java b/router/java/src/net/i2p/data/i2np/DataMessage.java
index cd4c4d327a265b7e541bad14d36714bb0581cc28..641d6b40b01b502e4efdf92b97cd7ed197c9d4bc 100644
--- a/router/java/src/net/i2p/data/i2np/DataMessage.java
+++ b/router/java/src/net/i2p/data/i2np/DataMessage.java
@@ -12,7 +12,6 @@ import java.io.IOException;
 
 import net.i2p.I2PAppContext;
 import net.i2p.data.DataHelper;
-// import net.i2p.util.Log;
 
 /**
  * Defines a message containing arbitrary bytes of data
@@ -20,7 +19,6 @@ import net.i2p.data.DataHelper;
  * @author jrandom
  */
 public class DataMessage extends I2NPMessageImpl {
-    // private final static Log _log = new Log(DataMessage.class);
     public final static int MESSAGE_TYPE = 20;
     private byte _data[];
     
diff --git a/router/java/src/net/i2p/data/i2np/DatabaseSearchReplyMessage.java b/router/java/src/net/i2p/data/i2np/DatabaseSearchReplyMessage.java
index f477ef2a1f98fd6d5c7a8631594867e708342976..ab3a7f678b3b3a3a4028292514fcb28b08651a18 100644
--- a/router/java/src/net/i2p/data/i2np/DatabaseSearchReplyMessage.java
+++ b/router/java/src/net/i2p/data/i2np/DatabaseSearchReplyMessage.java
@@ -15,7 +15,6 @@ import java.util.List;
 import net.i2p.I2PAppContext;
 import net.i2p.data.DataHelper;
 import net.i2p.data.Hash;
-import net.i2p.util.Log;
 
 /**
  * Defines the message a router sends to another router in response to a
@@ -25,7 +24,6 @@ import net.i2p.util.Log;
  * @author jrandom
  */
 public class DatabaseSearchReplyMessage extends I2NPMessageImpl {
-    private final static Log _log = new Log(DatabaseSearchReplyMessage.class);
     public final static int MESSAGE_TYPE = 3;
     private Hash _key;
     private List _peerHashes;
diff --git a/router/java/src/net/i2p/data/i2np/DatabaseStoreMessage.java b/router/java/src/net/i2p/data/i2np/DatabaseStoreMessage.java
index 9bf61e84390ecae056687c9d13be4db6eb64e7b4..17a81ec09b4a3f352e3148332ee7f89d0a98449d 100644
--- a/router/java/src/net/i2p/data/i2np/DatabaseStoreMessage.java
+++ b/router/java/src/net/i2p/data/i2np/DatabaseStoreMessage.java
@@ -18,7 +18,6 @@ import net.i2p.data.Hash;
 import net.i2p.data.LeaseSet;
 import net.i2p.data.RouterInfo;
 import net.i2p.data.TunnelId;
-import net.i2p.util.Log;
 
 /**
  * Defines the message a router sends to another router to test the network
@@ -27,7 +26,6 @@ import net.i2p.util.Log;
  * @author jrandom
  */
 public class DatabaseStoreMessage extends I2NPMessageImpl {
-    private final static Log _log = new Log(DatabaseStoreMessage.class);
     public final static int MESSAGE_TYPE = 1;
     private Hash _key;
     private int _type;
diff --git a/router/java/src/net/i2p/data/i2np/DateMessage.java b/router/java/src/net/i2p/data/i2np/DateMessage.java
index 166ecafd3c181779fafc2532f810c0096f219c89..3b84d40570e3cdde25e0051030ff2f28e01d0975 100644
--- a/router/java/src/net/i2p/data/i2np/DateMessage.java
+++ b/router/java/src/net/i2p/data/i2np/DateMessage.java
@@ -12,14 +12,12 @@ import java.io.IOException;
 
 import net.i2p.I2PAppContext;
 import net.i2p.data.DataHelper;
-import net.i2p.util.Log;
 
 /**
  * Contains the sending router's current time, to sync (and verify sync)
  *
  */
 public class DateMessage extends I2NPMessageImpl {
-    private final static Log _log = new Log(DateMessage.class);
     public final static int MESSAGE_TYPE = 16;
     private long _now;
     
diff --git a/router/java/src/net/i2p/data/i2np/DeliveryStatusMessage.java b/router/java/src/net/i2p/data/i2np/DeliveryStatusMessage.java
index 9325a63331ee49f186c43c206745af837fda81fd..e04d6e6422ba8f8188c2d3f6effd54cad85c6b34 100644
--- a/router/java/src/net/i2p/data/i2np/DeliveryStatusMessage.java
+++ b/router/java/src/net/i2p/data/i2np/DeliveryStatusMessage.java
@@ -12,7 +12,6 @@ import java.io.IOException;
 
 import net.i2p.I2PAppContext;
 import net.i2p.data.DataHelper;
-import net.i2p.util.Log;
 
 /**
  * Defines the message sent back in reply to a message when requested, containing
@@ -21,7 +20,6 @@ import net.i2p.util.Log;
  * @author jrandom
  */
 public class DeliveryStatusMessage extends I2NPMessageImpl {
-    private final static Log _log = new Log(DeliveryStatusMessage.class);
     public final static int MESSAGE_TYPE = 10;
     private long _id;
     private long _arrival;
diff --git a/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java b/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java
index 757549e49a7fe86699d932374f9071c7846f9a23..f89c6cbfed4554c1605bacdd4ec0db5effbc08f5 100644
--- a/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java
+++ b/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java
@@ -66,6 +66,22 @@ public abstract class I2NPMessageImpl extends DataStructureImpl implements I2NPM
             throw new DataFormatException("Bad bytes", ime);
         }
     }
+
+    /**
+     *  Read the header, then read the rest into buffer, then call
+     *  readMessage in the implemented message type
+     *
+     *  Specifically:
+     *    1 byte type (if caller didn't read already, as specified by the type param
+     *    4 byte ID
+     *    8 byte expiration
+     *    2 byte size
+     *    1 byte checksum
+     *    size bytes of payload (read by readMessage() in implementation)
+     *
+     *  @param type the message type or -1 if we should read it here
+     *  @param buffer temp buffer to use
+     */
     public int readBytes(InputStream in, int type, byte buffer[]) throws I2NPMessageException, IOException {
         try {
             if (type < 0)
@@ -268,6 +284,7 @@ public abstract class I2NPMessageImpl extends DataStructureImpl implements I2NPM
      */
 
     
+    /** used by SSU only */
     public int toRawByteArray(byte buffer[]) {
         verifyUnwritten();
         if (RAW_FULL_SIZE)
@@ -298,9 +315,13 @@ public abstract class I2NPMessageImpl extends DataStructureImpl implements I2NPM
     }
 
     
+/*****
     public static I2NPMessage fromRawByteArray(I2PAppContext ctx, byte buffer[], int offset, int len) throws I2NPMessageException {
         return fromRawByteArray(ctx, buffer, offset, len, new I2NPMessageHandler(ctx));
     }
+*****/
+
+    /** used by SSU only */
     public static I2NPMessage fromRawByteArray(I2PAppContext ctx, byte buffer[], int offset, int len, I2NPMessageHandler handler) throws I2NPMessageException {
         int type = (int)DataHelper.fromLong(buffer, offset, 1);
         offset++;
diff --git a/router/java/src/net/i2p/data/i2np/TunnelDataMessage.java b/router/java/src/net/i2p/data/i2np/TunnelDataMessage.java
index a55efc2b1fd40292ed79e00c3e1b609125d8b85c..70876ea64c1aab5776990e4dea9866640e477216 100644
--- a/router/java/src/net/i2p/data/i2np/TunnelDataMessage.java
+++ b/router/java/src/net/i2p/data/i2np/TunnelDataMessage.java
@@ -33,7 +33,7 @@ public class TunnelDataMessage extends I2NPMessageImpl {
     /** if we can't deliver a tunnel message in 10s, fuck it */
     private static final int EXPIRATION_PERIOD = 10*1000;
     
-    private static final ByteCache _cache = ByteCache.getInstance(512, DATA_SIZE);
+    private static final ByteCache _cache;
     /**
      * When true, it means this tunnelDataMessage is being used as part of a tunnel
      * processing pipeline, where the byte array is acquired during the TunnelDataMessage's
@@ -42,9 +42,63 @@ public class TunnelDataMessage extends I2NPMessageImpl {
      * handler's cache, etc), until it is finally released back into the cache when written
      * to the next peer (or explicitly by the fragment handler's completion).
      * Setting this to false just increases memory churn
+     *
+     * Well, this is tricky to get right and avoid data corruption,
+     * here's an example after checks were put in:
+     *
+     *
+    10:57:05.197 CRIT  [NTCP read 1 ] 2p.data.i2np.TunnelDataMessage: TDM boom
+    net.i2p.data.i2np.I2NPMessageException: TDM data buf use after free
+	at net.i2p.data.i2np.TunnelDataMessage.writeMessageBody(TunnelDataMessage.java:124)
+	at net.i2p.data.i2np.I2NPMessageImpl.toByteArray(I2NPMessageImpl.java:217)
+	at net.i2p.router.transport.ntcp.NTCPConnection.bufferedPrepare(NTCPConnection.java:678)
+	at net.i2p.router.transport.ntcp.NTCPConnection.send(NTCPConnection.java:293)
+	at net.i2p.router.transport.ntcp.NTCPTransport.outboundMessageReady(NTCPTransport.java:185)
+	at net.i2p.router.transport.TransportImpl.send(TransportImpl.java:357)
+	at net.i2p.router.transport.GetBidsJob.getBids(GetBidsJob.java:80)
+	at net.i2p.router.transport.CommSystemFacadeImpl.processMessage(CommSystemFacadeImpl.java:129)
+	at net.i2p.router.OutNetMessagePool.add(OutNetMessagePool.java:61)
+	at net.i2p.router.transport.TransportImpl.afterSend(TransportImpl.java:252)
+	at net.i2p.router.transport.TransportImpl.afterSend(TransportImpl.java:163)
+	at net.i2p.router.transport.udp.UDPTransport.failed(UDPTransport.java:1314)
+	at net.i2p.router.transport.udp.PeerState.add(PeerState.java:1064)
+	at net.i2p.router.transport.udp.OutboundMessageFragments.add(OutboundMessageFragments.java:146)
+	at net.i2p.router.transport.udp.UDPTransport.send(UDPTransport.java:1098)
+	at net.i2p.router.transport.GetBidsJob.getBids(GetBidsJob.java:80)
+	at net.i2p.router.transport.CommSystemFacadeImpl.processMessage(CommSystemFacadeImpl.java:129)
+	at net.i2p.router.OutNetMessagePool.add(OutNetMessagePool.java:61)
+	at net.i2p.router.tunnel.TunnelParticipant.send(TunnelParticipant.java:172)
+	at net.i2p.router.tunnel.TunnelParticipant.dispatch(TunnelParticipant.java:86)
+	at net.i2p.router.tunnel.TunnelDispatcher.dispatch(TunnelDispatcher.java:351)
+	at net.i2p.router.InNetMessagePool.doShortCircuitTunnelData(InNetMessagePool.java:306)
+	at net.i2p.router.InNetMessagePool.shortCircuitTunnelData(InNetMessagePool.java:291)
+	at net.i2p.router.InNetMessagePool.add(InNetMessagePool.java:160)
+	at net.i2p.router.transport.TransportManager.messageReceived(TransportManager.java:462)
+	at net.i2p.router.transport.TransportImpl.messageReceived(TransportImpl.java:416)
+	at net.i2p.router.transport.ntcp.NTCPConnection$ReadState.receiveLastBlock(NTCPConnection.java:1285)
+	at net.i2p.router.transport.ntcp.NTCPConnection$ReadState.receiveSubsequent(NTCPConnection.java:1248)
+	at net.i2p.router.transport.ntcp.NTCPConnection$ReadState.receiveBlock(NTCPConnection.java:1205)
+	at net.i2p.router.transport.ntcp.NTCPConnection.recvUnencryptedI2NP(NTCPConnection.java:1035)
+	at net.i2p.router.transport.ntcp.NTCPConnection.recvEncryptedI2NP(NTCPConnection.java:1018)
+	at net.i2p.router.transport.ntcp.Reader.processRead(Reader.java:167)
+	at net.i2p.router.transport.ntcp.Reader.access$400(Reader.java:17)
+	at net.i2p.router.transport.ntcp.Reader$Runner.run(Reader.java:106)
+	at java.lang.Thread.run(Thread.java:619)
+	at net.i2p.util.I2PThread.run(I2PThread.java:71)
+     *
      */
     private static final boolean PIPELINED_CACHE = true;
 
+    static {
+        if (PIPELINED_CACHE)
+            _cache = ByteCache.getInstance(512, DATA_SIZE);
+        else
+            _cache = null;
+    }
+
+    /** For use-after-free checks. Always false if PIPELINED_CACHE is false. */
+    private boolean _hadCache;
+
     public TunnelDataMessage(I2PAppContext context) {
         super(context);
         _log = context.logManager().getLog(TunnelDataMessage.class);
@@ -63,7 +117,15 @@ public class TunnelDataMessage extends I2NPMessageImpl {
         _tunnelId = id.getTunnelId();
     }
     
-    public byte[] getData() { return _data; }
+    public byte[] getData() {
+        if (_hadCache && _dataBuf == null) {
+            RuntimeException e = new RuntimeException("TDM data buf use after free");
+            _log.error("TDM boom", e);
+            throw e;
+        }
+        return _data;
+    }
+
     public void setData(byte data[]) { 
         if ( (data == null) || (data.length <= 0) )
             throw new IllegalArgumentException("Empty tunnel payload?");
@@ -86,6 +148,7 @@ public class TunnelDataMessage extends I2NPMessageImpl {
         if (PIPELINED_CACHE) {
             _dataBuf = _cache.acquire();
             _data = _dataBuf.getData();
+            _hadCache = true;
         } else {
             _data = new byte[DATA_SIZE];
         }
@@ -101,12 +164,24 @@ public class TunnelDataMessage extends I2NPMessageImpl {
         if (_data.length <= 0) 
             throw new I2NPMessageException("Not enough data to write out (data.length=" + _data.length + ")");
 
+        if (_hadCache && _dataBuf == null) {
+            I2NPMessageException e = new I2NPMessageException("TDM data buf use after free");
+            _log.error("TDM boom", e);
+            throw e;
+        }
+
         DataHelper.toLong(out, curIndex, 4, _tunnelId);
         curIndex += 4;
         System.arraycopy(_data, 0, out, curIndex, DATA_SIZE);
         curIndex += _data.length;
-        if (PIPELINED_CACHE)
-            _cache.release(_dataBuf);
+
+        // We can use from the cache, we just can't release to the cache, due to the bug
+        // noted above. In effect, this means that transmitted TDMs don't get their
+        // dataBufs released - but received TDMs do (via FragmentHandler)
+        //if (_hadCache) {
+        //    _cache.release(_dataBuf);
+        //    _dataBuf = null;
+        //}
         return curIndex;
     }
     
diff --git a/router/java/src/net/i2p/router/InNetMessagePool.java b/router/java/src/net/i2p/router/InNetMessagePool.java
index 1d3cac39ddf59b46fa716e53934b1e12549fe374..d3194095669c27ef3ed0160bb8398222b8a1a1af 100644
--- a/router/java/src/net/i2p/router/InNetMessagePool.java
+++ b/router/java/src/net/i2p/router/InNetMessagePool.java
@@ -18,8 +18,6 @@ import net.i2p.data.i2np.DatabaseLookupMessage;
 import net.i2p.data.i2np.DatabaseSearchReplyMessage;
 import net.i2p.data.i2np.DeliveryStatusMessage;
 import net.i2p.data.i2np.I2NPMessage;
-//import net.i2p.data.i2np.TunnelCreateMessage;
-//import net.i2p.data.i2np.TunnelCreateStatusMessage;
 import net.i2p.data.i2np.TunnelDataMessage;
 import net.i2p.data.i2np.TunnelGatewayMessage;
 import net.i2p.util.I2PThread;
@@ -35,6 +33,7 @@ public class InNetMessagePool implements Service {
     private Log _log;
     private RouterContext _context;
     private HandlerJobBuilder _handlerJobBuilders[];
+    /** following 5 unused unless DISPATCH_DIRECT == false */
     private final List _pendingDataMessages;
     private final List _pendingDataMessagesFrom;
     private final List _pendingGatewayMessages;
@@ -63,21 +62,27 @@ public class InNetMessagePool implements Service {
     
     public InNetMessagePool(RouterContext context) {
         _context = context;
+        // 32 is greater than the max I2NP message type number (currently 22) + 1
         _handlerJobBuilders = new HandlerJobBuilder[32];
-        _pendingDataMessages = new ArrayList(16);
-        _pendingDataMessagesFrom = new ArrayList(16);
-        _pendingGatewayMessages = new ArrayList(16);
-        _shortCircuitDataJob = new SharedShortCircuitDataJob(context);
-        _shortCircuitGatewayJob = new SharedShortCircuitGatewayJob(context);
+        if (DISPATCH_DIRECT) {
+            // keep the compiler happy since they are final
+            _pendingDataMessages = null;
+            _pendingDataMessagesFrom = null;
+            _pendingGatewayMessages = null;
+        } else {
+            _pendingDataMessages = new ArrayList(16);
+            _pendingDataMessagesFrom = new ArrayList(16);
+            _pendingGatewayMessages = new ArrayList(16);
+            _shortCircuitDataJob = new SharedShortCircuitDataJob(context);
+            _shortCircuitGatewayJob = new SharedShortCircuitGatewayJob(context);
+        }
         _log = _context.logManager().getLog(InNetMessagePool.class);
         _alive = false;
-        _context.statManager().createRateStat("inNetPool.dropped", "How often do we drop a message", "InNetPool", new long[] { 60*1000l, 60*60*1000l, 24*60*60*1000l });
-        _context.statManager().createRateStat("inNetPool.droppedDeliveryStatusDelay", "How long after a delivery status message is created do we receive it back again (for messages that are too slow to be handled)", "InNetPool", new long[] { 60*1000l, 60*60*1000l, 24*60*60*1000l });
-        _context.statManager().createRateStat("inNetPool.duplicate", "How often do we receive a duplicate message", "InNetPool", new long[] { 60*1000l, 60*60*1000l, 24*60*60*1000l });
+        _context.statManager().createRateStat("inNetPool.dropped", "How often do we drop a message", "InNetPool", new long[] { 60*60*1000l });
+        _context.statManager().createRateStat("inNetPool.droppedDeliveryStatusDelay", "How long after a delivery status message is created do we receive it back again (for messages that are too slow to be handled)", "InNetPool", new long[] { 60*60*1000l });
+        _context.statManager().createRateStat("inNetPool.duplicate", "How often do we receive a duplicate message", "InNetPool", new long[] { 60*60*1000l });
         //_context.statManager().createRateStat("inNetPool.droppedTunnelCreateStatusMessage", "How often we drop a slow-to-arrive tunnel request response", "InNetPool", new long[] { 60*60*1000l, 24*60*60*1000l });
-        _context.statManager().createRateStat("inNetPool.droppedDbLookupResponseMessage", "How often we drop a slow-to-arrive db search response", "InNetPool", new long[] { 60*60*1000l, 24*60*60*1000l });
-        _context.statManager().createRateStat("pool.dispatchDataTime", "How long a tunnel dispatch takes", "Tunnels", new long[] { 10*60*1000l, 60*60*1000l, 24*60*60*1000l });
-        _context.statManager().createRateStat("pool.dispatchGatewayTime", "How long a tunnel gateway dispatch takes", "Tunnels", new long[] { 10*60*1000l, 60*60*1000l, 24*60*60*1000l });
+        _context.statManager().createRateStat("inNetPool.droppedDbLookupResponseMessage", "How often we drop a slow-to-arrive db search response", "InNetPool", new long[] { 60*60*1000l });
     }
   
     public HandlerJobBuilder registerHandlerJobBuilder(int i2npMessageType, HandlerJobBuilder builder) {
@@ -309,10 +314,12 @@ public class InNetMessagePool implements Service {
     }
     public void shutdown() {
         _alive = false;
-        synchronized (_pendingDataMessages) {
-            _pendingDataMessages.clear();
-            _pendingDataMessagesFrom.clear();
-            _pendingDataMessages.notifyAll();
+        if (!DISPATCH_DIRECT) {
+            synchronized (_pendingDataMessages) {
+                _pendingDataMessages.clear();
+                _pendingDataMessagesFrom.clear();
+                _pendingDataMessages.notifyAll();
+            }
         }
     }
     
@@ -324,6 +331,8 @@ public class InNetMessagePool implements Service {
             _dispatchThreaded = Boolean.valueOf(threadedStr).booleanValue();
         }
         if (_dispatchThreaded) {
+            _context.statManager().createRateStat("pool.dispatchDataTime", "How long a tunnel dispatch takes", "Tunnels", new long[] { 10*60*1000l, 60*60*1000l, 24*60*60*1000l });
+            _context.statManager().createRateStat("pool.dispatchGatewayTime", "How long a tunnel gateway dispatch takes", "Tunnels", new long[] { 10*60*1000l, 60*60*1000l, 24*60*60*1000l });
             I2PThread data = new I2PThread(new TunnelDataDispatcher(), "Tunnel data dispatcher");
             data.setDaemon(true);
             data.start();
@@ -333,6 +342,7 @@ public class InNetMessagePool implements Service {
         }
     }
     
+    /** unused unless DISPATCH_DIRECT == false */
     private class SharedShortCircuitDataJob extends JobImpl {
         public SharedShortCircuitDataJob(RouterContext ctx) {
             super(ctx);
@@ -355,6 +365,8 @@ public class InNetMessagePool implements Service {
                 getContext().jobQueue().addJob(SharedShortCircuitDataJob.this);
         }
     }
+
+    /** unused unless DISPATCH_DIRECT == false */
     private class SharedShortCircuitGatewayJob extends JobImpl {
         public SharedShortCircuitGatewayJob(RouterContext ctx) {
             super(ctx);
@@ -375,6 +387,7 @@ public class InNetMessagePool implements Service {
         }
     }
     
+    /** unused unless router.dispatchThreaded=true */
     private class TunnelGatewayDispatcher implements Runnable {
         public void run() {
             while (_alive) {
@@ -403,6 +416,8 @@ public class InNetMessagePool implements Service {
             }
         }
     }
+
+    /** unused unless router.dispatchThreaded=true */
     private class TunnelDataDispatcher implements Runnable {
         public void run() {
             while (_alive) {
diff --git a/router/java/src/net/i2p/router/MessageHistory.java b/router/java/src/net/i2p/router/MessageHistory.java
index 4db6c47c68127f6b7752b00d8f5295f5661eb136..07a62144566d5aa795a8fbd361349a0745e64827 100644
--- a/router/java/src/net/i2p/router/MessageHistory.java
+++ b/router/java/src/net/i2p/router/MessageHistory.java
@@ -33,7 +33,7 @@ public class MessageHistory {
     private boolean _doPause; // true == briefly stop writing data to the log (used while submitting it)
     private ReinitializeJob _reinitializeJob;
     private WriteJob _writeJob;
-    private SubmitMessageHistoryJob _submitMessageHistoryJob;
+    //private SubmitMessageHistoryJob _submitMessageHistoryJob;
     private volatile boolean _firstPass;
     
     private final static byte[] NL = System.getProperty("line.separator").getBytes();
diff --git a/router/java/src/net/i2p/router/OutNetMessage.java b/router/java/src/net/i2p/router/OutNetMessage.java
index 39921a5e7a6b580c449a5408166f4fc60672a972..e3188f363457416f75825cc2c6d95a842a247fec 100644
--- a/router/java/src/net/i2p/router/OutNetMessage.java
+++ b/router/java/src/net/i2p/router/OutNetMessage.java
@@ -126,7 +126,7 @@ public class OutNetMessage {
         }
         return ZERO;
     }
-    private static final Long ZERO = new Long(0);
+    private static final Long ZERO = Long.valueOf(0);
     private void locked_initTimestamps() {
         if (_timestamps == null) {
             _timestamps = new HashMap(8);
diff --git a/router/java/src/net/i2p/router/Router.java b/router/java/src/net/i2p/router/Router.java
index 7e231097b40cb9ac80e4e472438b918981489fba..6c97b2124d13c7f1ca118b145b2efdc23b829d43 100644
--- a/router/java/src/net/i2p/router/Router.java
+++ b/router/java/src/net/i2p/router/Router.java
@@ -37,10 +37,12 @@ import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade;
 import net.i2p.router.startup.StartupJob;
 import net.i2p.router.startup.WorkingDir;
 import net.i2p.router.transport.FIFOBandwidthLimiter;
+import net.i2p.router.transport.udp.UDPTransport;
 import net.i2p.stat.Rate;
 import net.i2p.stat.RateStat;
 import net.i2p.stat.StatManager;
 import net.i2p.util.FileUtil;
+import net.i2p.util.I2PAppThread;
 import net.i2p.util.I2PThread;
 import net.i2p.util.Log;
 import net.i2p.util.SimpleScheduler;
@@ -201,6 +203,8 @@ public class Router {
         installUpdates();
 
         // Apps may use this as an easy way to determine if they are in the router JVM
+        // But context.isRouterContext() is even easier...
+        // Both of these as of 0.7.9
         System.setProperty("router.version", RouterVersion.VERSION);
 
         // NOW we start all the activity
@@ -228,14 +232,10 @@ public class Router {
             }
         };
         _shutdownHook = new ShutdownHook(_context);
-        _gracefulShutdownDetector = new I2PThread(new GracefulShutdown());
-        _gracefulShutdownDetector.setDaemon(true);
-        _gracefulShutdownDetector.setName("Graceful shutdown hook");
+        _gracefulShutdownDetector = new I2PAppThread(new GracefulShutdown(), "Graceful shutdown hook", true);
         _gracefulShutdownDetector.start();
         
-        I2PThread watchdog = new I2PThread(new RouterWatchdog(_context));
-        watchdog.setName("RouterWatchdog");
-        watchdog.setDaemon(true);
+        Thread watchdog = new I2PAppThread(new RouterWatchdog(_context), "RouterWatchdog", true);
         watchdog.start();
         
     }
@@ -315,10 +315,10 @@ public class Router {
         readConfig();
         
         setupHandlers();
-        if (ALLOW_DYNAMIC_KEYS) {
-            if ("true".equalsIgnoreCase(_context.getProperty(Router.PROP_HIDDEN, "false")))
-                killKeys();
-        }
+        //if (ALLOW_DYNAMIC_KEYS) {
+        //    if ("true".equalsIgnoreCase(_context.getProperty(Router.PROP_HIDDEN, "false")))
+        //        killKeys();
+        //}
 
         _context.messageValidator().startup();
         _context.tunnelDispatcher().startup();
@@ -339,7 +339,7 @@ public class Router {
         long waited = System.currentTimeMillis() - before;
         if (_log.shouldLog(Log.INFO))
             _log.info("Waited " + waited + "ms to initialize");
-        
+
         _context.jobQueue().addJob(new StartupJob(_context));
     }
     
@@ -527,7 +527,7 @@ public class Router {
 
     static final String IDENTLOG = "identlog.txt";
     public void killKeys() {
-        new Exception("Clearing identity files").printStackTrace();
+        //new Exception("Clearing identity files").printStackTrace();
         int remCount = 0;
         for (int i = 0; i < _rebuildFiles.length; i++) {
             File f = new File(_context.getRouterDir(),_rebuildFiles[i]);
@@ -541,6 +541,12 @@ public class Router {
                 }
             }
         }
+
+        // now that we have random ports, keeping the same port would be bad
+        removeConfigSetting(UDPTransport.PROP_INTERNAL_PORT);
+        removeConfigSetting(UDPTransport.PROP_EXTERNAL_PORT);
+        saveConfig();
+
         if (remCount > 0) {
             FileOutputStream log = null;
             try {
@@ -910,11 +916,11 @@ public class Router {
      */
     private static final boolean ALLOW_DYNAMIC_KEYS = false;
 
-    public void finalShutdown(int exitCode) {
+    private void finalShutdown(int exitCode) {
         _log.log(Log.CRIT, "Shutdown(" + exitCode + ") complete", new Exception("Shutdown"));
         try { _context.logManager().shutdown(); } catch (Throwable t) { }
         if (ALLOW_DYNAMIC_KEYS) {
-            if ("true".equalsIgnoreCase(_context.getProperty(PROP_DYNAMIC_KEYS, "false")))
+            if (Boolean.valueOf(_context.getProperty(PROP_DYNAMIC_KEYS)).booleanValue())
                 killKeys();
         }
 
diff --git a/router/java/src/net/i2p/router/RouterContext.java b/router/java/src/net/i2p/router/RouterContext.java
index 2a3410348c297f9d7ef5d84780d529b9e87bd94e..8f1c240c35af0f167004437568433d3d63f93e9d 100644
--- a/router/java/src/net/i2p/router/RouterContext.java
+++ b/router/java/src/net/i2p/router/RouterContext.java
@@ -379,4 +379,12 @@ public class RouterContext extends I2PAppContext {
         }
     }
     
+    /**
+     *  Use this instead of context instanceof RouterContext
+     *  @return true
+     *  @since 0.7.9
+     */
+    public boolean isRouterContext() {
+        return true;
+    }
 }
diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java
index b74a3a021a67537a1c5a88fd8f2ae075a48f864b..32a2083be1d8d4b31cb714f58ea945403bbcc484 100644
--- a/router/java/src/net/i2p/router/RouterVersion.java
+++ b/router/java/src/net/i2p/router/RouterVersion.java
@@ -18,7 +18,7 @@ public class RouterVersion {
     /** deprecated */
     public final static String ID = "Monotone";
     public final static String VERSION = CoreVersion.VERSION;
-    public final static long BUILD = 1;
+    public final static long BUILD = 17;
     /** for example "-test" */
     public final static String EXTRA = "";
     public final static String FULL_VERSION = VERSION + "-" + BUILD + EXTRA;
diff --git a/router/java/src/net/i2p/router/TunnelSettings.java b/router/java/src/net/i2p/router/TunnelSettings.java
deleted file mode 100644
index 99249f7c75f3c7042349711874b7e54b81e26ba3..0000000000000000000000000000000000000000
--- a/router/java/src/net/i2p/router/TunnelSettings.java
+++ /dev/null
@@ -1,138 +0,0 @@
-package net.i2p.router;
-/*
- * free (adj.): unencumbered; not under the control of others
- * Written by jrandom in 2003 and released into the public domain
- * with no warranty of any kind, either expressed or implied.
- * It probably won't make your computer catch on fire, or eat
- * your children, but it might.  Use at your own risk.
- *
- */
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Date;
-
-import net.i2p.I2PAppContext;
-import net.i2p.data.DataFormatException;
-import net.i2p.data.DataHelper;
-import net.i2p.data.DataStructureImpl;
-
-/**
- * Wrap up the settings specified for a particular tunnel
- *
- */
-public class TunnelSettings extends DataStructureImpl {
-    private I2PAppContext _context;
-    private int _depth;
-    private long _msgsPerMinuteAvg;
-    private long _bytesPerMinuteAvg;
-    private long _msgsPerMinutePeak;
-    private long _bytesPerMinutePeak;
-    private boolean _includeDummy;
-    private boolean _reorder;
-    private long _expiration;
-    private long _created;
-    
-    public TunnelSettings(I2PAppContext context) {
-        _context = context;
-        _depth = 0;
-        _msgsPerMinuteAvg = 0;
-        _msgsPerMinutePeak = 0;
-        _bytesPerMinuteAvg = 0;
-        _bytesPerMinutePeak = 0;
-        _includeDummy = false;
-        _reorder = false;
-        _expiration = 0;
-        _created = _context.clock().now();
-    }
-    
-    public int getDepth() { return _depth; }
-    public void setDepth(int depth) { _depth = depth; }
-    public long getMessagesPerMinuteAverage() { return _msgsPerMinuteAvg; }
-    public long getMessagesPerMinutePeak() { return _msgsPerMinutePeak; }
-    public long getBytesPerMinuteAverage() { return _bytesPerMinuteAvg; }
-    public long getBytesPerMinutePeak() { return _bytesPerMinutePeak; }
-    public void setMessagesPerMinuteAverage(long msgs) { _msgsPerMinuteAvg = msgs; }
-    public void setMessagesPerMinutePeak(long msgs) { _msgsPerMinutePeak = msgs; }
-    public void setBytesPerMinuteAverage(long bytes) { _bytesPerMinuteAvg = bytes; }
-    public void setBytesPerMinutePeak(long bytes) { _bytesPerMinutePeak = bytes; }
-    public boolean getIncludeDummy() { return _includeDummy; }
-    public void setIncludeDummy(boolean include) { _includeDummy = include; }
-    public boolean getReorder() { return _reorder; }
-    public void setReorder(boolean reorder) { _reorder = reorder; }
-    public long getExpiration() { return _expiration; }
-    public void setExpiration(long expiration) { _expiration = expiration; }
-    public long getCreated() { return _created; }
-    
-    public void readBytes(InputStream in) throws DataFormatException, IOException {
-        Boolean b = DataHelper.readBoolean(in);
-        if (b == null) throw new DataFormatException("Null includeDummy boolean value");
-        _includeDummy = b.booleanValue();
-        b = DataHelper.readBoolean(in);
-        if (b == null) throw new DataFormatException("Null reorder boolean value");
-        _reorder = b.booleanValue();
-        _depth = (int)DataHelper.readLong(in, 1);
-        _bytesPerMinuteAvg = DataHelper.readLong(in, 4);
-        _bytesPerMinutePeak = DataHelper.readLong(in, 4);
-        Date exp = DataHelper.readDate(in);
-        if (exp == null)
-            _expiration = 0;
-        else
-            _expiration = exp.getTime();
-        _msgsPerMinuteAvg = DataHelper.readLong(in, 4);
-        _msgsPerMinutePeak = DataHelper.readLong(in, 4);
-        Date created = DataHelper.readDate(in);
-        if (created != null)
-            _created = created.getTime();
-        else
-            _created = _context.clock().now();
-    }
-    
-    public void writeBytes(OutputStream out) throws DataFormatException, IOException {
-        DataHelper.writeBoolean(out, _includeDummy ? Boolean.TRUE : Boolean.FALSE);
-        DataHelper.writeBoolean(out, _reorder ? Boolean.TRUE : Boolean.FALSE);
-        DataHelper.writeLong(out, 1, _depth);
-        DataHelper.writeLong(out, 4, _bytesPerMinuteAvg);
-        DataHelper.writeLong(out, 4, _bytesPerMinutePeak);
-        if (_expiration <= 0)
-            DataHelper.writeDate(out, new Date(0));
-        else
-            DataHelper.writeDate(out, new Date(_expiration));
-        DataHelper.writeLong(out, 4, _msgsPerMinuteAvg);
-        DataHelper.writeLong(out, 4, _msgsPerMinutePeak);
-        DataHelper.writeDate(out, new Date(_created));
-    }
-    
-    
-    @Override
-    public int hashCode() {
-        int rv = 0;
-        rv += _includeDummy ? 100 : 0;
-        rv += _reorder ? 50 : 0;
-        rv += _depth;
-        rv += _bytesPerMinuteAvg;
-        rv += _bytesPerMinutePeak;
-        rv += _expiration;
-        rv += _msgsPerMinuteAvg;
-        rv += _msgsPerMinutePeak;
-        return rv;
-    }
-    
-    @Override
-    public boolean equals(Object obj) {
-        if ( (obj != null) && (obj instanceof TunnelSettings) ) {
-            TunnelSettings settings = (TunnelSettings)obj;
-            return settings.getBytesPerMinuteAverage() == getBytesPerMinuteAverage() &&
-            settings.getBytesPerMinutePeak() == getBytesPerMinutePeak() &&
-            settings.getDepth() == getDepth() &&
-            settings.getExpiration() == getExpiration() &&
-            settings.getIncludeDummy() == getIncludeDummy() &&
-            settings.getMessagesPerMinuteAverage() == getMessagesPerMinuteAverage() &&
-            settings.getMessagesPerMinutePeak() == getMessagesPerMinutePeak() &&
-            settings.getReorder() == getReorder();
-        } else {
-            return false;
-        }
-    }
-}
diff --git a/router/java/src/net/i2p/router/client/InternalClientListenerRunner.java b/router/java/src/net/i2p/router/client/InternalClientListenerRunner.java
index 2105f7691b44d76f872dffcca3ff3527f75c5692..995c69400f5d17988f7ccd0f9d47008e6968956b 100644
--- a/router/java/src/net/i2p/router/client/InternalClientListenerRunner.java
+++ b/router/java/src/net/i2p/router/client/InternalClientListenerRunner.java
@@ -19,6 +19,7 @@ import net.i2p.util.InternalServerSocket;
  * Listen for in-JVM connections on the internal "socket"
  *
  * @author zzz
+ * @since 0.7.9
  */
 public class InternalClientListenerRunner extends ClientListenerRunner {
 
diff --git a/router/java/src/net/i2p/router/networkdb/HandleDatabaseLookupMessageJob.java b/router/java/src/net/i2p/router/networkdb/HandleDatabaseLookupMessageJob.java
index 17e96be3bc47afc53e86a2e301fb8532b05172b9..8259e69395bea5d69b25c3eb947c5b72f8731e6d 100644
--- a/router/java/src/net/i2p/router/networkdb/HandleDatabaseLookupMessageJob.java
+++ b/router/java/src/net/i2p/router/networkdb/HandleDatabaseLookupMessageJob.java
@@ -100,7 +100,7 @@ public class HandleDatabaseLookupMessageJob extends JobImpl {
                 getContext().statManager().addRateData("netDb.lookupsMatchedReceivedPublished", 1, 0);
                 sendData(_message.getSearchKey(), ls, fromKey, _message.getReplyTunnel());
             } else {
-                Set routerInfoSet = getContext().netDb().findNearestRouters(_message.getSearchKey(), 
+                Set<RouterInfo> routerInfoSet = getContext().netDb().findNearestRouters(_message.getSearchKey(), 
                                                                             CLOSENESS_THRESHOLD,
                                                                             _message.getDontIncludePeers());
                 if (getContext().clientManager().isLocal(ls.getDestination())) {
@@ -142,13 +142,11 @@ public class HandleDatabaseLookupMessageJob extends JobImpl {
                 }
             } else {
                 // not found locally - return closest peer routerInfo structs
-                Set dontInclude = _message.getDontIncludePeers();
-                // TODO: Honor flag to exclude all floodfills
+                Set<Hash> dontInclude = _message.getDontIncludePeers();
+                // Honor flag to exclude all floodfills
                 //if (dontInclude.contains(Hash.FAKE_HASH)) {
-                //    dontInclude = new HashSet(dontInclude);
-                //    dontInclude.addAll( pfffft );
-                //}
-                Set routerInfoSet = getContext().netDb().findNearestRouters(_message.getSearchKey(), 
+                // This is handled in FloodfillPeerSelector
+                Set<RouterInfo> routerInfoSet = getContext().netDb().findNearestRouters(_message.getSearchKey(), 
                                                                         MAX_ROUTERS_RETURNED, 
                                                                         dontInclude);
 
@@ -199,7 +197,7 @@ public class HandleDatabaseLookupMessageJob extends JobImpl {
     
     private void sendData(Hash key, DataStructure data, Hash toPeer, TunnelId replyTunnel) {
         if (_log.shouldLog(Log.DEBUG))
-            _log.debug("Sending data matching key key " + key.toBase64() + " to peer " + toPeer.toBase64() 
+            _log.debug("Sending data matching key " + key.toBase64() + " to peer " + toPeer.toBase64() 
                        + " tunnel " + replyTunnel);
         DatabaseStoreMessage msg = new DatabaseStoreMessage(getContext());
         msg.setKey(key);
@@ -216,7 +214,7 @@ public class HandleDatabaseLookupMessageJob extends JobImpl {
         sendMessage(msg, toPeer, replyTunnel);
     }
     
-    protected void sendClosest(Hash key, Set routerInfoSet, Hash toPeer, TunnelId replyTunnel) {
+    protected void sendClosest(Hash key, Set<RouterInfo> routerInfoSet, Hash toPeer, TunnelId replyTunnel) {
         if (_log.shouldLog(Log.DEBUG))
             _log.debug("Sending closest routers to key " + key.toBase64() + ": # peers = " 
                        + routerInfoSet.size() + " tunnel " + replyTunnel);
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/ExploreJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/ExploreJob.java
index 8f97ab334ec8e8ab19774857bebd00876de063c1..31cdbdb3590fdc50ee1e72ad6dcff9098c506049 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/ExploreJob.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/ExploreJob.java
@@ -85,12 +85,14 @@ class ExploreJob extends SearchJob {
         msg.setReplyTunnel(replyTunnelId);
         
         int available = MAX_CLOSEST - msg.getDontIncludePeers().size();
-        // TODO: add this once ../HTLMJ handles it
-        //if (available > 0) {
-        //    // add a flag to say this is an exploration and we don't want floodfills in the responses
-        //    if (msg.getDontIncludePeers().add(Hash.FAKE_HASH))
-        //        available--;
-        //}
+        if (available > 0) {
+            // Add a flag to say this is an exploration and we don't want floodfills in the responses.
+            // Doing it this way is of course backwards-compatible.
+            // Supported as of 0.7.9
+            if (msg.getDontIncludePeers().add(Hash.FAKE_HASH))
+                available--;
+        }
+
         KBucketSet ks = _facade.getKBuckets();
         Hash rkey = getContext().routingKeyGenerator().getRoutingKey(getState().getTarget());
         // in a few releases, we can (and should) remove this,
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillPeerSelector.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillPeerSelector.java
index af6f067e438594a6d81fc069fa0d31c42d784c0b..c6c2d2cfb8a02c3510112119441dda480a938e98 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillPeerSelector.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillPeerSelector.java
@@ -98,7 +98,8 @@ class FloodfillPeerSelector extends PeerSelector {
      *  @param maxNumRouters max to return
      *  Sorted by closest to the key if > maxNumRouters, otherwise not
      *  The list is in 3 groups - sorted by routing key within each group.
-     *  Group 1: No store or lookup failure in a long time
+     *  Group 1: No store or lookup failure in a long time, and
+    *            lookup fail rate no more than 1.5 * average
      *  Group 2: No store or lookup failure in a little while or
      *           success newer than failure
      *  Group 3: All others
@@ -126,6 +127,14 @@ class FloodfillPeerSelector extends PeerSelector {
         int found = 0;
         long now = _context.clock().now();
 
+        double maxFailRate;
+        if (_context.router().getUptime() > 60*60*1000) {
+            double currentFailRate = _context.statManager().getRate("peer.failedLookupRate").getRate(60*60*1000).getAverageValue();
+            maxFailRate = Math.max(0.20d, 1.5d * currentFailRate);
+        } else {
+            maxFailRate = 100d; // disable
+        }
+
         // split sorted list into 3 sorted lists
         for (int i = 0; found < howMany && i < ffs.size(); i++) {
             Hash entry = sorted.first();
@@ -146,7 +155,8 @@ class FloodfillPeerSelector extends PeerSelector {
                 if (prof != null && prof.getDBHistory() != null
                     && prof.getDbResponseTime().getRate(10*60*1000).getAverageValue() < maxGoodRespTime
                     && prof.getDBHistory().getLastStoreFailed() < now - NO_FAIL_STORE_GOOD
-                    && prof.getDBHistory().getLastLookupFailed() < now - NO_FAIL_LOOKUP_GOOD) {
+                    && prof.getDBHistory().getLastLookupFailed() < now - NO_FAIL_LOOKUP_GOOD
+                    && prof.getDBHistory().getFailedLookupRate().getRate(60*60*1000).getAverageValue() < maxFailRate) {
                     // good
                     if (_log.shouldLog(Log.DEBUG))
                         _log.debug("Good: " + entry);
@@ -246,11 +256,14 @@ class FloodfillPeerSelector extends PeerSelector {
 
         /**
          *  @return list of all with the 'f' mark in their netdb except for shitlisted ones.
+         *  Will return non-floodfills only if there aren't enough floodfills.
+         *
          *  The list is in 3 groups - unsorted (shuffled) within each group.
          *  Group 1: If preferConnected = true, the peers we are directly
          *           connected to, that meet the group 2 criteria
          *  Group 2: Netdb published less than 3h ago, no bad send in last 30m.
          *  Group 3: All others
+         *  Group 4: Non-floodfills, sorted by closest-to-the-key
          */
         public List<Hash> get(int howMany, boolean preferConnected) {
             Collections.shuffle(_floodfillMatches, _context.random());
@@ -310,6 +323,8 @@ class FloodfillPeerSelector extends PeerSelector {
     
     /**
      * Floodfill peers only. Used only by HandleDatabaseLookupMessageJob to populate the DSRM.
+     * UNLESS peersToIgnore contains Hash.FAKE_HASH (all zeros), in which case this is an exploratory
+     * lookup, and the response should not include floodfills.
      *
      * @param key the original key (NOT the routing key)
      * @return List of Hash for the peers selected, ordered
@@ -317,6 +332,15 @@ class FloodfillPeerSelector extends PeerSelector {
     @Override
     public List<Hash> selectNearest(Hash key, int maxNumRouters, Set<Hash> peersToIgnore, KBucketSet kbuckets) {
         Hash rkey = _context.routingKeyGenerator().getRoutingKey(key);
-        return selectFloodfillParticipants(rkey, maxNumRouters, peersToIgnore, kbuckets);
+        if (peersToIgnore != null && peersToIgnore.contains(Hash.FAKE_HASH)) {
+            // return non-ff
+            peersToIgnore.addAll(selectFloodfillParticipants(peersToIgnore, kbuckets));
+            FloodfillSelectionCollector matches = new FloodfillSelectionCollector(rkey, peersToIgnore, maxNumRouters);
+            kbuckets.getAll(matches);
+            return matches.get(maxNumRouters);
+        } else {
+            // return ff
+            return selectFloodfillParticipants(rkey, maxNumRouters, peersToIgnore, kbuckets);
+        }
     }
 }
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java
index 5e32409e5cd40a69129141f613ec1a009ff35a8d..fe3c7548510d97b71c6e4f01b1dfbc14a14d4168 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java
@@ -532,7 +532,7 @@ class SearchJob extends JobImpl {
     void replyFound(DatabaseSearchReplyMessage message, Hash peer) {
         long duration = _state.replyFound(peer);
         // this processing can take a while, so split 'er up
-        getContext().jobQueue().addJob(new SearchReplyJob(getContext(), this, (DatabaseSearchReplyMessage)message, peer, duration));
+        getContext().jobQueue().addJob(new SearchReplyJob(getContext(), this, message, peer, duration));
     }
     
     /**
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/StoreJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/StoreJob.java
index e0ec4dde8ad6fa88b3557d611e4a93b68d6ebf58..066122ce4e947b49066aff193f4636835da4d666 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/StoreJob.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/StoreJob.java
@@ -255,7 +255,7 @@ class StoreJob extends JobImpl {
     private static final int MAX_DIRECT_EXPIRATION = 15*1000;
 
     /**
-     * Send a store to the given peer through a garlic route, including a reply 
+     * Send a store to the given peer, including a reply 
      * DeliveryStatusMessage so we know it got there
      *
      */
@@ -285,6 +285,11 @@ class StoreJob extends JobImpl {
         sendStore(msg, router, getContext().clock().now() + responseTime);
     }
     
+    /**
+     * Send a store to the given peer, including a reply 
+     * DeliveryStatusMessage so we know it got there
+     *
+     */
     private void sendStore(DatabaseStoreMessage msg, RouterInfo peer, long expiration) {
         if (msg.getValueType() == DatabaseStoreMessage.KEY_TYPE_LEASESET) {
             getContext().statManager().addRateData("netDb.storeLeaseSetSent", 1, 0);
@@ -295,6 +300,11 @@ class StoreJob extends JobImpl {
         }
     }
 
+    /**
+     * Send directly,
+     * with the reply to come back directly.
+     *
+     */
     private void sendDirect(DatabaseStoreMessage msg, RouterInfo peer, long expiration) {
         long token = getContext().random().nextLong(I2NPMessage.MAX_ID_VALUE);
         msg.setReplyToken(token);
@@ -324,6 +334,12 @@ class StoreJob extends JobImpl {
         getContext().commSystem().processMessage(m);
     }
     
+    /**
+     * This is misnamed, it means sending it out through an exploratory tunnel,
+     * with the reply to come back through an exploratory tunnel.
+     * There is no garlic encryption added.
+     *
+     */
     private void sendStoreThroughGarlic(DatabaseStoreMessage msg, RouterInfo peer, long expiration) {
         long token = getContext().random().nextLong(I2NPMessage.MAX_ID_VALUE);
         
diff --git a/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java b/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java
index f37f01aa267eaf75f8c1de3857090d5ec8d47949..2e93cb3e02e3723fa26e687bbb52207d7aa4aa8d 100644
--- a/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java
+++ b/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java
@@ -15,7 +15,7 @@ import java.util.StringTokenizer;
 import net.i2p.I2PAppContext;
 import net.i2p.router.RouterContext;
 import net.i2p.util.EepGet;
-import net.i2p.util.I2PThread;
+import net.i2p.util.I2PAppThread;
 import net.i2p.util.Log;
 
 /**
@@ -52,13 +52,15 @@ public class Reseeder {
                 return;
             } else {
                 System.setProperty(PROP_INPROGRESS, "true");
-                I2PThread reseed = new I2PThread(_reseedRunner, "Reseed");
+                // set to daemon so it doesn't hang a shutdown
+                Thread reseed = new I2PAppThread(_reseedRunner, "Reseed", true);
                 reseed.start();
             }
         }
 
     }
 
+    /** Todo: translate the messages sent via PROP_STATUS */
     public class ReseedRunner implements Runnable, EepGet.StatusListener {
         private boolean _isRunning;
 
diff --git a/router/java/src/net/i2p/router/peermanager/DBHistory.java b/router/java/src/net/i2p/router/peermanager/DBHistory.java
index a8e084e491c963baba154a92add12ee2ab38b6be..36b9bc9a3015d08fa1e1f3689a2292fd7d726571 100644
--- a/router/java/src/net/i2p/router/peermanager/DBHistory.java
+++ b/router/java/src/net/i2p/router/peermanager/DBHistory.java
@@ -105,6 +105,7 @@ public class DBHistory {
      */
     public RateStat getFailedLookupRate() { return _failedLookupRate; }
     
+    /** not sure how much this is used, to be investigated */
     public RateStat getInvalidReplyRate() { return _invalidReplyRate; }
     
     /**
@@ -115,6 +116,7 @@ public class DBHistory {
     public void lookupSuccessful() {
         _successfulLookups++;
         _failedLookupRate.addData(0, 0);
+        _context.statManager().addRateData("peer.failedLookupRate", 0, 0);
         _lastLookupSuccessful = _context.clock().now();
     }
 
@@ -124,6 +126,7 @@ public class DBHistory {
     public void lookupFailed() {
         _failedLookups++;
         _failedLookupRate.addData(1, 0);
+        _context.statManager().addRateData("peer.failedLookupRate", 1, 0);
         _lastLookupFailed = _context.clock().now();
     }
 
@@ -136,6 +139,7 @@ public class DBHistory {
         // Fixme, redefined this to include both lookup and store fails,
         // need to fix the javadocs
         _failedLookupRate.addData(0, 0);
+        _context.statManager().addRateData("peer.failedLookupRate", 0, 0);
         _lastStoreSuccessful = _context.clock().now();
     }
 
@@ -275,9 +279,9 @@ public class DBHistory {
     
     private void createRates(String statGroup) {
         if (_failedLookupRate == null)
-            _failedLookupRate = new RateStat("dbHistory.failedLookupRate", "How often does this peer to respond to a lookup?", statGroup, new long[] { 60*1000l, 60*60*1000l, 24*60*60*1000l });
+            _failedLookupRate = new RateStat("dbHistory.failedLookupRate", "How often does this peer to respond to a lookup?", statGroup, new long[] { 10*60*1000l, 60*60*1000l, 24*60*60*1000l });
         if (_invalidReplyRate == null)
-            _invalidReplyRate = new RateStat("dbHistory.invalidReplyRate", "How often does this peer give us a bad (nonexistant, forged, etc) peer?", statGroup, new long[] { 30*60*1000l, 60*60*1000l, 24*60*60*1000l });
+            _invalidReplyRate = new RateStat("dbHistory.invalidReplyRate", "How often does this peer give us a bad (nonexistant, forged, etc) peer?", statGroup, new long[] { 30*60*1000l });
         _failedLookupRate.setStatLog(_context.statManager().getStatLog());
         _invalidReplyRate.setStatLog(_context.statManager().getStatLog());
     }
diff --git a/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java b/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java
index 20f0fba3d4b5977c2247efab62056070b3f98a9c..d249dc9687c77116cf3c4a8ea3220958b93e34b7 100644
--- a/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java
+++ b/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java
@@ -97,10 +97,10 @@ public class ProfileOrganizer {
         _log = context.logManager().getLog(ProfileOrganizer.class);
         _comp = new InverseCapacityComparator();
         _fastPeers = new HashMap(16);
-        _highCapacityPeers = new HashMap(16);
+        _highCapacityPeers = new HashMap(32);
         _wellIntegratedPeers = new HashMap(16);
-        _notFailingPeers = new HashMap(64);
-        _notFailingPeersList = new ArrayList(64);
+        _notFailingPeers = new HashMap(256);
+        _notFailingPeersList = new ArrayList(256);
         _failingPeers = new HashMap(16);
         _strictCapacityOrder = new TreeSet(_comp);
         _thresholdSpeedValue = 0.0d;
@@ -113,6 +113,8 @@ public class ProfileOrganizer {
         _context.statManager().createRateStat("peer.profileThresholdTime", "How long the reorg takes determining the tier thresholds", "Peers", new long[] { 10*60*1000 });
         _context.statManager().createRateStat("peer.profilePlaceTime", "How long the reorg takes placing peers in the tiers", "Peers", new long[] { 10*60*1000 });
         _context.statManager().createRateStat("peer.profileReorgTime", "How long the reorg takes overall", "Peers", new long[] { 10*60*1000 });
+        // used in DBHistory
+        _context.statManager().createRateStat("peer.failedLookupRate", "DB Lookup fail rate", "Peers", new long[] { 10*60*1000l, 60*60*1000l, 24*60*60*1000l });
     }
     
     private void getReadLock() {
diff --git a/router/java/src/net/i2p/router/peermanager/TunnelHistory.java b/router/java/src/net/i2p/router/peermanager/TunnelHistory.java
index bdf352501e8a8b41ab348feeef97e149414b322d..208415ca0b3f0e5e5e911c037522ebc109a9eeba 100644
--- a/router/java/src/net/i2p/router/peermanager/TunnelHistory.java
+++ b/router/java/src/net/i2p/router/peermanager/TunnelHistory.java
@@ -28,13 +28,13 @@ public class TunnelHistory {
     private RateStat _failRate;
     private String _statGroup;
     
-    /** probabalistic tunnel rejection due to a flood of requests */
+    /** probabalistic tunnel rejection due to a flood of requests - essentially unused */
     public static final int TUNNEL_REJECT_PROBABALISTIC_REJECT = 10;
-    /** tunnel rejection due to temporary cpu/job/tunnel overload */
+    /** tunnel rejection due to temporary cpu/job/tunnel overload - essentially unused */
     public static final int TUNNEL_REJECT_TRANSIENT_OVERLOAD = 20;
     /** tunnel rejection due to excess bandwidth usage */
     public static final int TUNNEL_REJECT_BANDWIDTH = 30;
-    /** tunnel rejection due to system failure */
+    /** tunnel rejection due to system failure - essentially unused */
     public static final int TUNNEL_REJECT_CRIT = 50;
     
     public TunnelHistory(RouterContext context, String statGroup) {
@@ -100,8 +100,10 @@ public class TunnelHistory {
         }
     }
 
-    // Define this rate as the probability it really failed
-    // @param pct = probability * 100
+    /**
+     * Define this rate as the probability it really failed
+     * @param pct = probability * 100
+     */
     public void incrementFailed(int pct) {
         _lifetimeFailed++;
         _failRate.addData(pct, 1);
@@ -150,7 +152,7 @@ public class TunnelHistory {
         _failRate.store(out, "tunnelHistory.failRate");
     }
     
-    private void add(StringBuilder buf, String name, long val, String description) {
+    private static void add(StringBuilder buf, String name, long val, String description) {
         buf.append("# ").append(name.toUpperCase()).append(NL).append("# ").append(description).append(NL);
         buf.append("tunnels.").append(name).append('=').append(val).append(NL).append(NL);
     }
diff --git a/router/java/src/net/i2p/router/transport/Addresses.java b/router/java/src/net/i2p/router/transport/Addresses.java
index c8c2b6518c96df6d8d19ff2518d8715c8e102515..5f2641b64c5c43602be932b6950eb0cd46fb6416 100644
--- a/router/java/src/net/i2p/router/transport/Addresses.java
+++ b/router/java/src/net/i2p/router/transport/Addresses.java
@@ -22,7 +22,7 @@ import java.util.Set;
  */
 public class Addresses {
     
-    /** return the first non-local address it finds, or null */
+    /** @return the first non-local address it finds, or null */
     public static String getAnyAddress() {
         String[] a = getAddresses();
         if (a.length > 0)
@@ -31,7 +31,7 @@ public class Addresses {
     }
 
     /**
-     *  Return an array of all addresses, excluding
+     *  @return an array of all addresses, excluding
      *  IPv6, local, broadcast, multicast, etc.
      */
     public static String[] getAddresses() {
diff --git a/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java b/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java
index 6a7eaca84b4d1e6ae7423a0e6172de229bfbc6f5..f1460b9f7a2bdd09c9f87ba776746e3ee58ef99b 100644
--- a/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java
+++ b/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java
@@ -77,31 +77,26 @@ public class CommSystemFacadeImpl extends CommSystemFacade {
     public boolean haveHighOutboundCapacity() { return (_manager == null ? false : _manager.haveHighOutboundCapacity()); } 
     
     /**
-     * Framed average clock skew of connected peers in seconds, or null if we cannot answer.
+     * Framed average clock skew of connected peers in seconds, or the clock offset if we cannot answer.
      * Average is calculated over the middle "percentToInclude" peers.
      */
     @Override
     public Long getFramedAveragePeerClockSkew(int percentToInclude) {
         if (_manager == null) {
-            if (_log.shouldLog(Log.INFO))
-                _log.info("Returning null for framed averege peer clock skew (no transport manager)!");
-            return null;
+            // round toward zero
+            return Long.valueOf(_context.clock().getOffset() / 1000);
         }
         Vector skews = _manager.getClockSkews();
         if (skews == null) {
-            if (_log.shouldLog(Log.ERROR))
-                _log.error("Returning null for framed average peer clock skew (no data)!");
-            return null;
+            return Long.valueOf(_context.clock().getOffset() / 1000);
         }
-        if (skews.size() < 20) {
-            if (_log.shouldLog(Log.WARN))
-                _log.warn("Returning null for framed average peer clock skew (only " + skews.size() + " peers)!");
-            return null;
+        if (skews.size() < 5) {
+            return Long.valueOf(_context.clock().getOffset() / 1000);
         }
         // Going to calculate, sort them
         Collections.sort(skews);
         // Calculate frame size
-        int frameSize = (skews.size() * percentToInclude / 100);
+        int frameSize = Math.min((skews.size() * percentToInclude / 100), 2);
         int first = (skews.size() / 2) - (frameSize / 2);
         int last = (skews.size() / 2) + (frameSize / 2);
         // Sum skew values
@@ -112,11 +107,8 @@ public class CommSystemFacadeImpl extends CommSystemFacade {
                 _log.debug("Adding clock skew " + i + " valued " + value + " s.");
             sum = sum + value;
         }
-        // Calculate average
-        Long framedAverageClockSkew = new Long(sum / frameSize);
-        if (_log.shouldLog(Log.INFO))
-            _log.info("Our framed average peer clock skew is " + framedAverageClockSkew + " s.");
-        return framedAverageClockSkew;
+        // Calculate average (round toward zero)
+        return Long.valueOf(sum / frameSize);
     }
     
     public List getBids(OutNetMessage msg) {
diff --git a/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java b/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java
index e9046db39bd788a0d9393f7a562acb151a9bc1c8..42e205671beaae4880d8884ed1388f659db516f7 100644
--- a/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java
+++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java
@@ -602,8 +602,8 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener {
         OutNetMessage msg = null;
         synchronized (_outbound) {
             if (_currentOutbound != null) {
-                if (_log.shouldLog(Log.WARN))
-                    _log.warn("attempt for multiple outbound messages with " + System.identityHashCode(_currentOutbound) + " already waiting and " + _outbound.size() + " queued");
+                if (_log.shouldLog(Log.INFO))
+                    _log.info("attempt for multiple outbound messages with " + System.identityHashCode(_currentOutbound) + " already waiting and " + _outbound.size() + " queued");
                 return;
             }
                 //throw new RuntimeException("We should not be preparing a write while we still have one pending");
@@ -772,8 +772,8 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener {
         private long acquiredOn;
         
         PrepBuffer() {
-            unencrypted = new byte[16*1024];
-            base = new byte[16*1024];
+            unencrypted = new byte[BUFFER_SIZE];
+            base = new byte[BUFFER_SIZE];
             pad = new byte[16];
             crc = new Adler32();
         }
@@ -1033,7 +1033,7 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener {
     /** _decryptBlockBuf contains another cleartext block of I2NP to parse */
     private boolean recvUnencryptedI2NP() {
         _curReadState.receiveBlock(_decryptBlockBuf);
-        if (_curReadState.getSize() > 16*1024) {
+        if (_curReadState.getSize() > BUFFER_SIZE) {
             if (_log.shouldLog(Log.ERROR))
                 _log.error("I2NP message too big - size: " + _curReadState.getSize() + " Dropping " + toString());
             _context.statManager().addRateData("ntcp.corruptTooLargeI2NP", _curReadState.getSize(), getUptime());
@@ -1112,7 +1112,8 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener {
         return obj == this;
     }
 
-    private final static List _i2npHandlers = new ArrayList(4);
+    private static final int MAX_HANDLERS = 4;
+    private final static List _i2npHandlers = new ArrayList(MAX_HANDLERS);
     private final static I2NPMessageHandler acquireHandler(RouterContext ctx) {
         I2NPMessageHandler rv = null;
         synchronized (_i2npHandlers) {
@@ -1125,7 +1126,7 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener {
     }
     private static void releaseHandler(I2NPMessageHandler handler) {
         synchronized (_i2npHandlers) {
-            if (_i2npHandlers.size() < 4)
+            if (_i2npHandlers.size() < MAX_HANDLERS)
                 _i2npHandlers.add(handler);
         }
     }
@@ -1137,13 +1138,13 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener {
         byte data[];
         ByteArrayInputStream bais;
         public DataBuf() {
-            data = new byte[16*1024];
+            data = new byte[BUFFER_SIZE];
             bais = new ByteArrayInputStream(data);
         }
     }
     
-    private static int MAX_DATA_READ_BUFS = 16;
-    private final static List _dataReadBufs = new ArrayList(16);
+    private static final int MAX_DATA_READ_BUFS = 16;
+    private final static List _dataReadBufs = new ArrayList(MAX_DATA_READ_BUFS);
     private static DataBuf acquireReadBuf() {
         synchronized (_dataReadBufs) {
             if (_dataReadBufs.size() > 0)
@@ -1178,7 +1179,7 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener {
             _crc = new Adler32();
             init();
         }
-        public void init() {
+        private void init() {
             _size = -1;
             _nextWrite = 0;
             _expectedCrc = -1;
@@ -1268,11 +1269,15 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener {
                     I2NPMessage read = h.readMessage(_dataBuf.bais);
                     long timeToRecv = System.currentTimeMillis() - _stateBegin;
                     releaseHandler(h);
-                    if (_log.shouldLog(Log.DEBUG))
-                        _log.debug("I2NP message " + _messagesRead + "/" + (read != null ? read.getUniqueId() : 0) 
-                                   + " received after " + timeToRecv + " with " + _size +"/"+ (_blocks*16) + " bytes on " + toString());
+                    if (_log.shouldLog(Log.INFO))
+                        _log.info("I2NP message " + _messagesRead + "/" + (read != null ? read.getUniqueId() : 0) 
+                                   + " received after " + timeToRecv + " with " + _size +"/"+ (_blocks*16) + " bytes on " + NTCPConnection.this.toString());
                     _context.statManager().addRateData("ntcp.receiveTime", timeToRecv, timeToRecv);
                     _context.statManager().addRateData("ntcp.receiveSize", _size, timeToRecv);
+
+                    // FIXME move end of try block here.
+                    // On the input side, move releaseHandler() and init() to a finally block.
+
                     if (read != null) {
                         _transport.messageReceived(read, _remotePeer, null, timeToRecv, _size);
                         if (_messagesRead <= 0)
@@ -1283,23 +1288,27 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener {
                     // get it ready for the next I2NP message
                     init();
                 } catch (IOException ioe) {
-                    if (_log.shouldLog(Log.DEBUG))
-                        _log.debug("Error parsing I2NP message", ioe);
+                    if (_log.shouldLog(Log.WARN))
+                        _log.warn("Error parsing I2NP message", ioe);
                     _context.statManager().addRateData("ntcp.corruptI2NPIOE", 1, getUptime());
                     close();
+                    // handler and databuf are lost
                     return;
                 } catch (I2NPMessageException ime) {
-                    if (_log.shouldLog(Log.DEBUG))
-                        _log.debug("Error parsing I2NP message", ime);
+                    if (_log.shouldLog(Log.WARN))
+                        _log.warn("Error parsing I2NP message", ime);
                     _context.statManager().addRateData("ntcp.corruptI2NPIME", 1, getUptime());
                     close();
+                    // handler and databuf are lost
                     return;
                 }
             } else {
                 if (_log.shouldLog(Log.ERROR))
                     _log.error("CRC incorrect for message " + _messagesRead + " (calc=" + val + " expected=" + _expectedCrc + ") size=" + _size + " blocks " + _blocks);
                     _context.statManager().addRateData("ntcp.corruptI2NPCRC", 1, getUptime());
+                // should we try to read in the message and keep going?
                 close();
+                // databuf is lost
                 return;
             }
         }
diff --git a/router/java/src/net/i2p/router/transport/udp/InboundMessageState.java b/router/java/src/net/i2p/router/transport/udp/InboundMessageState.java
index 7338e0b8355c190a21b7b991064efe59d6ab447a..6a12295791f0205988ce74e19280a63e13dd47ba 100644
--- a/router/java/src/net/i2p/router/transport/udp/InboundMessageState.java
+++ b/router/java/src/net/i2p/router/transport/udp/InboundMessageState.java
@@ -27,6 +27,7 @@ public class InboundMessageState {
     private int _lastFragment;
     private long _receiveBegin;
     private int _completeSize;
+    private boolean _released;
     
     /** expire after 10s */
     private static final long MAX_RECEIVE_TIME = 10*1000;
@@ -156,9 +157,15 @@ public class InboundMessageState {
             for (int i = 0; i < _fragments.length; i++)
                 _fragmentCache.release(_fragments[i]);
         //_fragments = null;
+        _released = true;
     }
     
     public ByteArray[] getFragments() {
+        if (_released) {
+            RuntimeException e = new RuntimeException("Use after free: " + toString());
+            _log.error("SSU IMS", e);
+            throw e;
+        }
         return _fragments;
     }
     public int getFragmentCount() { return _lastFragment+1; }
diff --git a/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java b/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java
index 2e3329a8f08fc2ea28c3dc1ad2cfe9769e4b8a87..0fe2f96a0baeadc7f1bfd2589fa1611d9622e88d 100644
--- a/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java
+++ b/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java
@@ -23,9 +23,9 @@ public class IntroductionManager {
     private UDPTransport _transport;
     private PacketBuilder _builder;
     /** map of relay tag to PeerState that should receive the introduction */
-    private Map _outbound;
+    private Map<Long, PeerState> _outbound;
     /** list of peers (PeerState) who have given us introduction tags */
-    private final List _inbound;
+    private final List<PeerState> _inbound;
 
     public IntroductionManager(RouterContext ctx, UDPTransport transport) {
         _context = ctx;
@@ -74,7 +74,7 @@ public class IntroductionManager {
     }
     
     public PeerState get(long id) {
-        return (PeerState)_outbound.get(new Long(id));
+        return _outbound.get(new Long(id));
     }
     
     /**
@@ -90,7 +90,7 @@ public class IntroductionManager {
      * and we want to keep our introducers valid.
      */
     public int pickInbound(Properties ssuOptions, int howMany) {
-        List peers = null;
+        List<PeerState> peers = null;
         int start = _context.random().nextInt(Integer.MAX_VALUE);
         synchronized (_inbound) {
             if (_log.shouldLog(Log.DEBUG))
@@ -103,7 +103,7 @@ public class IntroductionManager {
         int found = 0;
         long inactivityCutoff = _context.clock().now() - (UDPTransport.EXPIRE_TIMEOUT / 2);
         for (int i = 0; i < sz && found < howMany; i++) {
-            PeerState cur = (PeerState)peers.get((start + i) % sz);
+            PeerState cur = peers.get((start + i) % sz);
             RouterInfo ri = _context.netDb().lookupRouterInfoLocally(cur.getRemotePeer());
             if (ri == null) {
                 if (_log.shouldLog(Log.INFO))
@@ -144,7 +144,7 @@ public class IntroductionManager {
         long pingCutoff = _context.clock().now() - (2 * 60 * 60 * 1000);
         inactivityCutoff = _context.clock().now() - (UDPTransport.EXPIRE_TIMEOUT / 4);
         for (int i = 0; i < sz; i++) {
-            PeerState cur = (PeerState)peers.get(i);
+            PeerState cur = peers.get(i);
             if (cur.getIntroducerTime() > pingCutoff &&
                 cur.getLastSendTime() < inactivityCutoff) {
                 if (_log.shouldLog(Log.INFO))
@@ -157,6 +157,18 @@ public class IntroductionManager {
         return found;
     }
     
+    /**
+     * Not as elaborate as pickInbound() above.
+     * Just a quick check to see how many volunteers we know,
+     * which the Transport uses to see if we need more.
+     * @return number of peers that have volunteerd to introduce us
+     */
+    int introducerCount() {
+        synchronized(_inbound) {
+            return _inbound.size();
+        }
+    }
+
     void receiveRelayIntro(RemoteHostId bob, UDPPacketReader reader) {
         if (_context.router().isHidden())
             return;
diff --git a/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java b/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java
index f4afa45c632c55bd3f7be872d0b69dcc3ca6f28d..1a9a9c590c311abe0bf00682d684c3a2b68ab06d 100644
--- a/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java
+++ b/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java
@@ -1,6 +1,7 @@
 package net.i2p.router.transport.udp;
 
 import java.util.Arrays;
+import java.util.Date;
 
 import net.i2p.I2PAppContext;
 import net.i2p.data.Base64;
@@ -33,6 +34,9 @@ public class OutboundMessageState {
     private int _pushCount;
     private short _maxSends;
     // private int _nextSendFragment;
+    /** for tracking use-after-free bugs */
+    private boolean _released;
+    private Exception _releasedBy;
     
     public static final int MAX_MSG_SIZE = 32 * 1024;
     /** is this enough for a high-bandwidth router? */
@@ -116,13 +120,22 @@ public class OutboundMessageState {
         } catch (IllegalStateException ise) {
             _cache.release(_messageBuf);
             _messageBuf = null;
+            _released = true;
             return false;
         }
     }
     
-    public void releaseResources() { 
-        if (_messageBuf != null)
+    /**
+     *  This is synchronized with writeFragment(),
+     *  so we do not release (probably due to an ack) while we are retransmitting.
+     *  Also prevent double-free
+     */
+    public synchronized void releaseResources() { 
+        if (_messageBuf != null && !_released) {
             _cache.release(_messageBuf);
+            _released = true;
+            _releasedBy = new Exception ("Released on " + new Date() + " by:");
+        }
         //_messageBuf = null;
     }
     
@@ -267,16 +280,50 @@ public class OutboundMessageState {
 
     /**
      * Write a part of the the message onto the specified buffer.
+     * See releaseResources() above for synchhronization information.
      *
      * @param out target to write
      * @param outOffset into outOffset to begin writing
      * @param fragmentNum fragment to write (0 indexed)
      * @return bytesWritten
      */
-    public int writeFragment(byte out[], int outOffset, int fragmentNum) {
+    public synchronized int writeFragment(byte out[], int outOffset, int fragmentNum) {
+        if (_messageBuf == null) return -1;
+        if (_released) {
+            /******
+                Solved by synchronization with releaseResources() and simply returning -1.
+                Previous output:
+
+                23:50:57.013 ERROR [acket pusher] sport.udp.OutboundMessageState: SSU OMS Use after free
+                java.lang.Exception: Released on Wed Dec 23 23:50:57 GMT 2009 by:
+                	at net.i2p.router.transport.udp.OutboundMessageState.releaseResources(OutboundMessageState.java:133)
+                	at net.i2p.router.transport.udp.PeerState.acked(PeerState.java:1391)
+                	at net.i2p.router.transport.udp.OutboundMessageFragments.acked(OutboundMessageFragments.java:404)
+                	at net.i2p.router.transport.udp.InboundMessageFragments.receiveACKs(InboundMessageFragments.java:191)
+                	at net.i2p.router.transport.udp.InboundMessageFragments.receiveData(InboundMessageFragments.java:77)
+                	at net.i2p.router.transport.udp.PacketHandler$Handler.handlePacket(PacketHandler.java:485)
+                	at net.i2p.router.transport.udp.PacketHandler$Handler.receivePacket(PacketHandler.java:282)
+                	at net.i2p.router.transport.udp.PacketHandler$Handler.handlePacket(PacketHandler.java:231)
+                	at net.i2p.router.transport.udp.PacketHandler$Handler.run(PacketHandler.java:136)
+                	at java.lang.Thread.run(Thread.java:619)
+                	at net.i2p.util.I2PThread.run(I2PThread.java:71)
+                23:50:57.014 ERROR [acket pusher] ter.transport.udp.PacketPusher: SSU Output Queue Error
+                java.lang.RuntimeException: SSU OMS Use after free: Message 2381821417 with 4 fragments of size 0 volleys: 2 lifetime: 1258 pending fragments: 0 1 2 3 
+                	at net.i2p.router.transport.udp.OutboundMessageState.writeFragment(OutboundMessageState.java:298)
+                	at net.i2p.router.transport.udp.PacketBuilder.buildPacket(PacketBuilder.java:170)
+                	at net.i2p.router.transport.udp.OutboundMessageFragments.preparePackets(OutboundMessageFragments.java:332)
+                	at net.i2p.router.transport.udp.OutboundMessageFragments.getNextVolley(OutboundMessageFragments.java:297)
+                	at net.i2p.router.transport.udp.PacketPusher.run(PacketPusher.java:38)
+                	at java.lang.Thread.run(Thread.java:619)
+                	at net.i2p.util.I2PThread.run(I2PThread.java:71)
+            *******/
+            if (_log.shouldLog(Log.WARN))
+                _log.log(Log.WARN, "SSU OMS Use after free: " + toString(), _releasedBy);
+            return -1;
+            //throw new RuntimeException("SSU OMS Use after free: " + toString());
+        }
         int start = _fragmentSize * fragmentNum;
         int end = start + fragmentSize(fragmentNum);
-        if (_messageBuf == null) return -1;
         int toSend = end - start;
         byte buf[] = _messageBuf.getData();
         if ( (buf != null) && (start + toSend < buf.length) && (out != null) && (outOffset + toSend < out.length) ) {
diff --git a/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java b/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java
index 5fe177764f394b79f63e5b5103e816ee35229eee..75258791e7b7f0e1df3472d1c925632d07e5017c 100644
--- a/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java
+++ b/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java
@@ -169,8 +169,14 @@ public class PacketBuilder {
         
         int sizeWritten = state.writeFragment(data, off, fragment);
         if (sizeWritten != size) {
-            _log.error("Size written: " + sizeWritten + " but size: " + size 
-                       + " for fragment " + fragment + " of " + state.getMessageId());
+            if (sizeWritten < 0) {
+                // probably already freed from OutboundMessageState
+                if (_log.shouldLog(Log.WARN))
+                    _log.warn("Write failed for fragment " + fragment + " of " + state.getMessageId());
+            } else {
+                _log.error("Size written: " + sizeWritten + " but size: " + size 
+                           + " for fragment " + fragment + " of " + state.getMessageId());
+            }
             packet.release();
             return null;
         } else if (_log.shouldLog(Log.DEBUG))
diff --git a/router/java/src/net/i2p/router/transport/udp/PacketPusher.java b/router/java/src/net/i2p/router/transport/udp/PacketPusher.java
index cb31376b4ff4a411f615e50e146533e7d232582b..582eed1c37d1e6f3f7e80d4c83362918caae4c73 100644
--- a/router/java/src/net/i2p/router/transport/udp/PacketPusher.java
+++ b/router/java/src/net/i2p/router/transport/udp/PacketPusher.java
@@ -43,7 +43,7 @@ public class PacketPusher implements Runnable {
                     }
                 }
             } catch (Exception e) {
-                _log.log(Log.CRIT, "Error pushing", e);
+                _log.error("SSU Output Queue Error", e);
             }
         }
     }
diff --git a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
index 7bc5990b9cb2e663a11d656726d48dfcc1f63fe5..075326c53bc8e9a6877c52ddb4529895392247da 100644
--- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
+++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
@@ -132,6 +132,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
     /** remember IP changes */
     public static final String PROP_IP= "i2np.lastIP";
     public static final String PROP_IP_CHANGE = "i2np.lastIPChange";
+    public static final String PROP_LAPTOP_MODE = "i2np.laptopMode";
 
     /** do we require introducers, regardless of our status? */
     public static final String PROP_FORCE_INTRODUCERS = "i2np.udp.forceIntroducers";
@@ -461,13 +462,15 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
         boolean updated = false;
         boolean fireTest = false;
 
+        if (_log.shouldLog(Log.WARN))
+            _log.warn("Change address? status = " + _reachabilityStatus +
+                      " diff = " + (_context.clock().now() - _reachabilityStatusLastUpdated) +
+                      " old = " + _externalListenHost + ':' + _externalListenPort +
+                      " new = " + DataHelper.toString(ourIP) + ':' + ourPort);
+
             synchronized (this) {
                 if ( (_externalListenHost == null) ||
                      (!eq(_externalListenHost.getAddress(), _externalListenPort, ourIP, ourPort)) ) {
-                    if (_log.shouldLog(Log.WARN))
-                        _log.warn("Change address? status = " + _reachabilityStatus +
-                                  " diff = " + (_context.clock().now() - _reachabilityStatusLastUpdated) +
-                                  " old = " + _externalListenHost + ':' + _externalListenPort);
                     if ( (_reachabilityStatus != CommSystemFacade.STATUS_OK) ||
                          (_externalListenHost == null) || (_externalListenPort <= 0) ||
                          (_context.clock().now() - _reachabilityStatusLastUpdated > 2*TEST_FREQUENCY) ) {
@@ -514,9 +517,35 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
             // store these for laptop-mode (change ident on restart... or every time... when IP changes)
             String oldIP = _context.getProperty(PROP_IP);
             if (!_externalListenHost.getHostAddress().equals(oldIP)) {
+                long lastChanged = 0;
+                long now = _context.clock().now();
+                String lcs = _context.getProperty(PROP_IP_CHANGE);
+                if (lcs != null) {
+                    try {
+                        lastChanged = Long.parseLong(lcs);
+                    } catch (NumberFormatException nfe) {}
+                }
+
                 _context.router().setConfigSetting(PROP_IP, _externalListenHost.getHostAddress());
-                _context.router().setConfigSetting(PROP_IP_CHANGE, "" + _context.clock().now());
+                _context.router().setConfigSetting(PROP_IP_CHANGE, "" + now);
                 _context.router().saveConfig();
+
+                // laptop mode
+                // For now, only do this at startup
+                if (oldIP != null &&
+                    System.getProperty("wrapper.version") != null &&
+                    Boolean.valueOf(_context.getProperty(PROP_LAPTOP_MODE)).booleanValue() &&
+                    now - lastChanged > 10*60*1000 &&
+                    _context.router().getUptime() < 10*60*1000) {
+                    _log.log(Log.CRIT, "IP changed, restarting with a new identity and port");
+                    // this removes the UDP port config
+                    _context.router().killKeys();
+                    // do we need WrapperManager.signalStopped() like in ConfigServiceHandler ???
+                    // without it, the wrapper complains "shutdown unexpectedly"
+                    // but we can't have that dependency in the router
+                    _context.router().shutdown(Router.EXIT_HARD_RESTART);
+                    // doesn't return
+                }
             }
             _context.router().rebuildRouterInfo();
         }
@@ -968,6 +997,11 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
         return _endpoint.send(packet); 
     }
     
+    /** minimum active peers to maintain IP detection, etc. */
+    private static final int MIN_PEERS = 3;
+    /** minimum peers volunteering to be introducers if we need that */
+    private static final int MIN_INTRODUCER_POOL = 4;
+
     public TransportBid bid(RouterInfo toAddress, long dataSize) {
         if (dataSize > OutboundMessageState.MAX_MSG_SIZE) {
             // NTCP max is lower, so msg will get dropped
@@ -1015,11 +1049,16 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
 
             // Try to maintain at least 3 peers so we can determine our IP address and
             // we have a selection to run peer tests with.
+            // If we are firewalled, and we don't have enough peers that volunteered to
+            // also introduce us, also bid aggressively so we are preferred over NTCP.
+            // (Otherwise we only talk UDP to those that are firewalled, and we will
+            // never get any introducers)
             int count;
             synchronized (_peersByIdent) {
                 count = _peersByIdent.size();
             }
-            if (alwaysPreferUDP() || count < 3)
+            if (alwaysPreferUDP() || count < MIN_PEERS ||
+                (introducersRequired() && _introManager.introducerCount() < MIN_INTRODUCER_POOL))
                 return _slowPreferredBid;
             else if (preferUDP())
                 return _slowBid;
@@ -1157,6 +1196,10 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
                     _log.info("Picked peers: " + found);
                 _introducersSelectedOn = _context.clock().now();
                 introducersIncluded = true;
+            } else {
+                // maybe we should fail to publish an address at all in this case?
+                if (_log.shouldLog(Log.WARN))
+                    _log.warn("Need introducers but we don't know any");
             }
         }
         
diff --git a/router/java/src/net/i2p/router/tunnel/BatchedPreprocessor.java b/router/java/src/net/i2p/router/tunnel/BatchedPreprocessor.java
index 37c173c75ce0c58a51b3a8df55b9e09fd5c1574c..879eb78e70cf09eaa9c3fba4cd9393a54a66a5bb 100644
--- a/router/java/src/net/i2p/router/tunnel/BatchedPreprocessor.java
+++ b/router/java/src/net/i2p/router/tunnel/BatchedPreprocessor.java
@@ -2,7 +2,7 @@ package net.i2p.router.tunnel;
 
 import java.util.List;
 
-import net.i2p.I2PAppContext;
+import net.i2p.router.RouterContext;
 import net.i2p.util.Log;
 
 /**
@@ -45,11 +45,10 @@ import net.i2p.util.Log;
  *   }
  */
 public class BatchedPreprocessor extends TrivialPreprocessor {
-    private Log _log;
     private long _pendingSince;
     private String _name;
     
-    public BatchedPreprocessor(I2PAppContext ctx, String name) {
+    public BatchedPreprocessor(RouterContext ctx, String name) {
         super(ctx);
         _log = ctx.logManager().getLog(BatchedPreprocessor.class);
         _name = name;
@@ -68,6 +67,7 @@ public class BatchedPreprocessor extends TrivialPreprocessor {
         ctx.statManager().createRateStat("tunnel.batchFragmentation", "Avg. number of fragments per msg", "Tunnels", new long[] { 10*60*1000, 60*60*1000 });
     }
     
+    /** 1003 */
     private static final int FULL_SIZE = PREPROCESSED_SIZE 
                                          - IV_SIZE 
                                          - 1  // 0x00 ending the padding
@@ -77,11 +77,28 @@ public class BatchedPreprocessor extends TrivialPreprocessor {
     
     /* not final or private so the test code can adjust */
     static long DEFAULT_DELAY = 100;
-    /** Wait up to this long before sending (flushing) a small tunnel message */
+    /**
+     *  Wait up to this long before sending (flushing) a small tunnel message
+     *  Warning - overridden in BatchedRouterPreprocessor
+     */
     protected long getSendDelay() { return DEFAULT_DELAY; }
     
-    /** if we have 50 messages queued that are too small, flush them anyway */
-    private static final int FORCE_BATCH_FLUSH = 50;
+    /**
+     *  if we have this many messages queued that are too small, flush them anyway
+     *  Even small messages take up about 200 bytes or so.
+     */
+    private static final int FORCE_BATCH_FLUSH = 5;
+    
+    /** If we have this much allocated, flush anyway.
+     *  Tune this to trade off padding vs. fragmentation.
+     *  The lower the value, the more we are willing to send off
+     *  a tunnel msg that isn't full so the next message can start
+     *  in a new tunnel msg to minimize fragmentation.
+     *
+     *  This should be at most FULL_SIZE - (39 + a few), since
+     *  you want to at least fit in the instructions and a few bytes.
+     */
+    private static final int FULL_ENOUGH_SIZE = (FULL_SIZE * 80) / 100;
     
     /** how long do we want to wait before flushing */
     @Override
@@ -98,8 +115,11 @@ public class BatchedPreprocessor extends TrivialPreprocessor {
         return rv;
     }
     
+    /* See TunnelGateway.QueuePreprocessor for Javadoc */ 
     @Override
-    public boolean preprocessQueue(List pending, TunnelGateway.Sender sender, TunnelGateway.Receiver rec) {
+    public boolean preprocessQueue(List<TunnelGateway.Pending> pending, TunnelGateway.Sender sender, TunnelGateway.Receiver rec) {
+        if (_log.shouldLog(Log.INFO))
+            display(0, pending, "Starting");
         StringBuilder timingBuf = null;
         if (_log.shouldLog(Log.DEBUG)) {
             _log.debug("Preprocess queue with " + pending.size() + " to send");
@@ -116,12 +136,15 @@ public class BatchedPreprocessor extends TrivialPreprocessor {
         int batchCount = 0;
         int beforeLooping = pending.size();
         
+        // loop until the queue is empty
         while (pending.size() > 0) {
             int allocated = 0;
             long beforePendingLoop = System.currentTimeMillis();
+
+            // loop until we fill up a single message
             for (int i = 0; i < pending.size(); i++) {
                 long pendingStart = System.currentTimeMillis();
-                TunnelGateway.Pending msg = (TunnelGateway.Pending)pending.get(i);
+                TunnelGateway.Pending msg = pending.get(i);
                 int instructionsSize = getInstructionsSize(msg);
                 instructionsSize += getInstructionAugmentationSize(msg, allocated, instructionsSize);
                 int curWanted = msg.getData().length - msg.getOffset() + instructionsSize;
@@ -135,7 +158,7 @@ public class BatchedPreprocessor extends TrivialPreprocessor {
                         // the instructions alone exceed the size, so we won't get any
                         // of the message into it.  don't include it
                         i--;
-                        msg = (TunnelGateway.Pending)pending.get(i);
+                        msg = pending.get(i);
                         allocated -= curWanted;
                         if (_log.shouldLog(Log.DEBUG))
                             _log.debug("Pushback of " + curWanted + " (message " + (i+1) + " in " + pending + ")");
@@ -144,18 +167,22 @@ public class BatchedPreprocessor extends TrivialPreprocessor {
                         long waited = _context.clock().now() - _pendingSince;
                         _context.statManager().addRateData("tunnel.batchDelaySent", pending.size(), waited);
                     }
+
+                    // Send the message
                     long beforeSend = System.currentTimeMillis();
                     _pendingSince = 0;
                     send(pending, 0, i, sender, rec);
                     _context.statManager().addRateData("tunnel.batchFullFragments", 1, 0);
                     long afterSend = System.currentTimeMillis();
                     if (_log.shouldLog(Log.INFO))
-                        _log.info("Allocated=" + allocated + " so we sent " + (i+1) 
-                                  + " (last complete? " + (msg.getOffset() >= msg.getData().length) 
-                                  + ", off=" + msg.getOffset() + ", count=" + pending.size() + ")");
+                        display(allocated, pending, "Sent the message with " + (i+1));
+                        //_log.info(_name + ": Allocated=" + allocated + "B, Sent " + (i+1) 
+                        //          + " msgs (last complete? " + (msg.getOffset() >= msg.getData().length) 
+                        //          + ", off=" + msg.getOffset() + ", pending=" + pending.size() + ")");
 
+                    // Remove what we sent from the pending queue
                     for (int j = 0; j < i; j++) {
-                        TunnelGateway.Pending cur = (TunnelGateway.Pending)pending.remove(0);
+                        TunnelGateway.Pending cur = pending.remove(0);
                         if (cur.getOffset() < cur.getData().length)
                             throw new IllegalArgumentException("i=" + i + " j=" + j + " off=" + cur.getOffset() 
                                                                + " len=" + cur.getData().length + " alloc=" + allocated);
@@ -167,7 +194,7 @@ public class BatchedPreprocessor extends TrivialPreprocessor {
                     }
                     if (msg.getOffset() >= msg.getData().length) {
                         // ok, this last message fit perfectly, remove it too
-                        TunnelGateway.Pending cur = (TunnelGateway.Pending)pending.remove(0);
+                        TunnelGateway.Pending cur = pending.remove(0);
                         if (timingBuf != null)
                             timingBuf.append(" sent perfect fit " + cur).append(".");
                         notePreprocessing(cur.getMessageId(), cur.getFragmentNumber(), msg.getData().length, msg.getMessageIds(), "flushed tail, remaining: " + pending);
@@ -186,20 +213,24 @@ public class BatchedPreprocessor extends TrivialPreprocessor {
                                          + "/" + (beforeSend-start)
                                          + " pending current " + (pendingEnd-pendingStart)).append(".");
                     break;
-                }
+                }  // if >= full size
                 if (timingBuf != null)
                     timingBuf.append(" After pending loop " + (System.currentTimeMillis()-beforePendingLoop)).append(".");
-            }
+            }  // for
             
-            long afterCleared = System.currentTimeMillis();
             if (_log.shouldLog(Log.INFO))
                 display(allocated, pending, "after looping to clear " + (beforeLooping - pending.size()));
             long afterDisplayed = System.currentTimeMillis();
             if (allocated > 0) {
-                // after going through the entire pending list, we still don't
-                // have enough data to send a full message
+                // After going through the entire pending list, we have only a partial message.
+                // We might flush it or might not, but we are returning either way.
+
+                if ( (pending.size() > FORCE_BATCH_FLUSH) ||                    // enough msgs - or
+                     ( (_pendingSince > 0) && (getDelayAmount() <= 0) ) ||      // time to flush - or
+                     (allocated >= FULL_ENOUGH_SIZE)) {                         // full enough
+                     //(pending.get(0).getFragmentNumber() > 0)) {                // don't delay anybody's last fragment,
+                     //                                                           // which would be the first fragment in the message
 
-                if ( (pending.size() > FORCE_BATCH_FLUSH) || ( (_pendingSince > 0) && (getDelayAmount() <= 0) ) ) {
                     // not even a full message, but we want to flush it anyway
                     
                     if (pending.size() > 1)
@@ -209,21 +240,24 @@ public class BatchedPreprocessor extends TrivialPreprocessor {
                     send(pending, 0, pending.size()-1, sender, rec);
                     _context.statManager().addRateData("tunnel.batchSmallFragments", FULL_SIZE - allocated, 0);
                     
+                    // Remove everything in the outgoing message from the pending queue
                     int beforeSize = pending.size();
-                    for (int i = 0; i < pending.size(); i++) {
-                        TunnelGateway.Pending cur = (TunnelGateway.Pending)pending.get(i);
-                        if (cur.getOffset() >= cur.getData().length) {
-                            pending.remove(i);
-                            notePreprocessing(cur.getMessageId(), cur.getFragmentNumber(), cur.getData().length, cur.getMessageIds(), "flushed remaining");
-                            _context.statManager().addRateData("tunnel.batchFragmentation", cur.getFragmentNumber() + 1, 0);
-                            _context.statManager().addRateData("tunnel.writeDelay", cur.getLifetime(), cur.getData().length);
-                            i--;
-                        }
+                    for (int i = 0; i < beforeSize; i++) {
+                        TunnelGateway.Pending cur = pending.get(0);
+                        if (cur.getOffset() < cur.getData().length)
+                            break;
+                        pending.remove(0);
+                        notePreprocessing(cur.getMessageId(), cur.getFragmentNumber(), cur.getData().length, cur.getMessageIds(), "flushed remaining");
+                        _context.statManager().addRateData("tunnel.batchFragmentation", cur.getFragmentNumber() + 1, 0);
+                        _context.statManager().addRateData("tunnel.writeDelay", cur.getLifetime(), cur.getData().length);
                     }
+
                     if (pending.size() > 0) {
+                        // rare
                         _pendingSince = _context.clock().now();
                         _context.statManager().addRateData("tunnel.batchFlushRemaining", pending.size(), beforeSize);
-                        display(allocated, pending, "flushed, some remain");
+                        if (_log.shouldLog(Log.INFO))
+                            display(allocated, pending, "flushed, some remain");
                         
                         if (timingBuf != null) {
                             timingBuf.append(" flushed, some remain (displayed to now: " + (System.currentTimeMillis()-afterDisplayed) + ")");
@@ -232,12 +266,15 @@ public class BatchedPreprocessor extends TrivialPreprocessor {
                         }
                         return true;
                     } else {
-                        long delayAmount = _context.clock().now() - _pendingSince;
-                        _pendingSince = 0;
+                        long delayAmount = 0;
+                        if (_pendingSince > 0) {
+                            delayAmount = _context.clock().now() - _pendingSince;
+                            _pendingSince = 0;
+                        }
                         if (batchCount > 1)
                             _context.statManager().addRateData("tunnel.batchCount", batchCount, 0);
                         if (_log.shouldLog(Log.INFO))
-                            display(allocated, pending, "flushed " + (beforeSize) + ", no remaining after " + delayAmount);
+                            display(allocated, pending, "flushed " + (beforeSize) + ", no remaining after " + delayAmount + "ms");
                         
                         if (timingBuf != null) {
                             timingBuf.append(" flushed, none remain (displayed to now: " + (System.currentTimeMillis()-afterDisplayed) + ")");
@@ -246,14 +283,17 @@ public class BatchedPreprocessor extends TrivialPreprocessor {
                         }
                         return false;
                     }
+                    // won't get here, we returned
                 } else {
+                     // We didn't flush. Note that the messages remain on the pending list.
                     _context.statManager().addRateData("tunnel.batchDelay", pending.size(), 0);
                     if (_pendingSince <= 0)
                         _pendingSince = _context.clock().now();
                     if (batchCount > 1)
                         _context.statManager().addRateData("tunnel.batchCount", batchCount, 0);
                     // not yet time to send the delayed flush
-                    display(allocated, pending, "dont flush");
+                    if (_log.shouldLog(Log.INFO))
+                        display(allocated, pending, "dont flush");
                     
                     if (timingBuf != null) {
                         timingBuf.append(" dont flush (displayed to now: " + (System.currentTimeMillis()-afterDisplayed) + ")");
@@ -262,14 +302,15 @@ public class BatchedPreprocessor extends TrivialPreprocessor {
                     }
                     return true;
                 }
+                // won't get here, we returned
             } else {
                 // ok, we sent some, but haven't gone back for another 
                 // pass yet.  keep looping
                 
                 if (timingBuf != null)
                     timingBuf.append(" Keep looping");
-            }
-        }
+            }  // if allocated
+        }  // while
         
         if (_log.shouldLog(Log.DEBUG))
             _log.debug("Sent everything on the list (pending=" + pending.size() + ")");
@@ -283,20 +324,25 @@ public class BatchedPreprocessor extends TrivialPreprocessor {
         return false;
     }
     
-    private void display(long allocated, List pending, String title) {
+    /*
+     * Only if Log.INFO
+     *
+     * title: allocated: X pending: X (delay: X) [0]:offset/length/lifetime [1]:etc.
+     */
+    private void display(long allocated, List<TunnelGateway.Pending> pending, String title) {
         if (_log.shouldLog(Log.INFO)) {
             long highestDelay = 0;
-            StringBuilder buf = new StringBuilder();
+            StringBuilder buf = new StringBuilder(128);
             buf.append(_name).append(": ");
             buf.append(title);
-            buf.append(" allocated: ").append(allocated);
+            buf.append(" - allocated: ").append(allocated);
             buf.append(" pending: ").append(pending.size());
             if (_pendingSince > 0)
                 buf.append(" delay: ").append(getDelayAmount(false));
             for (int i = 0; i < pending.size(); i++) {
-                TunnelGateway.Pending curPending = (TunnelGateway.Pending)pending.get(i);
-                buf.append(" pending[").append(i).append("]: ");
-                buf.append(curPending.getOffset()).append("/").append(curPending.getData().length).append('/');
+                TunnelGateway.Pending curPending = pending.get(i);
+                buf.append(" [").append(i).append("]:");
+                buf.append(curPending.getOffset()).append('/').append(curPending.getData().length).append('/');
                 buf.append(curPending.getLifetime());
                 if (curPending.getLifetime() > highestDelay)
                     highestDelay = curPending.getLifetime();
@@ -314,9 +360,14 @@ public class BatchedPreprocessor extends TrivialPreprocessor {
      * @param startAt first index in pending to send (inclusive)
      * @param sendThrough last index in pending to send (inclusive)
      */
-    protected void send(List pending, int startAt, int sendThrough, TunnelGateway.Sender sender, TunnelGateway.Receiver rec) {
+    protected void send(List<TunnelGateway.Pending> pending, int startAt, int sendThrough, TunnelGateway.Sender sender, TunnelGateway.Receiver rec) {
         if (_log.shouldLog(Log.DEBUG))
             _log.debug("Sending " + startAt + ":" + sendThrough + " out of " + pending);
+
+        // Might as well take a buf from the cache;
+        // However it will never be returned to the cache.
+        // (TunnelDataMessage will not wrap the buffer in a new ByteArray and release() it)
+        // See also TDM for more discussion.
         byte preprocessed[] = _dataCache.acquire().getData();
         
         int offset = 0;
@@ -343,10 +394,10 @@ public class BatchedPreprocessor extends TrivialPreprocessor {
                 _log.error("Error preprocessing the messages (offset=" + offset + " start=" + startAt + " through=" + sendThrough + " pending=" + pending.size() + " preproc=" + preprocessed.length);
             return;
         }
-        
+
         long msgId = sender.sendPreprocessed(preprocessed, rec);
         for (int i = 0; i < pending.size(); i++) {
-            TunnelGateway.Pending cur = (TunnelGateway.Pending)pending.get(i);
+            TunnelGateway.Pending cur = pending.get(i);
             cur.addMessageId(msgId);
         }
         if (_log.shouldLog(Log.DEBUG))
@@ -359,9 +410,9 @@ public class BatchedPreprocessor extends TrivialPreprocessor {
      *
      * @return new offset into the target for further bytes to be written
      */
-    private int writeFragments(List pending, int startAt, int sendThrough, byte target[], int offset) {
+    private int writeFragments(List<TunnelGateway.Pending> pending, int startAt, int sendThrough, byte target[], int offset) {
         for (int i = startAt; i <= sendThrough; i++) {
-            TunnelGateway.Pending msg = (TunnelGateway.Pending)pending.get(i);
+            TunnelGateway.Pending msg = pending.get(i);
             int prevOffset = offset;
             if (msg.getOffset() == 0) {
                 offset = writeFirstFragment(msg, target, offset);
diff --git a/router/java/src/net/i2p/router/tunnel/BatchedRouterPreprocessor.java b/router/java/src/net/i2p/router/tunnel/BatchedRouterPreprocessor.java
index 2e5e988855b5d05b072a72ae15fc28d0e0d4d356..71d80b01124d63d43daa6929db876ca419da72e8 100644
--- a/router/java/src/net/i2p/router/tunnel/BatchedRouterPreprocessor.java
+++ b/router/java/src/net/i2p/router/tunnel/BatchedRouterPreprocessor.java
@@ -11,75 +11,103 @@ import net.i2p.router.RouterContext;
  *
  */
 public class BatchedRouterPreprocessor extends BatchedPreprocessor {
-    private RouterContext _routerContext;
+    protected RouterContext _routerContext;
     private TunnelCreatorConfig _config;
-    private HopConfig _hopConfig;
+    protected HopConfig _hopConfig;
+    private final long _sendDelay;
     
     /** 
      * How frequently should we flush non-full messages, in milliseconds
+     * This goes in I2CP custom options for the pool.
+     * Only applies to OBGWs.
      */
     public static final String PROP_BATCH_FREQUENCY = "batchFrequency";
+    /** This goes in router advanced config */
     public static final String PROP_ROUTER_BATCH_FREQUENCY = "router.batchFrequency";
-    public static final int DEFAULT_BATCH_FREQUENCY = 100;
+    /** for client OBGWs only (our data) */
+    public static final int OB_CLIENT_BATCH_FREQ = 100;
+    /** for exploratory OBGWs only (our tunnel tests and build messages) */
+    public static final int OB_EXPL_BATCH_FREQ = 150;
+    /** for IBGWs for efficiency (not our data) */
+    public static final int DEFAULT_BATCH_FREQUENCY = 250;
     
-    public BatchedRouterPreprocessor(RouterContext ctx) {
-        this(ctx, (HopConfig)null);
-    }
+    /** for OBGWs */
     public BatchedRouterPreprocessor(RouterContext ctx, TunnelCreatorConfig cfg) {
         super(ctx, getName(cfg));
         _routerContext = ctx;
         _config = cfg;
+        _sendDelay = initialSendDelay();
     }
+
+    /** for IBGWs */
     public BatchedRouterPreprocessor(RouterContext ctx, HopConfig cfg) {
         super(ctx, getName(cfg));
         _routerContext = ctx;
         _hopConfig = cfg;
+        _sendDelay = initialSendDelay();
     }
     
     private static String getName(HopConfig cfg) {
-        if (cfg == null) return "[unknown]";
+        if (cfg == null) return "IB??";
         if (cfg.getReceiveTunnel() != null)
-            return cfg.getReceiveTunnel().getTunnelId() + "";
+            return "IB " + cfg.getReceiveTunnel().getTunnelId();
         else if (cfg.getSendTunnel() != null)
-            return cfg.getSendTunnel().getTunnelId() + "";
+            return "IB " + cfg.getSendTunnel().getTunnelId();
         else
-            return "[n/a]";
+            return "IB??";
     }
     
     private static String getName(TunnelCreatorConfig cfg) {
-        if (cfg == null) return "[unknown]";
+        if (cfg == null) return "OB??";
         if (cfg.getReceiveTunnelId(0) != null)
-            return cfg.getReceiveTunnelId(0).getTunnelId() + "";
+            return "OB " + cfg.getReceiveTunnelId(0).getTunnelId();
         else if (cfg.getSendTunnelId(0) != null)
-            return cfg.getSendTunnelId(0).getTunnelId() + "";
+            return "OB " + cfg.getSendTunnelId(0).getTunnelId();
         else
-            return "[n/a]";
+            return "OB??";
     }
 
-    /** how long should we wait before flushing */
+    /**
+     *  how long should we wait before flushing
+     */
     @Override
-    protected long getSendDelay() { 
-        String freq = null;
+    protected long getSendDelay() { return _sendDelay; }
+
+    /*
+     *  Extend the batching time for exploratory OBGWs, they have a lot of small
+     *  tunnel test messages, and build messages that don't fit perfectly.
+     *  And these are not as delay-sensitive.
+     *
+     *  We won't pick up config changes after the preprocessor is created,
+     *  but a preprocessor lifetime is only 10 minutes, so just wait...
+     */
+    private long initialSendDelay() {
         if (_config != null) {
             Properties opts = _config.getOptions();
-            if (opts != null)
-                freq = opts.getProperty(PROP_BATCH_FREQUENCY);
-        }
-        if (freq == null)
-            freq = _routerContext.getProperty(PROP_ROUTER_BATCH_FREQUENCY);
-        
-        if (freq != null) {
-            try {
-                return Integer.parseInt(freq);
-            } catch (NumberFormatException nfe) {
-                return DEFAULT_BATCH_FREQUENCY;
+            if (opts != null) {
+                String freq = opts.getProperty(PROP_BATCH_FREQUENCY);
+                if (freq != null) {
+                    try {
+                        return Integer.parseInt(freq);
+                    } catch (NumberFormatException nfe) {}
+                }
             }
         }
-        return DEFAULT_BATCH_FREQUENCY;
+
+        int def;
+        if (_config != null) {
+            if (_config.getDestination() != null)
+                def = OB_CLIENT_BATCH_FREQ;
+            else
+                def = OB_EXPL_BATCH_FREQ;
+        } else {
+            def = DEFAULT_BATCH_FREQUENCY;
+        }
+        return _routerContext.getProperty(PROP_ROUTER_BATCH_FREQUENCY, def);
     }
     
     @Override
-    protected void notePreprocessing(long messageId, int numFragments, int totalLength, List messageIds, String msg) {
+    protected void notePreprocessing(long messageId, int numFragments, int totalLength, List<Long> messageIds, String msg) {
         if (_config != null)
             _routerContext.messageHistory().fragmentMessage(messageId, numFragments, totalLength, messageIds, _config, msg);
         else
diff --git a/router/java/src/net/i2p/router/tunnel/FragmentHandler.java b/router/java/src/net/i2p/router/tunnel/FragmentHandler.java
index 43e1d13144de93911a3c84eccdb6c1fac94a16ff..18a06f0362dfa1f4ad68bba6e2d054e2a4f1cc66 100644
--- a/router/java/src/net/i2p/router/tunnel/FragmentHandler.java
+++ b/router/java/src/net/i2p/router/tunnel/FragmentHandler.java
@@ -4,7 +4,6 @@ import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
 
-import net.i2p.I2PAppContext;
 import net.i2p.data.Base64;
 import net.i2p.data.ByteArray;
 import net.i2p.data.DataHelper;
@@ -13,6 +12,7 @@ import net.i2p.data.TunnelId;
 import net.i2p.data.i2np.I2NPMessage;
 import net.i2p.data.i2np.I2NPMessageException;
 import net.i2p.data.i2np.I2NPMessageHandler;
+import net.i2p.router.RouterContext;
 import net.i2p.util.ByteCache;
 import net.i2p.util.Log;
 import net.i2p.util.SimpleTimer;
@@ -21,35 +21,102 @@ import net.i2p.util.SimpleTimer;
  * Handle fragments at the endpoint of a tunnel, peeling off fully completed 
  * I2NPMessages when they arrive, and dropping fragments if they take too long
  * to arrive.
+ *
+ * From tunnel-alt.html:
+
+<p>When the gateway wants to deliver data through the tunnel, it first
+gathers zero or more <a href="i2np.html">I2NP</a> messages, selects how much padding will be used, 
+fragments it across the necessary number of 1KB tunnel messages, and decides how
+each I2NP message should be handled by the tunnel endpoint, encoding that
+data into the raw tunnel payload:</p>
+<ul>
+<li>The 4 byte Tunnel ID</li>
+<li>The 16 byte IV</li>
+<li>the first 4 bytes of the SHA256 of (the remaining preprocessed data concatenated 
+    with the IV), using the IV as will be seen on the tunnel endpoint (for
+    outbound tunnels), or the IV as was seen on the tunnel gateway (for inbound
+    tunnels) (see below for IV processing).</li>
+<li>0 or more bytes containing random nonzero integers</li>
+<li>1 byte containing 0x00</li>
+<li>a series of zero or more { instructions, message } pairs</li>
+</ul>
+
+<p>Note that the padding, if any, must be before the instruction/message pairs.
+there is no provision for padding at the end.</p>
+
+<p>The instructions are encoded with a single control byte, followed by any
+necessary additional information.  The first bit in that control byte determines
+how the remainder of the header is interpreted - if it is not set, the message 
+is either not fragmented or this is the first fragment in the message.  If it is
+set, this is a follow on fragment.</p>
+
+<p>With the first (leftmost or MSB) bit being 0, the instructions are:</p>
+<ul>
+<li>1 byte control byte:<pre>
+      bit 0: is follow on fragment?  (1 = true, 0 = false, must be 0)
+   bits 1-2: delivery type
+             (0x0 = LOCAL, 0x01 = TUNNEL, 0x02 = ROUTER)
+      bit 3: delay included?  (1 = true, 0 = false) (unimplemented)
+      bit 4: fragmented?  (1 = true, 0 = false)
+      bit 5: extended options?  (1 = true, 0 = false) (unimplemented)
+   bits 6-7: reserved</pre></li>
+<li>if the delivery type was TUNNEL, a 4 byte tunnel ID</li>
+<li>if the delivery type was TUNNEL or ROUTER, a 32 byte router hash</li>
+<li>if the delay included flag is true, a 1 byte value (unimplemented):<pre>
+      bit 0: type (0 = strict, 1 = randomized)
+   bits 1-7: delay exponent (2^value minutes)</pre></li>
+<li>if the fragmented flag is true, a 4 byte message ID</li>
+<li>if the extended options flag is true (unimplemented):<pre>
+   = a 1 byte option size (in bytes)
+   = that many bytes</pre></li>
+<li>2 byte size of the I2NP message or this fragment</li>
+</ul>
+
+<p>If the first bit being 1, the instructions are:</p>
+<ul>
+<li>1 byte control byte:<pre>
+      bit 0: is follow on fragment?  (1 = true, 0 = false, must be 1)
+   bits 1-6: fragment number
+      bit 7: is last? (1 = true, 0 = false)</pre></li>
+<li>4 byte message ID (same one defined in the first fragment)</li>
+<li>2 byte size of this fragment</li>
+</ul>
+
+<p>The I2NP message is encoded in its standard form, and the 
+preprocessed payload must be padded to a multiple of 16 bytes.
+The total size, including the tunnel ID and IV, is 1028 bytes.
+</p>
+
  *
  */
 public class FragmentHandler {
-    private I2PAppContext _context;
-    private Log _log;
-    private final Map _fragmentedMessages;
+    protected RouterContext _context;
+    protected Log _log;
+    private final Map<Long, FragmentedMessage> _fragmentedMessages;
     private DefragmentedReceiver _receiver;
     private int _completed;
     private int _failed;
+    private static final long[] RATES = { 10*60*1000l, 60*60*1000l, 3*60*60*1000l, 24*60*60*1000 };
     
     /** don't wait more than 60s to defragment the partial message */
     static long MAX_DEFRAGMENT_TIME = 60*1000;
     private static final ByteCache _cache = ByteCache.getInstance(512, TrivialPreprocessor.PREPROCESSED_SIZE);
 
-    public FragmentHandler(I2PAppContext context, DefragmentedReceiver receiver) {
+    public FragmentHandler(RouterContext context, DefragmentedReceiver receiver) {
         _context = context;
         _log = context.logManager().getLog(FragmentHandler.class);
-        _fragmentedMessages = new HashMap(4);
+        _fragmentedMessages = new HashMap(8);
         _receiver = receiver;
         _context.statManager().createRateStat("tunnel.smallFragments", "How many pad bytes are in small fragments?", 
-                                              "Tunnels", new long[] { 10*60*1000l, 60*60*1000l, 3*60*60*1000l, 24*60*60*1000 });
+                                              "Tunnels", RATES);
         _context.statManager().createRateStat("tunnel.fullFragments", "How many tunnel messages use the full data area?", 
-                                              "Tunnels", new long[] { 10*60*1000l, 60*60*1000l, 3*60*60*1000l, 24*60*60*1000 });
+                                              "Tunnels", RATES);
         _context.statManager().createRateStat("tunnel.fragmentedComplete", "How many fragments were in a completely received message?", 
-                                              "Tunnels", new long[] { 10*60*1000l, 60*60*1000l, 3*60*60*1000l, 24*60*60*1000 });
+                                              "Tunnels", RATES);
         _context.statManager().createRateStat("tunnel.fragmentedDropped", "How many fragments were in a partially received yet failed message?", 
-                                              "Tunnels", new long[] { 10*60*1000l, 60*60*1000l, 3*60*60*1000l, 24*60*60*1000 });
+                                              "Tunnels", RATES);
         _context.statManager().createRateStat("tunnel.corruptMessage", "How many corrupted messages arrived?", 
-                                              "Tunnels", new long[] { 10*60*1000l, 60*60*1000l, 3*60*60*1000l, 24*60*60*1000 });
+                                              "Tunnels", RATES);
     }
     
     /**
@@ -122,6 +189,9 @@ public class FragmentHandler {
             // each of the FragmentedMessages populated make a copy out of the
             // payload, which they release separately, so we can release 
             // immediately
+            //
+            // This is certainly interesting, to wrap the 1024-byte array in a new ByteArray
+            // in order to put it in the pool, but it shouldn't cause any harm.
             _cache.release(new ByteArray(preprocessed));
         }
     }
@@ -141,6 +211,13 @@ public class FragmentHandler {
      * this.
      */
     private boolean verifyPreprocessed(byte preprocessed[], int offset, int length) {
+        // ByteCache/ByteArray corruption detection
+        //byte[] orig = new byte[length];
+        //System.arraycopy(preprocessed, 0, orig, 0, length);
+        //try {
+        //    Thread.sleep(75);
+        //} catch (InterruptedException ie) {}
+
         // now we need to verify that the message was received correctly
         int paddingEnd = HopProcessor.IV_LENGTH + 4;
         while (preprocessed[offset+paddingEnd] != (byte)0x00) {
@@ -149,7 +226,7 @@ public class FragmentHandler {
                 if (_log.shouldLog(Log.WARN))
                     _log.warn("cannot verify, going past the end [off=" 
                               + offset + " len=" + length + " paddingEnd=" 
-                              + paddingEnd + " data:\n"
+                              + paddingEnd + " data: "
                               + Base64.encode(preprocessed, offset, length));
                 return false;
             }
@@ -165,21 +242,19 @@ public class FragmentHandler {
             _log.debug("endpoint IV: " + Base64.encode(preV, validLength - HopProcessor.IV_LENGTH, HopProcessor.IV_LENGTH));
         
         Hash v = _context.sha().calculateHash(preV, 0, validLength);
+        _validateCache.release(ba);
         
-        //Hash v = _context.sha().calculateHash(preV, 0, validLength);
         boolean eq = DataHelper.eq(v.getData(), 0, preprocessed, offset + HopProcessor.IV_LENGTH, 4);
         if (!eq) {
-            if (_log.shouldLog(Log.WARN))
-                _log.warn("Corrupt tunnel message - verification fails: \n" + Base64.encode(preprocessed, offset+HopProcessor.IV_LENGTH, 4)
-                           + "\n" + Base64.encode(v.getData(), 0, 4));
-            if (_log.shouldLog(Log.WARN))
-                _log.warn("nomatching endpoint: # pad bytes: " + (paddingEnd-(HopProcessor.IV_LENGTH+4)-1) + "\n" 
-                           + " offset=" + offset + " length=" + length + " paddingEnd=" + paddingEnd
-                           + Base64.encode(preprocessed, offset, length));
+            if (_log.shouldLog(Log.WARN)) {
+                _log.warn("Corrupt tunnel message - verification fails: " + Base64.encode(preprocessed, offset+HopProcessor.IV_LENGTH, 4)
+                           + " != " + Base64.encode(v.getData(), 0, 4));
+                _log.warn("No matching endpoint: # pad bytes: " + (paddingEnd-(HopProcessor.IV_LENGTH+4)-1)
+                           + " offset=" + offset + " length=" + length + " paddingEnd=" + paddingEnd + ' '
+                           + Base64.encode(preprocessed, offset, length), new Exception("trace"));
+            }
         }
         
-        _validateCache.release(ba);
-        
         if (eq) {
             int excessPadding = paddingEnd - (HopProcessor.IV_LENGTH + 4 + 1);
             if (excessPadding > 0) // suboptimal fragmentation
@@ -188,6 +263,13 @@ public class FragmentHandler {
                 _context.statManager().addRateData("tunnel.fullFragments", 1, 0);
         }
         
+        // ByteCache/ByteArray corruption detection
+        //if (!DataHelper.eq(preprocessed, 0, orig, 0, length)) {
+        //    _log.log(Log.CRIT, "Not equal! orig =\n" + Base64.encode(orig, 0, length) +
+        //             "\nprep =\n" + Base64.encode(preprocessed, 0, length),
+        //             new Exception("hosed"));
+        //}
+
         return eq;
     }
     
@@ -197,11 +279,12 @@ public class FragmentHandler {
     static final byte MASK_TYPE = (byte)(3 << 5);
     /** is this the first of a fragmented message? */
     static final byte MASK_FRAGMENTED = (byte)(1 << 3);
-    /** are there follow up headers? */
+    /** are there follow up headers? UNIMPLEMENTED */
     static final byte MASK_EXTENDED = (byte)(1 << 2);
     /** for subsequent fragments, which bits contain the fragment #? */
     private static final int MASK_FRAGMENT_NUM = (byte)((1 << 7) - 2); // 0x7E;
     
+    /** LOCAL isn't explicitly used anywhere, because the code knows that it is 0 */
     static final short TYPE_LOCAL = 0;
     static final short TYPE_TUNNEL = 1;
     static final short TYPE_ROUTER = 2;
@@ -211,8 +294,8 @@ public class FragmentHandler {
      */
     private int receiveFragment(byte preprocessed[], int offset, int length) {
         if (_log.shouldLog(Log.DEBUG))
-            _log.debug("CONTROL: " + Integer.toHexString(preprocessed[offset]) + " / " 
-                       + "/" + Base64.encode(preprocessed, offset, 1) + " at offset " + offset);
+            _log.debug("CONTROL: 0x" + Integer.toHexString(preprocessed[offset] & 0xff) +
+                       " at offset " + offset);
         if (0 == (preprocessed[offset] & MASK_IS_SUBSEQUENT))
             return receiveInitialFragment(preprocessed, offset, length);
         else
@@ -273,42 +356,48 @@ public class FragmentHandler {
         int size = (int)DataHelper.fromLong(preprocessed, offset, 2);
         offset += 2;
         
-        boolean isNew = false;
         FragmentedMessage msg = null;
         if (fragmented) {
             synchronized (_fragmentedMessages) {
-                msg = (FragmentedMessage)_fragmentedMessages.get(new Long(messageId));
+                msg = _fragmentedMessages.get(new Long(messageId));
                 if (msg == null) {
                     msg = new FragmentedMessage(_context);
                     _fragmentedMessages.put(new Long(messageId), msg);
-                    isNew = true;
                 }
             }
         } else {
             msg = new FragmentedMessage(_context);
         }
         
-        boolean ok = msg.receive(messageId, preprocessed, offset, size, !fragmented, router, tunnelId);
-        if (!ok) return -1;
-        if (msg.isComplete()) {
-            if (fragmented) {
-                synchronized (_fragmentedMessages) {
-                    _fragmentedMessages.remove(new Long(messageId));
+        if (fragmented) {
+            // synchronized is required, fragments may be arriving in different threads
+            synchronized(msg) {
+                boolean ok = msg.receive(messageId, preprocessed, offset, size, false, router, tunnelId);
+                if (!ok) return -1;
+                if (msg.isComplete()) {
+                    synchronized (_fragmentedMessages) {
+                        _fragmentedMessages.remove(new Long(messageId));
+                    }
+                    if (msg.getExpireEvent() != null)
+                        SimpleTimer.getInstance().removeEvent(msg.getExpireEvent());
+                    receiveComplete(msg);
+                } else {
+                    noteReception(msg.getMessageId(), 0, msg);
+                    if (msg.getExpireEvent() == null) {
+                        RemoveFailed evt = new RemoveFailed(msg);
+                        msg.setExpireEvent(evt);
+                        if (_log.shouldLog(Log.DEBUG))
+                            _log.debug("In " + MAX_DEFRAGMENT_TIME + " dropping " + messageId);
+                        SimpleTimer.getInstance().addEvent(evt, MAX_DEFRAGMENT_TIME);
+                    }
                 }
             }
-            if (msg.getExpireEvent() != null)
-                SimpleTimer.getInstance().removeEvent(msg.getExpireEvent());
+        } else {        
+            // synchronized not required if !fragmented
+            boolean ok = msg.receive(messageId, preprocessed, offset, size, true, router, tunnelId);
+            if (!ok) return -1;
+            // always complete, never an expire event
             receiveComplete(msg);
-        } else {
-            noteReception(msg.getMessageId(), 0, msg);
-        }
-        
-        if (isNew && fragmented && !msg.isComplete()) {
-            RemoveFailed evt = new RemoveFailed(msg);
-            msg.setExpireEvent(evt);
-            if (_log.shouldLog(Log.DEBUG))
-                _log.debug("In " + MAX_DEFRAGMENT_TIME + " dropping " + messageId);
-            SimpleTimer.getInstance().addEvent(evt, MAX_DEFRAGMENT_TIME);
         }
         
         offset += size;
@@ -340,38 +429,38 @@ public class FragmentHandler {
             throw new RuntimeException("Preprocessed message was invalid [messageId =" + messageId + " size=" 
                                        + size + " offset=" + offset + " fragment=" + fragmentNum);
         
-        boolean isNew = false;
         FragmentedMessage msg = null;
         synchronized (_fragmentedMessages) {
-            msg = (FragmentedMessage)_fragmentedMessages.get(new Long(messageId));
+            msg = _fragmentedMessages.get(new Long(messageId));
             if (msg == null) {
                 msg = new FragmentedMessage(_context);
                 _fragmentedMessages.put(new Long(messageId), msg);
-                isNew = true;
             }
         }
         
-        boolean ok = msg.receive(messageId, fragmentNum, preprocessed, offset, size, isLast);
-        if (!ok) return -1;
-        
-        if (msg.isComplete()) {
-            synchronized (_fragmentedMessages) {
-                _fragmentedMessages.remove(new Long(messageId));
+        // synchronized is required, fragments may be arriving in different threads
+        synchronized(msg) {
+            boolean ok = msg.receive(messageId, fragmentNum, preprocessed, offset, size, isLast);
+            if (!ok) return -1;
+            
+            if (msg.isComplete()) {
+                synchronized (_fragmentedMessages) {
+                    _fragmentedMessages.remove(new Long(messageId));
+                }
+                if (msg.getExpireEvent() != null)
+                    SimpleTimer.getInstance().removeEvent(msg.getExpireEvent());
+                _context.statManager().addRateData("tunnel.fragmentedComplete", msg.getFragmentCount(), msg.getLifetime());
+                receiveComplete(msg);
+            } else {
+                noteReception(msg.getMessageId(), fragmentNum, msg);
+                if (msg.getExpireEvent() == null) {
+                    RemoveFailed evt = new RemoveFailed(msg);
+                    msg.setExpireEvent(evt);
+                    if (_log.shouldLog(Log.DEBUG))
+                        _log.debug("In " + MAX_DEFRAGMENT_TIME + " dropping " + msg.getMessageId() + "/" + fragmentNum);
+                    SimpleTimer.getInstance().addEvent(evt, MAX_DEFRAGMENT_TIME);
+                }
             }
-            if (msg.getExpireEvent() != null)
-                SimpleTimer.getInstance().removeEvent(msg.getExpireEvent());
-            _context.statManager().addRateData("tunnel.fragmentedComplete", msg.getFragmentCount(), msg.getLifetime());
-            receiveComplete(msg);
-        } else {
-            noteReception(msg.getMessageId(), fragmentNum, msg);
-        }
-        
-        if (isNew && !msg.isComplete()) {
-            RemoveFailed evt = new RemoveFailed(msg);
-            msg.setExpireEvent(evt);
-            if (_log.shouldLog(Log.DEBUG))
-                _log.debug("In " + MAX_DEFRAGMENT_TIME + " dropping " + msg.getMessageId() + "/" + fragmentNum);
-            SimpleTimer.getInstance().addEvent(evt, MAX_DEFRAGMENT_TIME);
         }
         
         offset += size;
@@ -392,8 +481,8 @@ public class FragmentHandler {
             if (data == null)
                 throw new I2NPMessageException("null data");   // fragments already released???
             if (_log.shouldLog(Log.DEBUG))
-                _log.debug("RECV(" + data.length + "): " + Base64.encode(data)  
-                           + " " + _context.sha().calculateHash(data).toBase64());
+                _log.debug("RECV(" + data.length + "): "); // + Base64.encode(data)  
+                           //+ " " + _context.sha().calculateHash(data).toBase64());
             I2NPMessage m = new I2NPMessageHandler(_context).readMessage(data);
             noteReception(m.getUniqueId(), fragmentCount-1, "complete: ");// + msg.toString());
             noteCompletion(m.getUniqueId());
@@ -441,15 +530,17 @@ public class FragmentHandler {
             synchronized (_fragmentedMessages) {
                 removed = (null != _fragmentedMessages.remove(new Long(_msg.getMessageId())));
             }
-            if (removed && !_msg.getReleased()) {
-                _failed++;
-                noteFailure(_msg.getMessageId(), _msg.toString());
-                if (_log.shouldLog(Log.WARN))
-                    _log.warn("Dropped failed fragmented message: " + _msg);
-                _context.statManager().addRateData("tunnel.fragmentedDropped", _msg.getFragmentCount(), _msg.getLifetime());
-                _msg.failed();
-            } else {
-                // succeeded before timeout
+            synchronized (_msg) {
+                if (removed && !_msg.getReleased()) {
+                    _failed++;
+                    noteFailure(_msg.getMessageId(), _msg.toString());
+                    if (_log.shouldLog(Log.WARN))
+                        _log.warn("Dropped incomplete fragmented message: " + _msg);
+                    _context.statManager().addRateData("tunnel.fragmentedDropped", _msg.getFragmentCount(), _msg.getLifetime());
+                    _msg.failed();
+                } else {
+                    // succeeded before timeout
+                }
             }
         }
         
diff --git a/router/java/src/net/i2p/router/tunnel/FragmentedMessage.java b/router/java/src/net/i2p/router/tunnel/FragmentedMessage.java
index 77f54bb2c4fd8f1da0d7e8aed20db3643da3d0f4..0515f813b51245f63c85a9d2ff4bc859886ed0f0 100644
--- a/router/java/src/net/i2p/router/tunnel/FragmentedMessage.java
+++ b/router/java/src/net/i2p/router/tunnel/FragmentedMessage.java
@@ -21,6 +21,8 @@ import net.i2p.util.SimpleTimer;
  * Gather fragments of I2NPMessages at a tunnel endpoint, making them available 
  * for reading when complete.
  *
+ * Warning - this is all unsynchronized here - receivers must implement synchronization
+ *
  */
 public class FragmentedMessage {
     private I2PAppContext _context;
@@ -186,6 +188,11 @@ public class FragmentedMessage {
     public int getCompleteSize() {
         if (!_lastReceived) 
             throw new IllegalStateException("wtf, don't get the completed size when we're not complete");
+        if (_releasedAfter > 0) {
+             RuntimeException e = new RuntimeException("use after free in FragmentedMessage");
+             _log.error("FM completeSize()", e);
+             throw e;
+        }
         int size = 0;
         for (int i = 0; i <= _highFragmentNum; i++) {
             ByteArray ba = _fragments[i];
@@ -203,6 +210,11 @@ public class FragmentedMessage {
     
     
     public void writeComplete(OutputStream out) throws IOException {
+        if (_releasedAfter > 0) {
+             RuntimeException e = new RuntimeException("use after free in FragmentedMessage");
+             _log.error("FM writeComplete()", e);
+             throw e;
+        }
         for (int i = 0; i <= _highFragmentNum; i++) {
             ByteArray ba = _fragments[i];
             out.write(ba.getData(), ba.getOffset(), ba.getValid());
@@ -210,6 +222,11 @@ public class FragmentedMessage {
         _completed = true;
     }
     public void writeComplete(byte target[], int offset) {
+        if (_releasedAfter > 0) {
+             RuntimeException e = new RuntimeException("use after free in FragmentedMessage");
+             _log.error("FM writeComplete() 2", e);
+             throw e;
+        }
         for (int i = 0; i <= _highFragmentNum; i++) {
             ByteArray ba = _fragments[i];
             System.arraycopy(ba.getData(), ba.getOffset(), target, offset, ba.getValid());
@@ -239,6 +256,11 @@ public class FragmentedMessage {
      *
      */
     private void releaseFragments() {
+        if (_releasedAfter > 0) {
+             RuntimeException e = new RuntimeException("double free in FragmentedMessage");
+             _log.error("FM releaseFragments()", e);
+             throw e;
+        }
         _releasedAfter = getLifetime();
         for (int i = 0; i <= _highFragmentNum; i++) {
             ByteArray ba = _fragments[i];
@@ -249,6 +271,7 @@ public class FragmentedMessage {
         }
     }
     
+/****
     public InputStream getInputStream() { return new FragmentInputStream(); }
     private class FragmentInputStream extends InputStream {
         private int _fragment;
@@ -272,6 +295,7 @@ public class FragmentedMessage {
             }
         }
     }
+****/
     
     @Override
     public String toString() {
@@ -282,7 +306,7 @@ public class FragmentedMessage {
             if (ba != null)
                 buf.append(i).append(":").append(ba.getValid()).append(" bytes ");
             else
-                buf.append(i).append(": missing ");
+                buf.append(i).append(":missing ");
         }
         buf.append(" highest received: ").append(_highFragmentNum);
         buf.append(" last received? ").append(_lastReceived);
@@ -299,6 +323,7 @@ public class FragmentedMessage {
         return buf.toString();
     }
     
+/*****
     public static void main(String args[]) {
         try {
             I2PAppContext ctx = I2PAppContext.getGlobalContext();
@@ -325,4 +350,5 @@ public class FragmentedMessage {
             e.printStackTrace();
         }
     }
+******/
 }
diff --git a/router/java/src/net/i2p/router/tunnel/HashSetIVValidator.java b/router/java/src/net/i2p/router/tunnel/HashSetIVValidator.java
index 0dbbe246883604f66b11037284f432b505c80fc2..e7022b55e2bbe49e87c9c713ae1046f18cb38501 100644
--- a/router/java/src/net/i2p/router/tunnel/HashSetIVValidator.java
+++ b/router/java/src/net/i2p/router/tunnel/HashSetIVValidator.java
@@ -8,6 +8,8 @@ import net.i2p.util.ConcurrentHashSet;
 
 /** 
  * waste lots of RAM 
+ *
+ * @deprecated unused
  */
 class HashSetIVValidator implements IVValidator {
     private final Set<ByteArray> _received;
diff --git a/router/java/src/net/i2p/router/tunnel/HopProcessor.java b/router/java/src/net/i2p/router/tunnel/HopProcessor.java
index f70cc111979df0ac63b8a03fc6fd070d2a040788..205339d7f4076f1556aaf30178a9d91dfc3bd991 100644
--- a/router/java/src/net/i2p/router/tunnel/HopProcessor.java
+++ b/router/java/src/net/i2p/router/tunnel/HopProcessor.java
@@ -32,9 +32,11 @@ public class HopProcessor {
     static final int IV_LENGTH = 16;
     private static final ByteCache _cache = ByteCache.getInstance(128, IV_LENGTH);
     
+    /** @deprecated unused */
     public HopProcessor(I2PAppContext ctx, HopConfig config) {
         this(ctx, config, createValidator());
     }
+
     public HopProcessor(I2PAppContext ctx, HopConfig config, IVValidator validator) {
         _context = ctx;
         _log = ctx.logManager().getLog(HopProcessor.class);
@@ -42,6 +44,7 @@ public class HopProcessor {
         _validator = validator;
     }
     
+    /** @deprecated unused */
     protected static IVValidator createValidator() { 
         // yeah, we'll use an O(1) validator later (e.g. bloom filter)
         return new HashSetIVValidator();
@@ -88,10 +91,10 @@ public class HopProcessor {
             encrypt(orig, offset, length);
             updateIV(orig, offset);
         }
-        if (_log.shouldLog(Log.DEBUG)) {
+        //if (_log.shouldLog(Log.DEBUG)) {
             //_log.debug("Data after processing: " + Base64.encode(orig, IV_LENGTH, orig.length - IV_LENGTH));
             //_log.debug("IV sent: " + Base64.encode(orig, 0, IV_LENGTH));
-        }
+        //}
         return true;
     }
     
diff --git a/router/java/src/net/i2p/router/tunnel/InboundEndpointProcessor.java b/router/java/src/net/i2p/router/tunnel/InboundEndpointProcessor.java
index 6c572cb426ab90bc7267bbf785d547f8a9017311..7376a5046692207b666f6edccbe3d70c34c9af9f 100644
--- a/router/java/src/net/i2p/router/tunnel/InboundEndpointProcessor.java
+++ b/router/java/src/net/i2p/router/tunnel/InboundEndpointProcessor.java
@@ -1,6 +1,5 @@
 package net.i2p.router.tunnel;
 
-import net.i2p.I2PAppContext;
 import net.i2p.data.ByteArray;
 import net.i2p.data.Hash;
 import net.i2p.router.RouterContext;
@@ -16,7 +15,7 @@ import net.i2p.util.Log;
  *
  */
 public class InboundEndpointProcessor {
-    private I2PAppContext _context;
+    private RouterContext _context;
     private Log _log;
     private TunnelCreatorConfig _config;
     private IVValidator _validator;    
@@ -24,10 +23,10 @@ public class InboundEndpointProcessor {
     static final boolean USE_ENCRYPTION = HopProcessor.USE_ENCRYPTION;
     private static final ByteCache _cache = ByteCache.getInstance(128, HopProcessor.IV_LENGTH);
     
-    public InboundEndpointProcessor(I2PAppContext ctx, TunnelCreatorConfig cfg) {
+    public InboundEndpointProcessor(RouterContext ctx, TunnelCreatorConfig cfg) {
         this(ctx, cfg, DummyValidator.getInstance());
     }
-    public InboundEndpointProcessor(I2PAppContext ctx, TunnelCreatorConfig cfg, IVValidator validator) {
+    public InboundEndpointProcessor(RouterContext ctx, TunnelCreatorConfig cfg, IVValidator validator) {
         _context = ctx;
         _log = ctx.logManager().getLog(InboundEndpointProcessor.class);
         _config = cfg;
@@ -73,23 +72,19 @@ public class InboundEndpointProcessor {
         
         _cache.release(ba);
         
-        // now for a little bookkeeping
-        RouterContext ctx = null;
-        if (_context instanceof RouterContext)
-            ctx = (RouterContext)_context;
-        if ( (ctx != null) && (_config.getLength() > 0) ) {
+        if (_config.getLength() > 0) {
             int rtt = 0; // dunno... may not be related to an rtt
             if (_log.shouldLog(Log.DEBUG))
                 _log.debug("Received a " + length + "byte message through tunnel " + _config);
             for (int i = 0; i < _config.getLength(); i++)
-                ctx.profileManager().tunnelDataPushed(_config.getPeer(i), rtt, length);
+                _context.profileManager().tunnelDataPushed(_config.getPeer(i), rtt, length);
             _config.incrementVerifiedBytesTransferred(length);
         }
         
         return true;
     }
     
-    private void decrypt(I2PAppContext ctx, TunnelCreatorConfig cfg, byte iv[], byte orig[], int offset, int length) {
+    private void decrypt(RouterContext ctx, TunnelCreatorConfig cfg, byte iv[], byte orig[], int offset, int length) {
         Log log = ctx.logManager().getLog(OutboundGatewayProcessor.class);
         ByteArray ba = _cache.acquire();
         byte cur[] = ba.getData(); // new byte[HopProcessor.IV_LENGTH]; // so we dont malloc
diff --git a/router/java/src/net/i2p/router/tunnel/InboundGatewayReceiver.java b/router/java/src/net/i2p/router/tunnel/InboundGatewayReceiver.java
index 382be541f3b85355393de973f80582debe6a3811..ab39adf8915463b4658434b1677d6753681f6b14 100644
--- a/router/java/src/net/i2p/router/tunnel/InboundGatewayReceiver.java
+++ b/router/java/src/net/i2p/router/tunnel/InboundGatewayReceiver.java
@@ -35,8 +35,9 @@ public class InboundGatewayReceiver implements TunnelGateway.Receiver {
             }
         }
         
-        if (_context.tunnelDispatcher().shouldDropParticipatingMessage("IBGW", encrypted.length))
-            return -1;
+        // We do this before the preprocessor now (i.e. before fragmentation)
+        //if (_context.tunnelDispatcher().shouldDropParticipatingMessage("IBGW", encrypted.length))
+        //    return -1;
         _config.incrementSentMessages();
         TunnelDataMessage msg = new TunnelDataMessage(_context);
         msg.setData(encrypted);
diff --git a/router/java/src/net/i2p/router/tunnel/InboundSender.java b/router/java/src/net/i2p/router/tunnel/InboundSender.java
index 1fd1b915d30edd1367e0b42d009c3e5ca603d042..14c911f9367ba3e7dffa9f81a1deb5884c7c8dbc 100644
--- a/router/java/src/net/i2p/router/tunnel/InboundSender.java
+++ b/router/java/src/net/i2p/router/tunnel/InboundSender.java
@@ -1,7 +1,6 @@
 package net.i2p.router.tunnel;
 
 import net.i2p.I2PAppContext;
-import net.i2p.util.Log;
 
 /**
  * Receive the preprocessed data for an inbound gateway, encrypt it, and forward
@@ -9,16 +8,12 @@ import net.i2p.util.Log;
  *
  */
 public class InboundSender implements TunnelGateway.Sender {
-    private I2PAppContext _context;
-    private Log _log;
     private InboundGatewayProcessor _processor;
     
     static final boolean USE_ENCRYPTION = HopProcessor.USE_ENCRYPTION;
     
     public InboundSender(I2PAppContext ctx, HopConfig config) {
-        _context = ctx;
-        _log = ctx.logManager().getLog(InboundSender.class);
-        _processor = new InboundGatewayProcessor(_context, config);
+        _processor = new InboundGatewayProcessor(ctx, config);
     }
     
     public long sendPreprocessed(byte[] preprocessed, TunnelGateway.Receiver receiver) {
diff --git a/router/java/src/net/i2p/router/tunnel/OutboundTunnelEndpoint.java b/router/java/src/net/i2p/router/tunnel/OutboundTunnelEndpoint.java
index 32e4c2c2ef216af1ba3b84d0cd82da11236652da..7ba086fdcf2ad524d3f35b729dfe026b0d545073 100644
--- a/router/java/src/net/i2p/router/tunnel/OutboundTunnelEndpoint.java
+++ b/router/java/src/net/i2p/router/tunnel/OutboundTunnelEndpoint.java
@@ -30,7 +30,16 @@ public class OutboundTunnelEndpoint {
     }
     public void dispatch(TunnelDataMessage msg, Hash recvFrom) {
         _config.incrementProcessedMessages();
-        _processor.process(msg.getData(), 0, msg.getData().length, recvFrom);
+        boolean ok = _processor.process(msg.getData(), 0, msg.getData().length, recvFrom);
+        if (!ok) {
+            // invalid IV
+            // If we pass it on to the handler, it will fail
+            // If we don't, the data buf won't get released from the cache... that's ok
+            if (_log.shouldLog(Log.WARN))
+                _log.warn("Invalid IV, dropping at OBEP " + _config);
+            _context.statManager().addRateData("tunnel.corruptMessage", 1, 1);
+            return;
+        }
         _handler.receiveTunnelMessage(msg.getData(), 0, msg.getData().length);
     }
     
diff --git a/router/java/src/net/i2p/router/tunnel/PumpedTunnelGateway.java b/router/java/src/net/i2p/router/tunnel/PumpedTunnelGateway.java
index 9364092df5db80e302427e905300879a4de2bfe3..fddb30d2caa27c221212b2896ff8ac4cfbe21046 100644
--- a/router/java/src/net/i2p/router/tunnel/PumpedTunnelGateway.java
+++ b/router/java/src/net/i2p/router/tunnel/PumpedTunnelGateway.java
@@ -3,14 +3,16 @@ package net.i2p.router.tunnel;
 import java.util.ArrayList;
 import java.util.List;
 
-import net.i2p.I2PAppContext;
 import net.i2p.data.Hash;
 import net.i2p.data.TunnelId;
 import net.i2p.data.i2np.I2NPMessage;
 import net.i2p.router.Router;
+import net.i2p.router.RouterContext;
 import net.i2p.util.Log;
 
 /**
+ * This is used for all gateways with more than zero hops.
+ *
  * Serve as the gatekeeper for a tunnel, accepting messages, coallescing and/or
  * fragmenting them before wrapping them up for tunnel delivery. The flow here
  * is: <ol>
@@ -32,7 +34,7 @@ import net.i2p.util.Log;
  *
  */
 public class PumpedTunnelGateway extends TunnelGateway {
-    private final List _prequeue;
+    private final List<Pending> _prequeue;
     private TunnelGatewayPumper _pumper;
     
     /**
@@ -43,7 +45,7 @@ public class PumpedTunnelGateway extends TunnelGateway {
      * @param receiver this receives the encrypted message and forwards it off 
      *                 to the first hop
      */
-    public PumpedTunnelGateway(I2PAppContext context, QueuePreprocessor preprocessor, Sender sender, Receiver receiver, TunnelGatewayPumper pumper) {
+    public PumpedTunnelGateway(RouterContext context, QueuePreprocessor preprocessor, Sender sender, Receiver receiver, TunnelGatewayPumper pumper) {
         super(context, preprocessor, sender, receiver);
         _prequeue = new ArrayList(4);
         _pumper = pumper;
@@ -77,8 +79,11 @@ public class PumpedTunnelGateway extends TunnelGateway {
      * scheduling a later delayed flush as necessary.  this allows the gw.add call to
      * go quickly, rather than blocking its callers on potentially substantial
      * processing.
+     *
+     * @param queueBuf Empty list for convenience, to use as a temporary buffer.
+     *                 Must be empty when called; will always be emptied before return.
      */
-    void pump(List queueBuf) {
+    void pump(List<Pending> queueBuf) {
         synchronized (_prequeue) {
             if (_prequeue.size() > 0) {
                 queueBuf.addAll(_prequeue);
@@ -88,7 +93,7 @@ public class PumpedTunnelGateway extends TunnelGateway {
             }
         }
         long startAdd = System.currentTimeMillis();
-        long beforeLock = System.currentTimeMillis();
+        long beforeLock = startAdd;
         long afterAdded = -1;
         boolean delayedFlush = false;
         long delayAmount = -1;
@@ -108,7 +113,7 @@ public class PumpedTunnelGateway extends TunnelGateway {
             
             // expire any as necessary, even if its framented
             for (int i = 0; i < _queue.size(); i++) {
-                Pending m = (Pending)_queue.get(i);
+                Pending m = _queue.get(i);
                 if (m.getExpiration() + Router.CLOCK_FUDGE_FACTOR < _lastFlush) {
                     if (_log.shouldLog(Log.DEBUG))
                         _log.debug("Expire on the queue (size=" + _queue.size() + "): " + m);
diff --git a/router/java/src/net/i2p/router/tunnel/RouterFragmentHandler.java b/router/java/src/net/i2p/router/tunnel/RouterFragmentHandler.java
index acb4231d27cf6989435576bf33deb744af384268..50b9396bec9260fbe38d08247c82643e7e597db3 100644
--- a/router/java/src/net/i2p/router/tunnel/RouterFragmentHandler.java
+++ b/router/java/src/net/i2p/router/tunnel/RouterFragmentHandler.java
@@ -7,31 +7,27 @@ import net.i2p.util.Log;
  * Minor extension to allow message history integration
  */
 public class RouterFragmentHandler extends FragmentHandler {
-    private RouterContext _routerContext;
-    private Log _log;
     
     public RouterFragmentHandler(RouterContext context, DefragmentedReceiver receiver) {
         super(context, receiver);
-        _routerContext = context;
-        _log = context.logManager().getLog(RouterFragmentHandler.class);
     }
     
     @Override
     protected void noteReception(long messageId, int fragmentId, Object status) {
         if (_log.shouldLog(Log.INFO))
             _log.info("Received fragment " + fragmentId + " for message " + messageId + ": " + status);
-        _routerContext.messageHistory().receiveTunnelFragment(messageId, fragmentId, status);
+        _context.messageHistory().receiveTunnelFragment(messageId, fragmentId, status);
     }
     @Override
     protected void noteCompletion(long messageId) {
         if (_log.shouldLog(Log.INFO))
             _log.info("Received complete message " + messageId);
-        _routerContext.messageHistory().receiveTunnelFragmentComplete(messageId);
+        _context.messageHistory().receiveTunnelFragmentComplete(messageId);
     }
     @Override
     protected void noteFailure(long messageId, String status) {
         if (_log.shouldLog(Log.INFO))
             _log.info("Dropped message " + messageId + ": " + status);
-        _routerContext.messageHistory().droppedFragmentedMessage(messageId, status);
+        _context.messageHistory().droppedFragmentedMessage(messageId, status);
     }
 }
diff --git a/router/java/src/net/i2p/router/tunnel/ThrottledPumpedTunnelGateway.java b/router/java/src/net/i2p/router/tunnel/ThrottledPumpedTunnelGateway.java
new file mode 100644
index 0000000000000000000000000000000000000000..20e86b10f73e75abeffefd16d8355bd03a18e683
--- /dev/null
+++ b/router/java/src/net/i2p/router/tunnel/ThrottledPumpedTunnelGateway.java
@@ -0,0 +1,50 @@
+package net.i2p.router.tunnel;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.i2p.data.Hash;
+import net.i2p.data.TunnelId;
+import net.i2p.data.i2np.I2NPMessage;
+import net.i2p.router.RouterContext;
+
+/**
+ * Same as PTG, but check to see if a message should be dropped before queueing it.
+ * Used for IBGWs.
+ *
+ * @since 0.7.9
+ */
+public class ThrottledPumpedTunnelGateway extends PumpedTunnelGateway {
+    /** saved so we can note messages that get dropped */
+    private HopConfig _config;
+    
+    public ThrottledPumpedTunnelGateway(RouterContext context, QueuePreprocessor preprocessor, Sender sender,
+                                        Receiver receiver, TunnelGatewayPumper pumper, HopConfig config) {
+        super(context, preprocessor, sender, receiver, pumper);
+        _config = config;
+    }
+    
+    /**
+     * Possibly drop a message due to bandwidth before adding it to the preprocessor queue.
+     * We do this here instead of in the InboundGatewayReceiver because it is much smarter to drop
+     * whole I2NP messages, where we know the message type and length, rather than
+     * tunnel messages containing I2NP fragments.
+     */
+    @Override
+    public void add(I2NPMessage msg, Hash toRouter, TunnelId toTunnel) {
+        //_log.error("IBGW count: " + _config.getProcessedMessagesCount() + " type: " + msg.getType() + " size: " + msg.getMessageSize());
+
+        // Hard to do this exactly, but we'll assume 2:1 batching
+        // for the purpose of estimating outgoing size.
+        // We assume that it's the outbound bandwidth that is the issue...
+        int size = Math.max(msg.getMessageSize(), 1024/2);
+        if (_context.tunnelDispatcher().shouldDropParticipatingMessage("IBGW " + msg.getType(), size)) {
+            // this overstates the stat somewhat, but ok for now
+            int kb = (size + 1023) / 1024;
+            for (int i = 0; i < kb; i++)
+                _config.incrementProcessedMessages();
+            return;
+        }
+        super.add(msg, toRouter,toTunnel);
+    }
+}
diff --git a/router/java/src/net/i2p/router/tunnel/TrivialPreprocessor.java b/router/java/src/net/i2p/router/tunnel/TrivialPreprocessor.java
index 4792b14c266bcc66e33e73117288f74dab5d46ad..0e32f0f937549706d97f803945b8aabc95dffc58 100644
--- a/router/java/src/net/i2p/router/tunnel/TrivialPreprocessor.java
+++ b/router/java/src/net/i2p/router/tunnel/TrivialPreprocessor.java
@@ -3,11 +3,11 @@ package net.i2p.router.tunnel;
 import java.util.ArrayList;
 import java.util.List;
 
-import net.i2p.I2PAppContext;
 import net.i2p.data.Base64;
 import net.i2p.data.ByteArray;
 import net.i2p.data.DataHelper;
 import net.i2p.data.Hash;
+import net.i2p.router.RouterContext;
 import net.i2p.util.ByteCache;
 import net.i2p.util.Log;
 
@@ -17,18 +17,27 @@ import net.i2p.util.Log;
  * each of those out.  This does not coallesce message fragments or delay for more
  * optimal throughput.
  *
+ * See FragmentHandler Javadoc for tunnel message fragment format
  */
 public class TrivialPreprocessor implements TunnelGateway.QueuePreprocessor {
-    protected I2PAppContext _context;
-    private Log _log;
+    protected RouterContext _context;
+    protected Log _log;
     
     public static final int PREPROCESSED_SIZE = 1024;
     protected static final int IV_SIZE = HopProcessor.IV_LENGTH;
+
+    /**
+     * Here in tunnels, we take from the cache but never add to it.
+     * In other words, we take advantage of other places in the router also using 1024-byte ByteCaches
+     * (since ByteCache only maintains once instance for each size)
+     * Used in BatchedPreprocessor; see add'l comments there
+     */
     protected static final ByteCache _dataCache = ByteCache.getInstance(32, PREPROCESSED_SIZE);
-    protected static final ByteCache _ivCache = ByteCache.getInstance(128, IV_SIZE);
-    protected static final ByteCache _hashCache = ByteCache.getInstance(128, Hash.HASH_LENGTH);
+
+    private static final ByteCache _ivCache = ByteCache.getInstance(128, IV_SIZE);
+    private static final ByteCache _hashCache = ByteCache.getInstance(128, Hash.HASH_LENGTH);
     
-    public TrivialPreprocessor(I2PAppContext ctx) {
+    public TrivialPreprocessor(RouterContext ctx) {
         _context = ctx;
         _log = ctx.logManager().getLog(TrivialPreprocessor.class);
     }
@@ -40,8 +49,10 @@ public class TrivialPreprocessor implements TunnelGateway.QueuePreprocessor {
      * Return true if there were messages remaining, and we should queue up
      * a delayed flush to clear them
      *
+     * NOTE: Unused here, see BatchedPreprocessor override, super is not called.
      */
-    public boolean preprocessQueue(List pending, TunnelGateway.Sender sender, TunnelGateway.Receiver rec) {
+    public boolean preprocessQueue(List<TunnelGateway.Pending> pending, TunnelGateway.Sender sender, TunnelGateway.Receiver rec) {
+        if (true) throw new IllegalArgumentException("unused, right?");
         long begin = System.currentTimeMillis();
         StringBuilder buf = null;
         if (_log.shouldLog(Log.DEBUG)) {
@@ -49,7 +60,7 @@ public class TrivialPreprocessor implements TunnelGateway.QueuePreprocessor {
             buf.append("Trivial preprocessing of ").append(pending.size()).append(" ");
         }
         while (pending.size() > 0) {
-            TunnelGateway.Pending msg = (TunnelGateway.Pending)pending.remove(0);
+            TunnelGateway.Pending msg = pending.remove(0);
             long beforePreproc = System.currentTimeMillis();
             byte preprocessed[][] = preprocess(msg);
             long afterPreproc = System.currentTimeMillis();
@@ -84,8 +95,11 @@ public class TrivialPreprocessor implements TunnelGateway.QueuePreprocessor {
         return false;
     }
     
-    protected void notePreprocessing(long messageId, int numFragments, int totalLength, List messageIds, String msg) {}
+    protected void notePreprocessing(long messageId, int numFragments, int totalLength, List<Long> messageIds, String msg) {}
     
+    /*
+     * @deprecated unused except by above
+     */
     private byte[][] preprocess(TunnelGateway.Pending msg) {
         List fragments = new ArrayList(1);
 
@@ -109,6 +123,7 @@ public class TrivialPreprocessor implements TunnelGateway.QueuePreprocessor {
      * bytes after the IV, followed by the first 4 bytes of that SHA256, lining up
      * exactly to meet the beginning of the instructions. (i hope)
      *
+     * @deprecated unused except by above
      */
     private byte[] preprocessFragment(TunnelGateway.Pending msg) {
         byte target[] = _dataCache.acquire().getData();
@@ -175,6 +190,8 @@ public class TrivialPreprocessor implements TunnelGateway.QueuePreprocessor {
         //_log.debug("# pad bytes:  " + numPadBytes + " payloadLength: " + payloadLength + " instructions: " + instructionsLength);
 
         int paddingRemaining = numPadBytes;
+        // FIXME inefficient, waste of 3/4 of the entropy
+        // Should get a byte array of random, change all the zeros to something else, and ArrayCopy
         while (paddingRemaining > 0) {
             byte b = (byte)(_context.random().nextInt() & 0xFF);
             if (b != 0x00) {
@@ -196,7 +213,11 @@ public class TrivialPreprocessor implements TunnelGateway.QueuePreprocessor {
     private static final byte MASK_TYPE = FragmentHandler.MASK_TYPE;
     /** is this the first of a fragmented message? */
     private static final byte MASK_FRAGMENTED = FragmentHandler.MASK_FRAGMENTED;
-    /** are there follow up headers? */
+
+    /**
+     *  are there follow up headers?
+     *  @deprecated unimplemented
+     */
     private static final byte MASK_EXTENDED = FragmentHandler.MASK_EXTENDED;
     private static final byte MASK_TUNNEL = (byte)(FragmentHandler.TYPE_TUNNEL << 5);
     private static final byte MASK_ROUTER = (byte)(FragmentHandler.TYPE_ROUTER << 5);
@@ -311,19 +332,30 @@ public class TrivialPreprocessor implements TunnelGateway.QueuePreprocessor {
         return offset;
     }
 
+    /**
+     *  @return generally 3 or 35 or 39 for first fragment, 7 for subsequent fragments.
+     *
+     *  Does NOT include 4 for the message ID if the message will be fragmented;
+     *  call getInstructionAugmentationSize() for that.
+     */
     protected int getInstructionsSize(TunnelGateway.Pending msg) {
         if (msg.getFragmentNumber() > 0) 
             return 7;
+        // control byte
         int header = 1;
+        // tunnel ID
         if (msg.getToTunnel() != null)
             header += 4;
+        // router hash
         if (msg.getToRouter() != null)
             header += 32;
+        // size
         header += 2;
         
         return header;
     }
     
+    /** @return 0 or 4 */
     protected int getInstructionAugmentationSize(TunnelGateway.Pending msg, int offset, int instructionsSize) {
         int payloadLength = msg.getData().length - msg.getOffset();
         if (offset + payloadLength + instructionsSize + IV_SIZE + 1 + 4 > PREPROCESSED_SIZE) {
diff --git a/router/java/src/net/i2p/router/tunnel/TrivialRouterPreprocessor.java b/router/java/src/net/i2p/router/tunnel/TrivialRouterPreprocessor.java
index ad7322cb61f54a6d5dd3268144f682c98e8ca793..6ddf636e4f77a5e766dafeafdb22e3cf8bd07b0d 100644
--- a/router/java/src/net/i2p/router/tunnel/TrivialRouterPreprocessor.java
+++ b/router/java/src/net/i2p/router/tunnel/TrivialRouterPreprocessor.java
@@ -7,6 +7,7 @@ import net.i2p.router.RouterContext;
 /** 
  * Minor extension to track fragmentation
  *
+ * @deprecated unused
  */
 public class TrivialRouterPreprocessor extends TrivialPreprocessor {
     private RouterContext _routerContext;
@@ -16,7 +17,7 @@ public class TrivialRouterPreprocessor extends TrivialPreprocessor {
         _routerContext = ctx;
     }
 
-    protected void notePreprocessing(long messageId, int numFragments, int totalLength, List messageIds) {
+    protected void notePreprocessing(long messageId, int numFragments, int totalLength, List<Long> messageIds) {
         _routerContext.messageHistory().fragmentMessage(messageId, numFragments, totalLength, messageIds, null);
     }
 }
diff --git a/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java b/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java
index 681dadec100e517e05d23b4b9c71512bee1e12d6..05721d0fbeab61f2cb78672d3222ef2e0110187f 100644
--- a/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java
+++ b/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java
@@ -131,17 +131,20 @@ public class TunnelDispatcher implements Service {
                                          new long[] { 60*1000l, 10*60*1000l, 60*60*1000l });
     }
 
+    /** for IBGW */
     private TunnelGateway.QueuePreprocessor createPreprocessor(HopConfig cfg) {
-        if (true)
+        //if (true)
             return new BatchedRouterPreprocessor(_context, cfg); 
-        else
-            return new TrivialRouterPreprocessor(_context); 
+        //else
+        //    return new TrivialRouterPreprocessor(_context); 
     }
+
+    /** for OBGW */
     private TunnelGateway.QueuePreprocessor createPreprocessor(TunnelCreatorConfig cfg) {
-        if (true)
+        //if (true)
             return new BatchedRouterPreprocessor(_context, cfg); 
-        else
-            return new TrivialRouterPreprocessor(_context); 
+        //else
+        //    return new TrivialRouterPreprocessor(_context); 
     }
     
     /**
@@ -237,7 +240,7 @@ public class TunnelDispatcher implements Service {
         TunnelGateway.Sender sender = new InboundSender(_context, cfg);
         TunnelGateway.Receiver receiver = new InboundGatewayReceiver(_context, cfg);
         //TunnelGateway gw = new TunnelGateway(_context, preproc, sender, receiver);
-        TunnelGateway gw = new PumpedTunnelGateway(_context, preproc, sender, receiver, _pumper);
+        TunnelGateway gw = new ThrottledPumpedTunnelGateway(_context, preproc, sender, receiver, _pumper, cfg);
         TunnelId recvId = cfg.getReceiveTunnel();
         _inboundGateways.put(recvId, gw);
         _participatingConfig.put(recvId, cfg);
@@ -605,12 +608,17 @@ public class TunnelDispatcher implements Service {
         if (pctDrop <= 0)
             return false;
         // increase the drop probability for OBEP,
+        // (except lower it for tunnel build messages (type 21)),
         // and lower it for IBGW, for network efficiency
         double len = length;
-        if (type.startsWith("OBEP"))
-            len *= 1.5;
-        else if (type.startsWith("IBGW"))
+        if (type.startsWith("OBEP")) {
+            if (type.equals("OBEP 21"))
+                len /= 1.5;
+            else
+                len *= 1.5;
+        } else if (type.startsWith("IBGW")) {
             len /= 1.5;
+        }
         // drop in proportion to size w.r.t. a standard 1024-byte message
         // this is a little expensive but we want to adjust the curve between 0 and 1
         // Most messages are 1024, only at the OBEP do we see other sizes
diff --git a/router/java/src/net/i2p/router/tunnel/TunnelGateway.java b/router/java/src/net/i2p/router/tunnel/TunnelGateway.java
index 40c935e795de58a985b6aa02ea3d8935dc35e72f..bf093f7a261965a1ede21a74b36bc8e8aed73f1a 100644
--- a/router/java/src/net/i2p/router/tunnel/TunnelGateway.java
+++ b/router/java/src/net/i2p/router/tunnel/TunnelGateway.java
@@ -3,12 +3,12 @@ package net.i2p.router.tunnel;
 import java.util.ArrayList;
 import java.util.List;
 
-import net.i2p.I2PAppContext;
 import net.i2p.data.Hash;
 import net.i2p.data.TunnelId;
 import net.i2p.data.i2np.I2NPMessage;
 import net.i2p.data.i2np.TunnelGatewayMessage;
 import net.i2p.router.Router;
+import net.i2p.router.RouterContext;
 import net.i2p.util.Log;
 import net.i2p.util.SimpleTimer;
 
@@ -34,9 +34,9 @@ import net.i2p.util.SimpleTimer;
  *
  */
 public class TunnelGateway {
-    protected I2PAppContext _context;
+    protected RouterContext _context;
     protected Log _log;
-    protected final List _queue;
+    protected final List<Pending> _queue;
     protected QueuePreprocessor _preprocessor;
     protected Sender _sender;
     protected Receiver _receiver;
@@ -53,7 +53,7 @@ public class TunnelGateway {
      * @param receiver this receives the encrypted message and forwards it off 
      *                 to the first hop
      */
-    public TunnelGateway(I2PAppContext context, QueuePreprocessor preprocessor, Sender sender, Receiver receiver) {
+    public TunnelGateway(RouterContext context, QueuePreprocessor preprocessor, Sender sender, Receiver receiver) {
         _context = context;
         _log = context.logManager().getLog(getClass());
         _queue = new ArrayList(4);
@@ -110,7 +110,7 @@ public class TunnelGateway {
             
             // expire any as necessary, even if its framented
             for (int i = 0; i < _queue.size(); i++) {
-                Pending m = (Pending)_queue.get(i);
+                Pending m = _queue.get(i);
                 if (m.getExpiration() + Router.CLOCK_FUDGE_FACTOR < _lastFlush) {
                     if (_log.shouldLog(Log.DEBUG))
                         _log.debug("Expire on the queue (size=" + _queue.size() + "): " + m);
@@ -154,12 +154,18 @@ public class TunnelGateway {
         
     public interface QueuePreprocessor {
         /** 
+         * Caller must synchronize on the list!
+         *
          * @param pending list of Pending objects for messages either unsent
          *                or partly sent.  This list should be update with any
          *                values removed (the preprocessor owns the lock)
+         *                Messages are not removed from the list until actually sent.
+         *                The status of unsent and partially-sent messages is stored in
+         *                the Pending structure.
+         *
          * @return true if we should delay before preprocessing again 
          */
-        public boolean preprocessQueue(List pending, Sender sender, Receiver receiver);
+        public boolean preprocessQueue(List<Pending> pending, Sender sender, Receiver receiver);
         
         /** how long do we want to wait before flushing */
         public long getDelayAmount();
@@ -173,6 +179,9 @@ public class TunnelGateway {
         public long receiveEncrypted(byte encrypted[]);
     }
     
+    /**
+     *  Stores all the state for an unsent or partially-sent message
+     */
     public static class Pending {
         protected Hash _toRouter;
         protected TunnelId _toTunnel;
@@ -182,7 +191,7 @@ public class TunnelGateway {
         protected int _offset;
         protected int _fragmentNumber;
         protected long _created;
-        private List _messageIds;
+        private List<Long> _messageIds;
         
         public Pending(I2NPMessage message, Hash toRouter, TunnelId toTunnel) { 
             this(message, toRouter, toTunnel, System.currentTimeMillis()); 
@@ -215,6 +224,10 @@ public class TunnelGateway {
         public int getFragmentNumber() { return _fragmentNumber; }
         /** ok, fragment sent, increment what the next will be */
         public void incrementFragmentNumber() { _fragmentNumber++; }
+        /**
+         *  Add an ID to the list of the TunnelDataMssages this message was fragmented into.
+         *  Unused except in notePreprocessing() calls for debugging
+         */
         public void addMessageId(long id) { 
             synchronized (Pending.this) {
                 if (_messageIds == null)
@@ -222,7 +235,11 @@ public class TunnelGateway {
                 _messageIds.add(new Long(id));
             }
         }
-        public List getMessageIds() { 
+        /**
+         *  The IDs of the TunnelDataMssages this message was fragmented into.
+         *  Unused except in notePreprocessing() calls for debugging
+         */
+        public List<Long> getMessageIds() { 
             synchronized (Pending.this) { 
                 if (_messageIds != null)
                     return new ArrayList(_messageIds); 
@@ -231,6 +248,8 @@ public class TunnelGateway {
             } 
         }
     }
+
+    /** Extend for debugging */
     class PendingImpl extends Pending {
         public PendingImpl(I2NPMessage message, Hash toRouter, TunnelId toTunnel) {
             super(message, toRouter, toTunnel, _context.clock().now());
@@ -269,11 +288,11 @@ public class TunnelGateway {
             long beforeLock = _context.clock().now();
             long afterChecked = -1;
             long delayAmount = -1;
-            if (_queue.size() > 10000) // stay out of the synchronized block
-                System.out.println("foo!");
+            //if (_queue.size() > 10000) // stay out of the synchronized block
+            //    System.out.println("foo!");
             synchronized (_queue) {
-                if (_queue.size() > 10000) // stay in the synchronized block
-                    System.out.println("foo!");
+                //if (_queue.size() > 10000) // stay in the synchronized block
+                //    System.out.println("foo!");
                 afterChecked = _context.clock().now();
                 if (_queue.size() > 0) {
                     if ( (remaining > 0) && (_log.shouldLog(Log.DEBUG)) )
diff --git a/router/java/src/net/i2p/router/tunnel/TunnelGatewayPumper.java b/router/java/src/net/i2p/router/tunnel/TunnelGatewayPumper.java
index b840dad287bb154f7854697ed292dc95aafd62f0..2050864726c34a32bacb99098daf1a98ba29b97a 100644
--- a/router/java/src/net/i2p/router/tunnel/TunnelGatewayPumper.java
+++ b/router/java/src/net/i2p/router/tunnel/TunnelGatewayPumper.java
@@ -5,7 +5,6 @@ import java.util.List;
 
 import net.i2p.router.RouterContext;
 import net.i2p.util.I2PThread;
-import net.i2p.util.Log;
 
 /**
  * run through the tunnel gateways that have had messages added to them and push
@@ -13,14 +12,12 @@ import net.i2p.util.Log;
  */
 public class TunnelGatewayPumper implements Runnable {
     private RouterContext _context;
-    private Log _log;
-    private final List _wantsPumping;
+    private final List<PumpedTunnelGateway> _wantsPumping;
     private boolean _stop;
     
     /** Creates a new instance of TunnelGatewayPumper */
     public TunnelGatewayPumper(RouterContext ctx) {
         _context = ctx;
-        _log = ctx.logManager().getLog(getClass());
         _wantsPumping = new ArrayList(64);
         _stop = false;
         for (int i = 0; i < 4; i++)
@@ -40,12 +37,12 @@ public class TunnelGatewayPumper implements Runnable {
     
     public void run() {
         PumpedTunnelGateway gw = null;
-        List queueBuf = new ArrayList(32);
+        List<TunnelGateway.Pending> queueBuf = new ArrayList(32);
         while (!_stop) {
             try {
                 synchronized (_wantsPumping) {
                     if (_wantsPumping.size() > 0)
-                        gw = (PumpedTunnelGateway)_wantsPumping.remove(0);
+                        gw = _wantsPumping.remove(0);
                     else
                         _wantsPumping.wait();
                 }
diff --git a/router/java/src/net/i2p/router/tunnel/TunnelParticipant.java b/router/java/src/net/i2p/router/tunnel/TunnelParticipant.java
index a73208e3bb49a1060bd2c967f1ac668befed4667..54f22ce1c985c9e54253e8661aef803538be9987 100644
--- a/router/java/src/net/i2p/router/tunnel/TunnelParticipant.java
+++ b/router/java/src/net/i2p/router/tunnel/TunnelParticipant.java
@@ -71,6 +71,9 @@ public class TunnelParticipant {
             if (_log.shouldLog(Log.WARN))
                 _log.warn("Failed to dispatch " + msg + ": processor=" + _processor 
                            + " inboundEndpoint=" + _inboundEndpointProcessor);
+            if (_config != null)
+                _config.incrementProcessedMessages();
+            _context.statManager().addRateData("tunnel.corruptMessage", 1, 1);
             return;
         }
         
@@ -101,8 +104,11 @@ public class TunnelParticipant {
         }
     }
     
+/****
     private int _periodMessagesTransferred;
     private long _lastCoallesced = System.currentTimeMillis();
+****/
+
     /** 
      * take note that the peers specified were able to push us data.  hmm, is this safe?
      * this could be easily gamed to get us to rank some peer of their choosing as quite
diff --git a/router/java/src/net/i2p/router/tunnel/pool/BuildExecutor.java b/router/java/src/net/i2p/router/tunnel/pool/BuildExecutor.java
index 24a41c6f80c929fc36f309575006cca13fa957a3..5e4456490f201bf51ef2e2f7b1aea631243ee0de 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/BuildExecutor.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/BuildExecutor.java
@@ -2,6 +2,7 @@ package net.i2p.router.tunnel.pool;
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
 
 import net.i2p.data.Hash;
@@ -19,23 +20,25 @@ import net.i2p.util.Log;
  * it waits for a short period before looping again (or until it is told that something
  * changed, such as a tunnel failed, new client started up, or tunnel creation was aborted).
  *
+ * Note that 10 minute tunnel expiration is hardcoded in here.
  */
 class BuildExecutor implements Runnable {
-    private final List _recentBuildIds = new ArrayList(100);
+    private final ArrayList<Long> _recentBuildIds = new ArrayList(100);
     private RouterContext _context;
     private Log _log;
     private TunnelPoolManager _manager;
     /** list of TunnelCreatorConfig elements of tunnels currently being built */
-    private final List _currentlyBuilding;
+    private final List<PooledTunnelCreatorConfig> _currentlyBuilding;
     private boolean _isRunning;
     private BuildHandler _handler;
     private boolean _repoll;
+    private static final int MAX_CONCURRENT_BUILDS = 10;
 
     public BuildExecutor(RouterContext ctx, TunnelPoolManager mgr) {
         _context = ctx;
         _log = ctx.logManager().getLog(getClass());
         _manager = mgr;
-        _currentlyBuilding = new ArrayList(10);
+        _currentlyBuilding = new ArrayList(MAX_CONCURRENT_BUILDS);
         _context.statManager().createRateStat("tunnel.concurrentBuilds", "How many builds are going at once", "Tunnels", new long[] { 60*1000, 5*60*1000, 60*60*1000 });
         _context.statManager().createRateStat("tunnel.concurrentBuildsLagged", "How many builds are going at once when we reject further builds, due to job lag (period is lag)", "Tunnels", new long[] { 60*1000, 5*60*1000, 60*60*1000 });
         _context.statManager().createRateStat("tunnel.buildExploratoryExpire", "How often an exploratory tunnel times out during creation", "Tunnels", new long[] { 10*60*1000, 60*60*1000 });
@@ -51,9 +54,7 @@ class BuildExecutor implements Runnable {
 
         // Get stat manager, get recognized bandwidth tiers
         StatManager statMgr = _context.statManager();
-        @SuppressWarnings("static-access")
-        /* FIXME Accessing static field "BW_CAPABILITY_CHARS" FIXME */
-        String bwTiers = _context.router().getRouterInfo().BW_CAPABILITY_CHARS;
+        String bwTiers = RouterInfo.BW_CAPABILITY_CHARS;
         // For each bandwidth tier, create tunnel build agree/reject/expire stats
         for (int i = 0; i < bwTiers.length(); i++) {
             String bwTier = String.valueOf(bwTiers.charAt(i));
@@ -74,16 +75,17 @@ class BuildExecutor implements Runnable {
         int maxKBps = _context.bandwidthLimiter().getOutboundKBytesPerSecond();
         int allowed = maxKBps / 6; // Max. 1 concurrent build per 6 KB/s outbound
         if (allowed < 2) allowed = 2; // Never choke below 2 builds (but congestion may)
-        if (allowed > 10) allowed = 10; // Never go beyond 10, that is uncharted territory (old limit was 5)
+        if (allowed > MAX_CONCURRENT_BUILDS) allowed = MAX_CONCURRENT_BUILDS; // Never go beyond 10, that is uncharted territory (old limit was 5)
         allowed = _context.getProperty("router.tunnelConcurrentBuilds", allowed);
 
-        List expired = null;
+        List<PooledTunnelCreatorConfig> expired = null;
         int concurrent = 0;
+        // Todo: Make expiration variable
         long expireBefore = _context.clock().now() + 10*60*1000 - BuildRequestor.REQUEST_TIMEOUT;
         synchronized (_currentlyBuilding) {
             // expire any old requests
             for (int i = 0; i < _currentlyBuilding.size(); i++) {
-                TunnelCreatorConfig cfg = (TunnelCreatorConfig)_currentlyBuilding.get(i);
+                PooledTunnelCreatorConfig cfg = _currentlyBuilding.get(i);
                 if (cfg.getExpiration() <= expireBefore) {
                     _currentlyBuilding.remove(i);
                     i--;
@@ -98,7 +100,7 @@ class BuildExecutor implements Runnable {
         
         if (expired != null) {
             for (int i = 0; i < expired.size(); i++) {
-                PooledTunnelCreatorConfig cfg = (PooledTunnelCreatorConfig)expired.get(i);
+                PooledTunnelCreatorConfig cfg = expired.get(i);
                 if (_log.shouldLog(Log.INFO))
                     _log.info("Timed out waiting for reply asking for " + cfg);
 
@@ -220,8 +222,8 @@ class BuildExecutor implements Runnable {
 
     public void run() {
         _isRunning = true;
-        List wanted = new ArrayList(8);
-        List pools = new ArrayList(8);
+        List<TunnelPool> wanted = new ArrayList(MAX_CONCURRENT_BUILDS);
+        List<TunnelPool> pools = new ArrayList(8);
         
         int pendingRemaining = 0;
         
@@ -238,7 +240,7 @@ class BuildExecutor implements Runnable {
                 _repoll = pendingRemaining > 0; // resets repoll to false unless there are inbound requeusts pending
                 _manager.listPools(pools);
                 for (int i = 0; i < pools.size(); i++) {
-                    TunnelPool pool = (TunnelPool)pools.get(i);
+                    TunnelPool pool = pools.get(i);
                     if (!pool.isAlive())
                         continue;
                     int howMany = pool.countHowManyToBuild();
@@ -278,14 +280,15 @@ class BuildExecutor implements Runnable {
                 } else {
                     if ( (allowed > 0) && (wanted.size() > 0) ) {
                         Collections.shuffle(wanted, _context.random());
-                        
+                        Collections.sort(wanted, new TunnelPoolComparator());
+
                         // force the loops to be short, since 3 consecutive tunnel build requests can take
                         // a long, long time
                         if (allowed > 2)
                             allowed = 2;
                         
                         for (int i = 0; (i < allowed) && (wanted.size() > 0); i++) {
-                            TunnelPool pool = (TunnelPool)wanted.remove(0);
+                            TunnelPool pool = wanted.remove(0);
                             //if (pool.countWantedTunnels() <= 0)
                             //    continue;
                             PooledTunnelCreatorConfig cfg = pool.configureNewTunnel();
@@ -360,13 +363,38 @@ class BuildExecutor implements Runnable {
         _isRunning = false;
     }
     
+    /**
+     *  Prioritize the pools for building
+     *  #1: Exploratory
+     *  #2: Pools without tunnels
+     *  #3: Everybody else
+     *
+     *  This prevents a large number of client pools from starving the exploratory pool.
+     *
+     */
+    private static class TunnelPoolComparator implements Comparator {
+        public int compare(Object l, Object r) {
+            TunnelPool tpl = (TunnelPool) l;
+            TunnelPool tpr = (TunnelPool) r;
+            if (tpl.getSettings().isExploratory() && !tpr.getSettings().isExploratory())
+                return -1;
+            if (tpr.getSettings().isExploratory() && !tpl.getSettings().isExploratory())
+                return 1;
+            if (tpl.getTunnelCount() <= 0 && tpr.getTunnelCount() > 0)
+                return -1;
+            if (tpr.getTunnelCount() <= 0 && tpl.getTunnelCount() > 0)
+                return 1;
+            return 0;
+        }
+    }
+
     /**
      * iterate over the 0hop tunnels, running them all inline regardless of how many are allowed
      * @return number of tunnels allowed after processing these zero hop tunnels (almost always the same as before)
      */
-    private int buildZeroHopTunnels(List wanted, int allowed) {
+    private int buildZeroHopTunnels(List<TunnelPool> wanted, int allowed) {
         for (int i = 0; i < wanted.size(); i++) {
-            TunnelPool pool = (TunnelPool)wanted.get(0);
+            TunnelPool pool = wanted.get(0);
             if (pool.getSettings().getLength() == 0) {
                 PooledTunnelCreatorConfig cfg = pool.configureNewTunnel();
                 if (cfg != null) {
@@ -403,8 +431,11 @@ class BuildExecutor implements Runnable {
         long id = cfg.getReplyMessageId();
         if (id > 0) {
             synchronized (_recentBuildIds) { 
-                while (_recentBuildIds.size() > 64)
-                    _recentBuildIds.remove(0);
+                // every so often, shrink the list semi-efficiently
+                if (_recentBuildIds.size() > 98) {
+                    for (int i = 0; i < 32; i++)
+                        _recentBuildIds.remove(0);
+                }
                 _recentBuildIds.add(new Long(id));
             }
         }
diff --git a/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java b/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java
index 465f21e33b5dccef54576d88d3b2ec97ce97747e..971b20a5455487dc6dee0b9984c7181d2ae99b53 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java
@@ -30,6 +30,8 @@ import net.i2p.stat.RateStat;
 import net.i2p.util.Log;
 
 /**
+ *
+ * Note that 10 minute tunnel expiration is hardcoded in here.
  *
  */
 class BuildHandler {
@@ -39,20 +41,27 @@ class BuildHandler {
     private Job _buildMessageHandlerJob;
     private Job _buildReplyMessageHandlerJob;
     /** list of BuildMessageState, oldest first */
-    private final List _inboundBuildMessages;
-    /** list of BuildReplyMessageState, oldest first */
-    private final List _inboundBuildReplyMessages;
-    /** list of BuildEndMessageState, oldest first */
-    private final List _inboundBuildEndMessages;
+    private final List<BuildMessageState> _inboundBuildMessages;
+    /** list of BuildReplyMessageState, oldest first - unused unless HANDLE_REPLIES_INLINE == false */
+    private final List<BuildReplyMessageState> _inboundBuildReplyMessages;
+    /** list of BuildEndMessageState, oldest first - unused unless HANDLE_REPLIES_INLINE == false */
+    private final List<BuildEndMessageState> _inboundBuildEndMessages;
     private BuildMessageProcessor _processor;
+
+    private static final boolean HANDLE_REPLIES_INLINE = true;
     
     public BuildHandler(RouterContext ctx, BuildExecutor exec) {
         _context = ctx;
         _log = ctx.logManager().getLog(getClass());
         _exec = exec;
         _inboundBuildMessages = new ArrayList(16);
-        _inboundBuildReplyMessages = new ArrayList(16);
-        _inboundBuildEndMessages = new ArrayList(16);
+        if (HANDLE_REPLIES_INLINE) {
+            _inboundBuildEndMessages = null;
+            _inboundBuildReplyMessages = null;
+        } else {
+            _inboundBuildEndMessages = new ArrayList(16);
+            _inboundBuildReplyMessages = new ArrayList(16);
+        }
     
         _context.statManager().createRateStat("tunnel.reject.10", "How often we reject a tunnel probabalistically", "Tunnels", new long[] { 60*1000, 10*60*1000 });
         _context.statManager().createRateStat("tunnel.reject.20", "How often we reject a tunnel because of transient overload", "Tunnels", new long[] { 60*1000, 10*60*1000 });
@@ -104,10 +113,10 @@ class BuildHandler {
                 if (toHandle > MAX_HANDLE_AT_ONCE)
                     toHandle = MAX_HANDLE_AT_ONCE;
                 handled = new ArrayList(toHandle);
-                if (false) {
-                    for (int i = 0; i < toHandle; i++) // LIFO for lower response time (should we RED it for DoS?)
-                        handled.add(_inboundBuildMessages.remove(_inboundBuildMessages.size()-1));
-                } else {
+                //if (false) {
+                //    for (int i = 0; i < toHandle; i++) // LIFO for lower response time (should we RED it for DoS?)
+                //        handled.add(_inboundBuildMessages.remove(_inboundBuildMessages.size()-1));
+                //} else {
                     // drop any expired messages
                     long dropBefore = System.currentTimeMillis() - (BuildRequestor.REQUEST_TIMEOUT/4);
                     do {
@@ -131,7 +140,7 @@ class BuildHandler {
                     // when adding)
                     for (int i = 0; i < toHandle && _inboundBuildMessages.size() > 0; i++)
                         handled.add(_inboundBuildMessages.remove(0));
-                }
+                //}
             }
             remaining = _inboundBuildMessages.size();
         }
@@ -148,14 +157,16 @@ class BuildHandler {
             }
             handled.clear();
         }
-        synchronized (_inboundBuildEndMessages) {
-            int toHandle = _inboundBuildEndMessages.size();
-            if (toHandle > 0) {
-                if (handled == null)
-                    handled = new ArrayList(_inboundBuildEndMessages);
-                else
-                    handled.addAll(_inboundBuildEndMessages);
-                _inboundBuildEndMessages.clear();
+        if (!HANDLE_REPLIES_INLINE) {
+            synchronized (_inboundBuildEndMessages) {
+                int toHandle = _inboundBuildEndMessages.size();
+                if (toHandle > 0) {
+                    if (handled == null)
+                        handled = new ArrayList(_inboundBuildEndMessages);
+                    else
+                        handled.addAll(_inboundBuildEndMessages);
+                    _inboundBuildEndMessages.clear();
+                }
             }
         }
         if (handled != null) {
@@ -181,7 +192,10 @@ class BuildHandler {
         return remaining;
     }
     
+    /** Warning - noop if HANDLE_REPLIES_INLINE == true */
     void handleInboundReplies() {
+        if (HANDLE_REPLIES_INLINE)
+            return;
         List handled = null;
         synchronized (_inboundBuildReplyMessages) {
             int toHandle = _inboundBuildReplyMessages.size();
@@ -236,8 +250,8 @@ class BuildHandler {
     private void handleReply(TunnelBuildReplyMessage msg, PooledTunnelCreatorConfig cfg, long delay) {
         long requestedOn = cfg.getExpiration() - 10*60*1000;
         long rtt = _context.clock().now() - requestedOn;
-        if (_log.shouldLog(Log.DEBUG))
-            _log.debug(msg.getUniqueId() + ": Handling the reply after " + rtt + ", delayed " + delay + " waiting for " + cfg);
+        if (_log.shouldLog(Log.INFO))
+            _log.info(msg.getUniqueId() + ": Handling the reply after " + rtt + ", delayed " + delay + " waiting for " + cfg);
         
         BuildReplyHandler handler = new BuildReplyHandler();
         List order = cfg.getReplyOrder();
@@ -468,6 +482,14 @@ class BuildHandler {
         return 0;
     }
     
+    /**
+     *  Actually process the request and send the reply.
+     *
+     *  Todo: Replies are not subject to RED for bandwidth reasons,
+     *  and the bandwidth is not credited to any tunnel.
+     *  If we did credit the reply to the tunnel, it would
+     *  prevent the classification of the tunnel as 'inactive' on tunnels.jsp.
+     */
     @SuppressWarnings("static-access")
     private void handleReq(RouterInfo nextPeerInfo, BuildMessageState state, BuildRequestRecord req, Hash nextPeer) {
         long ourId = req.readReceiveTunnelId();
@@ -590,8 +612,7 @@ class BuildHandler {
             return;
         }
 
-        BuildResponseRecord resp = new BuildResponseRecord();
-        byte reply[] = resp.create(_context, response, req.readReplyKey(), req.readReplyIV(), state.msg.getUniqueId());
+        byte reply[] = BuildResponseRecord.create(_context, response, req.readReplyKey(), req.readReplyIV(), state.msg.getUniqueId());
         for (int j = 0; j < TunnelBuildMessage.RECORD_COUNT; j++) {
             if (state.msg.getRecord(j) == null) {
                 ourSlot = j;
@@ -663,10 +684,10 @@ class BuildHandler {
         }
     }
     
-    /** um, this is bad.  don't set this. */
-    private static final boolean DROP_ALL_REQUESTS = false;
-    private static final boolean HANDLE_REPLIES_INLINE = true;
-
+    /**
+     *  Handle incoming Tunnel Build Messages, which are generally requests to us,
+     *  but could also be the reply where we are the IBEP.
+     */
     private class TunnelBuildMessageHandlerJobBuilder implements HandlerJobBuilder {
         public Job createJob(I2NPMessage receivedMessage, RouterIdentity from, Hash fromHash) {
             // need to figure out if this is a reply to an inbound tunnel request (where we are the
@@ -704,9 +725,11 @@ class BuildHandler {
                     _exec.repoll();
                 }
             } else {
-                if (DROP_ALL_REQUESTS || _exec.wasRecentlyBuilding(reqId)) {
+                if (_exec.wasRecentlyBuilding(reqId)) {
+                    // we are the IBEP but we already gave up?
                     if (_log.shouldLog(Log.WARN))
                         _log.warn("Dropping the reply " + reqId + ", as we used to be building that");
+                    _context.statManager().addRateData("tunnel.buildReplyTooSlow", 1, 0);
                 } else {
                     synchronized (_inboundBuildMessages) {
                         boolean removed = false;
diff --git a/router/java/src/net/i2p/router/tunnel/pool/BuildRequestor.java b/router/java/src/net/i2p/router/tunnel/pool/BuildRequestor.java
index 21325be85189c68045f0405a60f127decb6db6ec..5340dfa1afd390d59faa92ddc31aa1641079926f 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/BuildRequestor.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/BuildRequestor.java
@@ -29,7 +29,17 @@ class BuildRequestor {
             ORDER.add(Integer.valueOf(i));
     }
     private static final int PRIORITY = 500;
-    static final int REQUEST_TIMEOUT = 10*1000;
+    /**
+     *  At 10 seconds, we were receiving about 20% of replies after expiration
+     *  Todo: make this variable on a per-request basis, to account for tunnel length,
+     *  expl. vs. client, uptime, and network conditions.
+     *  Put the expiration in the PTCC.
+     *
+     *  Also, perhaps, save the PTCC even after expiration for an extended time,
+     *  so can we use a successfully built tunnel anyway.
+     *
+     */
+    static final int REQUEST_TIMEOUT = 13*1000;
     
     private static boolean usePairedTunnels(RouterContext ctx) {
         String val = ctx.getProperty("router.usePairedTunnels");
@@ -109,23 +119,24 @@ class BuildRequestor {
             return;
         }
         
-        cfg.setPairedTunnel(pairedTunnel);
+        //cfg.setPairedTunnel(pairedTunnel);
         
         long beforeDispatch = System.currentTimeMillis();
         if (cfg.isInbound()) {
-            if (log.shouldLog(Log.DEBUG))
-                log.debug("Sending the tunnel build request " + msg.getUniqueId() + " out the tunnel " + pairedTunnel + " to " 
+            if (log.shouldLog(Log.INFO))
+                log.info("Sending the tunnel build request " + msg.getUniqueId() + " out the tunnel " + pairedTunnel + " to " 
                           + cfg.getPeer(0).toBase64() + " for " + cfg + " waiting for the reply of "
                           + cfg.getReplyMessageId());
             // send it out a tunnel targetting the first hop
             ctx.tunnelDispatcher().dispatchOutbound(msg, pairedTunnel.getSendTunnelId(0), cfg.getPeer(0));
         } else {
-            if (log.shouldLog(Log.DEBUG))
-                log.debug("Sending the tunnel build request directly to " + cfg.getPeer(1).toBase64() 
+            if (log.shouldLog(Log.INFO))
+                log.info("Sending the tunnel build request directly to " + cfg.getPeer(1).toBase64() 
                           + " for " + cfg + " waiting for the reply of " + cfg.getReplyMessageId() 
                           + " with msgId=" + msg.getUniqueId());
             // send it directly to the first hop
             OutNetMessage outMsg = new OutNetMessage(ctx);
+            // Todo: add some fuzz to the expiration to make it harder to guess how many hops?
             outMsg.setExpiration(msg.getMessageExpiration());
             outMsg.setMessage(msg);
             outMsg.setPriority(PRIORITY);
@@ -190,7 +201,7 @@ class BuildRequestor {
                 }
             }
             if (log.shouldLog(Log.DEBUG))
-                log.debug(cfg.getReplyMessageId() + ": record " + i + "/" + hop + " has key " + key + " for " + cfg);
+                log.debug(cfg.getReplyMessageId() + ": record " + i + "/" + hop + " has key " + key);
             gen.createRecord(i, hop, msg, cfg, replyRouter, replyTunnel, ctx, key);
         }
         gen.layeredEncrypt(ctx, msg, cfg, order);
diff --git a/router/java/src/net/i2p/router/tunnel/pool/PooledTunnelCreatorConfig.java b/router/java/src/net/i2p/router/tunnel/pool/PooledTunnelCreatorConfig.java
index 3728ebc52da079829ede6b404d8a95b5d7a1b747..afe149fc65254cf645892aca6cc13555cc7d0e5a 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/PooledTunnelCreatorConfig.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/PooledTunnelCreatorConfig.java
@@ -55,6 +55,9 @@ public class PooledTunnelCreatorConfig extends TunnelCreatorConfig {
             // remove us from the pool (but not the dispatcher) so that we aren't 
             // selected again.  _expireJob is left to do its thing, in case there
             // are any straggling messages coming down the tunnel
+            //
+            // Todo: Maybe delay or prevent failing if we are near tunnel build capacity,
+            // to prevent collapse (loss of all tunnels)
             _pool.tunnelFailed(this);
             if (_testJob != null) // just in case...
                 _context.jobQueue().removeJob(_testJob);
@@ -79,11 +82,14 @@ public class PooledTunnelCreatorConfig extends TunnelCreatorConfig {
     public TunnelPool getTunnelPool() { return _pool; }
     
 
-    /* FIXME Exporting non-public type through public API FIXME */
-    public void setTestJob(TestJob job) { _testJob = job; }
+    /** @deprecated unused, which makes _testJob unused - why is it here */
+    void setTestJob(TestJob job) { _testJob = job; }
+    /** does nothing, to be deprecated */
     public void setExpireJob(Job job) { /* _expireJob = job; */ }
     
-    // Fix memory leaks caused by references if you need to use pairedTunnel
+    /**
+     * @deprecated Fix memory leaks caused by references if you need to use pairedTunnel
+     */
     public void setPairedTunnel(TunnelInfo tunnel) { /* _pairedTunnel = tunnel; */}
     // public TunnelInfo getPairedTunnel() { return _pairedTunnel; }
 }
diff --git a/router/java/src/net/i2p/router/tunnel/pool/TunnelPeerSelector.java b/router/java/src/net/i2p/router/tunnel/pool/TunnelPeerSelector.java
index 2cfac2cc4fc9ae4d657b8cd4aa436daab221fb2e..a3b5c4b208bcba94598a1a7b9cb03fdd2f408421 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/TunnelPeerSelector.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/TunnelPeerSelector.java
@@ -491,7 +491,7 @@ public abstract class TunnelPeerSelector {
      *  Now:
      *     d((H(l+h), h) - d(H(r+h), h)
      */
-    private class HashComparator implements Comparator {
+    private static class HashComparator implements Comparator {
         private Hash _hash;
 
         private HashComparator(Hash h) {
diff --git a/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java b/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java
index d879750359ba08992cb4effd9c856040c1dea5f4..bbee14a4840ca9e7175025e0739a7d787052086b 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java
@@ -29,6 +29,8 @@ import net.i2p.stat.RateStat;
 import net.i2p.util.I2PThread;
 import net.i2p.util.Log;
 import net.i2p.util.ObjectCounter;
+import net.i2p.util.SimpleScheduler;
+import net.i2p.util.SimpleTimer;
 
 /**
  * 
@@ -42,7 +44,7 @@ public class TunnelPoolManager implements TunnelManagerFacade {
     private final Map<Hash, TunnelPool> _clientOutboundPools;
     private TunnelPool _inboundExploratory;
     private TunnelPool _outboundExploratory;
-    private BuildExecutor _executor;
+    private final BuildExecutor _executor;
     private boolean _isShutdown;
     
     public TunnelPoolManager(RouterContext ctx) {
@@ -175,7 +177,7 @@ public class TunnelPoolManager implements TunnelManagerFacade {
     public int getOutboundClientTunnelCount() { 
         int count = 0;
         List destinations = null;
-        synchronized (_clientInboundPools) {
+        synchronized (_clientOutboundPools) {
             destinations = new ArrayList(_clientOutboundPools.keySet());
         }
         for (int i = 0; i < destinations.size(); i++) {
@@ -250,6 +252,10 @@ public class TunnelPoolManager implements TunnelManagerFacade {
         startup();
     }
         
+    /**
+     *  Used only at session startup.
+     *  Do not use to change settings.
+     */
     public void buildTunnels(Destination client, ClientTunnelSettings settings) {
         if (_log.shouldLog(Log.DEBUG))
             _log.debug("Building tunnels for the client " + client.calculateHash().toBase64() + ": " + settings);
@@ -259,6 +265,7 @@ public class TunnelPoolManager implements TunnelManagerFacade {
         TunnelPool inbound = null;
         TunnelPool outbound = null;
         // should we share the clientPeerSelector across both inbound and outbound?
+        // or just one for all clients? why separate?
         synchronized (_clientInboundPools) {
             inbound = _clientInboundPools.get(dest);
             if (inbound == null) {
@@ -280,11 +287,22 @@ public class TunnelPoolManager implements TunnelManagerFacade {
             }
         }
         inbound.startup();
-        try { Thread.sleep(3*1000); } catch (InterruptedException ie) {}
-        outbound.startup();
+        SimpleScheduler.getInstance().addEvent(new DelayedStartup(outbound), 3*1000);
     }
     
     
+    private static class DelayedStartup implements SimpleTimer.TimedEvent {
+        private TunnelPool pool;
+
+        public DelayedStartup(TunnelPool p) {
+            this.pool = p;
+        }
+
+        public void timeReached() {
+            this.pool.startup();
+        }
+    }
+
     public void removeTunnels(Hash destination) {
         if (destination == null) return;
         if (_context.clientManager().isLocal(destination)) {
@@ -357,12 +375,11 @@ public class TunnelPoolManager implements TunnelManagerFacade {
         _inboundExploratory = new TunnelPool(_context, this, inboundSettings, selector);
         _inboundExploratory.startup();
         
-        try { Thread.sleep(3*1000); } catch (InterruptedException ie) {}
         TunnelPoolSettings outboundSettings = new TunnelPoolSettings();
         outboundSettings.setIsExploratory(true);
         outboundSettings.setIsInbound(false);
         _outboundExploratory = new TunnelPool(_context, this, outboundSettings, selector);
-        _outboundExploratory.startup();
+        SimpleScheduler.getInstance().addEvent(new DelayedStartup(_outboundExploratory), 3*1000);
         
         // try to build up longer tunnels
         _context.jobQueue().addJob(new BootstrapPool(_context, _inboundExploratory));
diff --git a/router/java/src/net/i2p/router/SubmitMessageHistoryJob.java b/router/java/test/net/i2p/router/SubmitMessageHistoryJob.java
similarity index 100%
rename from router/java/src/net/i2p/router/SubmitMessageHistoryJob.java
rename to router/java/test/net/i2p/router/SubmitMessageHistoryJob.java
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/RouterGenerator.java b/router/java/test/net/i2p/router/networkdb/kademlia/RouterGenerator.java
similarity index 100%
rename from router/java/src/net/i2p/router/networkdb/kademlia/RouterGenerator.java
rename to router/java/test/net/i2p/router/networkdb/kademlia/RouterGenerator.java