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> <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> <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> <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> <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()%>&action=Stop%20all">Stop All</a> <a class="control" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&action=Start%20all">Start All</a> <a class="control" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&action=Restart%20all">Restart All</a> <a class="control" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&action=Reload%20configuration">Reload Config</a> + <a class="control" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&action=Stop%20all"><%=intl._("Stop All")%></a> <a class="control" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&action=Start%20all"><%=intl._("Start All")%></a> <a class="control" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&action=Restart%20all"><%=intl._("Restart All")%></a> <a class="control" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&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()%>&action=stop&tunnel=<%=curServer%>">Stop</a> + %><div class="statusStarting text"><%=intl._("Starting...")%></div> + <a class="control" title="Stop this Tunnel" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&action=stop&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()%>&action=stop&tunnel=<%=curServer%>">Stop</a> + %><div class="statusRunning text"><%=intl._("Running")%></div> + <a class="control" title="Stop this Tunnel" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&action=stop&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()%>&action=start&tunnel=<%=curServer%>">Start</a> + %><div class="statusNotRunning text"><%=intl._("Stopped")%></div> + <a class="control" title="Start this Tunnel" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&action=start&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()%>&action=stop&tunnel=<%=curClient%>">Stop</a> + %><div class="statusStarting text"><%=intl._("Starting...")%></div> + <a class="control" title="Stop this Tunnel" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&action=stop&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()%>&action=stop&tunnel=<%=curClient%>">Stop</a> + %><div class="statusStarting text"><%=intl._("Standby")%></div> + <a class="control" title="Stop this Tunnel" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&action=stop&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()%>&action=stop&tunnel=<%=curClient%>">Stop</a> + %><div class="statusRunning text"><%=intl._("Running")%></div> + <a class="control" title="Stop this Tunnel" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&action=stop&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()%>&action=start&tunnel=<%=curClient%>">Start</a> + %><div class="statusNotRunning text"><%=intl._("Stopped")%></div> + <a class="control" title="Start this Tunnel" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&action=start&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("<", "<").replaceAll(">", ">"); - 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("&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 & 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 & 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("…"); - 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("…\" title=\"").append(_("Leases expired")).append(" ").append(DataHelper.formatDuration(0-timeToExpire)); - buf.append(" ").append(_("ago")).append(". ").append(_("Rebuilding")).append("…\"></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("…"); + 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("…\" title=\"").append(_("Leases expired")).append(" ").append(DataHelper.formatDuration(0-timeToExpire)); + buf.append(" ").append(_("ago")).append(". ").append(_("Rebuilding")).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"); + } } 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("…\" title=\"").append(_("Building tunnels")).append("…\"></td></tr>\n"); } - } else { - // yellow light - buf.append("<td><img src=\"/themes/console/images/local_inprogress.png\" alt=\"").append(_("Building")).append("…\" title=\"").append(_("Building tunnels")).append("…\"></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\"> </td>"); + out.write("<td class=\"cells\"> </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\"> </td>"); + out.write("<td class=\"cells\"> </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\"> </td>"); - out.write(" <td class=\"cells\" align=\"center\"> </td>"); + out.write("<td class=\"cells\"> </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> </td> <td align=\"center\"><b>" + partCount); out.write("</b> <td> </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 & 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 & 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 & 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 & 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 & 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 & 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> </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çais" alt="Franç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>: 这两个站点用于跟踪哪些 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>: 这两个站点跟踪哪些 I2P 站点最近在线。</li> <li><a href="http://forum.i2p/">forum.i2p</a>:I2På®˜æ–¹è®ºå› <a href="http://forum.i2p2.de/">forum.i2p2.de</a> 的匿åå…¥å£ (个人的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>: å¯ä»¥å®‰å…¨åŒ¿å的访问I2P官网 <a href="http://www.i2p2.de/index_zh.html">www.i2p2.de</a></li> <li><a href="http://eepsites.i2p/">eepsites.i2p</a>: 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的相关文档 (例如 I2P Messenger 基于I2P的匿åèŠå¤©å·¥å…·ç‰) </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çš„å…¶ä¸ä¸€ä¸ªæœ¬åœ° <a href="/i2psnark">端å£</a> 用于内置的 <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 </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 </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 å·²ç»é›†æˆäº†ä¸€äº›è½¯ä»¶æ¥å¸®åŠ©ä½ è¿è¡Œè‡ªå·±çš„匿åå°ç«™ - 有一个 <a href="http://jetty.mortbay.org/">Jetty</a> 实例è¿è¡ŒäºŽæœ¬æœº <a href="http://127.0.0.1:7658/">http://127.0.0.1:7658/</a>上。åªè¦å°†ä½ 的文件放在 I2P目录下的 <code>eepsite/docroot/</code> æ–‡ä»¶å¤¹ä¸ (æˆ–å°†ä»»ä½•æ ‡å‡†çš„ JSP/Servlet <code>.war</code> 文件放置于 <code>eepsite/webapps</code> ä¸, æˆ–æ ‡å‡†çš„ CGI 脚本置于 <code>eepsite/cgi-bin</code> 目录内) ,通过上é¢çš„地å€å°±å¯ä»¥æµè§ˆå•¦ã€‚æ¤åŽåˆ›å»ºä¸€ä¸ª <a href="/i2ptunnel/">I2P站点隧é“(EEPSITE TUNNEL)</a> 将其指å‘上é¢çš„本地端å£, 您的匿å站点就å¯ä»¥ä¾›äººä»¬è®¿é—®äº†ã€‚创建 I2P站点的具体æ“作å‚è§ <a href="http://127.0.0.1:7658/">您的临时EEPSITE页é¢</a>。</p> +<p>I2P å·²ç»é›†æˆäº†JettyæœåŠ¡å™¨æ¥å¸®åŠ©ä½ è¿è¡Œè‡ªå·±çš„匿å站点 - <a href="http://jetty.mortbay.org/">Jetty</a> 实例è¿è¡ŒäºŽæœ¬æœº <a href="http://127.0.0.1:7658/">http://127.0.0.1:7658/</a>上。åªè¦å°†ä½ 的文件放在 I2P目录下的 <code>eepsite/docroot/</code> æ–‡ä»¶å¤¹ä¸ (æˆ–å°†ä»»ä½•æ ‡å‡†çš„ JSP/Servlet <code>.war</code> 文件放置于 <code>eepsite/webapps</code> ä¸, æ ‡å‡†çš„ CGI 脚本请置于 <code>eepsite/cgi-bin</code> 目录内) ,通过上é¢çš„地å€å°±å¯ä»¥æµè§ˆå•¦ã€‚ç„¶åŽ <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ã€‚ä½ ä¹Ÿå¯ä»¥åˆ° <a href="http://www.i2p2.i2p/index_zh.html">I2P 网站</a> 查找信æ¯, 在 <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ã€‚ä½ ä¹Ÿå¯ä»¥åˆ° <a href="http://www.i2p2.i2p/index_zh.html">I2P 网站</a> 查找信æ¯, 在 <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