propagate from branch 'i2p.i2p' (head dbcd208a02bbecfe924e13a7d71297ece3f01ef3)

to branch 'i2p.i2p.zzz.test' (head 9eee20312852c80ca6c8e079174578a335edbe6d)
This commit is contained in:
zzz
2010-01-06 17:16:18 +00:00
174 changed files with 15000 additions and 5280 deletions

View File

@@ -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)

View File

@@ -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/

View File

@@ -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>

View File

@@ -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

View File

@@ -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>

View File

@@ -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

View File

@@ -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'

View File

@@ -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();

View File

@@ -185,7 +185,7 @@ public class I2PSnarkServlet extends HttpServlet {
out.write("<tfoot><tr>\n" +
" <th align=\"left\" colspan=\"2\">");
out.write(_("Totals"));
out.write(" {");
out.write(" (");
out.write(_("{0} torrents", snarks.size()));
out.write(", ");
out.write(DataHelper.formatSize(stats[5]) + "B, ");
@@ -216,7 +216,7 @@ public class I2PSnarkServlet extends HttpServlet {
String action = req.getParameter("action");
if (action == null) {
// noop
} else if (_("Add torrent").equals(action)) {
} else if ("Add".equals(action)) {
String newFile = req.getParameter("newFile");
String newURL = req.getParameter("newURL");
// NOTE - newFile currently disabled in HTML form - see below
@@ -260,7 +260,7 @@ public class I2PSnarkServlet extends HttpServlet {
} else {
// no file or URL specified
}
} else if (_("Stop").equals(action)) {
} else if ("Stop".equals(action)) {
String torrent = req.getParameter("torrent");
if (torrent != null) {
byte infoHash[] = Base64.decode(torrent);
@@ -275,7 +275,7 @@ public class I2PSnarkServlet extends HttpServlet {
}
}
}
} else if (_("Start").equals(action)) {
} else if ("Start".equals(action)) {
String torrent = req.getParameter("torrent");
if (torrent != null) {
byte infoHash[] = Base64.decode(torrent);
@@ -357,7 +357,7 @@ public class I2PSnarkServlet extends HttpServlet {
}
}
}
} else if (_("Save configuration").equals(action)) {
} else if ("Save".equals(action)) {
String dataDir = req.getParameter("dataDir");
boolean autoStart = req.getParameter("autoStart") != null;
String seedPct = req.getParameter("seedPct");
@@ -371,7 +371,7 @@ public class I2PSnarkServlet extends HttpServlet {
boolean useOpenTrackers = req.getParameter("useOpenTrackers") != null;
String openTrackers = req.getParameter("openTrackers");
_manager.updateConfig(dataDir, autoStart, seedPct, eepHost, eepPort, i2cpHost, i2cpPort, i2cpOpts, upLimit, upBW, useOpenTrackers, openTrackers);
} else if (_("Create torrent").equals(action)) {
} else if ("Create".equals(action)) {
String baseData = req.getParameter("baseFile");
if (baseData != null && baseData.trim().length() > 0) {
File baseFile = new File(_manager.getDataDir(), baseData);
@@ -518,7 +518,7 @@ public class I2PSnarkServlet extends HttpServlet {
curPeers + '/' + knownPeers +
" <a href=\"" + uri + "?p=" + Base64.encode(snark.meta.getInfoHash()) + "\">" + _("peers") + "</a>)";
else if (isRunning)
statusString = _("Seeding") + " (" + curPeers + "/" + knownPeers + ' ' + ("peers") + ')';
statusString = _("Seeding") + " (" + curPeers + "/" + knownPeers + ' ' + _("peers") + ')';
else
statusString = _("Complete");
} else {
@@ -695,9 +695,9 @@ public class I2PSnarkServlet extends HttpServlet {
} else {
out.write("<font color=#a00000><a title=\"");
if (!peer.isInteresting())
out.write(_("Uninteresting"));
out.write(_("Uninteresting (The peer has no pieces we need)"));
else
out.write(_("Choked"));
out.write(_("Choked (The peer is not allowing us to request pieces)"));
out.write("\">");
out.write(formatSize(peer.getDownloadRate()) + "ps</a></font>");
}
@@ -711,9 +711,9 @@ public class I2PSnarkServlet extends HttpServlet {
} else {
out.write("<font color=#a00000><a title=\"");
if (!peer.isInterested())
out.write(_("Uninterested"));
out.write(_("Uninterested (We have no pieces the peer needs)"));
else
out.write(_("Choking"));
out.write(_("Choking (We are not allowing the peer to request pieces)"));
out.write("\">");
out.write(formatSize(peer.getUploadRate()) + "ps</a></font>");
}
@@ -738,6 +738,7 @@ public class I2PSnarkServlet extends HttpServlet {
// *not* enctype="multipart/form-data", so that the input type=file sends the filename, not the file
out.write("<form action=\"" + uri + "\" method=\"POST\">\n");
out.write("<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" >\n");
out.write("<input type=\"hidden\" name=\"action\" value=\"Add\" >\n");
out.write("<div class=\"addtorrentsection\"><span class=\"snarkConfigTitle\">");
out.write(_("Add Torrent"));
out.write("</span><br>\n<table border=\"0\"><tr><td>");
@@ -747,7 +748,7 @@ public class I2PSnarkServlet extends HttpServlet {
//out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br>\n");
out.write("<tr><td>&nbsp;<td><input type=\"submit\" value=\"");
out.write(_("Add torrent"));
out.write("\" name=\"action\" ><br>\n");
out.write("\" name=\"foo\" ><br>\n");
out.write("<tr><td>&nbsp;<td><span class=\"snarkAddInfo\">");
out.write(_("Alternately, you can copy .torrent files to the directory {0}.", _manager.getDataDir().getAbsolutePath()));
out.write("\n");
@@ -766,6 +767,7 @@ public class I2PSnarkServlet extends HttpServlet {
// *not* enctype="multipart/form-data", so that the input type=file sends the filename, not the file
out.write("<form action=\"" + uri + "\" method=\"POST\">\n");
out.write("<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" >\n");
out.write("<input type=\"hidden\" name=\"action\" value=\"Create\" >\n");
out.write("<span class=\"snarkConfigTitle\">");
out.write(_("Create Torrent"));
out.write("</span><br>\n<table border=\"0\"><tr><td>");
@@ -798,7 +800,7 @@ public class I2PSnarkServlet extends HttpServlet {
out.write("\" > ");
out.write("<tr><td>&nbsp;<td><input type=\"submit\" value=\"");
out.write(_("Create torrent"));
out.write("\" name=\"action\" ></table>\n");
out.write("\" name=\"foo\" ></table>\n");
out.write("</form>\n</span></div>");
}
@@ -813,6 +815,7 @@ public class I2PSnarkServlet extends HttpServlet {
out.write("<form action=\"" + uri + "\" method=\"POST\">\n");
out.write("<div class=\"configsection\"><span class=\"snarkConfig\">\n");
out.write("<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" >\n");
out.write("<input type=\"hidden\" name=\"action\" value=\"Save\" >\n");
out.write("<span class=\"snarkConfigTitle\">");
out.write(_("Configuration"));
out.write("</span><br>\n");
@@ -912,7 +915,7 @@ public class I2PSnarkServlet extends HttpServlet {
out.write("<tr><td>&nbsp;<td><input type=\"submit\" value=\"");
out.write(_("Save configuration"));
out.write("\" name=\"action\" >\n");
out.write("\" name=\"foo\" >\n");
out.write("</table></span>\n");
out.write("</form></div>");
}
@@ -970,6 +973,7 @@ private static class FetchAndAdd implements Runnable {
in = new FileInputStream(file);
MetaInfo info = new MetaInfo(in);
String name = info.getName();
name = DataHelper.stripHTML(name); // XSS
name = name.replace('/', '_');
name = name.replace('\\', '_');
name = name.replace('&', '+');

View File

@@ -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}"

View File

@@ -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 "设置"

View File

@@ -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">

View File

@@ -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'

View File

@@ -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);
}
}

View File

@@ -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;

View File

@@ -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);
}
}

View File

@@ -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.

View File

@@ -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>

View File

@@ -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>

View File

@@ -29,7 +29,7 @@
<div id="statusMessagePanel" class="panel">
<div class="header">
<h4>Status Messages</h4>
<h4><%=intl._("Status Messages")%></h4>
</div>
<div class="separator">
@@ -44,7 +44,7 @@
<div class="footer">
<div class="toolbox">
<a class="control" href="index.jsp">Refresh</a>
<a class="control" href="index.jsp"><%=intl._("Refresh")%></a>
</div>
</div>
</div>
@@ -53,7 +53,7 @@
<div class="header"></div>
<div class="footer">
<div class="toolbox">
<a class="control" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=Stop%20all">Stop All</a> <a class="control" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=Start%20all">Start All</a> <a class="control" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=Restart%20all">Restart All</a> <a class="control" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=Reload%20configuration">Reload Config</a>
<a class="control" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=Stop%20all"><%=intl._("Stop All")%></a> <a class="control" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=Start%20all"><%=intl._("Start All")%></a> <a class="control" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=Restart%20all"><%=intl._("Restart All")%></a> <a class="control" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=Reload%20configuration"><%=intl._("Reload Config")%></a>
</div>
</div>
</div>
@@ -63,23 +63,23 @@
<div id="localServerTunnelList" class="panel">
<div class="header">
<h4>I2P Server Tunnels</h4>
<h4><%=intl._("I2P Server Tunnels")%></h4>
</div>
<div class="separator"> </div>
<div class="nameHeaderField rowItem">
<label>Name:</label>
<label><%=intl._("Name")%>:</label>
</div>
<div class="previewHeaderField rowItem">
<label>Points at:</label>
<label><%=intl._("Points at")%>:</label>
</div>
<div class="targetHeaderField rowItem">
<label>Preview:</label>
<label><%=intl._("Preview")%>:</label>
</div>
<div class="statusHeaderField rowItem">
<label>Status:</label>
<label><%=intl._("Status")%>:</label>
<hr /> </div>
<%
@@ -88,11 +88,11 @@
%>
<div class="nameField rowItem">
<label>Name:</label>
<label><%=intl._("Name")%>:</label>
<span class="text"><a href="edit.jsp?tunnel=<%=curServer%>" title="Edit Server Tunnel Settings for <%=indexBean.getTunnelName(curServer)%>"><%=indexBean.getTunnelName(curServer)%></a></span>
</div>
<div class="previewField rowItem">
<label>Points at:</label>
<label><%=intl._("Points at")%>:</label>
<span class="text">
<%
if ("httpserver".equals(indexBean.getInternalType(curServer))) {
@@ -108,41 +108,41 @@
<div class="targetField rowItem">
<%
if ("httpserver".equals(indexBean.getInternalType(curServer)) && indexBean.getTunnelStatus(curServer) == IndexBean.RUNNING) {
%><label>Preview:</label>
<a class="control" title="Test HTTP server through I2P" href="http://<%=indexBean.getDestHashBase32(curServer)%>.b32.i2p">Preview</a>
%><label><%=intl._("Preview")%>:</label>
<a class="control" title="Test HTTP server through I2P" href="http://<%=indexBean.getDestHashBase32(curServer)%>.b32.i2p"><%=intl._("Preview")%></a>
<%
} else if (indexBean.getTunnelStatus(curServer) == IndexBean.RUNNING) {
%><span class="text">Base32 Address:<br /><%=indexBean.getDestHashBase32(curServer)%>.b32.i2p</span>
%><span class="text"><%=intl._("Base32 Address")%>:<br /><%=indexBean.getDestHashBase32(curServer)%>.b32.i2p</span>
<%
} else {
%><span class="comment">No Preview</span>
%><span class="comment"><%=intl._("No Preview")%></span>
<%
}
%></div>
<div class="statusField rowItem">
<label>Status:</label>
<label><%=intl._("Status")%>:</label>
<%
switch (indexBean.getTunnelStatus(curServer)) {
case IndexBean.STARTING:
%><div class="statusStarting text">Starting...</div>
<a class="control" title="Stop this Tunnel" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=stop&amp;tunnel=<%=curServer%>">Stop</a>
%><div class="statusStarting text"><%=intl._("Starting...")%></div>
<a class="control" title="Stop this Tunnel" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=stop&amp;tunnel=<%=curServer%>"><%=intl._("Stop")%></a>
<%
break;
case IndexBean.RUNNING:
%><div class="statusRunning text">Running</div>
<a class="control" title="Stop this Tunnel" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=stop&amp;tunnel=<%=curServer%>">Stop</a>
%><div class="statusRunning text"><%=intl._("Running")%></div>
<a class="control" title="Stop this Tunnel" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=stop&amp;tunnel=<%=curServer%>"><%=intl._("Stop")%></a>
<%
break;
case IndexBean.NOT_RUNNING:
%><div class="statusNotRunning text">Stopped</div>
<a class="control" title="Start this Tunnel" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=start&amp;tunnel=<%=curServer%>">Start</a>
%><div class="statusNotRunning text"><%=intl._("Stopped")%></div>
<a class="control" title="Start this Tunnel" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=start&amp;tunnel=<%=curServer%>"><%=intl._("Start")%></a>
<%
break;
}
%></div>
<div class="descriptionField rowItem">
<label>Description:</label>
<label><%=intl._("Description")%>:</label>
<div class="text"><%=indexBean.getTunnelDescription(curServer)%></div>
</div>
@@ -160,14 +160,14 @@
<form id="addNewServerTunnelForm" action="edit.jsp">
<div class="toolbox">
<label>New server tunnel:</label>
<label><%=intl._("New server tunnel")%>:</label>
<select name="type">
<option value="server">Standard</option>
<option value="server"><%=intl._("Standard")%></option>
<option value="httpserver">HTTP</option>
<option value="ircserver">IRC</option>
<option value="streamrserver">Streamr</option>
</select>
<input class="control" type="submit" value="Create" />
<input class="control" type="submit" value="<%=intl._("Create")%>" />
</div>
</form>
</div>
@@ -177,26 +177,26 @@
<div id="localClientTunnelList" class="panel">
<div class="header">
<h4>I2P Client Tunnels</h4>
<h4><%=intl._("I2P Client Tunnels")%></h4>
</div>
<div class="separator"> </div>
<div class="nameHeaderField rowItem">
<label>Name:</label>
<label><%=intl._("Name")%>:</label>
</div>
<div class="portHeaderField rowItem">
<label>Port:</label>
<label><%=intl._("Port")%>:</label>
</div>
<div class="typeHeaderField rowItem">
<label>Type:</label>
<label><%=intl._("Type")%>:</label>
</div>
<div class="interfaceHeaderField rowItem">
<label>Interface:</label>
<label><%=intl._("Interface")%>:</label>
</div>
<div class="statusHeaderField rowItem">
<label>Status:</label>
<label><%=intl._("Status")%>:</label>
</div>
<div class="separator">
@@ -207,43 +207,43 @@
if (!indexBean.isClient(curClient)) continue;
%>
<div class="nameField rowItem">
<label>Name:</label>
<label><%=intl._("Name")%>:</label>
<span class="text"><a href="edit.jsp?tunnel=<%=curClient%>" title="Edit Tunnel Settings for <%=indexBean.getTunnelName(curClient)%>"><%=indexBean.getTunnelName(curClient)%></a></span>
</div>
<div class="portField rowItem">
<label>Port:</label>
<label><%=intl._("Port")%>:</label>
<span class="text"><%=indexBean.getClientPort(curClient)%></span>
</div>
<div class="typeField rowItem">
<label>Type:</label>
<label><%=intl._("Type")%>:</label>
<span class="text"><%=indexBean.getTunnelType(curClient)%></span>
</div>
<div class="interfaceField rowItem">
<label>Interface:</label>
<label><%=intl._("Interface")%>:</label>
<span class="text"><%=indexBean.getClientInterface(curClient)%></span>
</div>
<div class="statusField rowItem">
<label>Status:</label>
<label><%=intl._("Status")%>:</label>
<%
switch (indexBean.getTunnelStatus(curClient)) {
case IndexBean.STARTING:
%><div class="statusStarting text">Starting...</div>
<a class="control" title="Stop this Tunnel" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=stop&amp;tunnel=<%=curClient%>">Stop</a>
%><div class="statusStarting text"><%=intl._("Starting...")%></div>
<a class="control" title="Stop this Tunnel" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=stop&amp;tunnel=<%=curClient%>"><%=intl._("Stop")%></a>
<%
break;
case IndexBean.STANDBY:
%><div class="statusStarting text">Standby</div>
<a class="control" title="Stop this Tunnel" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=stop&amp;tunnel=<%=curClient%>">Stop</a>
%><div class="statusStarting text"><%=intl._("Standby")%></div>
<a class="control" title="Stop this Tunnel" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=stop&amp;tunnel=<%=curClient%>"><%=intl._("Stop")%></a>
<%
break;
case IndexBean.RUNNING:
%><div class="statusRunning text">Running</div>
<a class="control" title="Stop this Tunnel" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=stop&amp;tunnel=<%=curClient%>">Stop</a>
%><div class="statusRunning text"><%=intl._("Running")%></div>
<a class="control" title="Stop this Tunnel" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=stop&amp;tunnel=<%=curClient%>"><%=intl._("Stop")%></a>
<%
break;
case IndexBean.NOT_RUNNING:
%><div class="statusNotRunning text">Stopped</div>
<a class="control" title="Start this Tunnel" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=start&amp;tunnel=<%=curClient%>">Start</a>
%><div class="statusNotRunning text"><%=intl._("Stopped")%></div>
<a class="control" title="Start this Tunnel" href="index.jsp?nonce=<%=indexBean.getNextNonce()%>&amp;action=start&amp;tunnel=<%=curClient%>"><%=intl._("Start")%></a>
<%
break;
}
@@ -253,9 +253,9 @@
<div class="destinationField rowItem">
<label>
<% if ("httpclient".equals(indexBean.getInternalType(curClient)) || "connectclient".equals(indexBean.getInternalType(curClient))) { %>
Outproxy:
<%=intl._("Outproxy")%>:
<% } else { %>
Destination:
<%=intl._("Destination")%>:
<% } %>
</label>
<input class="freetext" size="40" readonly="readonly" value="<%=indexBean.getClientDestination(curClient)%>" />
@@ -263,7 +263,7 @@
<% } %>
<div class="descriptionField rowItem">
<label>Description:</label>
<label><%=intl._("Description")%>:</label>
<div class="text"><%=indexBean.getTunnelDescription(curClient)%></div>
</div>
@@ -281,16 +281,16 @@
<form id="addNewClientTunnelForm" action="edit.jsp">
<div class="toolbox">
<label>New client tunnel:</label>
<label><%=intl._("New client tunnel")%>:</label>
<select name="type">
<option value="client">Standard</option>
<option value="client"><%=intl._("Standard")%></option>
<option value="httpclient">HTTP</option>
<option value="ircclient">IRC</option>
<option value="sockstunnel">SOCKS 4/4a/5</option>
<option value="connectclient">CONNECT</option>
<option value="streamrclient">Streamr</option>
</select>
<input class="control" type="submit" value="Create" />
<input class="control" type="submit" value="<%=intl._("Create")%>" />
</div>
</form>
</div>

View File

@@ -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 "Новый клиентский туннель"

View File

@@ -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 "新建客户隧道"

View File

@@ -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'

View File

@@ -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);

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -10,7 +10,7 @@ public class LogsHelper extends HelperBase {
public String getLogs() {
String str = formatMessages(_context.logManager().getBuffer().getMostRecentMessages());
return "Location: <b><code>" + _context.logManager().currentFile() + "</code></b><br><br>" + str;
return _("File location") + ": <b><code>" + _context.logManager().currentFile() + "</code></b><br><br>" + str;
}
public String getCriticalLogs() {
@@ -34,7 +34,7 @@ public class LogsHelper extends HelperBase {
return "";
else {
str = str.replaceAll("<", "&lt;").replaceAll(">", "&gt;");
return "Location:<b><code> " + f.getAbsolutePath() + "</code></b> <pre>" + str + "</pre>";
return _("File location") + ": <b><code>" + f.getAbsolutePath() + "</code></b> <pre>" + str + "</pre>";
}
}

View File

@@ -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();

View File

@@ -40,7 +40,7 @@ public class StatsGenerator {
String group = (String)entry.getKey();
Set stats = (Set)entry.getValue();
buf.append("<option value=\"/stats.jsp#").append(group).append("\">");
buf.append(group).append("</option>\n");
buf.append(_(group)).append("</option>\n");
for (Iterator statIter = stats.iterator(); statIter.hasNext(); ) {
String stat = (String)statIter.next();
buf.append("<option value=\"/stats.jsp#");
@@ -52,7 +52,7 @@ public class StatsGenerator {
out.write(buf.toString());
buf.setLength(0);
}
buf.append("</select> <input type=\"submit\" value=\"GO\" />");
buf.append("</select> <input type=\"submit\" value=\"").append(_("GO")).append("\" />");
buf.append("</form>");
buf.append(_("Statistics gathered during this router's uptime")).append(" (");
@@ -69,7 +69,7 @@ public class StatsGenerator {
buf.append("<h3><a name=\"");
buf.append(group);
buf.append("\">");
buf.append(group);
buf.append(_(group));
buf.append("</a></h3>");
buf.append("<ul>");
out.write(buf.toString());
@@ -88,7 +88,7 @@ public class StatsGenerator {
out.write(buf.toString());
buf.setLength(0);
}
out.write("</ul><br>");
out.write("</ul><br>\n");
}
out.flush();
}
@@ -104,7 +104,7 @@ public class StatsGenerator {
for (int i = 0; i < periods.length; i++) {
if (periods[i] > uptime)
break;
renderPeriod(buf, periods[i], "frequency");
renderPeriod(buf, periods[i], _("frequency"));
Frequency curFreq = freq.getFrequency(periods[i]);
buf.append(" <i>avg per period:</i> (");
buf.append(num(curFreq.getAverageEventsPerPeriod()));
@@ -124,9 +124,9 @@ public class StatsGenerator {
buf.append(" using the lifetime of ");
buf.append(curFreq.getEventCount());
buf.append(" events)");
buf.append("<br>");
buf.append("<br>\n");
}
buf.append("<br>");
buf.append("<br>\n");
}
private void renderRate(String name, StringBuilder buf) {
@@ -138,7 +138,7 @@ public class StatsGenerator {
buf.append("</i><br>");
}
if (rate.getLifetimeEventCount() <= 0) {
buf.append("No lifetime events<br>");
buf.append(_("No lifetime events")).append("<br>\n");
return;
}
long now = _context.clock().now();
@@ -150,9 +150,9 @@ public class StatsGenerator {
if (curRate.getLastCoalesceDate() <= curRate.getCreationDate())
break;
buf.append("<li>");
renderPeriod(buf, periods[i], "rate");
renderPeriod(buf, periods[i], _("rate"));
if (curRate.getLastEventCount() > 0) {
buf.append( "<i>avg value:</i> (");
buf.append( "<i>").append(_("avg value")).append(":</i> (");
buf.append(num(curRate.getAverageValue()));
buf.append(" peak ");
buf.append(num(curRate.getExtremeAverageValue()));
@@ -181,21 +181,21 @@ public class StatsGenerator {
buf.append(num(curRate.getExtremeSaturationLimit()));
buf.append(")");
}
buf.append(" <i>events:</i> ");
buf.append(" <i>").append(_("events")).append(":</i> ");
buf.append(curRate.getLastEventCount());
buf.append(" <i>in this period which ended:</i> ");
buf.append(DataHelper.formatDuration(now - curRate.getLastCoalesceDate()));
buf.append(" ago ");
} else {
buf.append(" <i>No events</i> ");
buf.append(" <i>").append(_("No events")).append("</i> ");
}
long numPeriods = curRate.getLifetimePeriods();
if (numPeriods > 0) {
double avgFrequency = curRate.getLifetimeEventCount() / (double)numPeriods;
double peakFrequency = curRate.getExtremeEventCount();
buf.append(" (lifetime average: ");
buf.append(" (").append(_("lifetime average")).append(": ");
buf.append(num(avgFrequency));
buf.append(", peak average: ");
buf.append(", ").append(_("peak average")).append(": ");
buf.append(curRate.getExtremeEventCount());
buf.append(")");
}
@@ -210,16 +210,16 @@ public class StatsGenerator {
buf.append("&amp;format=xml\" title=\"Dump stat history as XML\">XML</a>");
buf.append(" in a format <a href=\"http://people.ee.ethz.ch/~oetiker/webtools/rrdtool\">RRDTool</a> understands)");
}
buf.append("</li>");
buf.append("</li>\n");
}
// Display the strict average
buf.append("<li><b>lifetime average value:</b> ");
buf.append("<li><b>").append(_("lifetime average value")).append(":</b> ");
buf.append(num(rate.getLifetimeAverageValue()));
buf.append(" over ");
buf.append(rate.getLifetimeEventCount());
buf.append(" events<br></li>");
buf.append("</ul>");
buf.append("<br>");
buf.append("<br>\n");
}
private static void renderPeriod(StringBuilder buf, long period, String name) {
@@ -240,4 +240,9 @@ public class StatsGenerator {
private String _(String s) {
return Messages.getString(s, _context);
}
/** translate a string */
private String _(String s, Object o) {
return Messages.getString(s, o, _context);
}
}

View File

@@ -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"))

View File

@@ -62,6 +62,9 @@ public class SummaryHelper extends HelperBase {
return DataHelper.formatDuration(router.getUptime());
}
/**
this displayed offset, not skew - now handled in reachability()
private String timeSkew() {
if (_context == null) return "";
//if (!_context.clock().getUpdatedSuccessfully())
@@ -72,6 +75,7 @@ public class SummaryHelper extends HelperBase {
return "";
return " (" + DataHelper.formatDuration(diff) + " " + _("skew") + ")";
}
**/
public boolean allowReseed() {
return _context.netDb().isInitialized() &&
@@ -83,15 +87,20 @@ public class SummaryHelper extends HelperBase {
public int getAllPeers() { return Math.max(_context.netDb().getKnownRouters() - 1, 0); }
public String getReachability() {
return reachability() + timeSkew();
return reachability(); // + timeSkew();
}
private String reachability() {
if (_context.router().getUptime() > 60*1000 && (!_context.router().gracefulShutdownInProgress()) &&
!_context.clientManager().isAlive())
return _("ERR-Client Manager I2CP Error - check logs"); // not a router problem but the user should know
if (!_context.clock().getUpdatedSuccessfully())
return _("ERR-ClockSkew");
// Warn based on actual skew from peers, not update status, so if we successfully offset
// the clock, we don't complain.
//if (!_context.clock().getUpdatedSuccessfully())
Long skew = _context.commSystem().getFramedAveragePeerClockSkew(33);
// Display the actual skew, not the offset
if (skew != null && Math.abs(skew.longValue()) > 45)
return _("ERR-Clock Skew of {0}", DataHelper.formatDuration(Math.abs(skew.longValue()) * 1000));
if (_context.router().isHidden())
return _("Hidden");
@@ -118,7 +127,9 @@ public class SummaryHelper extends HelperBase {
default:
ra = _context.router().getRouterInfo().getTargetAddress("SSU");
if (ra == null && _context.router().getUptime() > 5*60*1000) {
if (_context.getProperty(ConfigNetHelper.PROP_I2NP_NTCP_HOSTNAME) == null ||
if (getActivePeers() <= 0)
return _("ERR-No Active Peers, Check Network Connection and Firewall");
else if (_context.getProperty(ConfigNetHelper.PROP_I2NP_NTCP_HOSTNAME) == null ||
_context.getProperty(ConfigNetHelper.PROP_I2NP_NTCP_PORT) == null)
return _("ERR-UDP Disabled and Inbound TCP host/port not set");
else
@@ -347,52 +358,58 @@ public class SummaryHelper extends HelperBase {
}
/**
* How many client destinations are connected locally.
* Client destinations connected locally.
*
* @return html section summary
*/
public String getDestinations() {
// covert the set to a list so we can sort by name and not lose duplicates
List clients = new ArrayList(_context.clientManager().listClients());
Collections.sort(clients, new AlphaComparator());
// convert the set to a list so we can sort by name and not lose duplicates
List<Destination> clients = new ArrayList(_context.clientManager().listClients());
StringBuilder buf = new StringBuilder(512);
buf.append("<h3><a href=\"i2ptunnel/index.jsp\" target=\"_blank\" title=\"").append(_("Add/remove/edit &amp; control your client and server tunnels")).append("\">").append(_("Local Destinations")).append("</a></h3><hr><div class=\"tunnels\"><table>");
for (Iterator iter = clients.iterator(); iter.hasNext(); ) {
Destination client = (Destination)iter.next();
String name = getName(client);
Hash h = client.calculateHash();
buf.append("<h3><a href=\"/i2ptunnel/index.jsp\" target=\"_blank\" title=\"").append(_("Add/remove/edit &amp; control your client and server tunnels")).append("\">").append(_("Local Destinations")).append("</a></h3><hr><div class=\"tunnels\">");
if (clients.size() > 0) {
Collections.sort(clients, new AlphaComparator());
buf.append("<table>");
buf.append("<tr><td align=\"right\"><img src=\"/themes/console/images/");
if (_context.clientManager().shouldPublishLeaseSet(h))
buf.append("server.png\" alt=\"Server\" title=\"" + _("Server") + "\">");
else
buf.append("client.png\" alt=\"Client\" title=\"" + _("Client") + "\">");
buf.append("</td><td align=\"left\"><b><a href=\"tunnels.jsp#").append(h.toBase64().substring(0,4));
buf.append("\" target=\"_top\" title=\"" + _("Show tunnels") + "\">");
if (name.length() < 16)
buf.append(name);
else
buf.append(name.substring(0,15)).append("&hellip;");
buf.append("</a></b></td>\n");
LeaseSet ls = _context.netDb().lookupLeaseSetLocally(h);
if (ls != null) {
long timeToExpire = ls.getEarliestLeaseDate() - _context.clock().now();
if (timeToExpire < 0) {
// red or yellow light
buf.append("<td><img src=\"/themes/console/images/local_inprogress.png\" alt=\"").append(_("Rebuilding")).append("&hellip;\" title=\"").append(_("Leases expired")).append(" ").append(DataHelper.formatDuration(0-timeToExpire));
buf.append(" ").append(_("ago")).append(". ").append(_("Rebuilding")).append("&hellip;\"></td></tr>\n");
for (Iterator<Destination> iter = clients.iterator(); iter.hasNext(); ) {
Destination client = iter.next();
String name = getName(client);
Hash h = client.calculateHash();
buf.append("<tr><td align=\"right\"><img src=\"/themes/console/images/");
if (_context.clientManager().shouldPublishLeaseSet(h))
buf.append("server.png\" alt=\"Server\" title=\"" + _("Server") + "\">");
else
buf.append("client.png\" alt=\"Client\" title=\"" + _("Client") + "\">");
buf.append("</td><td align=\"left\"><b><a href=\"tunnels.jsp#").append(h.toBase64().substring(0,4));
buf.append("\" target=\"_top\" title=\"" + _("Show tunnels") + "\">");
if (name.length() < 16)
buf.append(name);
else
buf.append(name.substring(0,15)).append("&hellip;");
buf.append("</a></b></td>\n");
LeaseSet ls = _context.netDb().lookupLeaseSetLocally(h);
if (ls != null) {
long timeToExpire = ls.getEarliestLeaseDate() - _context.clock().now();
if (timeToExpire < 0) {
// red or yellow light
buf.append("<td><img src=\"/themes/console/images/local_inprogress.png\" alt=\"").append(_("Rebuilding")).append("&hellip;\" title=\"").append(_("Leases expired")).append(" ").append(DataHelper.formatDuration(0-timeToExpire));
buf.append(" ").append(_("ago")).append(". ").append(_("Rebuilding")).append("&hellip;\"></td></tr>\n");
} else {
// green light
buf.append("<td><img src=\"/themes/console/images/local_up.png\" alt=\"Ready\" title=\"").append(_("Ready")).append("\"></td></tr>\n");
}
} else {
// green light
buf.append("<td><img src=\"/themes/console/images/local_up.png\" alt=\"Ready\" title=\"").append(_("Ready")).append("\"></td></tr>\n");
// yellow light
buf.append("<td><img src=\"/themes/console/images/local_inprogress.png\" alt=\"").append(_("Building")).append("&hellip;\" title=\"").append(_("Building tunnels")).append("&hellip;\"></td></tr>\n");
}
} else {
// yellow light
buf.append("<td><img src=\"/themes/console/images/local_inprogress.png\" alt=\"").append(_("Building")).append("&hellip;\" title=\"").append(_("Building tunnels")).append("&hellip;\"></td></tr>\n");
}
buf.append("</table>");
} else {
buf.append("<center><i>").append(_("none")).append("</i></center>");
}
buf.append("</table></div><hr>\n");
buf.append("</div><hr>\n");
return buf.toString();
}

View File

@@ -23,6 +23,7 @@ import net.i2p.router.TunnelInfo;
import net.i2p.router.TunnelPoolSettings;
import net.i2p.router.tunnel.HopConfig;
import net.i2p.router.tunnel.pool.TunnelPool;
import net.i2p.router.CommSystemFacade;
import net.i2p.stat.RateStat;
import net.i2p.util.ObjectCounter;
@@ -84,41 +85,40 @@ public class TunnelRenderer {
}
out.write("<tr>");
if (cfg.getReceiveTunnel() != null)
out.write(" <td class=\"cells\" align=\"center\">" + cfg.getReceiveTunnel().getTunnelId() +"</td>");
out.write("<td class=\"cells\" align=\"center\">" + cfg.getReceiveTunnel().getTunnelId() +"</td>");
else
out.write(" <td class=\"cells\" align=\"center\">n/a</td>");
out.write("<td class=\"cells\" align=\"center\">n/a</td>");
if (cfg.getReceiveFrom() != null)
out.write(" <td class=\"cells\" align=\"right\">" + netDbLink(cfg.getReceiveFrom()) +"</td>");
out.write("<td class=\"cells\" align=\"center\">" + netDbLink(cfg.getReceiveFrom()) +"</td>");
else
out.write(" <td class=\"cells\" align=\"center\">&nbsp;</td>");
out.write("<td class=\"cells\">&nbsp;</td>");
if (cfg.getSendTunnel() != null)
out.write(" <td class=\"cells\" align=\"center\">" + cfg.getSendTunnel().getTunnelId() +"</td>");
out.write("<td class=\"cells\" align=\"center\">" + cfg.getSendTunnel().getTunnelId() +"</td>");
else
out.write(" <td class=\"cells\" align=\"center\">&nbsp;</td>");
out.write("<td class=\"cells\">&nbsp;</td>");
if (cfg.getSendTo() != null)
out.write(" <td class=\"cells\" align=\"center\">" + netDbLink(cfg.getSendTo()) +"</td>");
out.write("<td class=\"cells\" align=\"center\">" + netDbLink(cfg.getSendTo()) +"</td>");
else
// out.write(" <td class=\"cells\" align=\"center\">&nbsp;</td>");
out.write(" <td class=\"cells\" align=\"center\">&nbsp;</td>");
out.write("<td class=\"cells\">&nbsp;</td>");
long timeLeft = cfg.getExpiration()-_context.clock().now();
if (timeLeft > 0)
out.write(" <td class=\"cells\" align=\"center\">" + DataHelper.formatDuration(timeLeft) + "</td>");
out.write("<td class=\"cells\" align=\"center\">" + DataHelper.formatDuration(timeLeft) + "</td>");
else
out.write(" <td class=\"cells\" align=\"center\">(" + _("grace period") + ")</td>");
out.write(" <td class=\"cells\" align=\"center\">" + cfg.getProcessedMessagesCount() + "KB</td>");
out.write("<td class=\"cells\" align=\"center\">(" + _("grace period") + ")</td>");
out.write("<td class=\"cells\" align=\"center\">" + cfg.getProcessedMessagesCount() + "KB</td>");
int lifetime = (int) ((_context.clock().now() - cfg.getCreation()) / 1000);
if (lifetime <= 0)
lifetime = 1;
if (lifetime > 10*60)
lifetime = 10*60;
int bps = 1024 * (int) cfg.getProcessedMessagesCount() / lifetime;
out.write(" <td class=\"cells\" align=\"center\">" + bps + "Bps</td>");
out.write("<td class=\"cells\" align=\"center\">" + bps + "Bps</td>");
if (cfg.getSendTo() == null)
out.write(" <td class=\"cells\" align=\"center\">" + _("Outbound Endpoint") + "</td>");
out.write("<td class=\"cells\" align=\"center\">" + _("Outbound Endpoint") + "</td>");
else if (cfg.getReceiveFrom() == null)
out.write(" <td class=\"cells\" align=\"center\">" + _("Inbound Gateway") + "</td>");
out.write("<td class=\"cells\" align=\"center\">" + _("Inbound Gateway") + "</td>");
else
out.write(" <td class=\"cells\" align=\"center\">" + _("Participant") + "</td>");
out.write("<td class=\"cells\" align=\"center\">" + _("Participant") + "</td>");
out.write("</tr>\n");
processed += cfg.getProcessedMessagesCount();
}
@@ -229,10 +229,10 @@ public class TunnelRenderer {
Set<Hash> peers = new HashSet(lc.objects());
peers.addAll(pc.objects());
List<Hash> peerList = new ArrayList(peers);
Collections.sort(peerList, new HashComparator());
Collections.sort(peerList, new CountryComparator(this._context.commSystem()));
out.write("<h2><a name=\"peers\"></a>" + _("Tunnel Counts By Peer") + "</h2>\n");
out.write("<table><tr><th>" + _("Peer") + "</th><th>" + _("Expl. + Client") + "</th><th>" + _("% of total") + "</th><th>" + _("Part. from + to") + "</th><th>" + _("% of total") + "</th></tr>\n");
out.write("<table><tr><th>" + _("Peer") + "</th><th>" + _("Our Tunnels") + "</th><th>" + _("% of total") + "</th><th>" + _("Participating Tunnels") + "</th><th>" + _("% of total") + "</th></tr>\n");
for (Hash h : peerList) {
out.write("<tr> <td class=\"cells\" align=\"center\">");
out.write(netDbLink(h));
@@ -250,7 +250,7 @@ public class TunnelRenderer {
out.write('0');
out.write('\n');
}
out.write("<tr class=\"tablefooter\"> <td align=\"center\"><b>" + _("Tunnels") + "</b> <td align=\"center\"><b>" + tunnelCount);
out.write("<tr class=\"tablefooter\"> <td align=\"center\"><b>" + _("Totals") + "</b> <td align=\"center\"><b>" + tunnelCount);
out.write("</b> <td>&nbsp;</td> <td align=\"center\"><b>" + partCount);
out.write("</b> <td>&nbsp;</td></tr></table></div>\n");
}
@@ -295,6 +295,26 @@ public class TunnelRenderer {
return ((Hash)l).toBase64().compareTo(((Hash)r).toBase64());
}
}
private static class CountryComparator implements Comparator<Hash> {
public CountryComparator(CommSystemFacade comm) {
this.comm = comm;
}
public int compare(Hash l, Hash r) {
// get both countries
String lc = this.comm.getCountry(l);
String rc = this.comm.getCountry(r);
// make them non-null
lc = (lc == null) ? "zzzz" : lc;
rc = (rc == null) ? "zzzz" : rc;
// let String handle the rest
return lc.compareTo(rc);
}
private CommSystemFacade comm;
}
private String getCapacity(Hash peer) {
RouterInfo info = _context.netDb().lookupRouterInfoLocally(peer);

View File

@@ -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");
}
}

View File

@@ -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>

View File

@@ -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>

View File

@@ -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");
}

View File

@@ -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");

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -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;

View File

@@ -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 можно найти несколько таких адресов."

View File

@@ -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'

View File

@@ -121,4 +121,32 @@ p.footer {
font-size: 10pt !important;
line-height: 160% !important;
-moz-box-shadow: inset 0px 0px 1px 0px #002;
}
}
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;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -22,11 +22,18 @@
*
* $Revision: 1.3 $
*/
// http://www.crazysquirrel.com/computing/general/form-encoding.jspx
if (request.getCharacterEncoding() == null)
request.setCharacterEncoding("UTF-8");
%>
<%@page pageEncoding="UTF-8"%>
<%@ page contentType="text/html"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<jsp:useBean id="version" class="i2p.susi.dns.VersionBean" scope="application" />
<jsp:useBean id="book" class="i2p.susi.dns.AddressbookBean" scope="session" />
<jsp:useBean id="intl" class="i2p.susi.dns.Messages" scope="application" />
<jsp:setProperty name="book" property="*" />
<jsp:setProperty name="book" property="resetDeletionMarks" value="1"/>
<c:forEach items="${paramValues.checked}" var="checked">
@@ -35,7 +42,8 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>${book.book} addressbook - susidns v${version.version}</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>${book.book} <%=intl._("addressbook")%> - susidns</title>
<link rel="stylesheet" type="text/css" href="css.css">
</head>
<body>
@@ -45,19 +53,20 @@
</div>
<hr>
<div id="navi">
<p>addressbooks
<a href="addressbook.jsp?book=master&filter=none&begin=0&end=99">master</a> |
<a href="addressbook.jsp?book=router&filter=none&begin=0&end=99">router</a> |
<a href="addressbook.jsp?book=published&filter=none&begin=0&end=99">published</a> |
<a href="addressbook.jsp?book=private&filter=none&begin=0&end=99">private</a> *
<a href="subscriptions.jsp">subscriptions</a> *
<a href="config.jsp">configuration</a> *
<a href="index.jsp">overview</a>
<p>
<%=intl._("addressbooks")%>
<a href="addressbook.jsp?book=private&filter=none&begin=0&end=99"><%=intl._("private")%></a> |
<a href="addressbook.jsp?book=master&filter=none&begin=0&end=99"><%=intl._("master")%></a> |
<a href="addressbook.jsp?book=router&filter=none&begin=0&end=99"><%=intl._("router")%></a> |
<a href="addressbook.jsp?book=published&filter=none&begin=0&end=99"><%=intl._("published")%></a> *
<a href="subscriptions.jsp"><%=intl._("subscriptions")%></a> *
<a href="config.jsp"><%=intl._("configuration")%></a> *
<a href="index.jsp"><%=intl._("overview")%></a>
</p>
</div>
<hr>
<div id="headline">
<h3>${book.book} addressbook at ${book.fileName}</h3>
<h3><%=intl._(book.getBook())%> <%=intl._("addressbook")%>: ${book.fileName}</h3>
</div>
<div id="messages">${book.messages}</div>
@@ -66,7 +75,7 @@
<c:if test="${book.notEmpty}">
<div id="filter">
<p>Filter:
<p><%=intl._("Filter")%>:
<a href="addressbook.jsp?filter=a&begin=0&end=99">a</a>
<a href="addressbook.jsp?filter=b&begin=0&end=99">b</a>
<a href="addressbook.jsp?filter=c&begin=0&end=99">c</a>
@@ -94,10 +103,10 @@
<a href="addressbook.jsp?filter=y&begin=0&end=99">y</a>
<a href="addressbook.jsp?filter=z&begin=0&end=99">z</a>
<a href="addressbook.jsp?filter=0-9&begin=0&end=99">0-9</a>
<a href="addressbook.jsp?filter=none&begin=0&end=99">all</a></p>
<a href="addressbook.jsp?filter=none&begin=0&end=99"><%=intl._("all")%></a></p>
<c:if test="${book.hasFilter}">
<p>Current filter: ${book.filter}
(<a href="addressbook.jsp?filter=none&begin=0&end=99">clear filter</a>)</p>
<p><%=intl._("Current filter")%>: ${book.filter}
(<a href="addressbook.jsp?filter=none&begin=0&end=99"><%=intl._("clear filter")%></a>)</p>
</c:if>
</div>
@@ -106,8 +115,8 @@
<input type="hidden" name="end" value="99">
<div id="search">
<table><tr>
<td class="search">Search: <input type="text" name="search" value="${book.search}" size="20" ></td>
<td class="search"><input type="image" src="images/search.png" name="submitsearch" value="search" alt="Search" ></td>
<td class="search"><%=intl._("Search")%>: <input type="text" name="search" value="${book.search}" size="20" ></td>
<td class="search"><input type="submit" name="submitsearch" value="<%=intl._("Search")%>" ></td>
</tr>
</table>
</div>
@@ -131,17 +140,17 @@
<th>&nbsp;</th>
</c:if>
<th>Name</th>
<th>Destination</th>
<th><%=intl._("Name")%></th>
<th><%=intl._("Destination")%></th>
</tr>
<!-- limit iterator, or "Form too large" may result on submit, and is a huge web page if we don't -->
<c:forEach items="${book.entries}" var="addr" begin="${book.begin}" end="${book.end}">
<tr class="list${book.trClass}">
<c:if test="${book.master || book.router || book.published || book.private}">
<td class="checkbox"><input type="checkbox" name="checked" value="${addr.name}" alt="Mark for deletion"></td>
<td class="checkbox"><input type="checkbox" name="checked" value="${addr.name}" title="<%=intl._("Mark for deletion")%>"></td>
</c:if>
<td class="names"><a href="http://${addr.name}/">${addr.name}</a> -
<span class="addrhlpr"><a href="http://${addr.name}/?i2paddresshelper=${addr.destination}">(addrhlpr)</a></span>
<span class="addrhlpr">(<a href="http://${addr.name}/?i2paddresshelper=${addr.destination}"><%=intl._("address helper link")%></a>)</span>
</td>
<td class="destinations"><textarea rows="1" style="height: 3em;" cols="40" wrap="off" readonly="readonly" name="dest_${addr.name}" >${addr.destination}</textarea></td>
</tr>
@@ -151,7 +160,7 @@
<c:if test="${book.master || book.router || book.published || book.private}">
<div id="buttons">
<p class="buttons"><input type="image" name="action" value="delete" src="images/delete.png" alt="Delete checked" >
<p class="buttons"><input type="submit" name="action" value="<%=intl._("Delete")%>" >
</p>
</div>
</c:if>
@@ -160,17 +169,17 @@
<c:if test="${book.isEmpty}">
<div id="book">
<p class="book">The ${book.book} addressbook is empty.</p>
<p class="book"><%=intl._("This addressbook is empty.")%></p>
</div>
</c:if>
<div id="add">
<p class="add">
<h3>Add new destination:</h3>
<b>Hostname:</b> <input type="text" name="hostname" value="${book.hostname}" size="20">
<b>Destination:</b> <textarea name="destination" rows="1" style="height: 3em;" cols="40" wrap="off" >${book.destination}</textarea><br/>
<h3><%=intl._("Add new destination")%>:</h3>
<b><%=intl._("Hostname")%>:</b> <input type="text" name="hostname" value="${book.hostname}" size="20">
<b><%=intl._("Destination")%>:</b> <textarea name="destination" rows="1" style="height: 3em;" cols="40" wrap="off" >${book.destination}</textarea><br/>
</p><p>
<input type="image" name="action" value="add" src="images/add.png" alt="Add destination" >
<input type="submit" name="action" value="<%=intl._("Add")%>" >
</p>
</div>

View File

@@ -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">

View File

@@ -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>
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._("The addressbook application is part of your i2p installation.")%>
<%=intl._("It regularly updates your hosts.txt file from distributed sources or \"subscriptions\".")%>
</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._("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>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.
<p>
<%=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>
<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>

View File

@@ -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">

View File

@@ -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">

View File

@@ -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;
}
}

View File

@@ -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; }
}
}

View File

@@ -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 {

View File

@@ -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();

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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
*/

View File

@@ -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() + "]";
}
}
}

View File

@@ -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() + "]";
}
}
}

View File

@@ -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;

View File

@@ -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();
}
}
}

View File

@@ -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();
}
}
}

View File

@@ -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();
}
}
}

View File

@@ -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();
}
}
}

View File

@@ -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() {

View File

@@ -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();
}
}
}

View File

@@ -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);
}
}
}

View File

@@ -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.

View File

@@ -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);
}
}
}
}

View File

@@ -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() + "]";
}
}
}

View File

@@ -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;

View File

@@ -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();
}
}
}

View File

@@ -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();
}
}
}

View File

@@ -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();
}
}
}

View File

@@ -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;

View File

@@ -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();
}
}
}

View File

@@ -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;

View File

@@ -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;

View File

@@ -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();
}
}
}

View File

@@ -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() + "]";
}
}
}

View File

@@ -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();
}
}
}

View File

@@ -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();
}
}
}

View File

@@ -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
}
}
*********/
}

View File

@@ -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" +

View File

@@ -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;

View File

@@ -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;

View File

@@ -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
}
}
}
}

View File

@@ -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);

View File

@@ -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

View File

@@ -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;

View File

@@ -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
*

View File

@@ -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) {

Some files were not shown because too many files have changed in this diff Show More