diff --git a/.mtn-ignore b/.mtn-ignore new file mode 100644 index 0000000000000000000000000000000000000000..b0fd2e40a5d11eeb1d34ef8274c151dcaa27b0ca --- /dev/null +++ b/.mtn-ignore @@ -0,0 +1,24 @@ +# Just to try and prevent some noob disasters. +# Use mtn add --no-respect-ignore foo.jar to ignore this ignore list +_jsp\.java$ +\.bz2$ +\.class$ +\.diff$ +\.exe$ +\.fba$ +\.gz$ +\.jar$ +\.out$ +\.patch$ +\.sig$ +\.sud$ +\.su2$ +\.tar$ +\.war$ +\.zip$ +^\. +^build/ +^pkg-temp/ +~$ +/build/ +/classes/ diff --git a/.tx/config b/.tx/config new file mode 100644 index 0000000000000000000000000000000000000000..060c32625f9406ae6c54df4c83f443ef2cbcade9 --- /dev/null +++ b/.tx/config @@ -0,0 +1,67 @@ +[I2P.i2ptunnel] +source_file = apps/i2ptunnel/locale/messages_en.po +source_lang = en +trans.ar = apps/i2ptunnel/locale/messages_ar.po +trans.de = apps/i2ptunnel/locale/messages_de.po +trans.es = apps/i2ptunnel/locale/messages_es.po +trans.fr = apps/i2ptunnel/locale/messages_fr.po +trans.nl = apps/i2ptunnel/locale/messages_nl.po +trans.ru = apps/i2ptunnel/locale/messages_ru.po +trans.zh_CN = apps/i2ptunnel/locale/messages_zh.po + +[I2P.routerconsole] +source_file = apps/routerconsole/locale/messages_en.po +source_lang = en +trans.ar = apps/routerconsole/locale/messages_ar.po +trans.de = apps/routerconsole/locale/messages_de.po +trans.es = apps/routerconsole/locale/messages_es.po +trans.fr = apps/routerconsole/locale/messages_fr.po +trans.nl = apps/routerconsole/locale/messages_nl.po +trans.ru = apps/routerconsole/locale/messages_ru.po +trans.zh_CN = apps/routerconsole/locale/messages_zh.po + +[I2P.i2psnark] +source_file = apps/i2psnark/locale/messages_en.po +source_lang = en +trans.ar = apps/i2psnark/locale/messages_ar.po +trans.de = apps/i2psnark/locale/messages_de.po +trans.es = apps/i2psnark/locale/messages_es.po +trans.fr = apps/i2psnark/locale/messages_fr.po +trans.nl = apps/i2psnark/locale/messages_nl.po +trans.pt = apps/i2psnark/locale/messages_pt.po +trans.ru = apps/i2psnark/locale/messages_ru.po +trans.zh_CN = apps/i2psnark/locale/messages_zh.po + +[I2P.susidns] +source_file = apps/susidns/locale/messages_en.po +source_lang = en +trans.ar = apps/susidns/locale/messages_ar.po +trans.de = apps/susidns/locale/messages_de.po +trans.es = apps/susidns/locale/messages_es.po +trans.fr = apps/susidns/locale/messages_fr.po +trans.nl = apps/susidns/locale/messages_nl.po +trans.ru = apps/susidns/locale/messages_ru.po +trans.zh_CN = apps/susidns/locale/messages_zh.po + +[I2P.desktopgui] +source_file = apps/desktopgui/locale/messages_en.po +source_lang = en +trans.ar = apps/desktopgui/locale/messages_ar.po +trans.de = apps/desktopgui/locale/messages_de.po +trans.es = apps/desktopgui/locale/messages_es.po +trans.fr = apps/desktopgui/locale/messages_fr.po +trans.nl = apps/desktopgui/locale/messages_nl.po +trans.ru = apps/desktopgui/locale/messages_ru.po +trans.zh_CN = apps/desktopgui/locale/messages_zh.po + +[I2P.susimail] +source_file = apps/susimail/locale/messages_en.po +source_lang = en +trans.de = apps/susimail/locale/messages_de.po +trans.es = apps/susimail/locale/messages_es.po +trans.fr = apps/susimail/locale/messages_fr.po +trans.nl = apps/susimail/locale/messages_nl.po + +[main] +host = http://www.transifex.net + diff --git a/apps/BOB/src/net/i2p/BOB/BOB.java b/apps/BOB/src/net/i2p/BOB/BOB.java index 2c689f65db73925149e56aafc64cfe7f62fb8906..60bf2b9ff65839f7d0f5716c894f336cb52b54e8 100644 --- a/apps/BOB/src/net/i2p/BOB/BOB.java +++ b/apps/BOB/src/net/i2p/BOB/BOB.java @@ -120,6 +120,7 @@ public class BOB { public final static String PROP_CONFIG_LOCATION = "BOB.config"; public final static String PROP_BOB_PORT = "BOB.port"; public final static String PROP_BOB_HOST = "BOB.host"; + public final static String PROP_CFG_VER = "BOB.CFG.VER"; private static NamedDB database; private static Properties props = new Properties(); private static AtomicBoolean spin = new AtomicBoolean(true); @@ -209,30 +210,41 @@ public class BOB { // Global router and client API configurations that are missing are set to defaults here. if (!props.containsKey(I2PClient.PROP_TCP_HOST)) { props.setProperty(I2PClient.PROP_TCP_HOST, "localhost"); + save = true; } if (!props.containsKey(I2PClient.PROP_TCP_PORT)) { props.setProperty(I2PClient.PROP_TCP_PORT, "7654"); - } - if (!props.containsKey(I2PClient.PROP_RELIABILITY)) { - props.setProperty(I2PClient.PROP_RELIABILITY, I2PClient.PROP_RELIABILITY_BEST_EFFORT); + save = true; } if (!props.containsKey(PROP_BOB_PORT)) { props.setProperty(PROP_BOB_PORT, "2827"); // 0xB0B + save = true; } if (!props.containsKey("inbound.length")) { props.setProperty("inbound.length", "1"); + save = true; } if (!props.containsKey("outbound.length")) { props.setProperty("outbound.length", "1"); + save = true; } if (!props.containsKey("inbound.lengthVariance")) { props.setProperty("inbound.lengthVariance", "0"); + save = true; } if (!props.containsKey("outbound.lengthVariance")) { props.setProperty("outbound.lengthVariance", "0"); + save = true; } if (!props.containsKey(PROP_BOB_HOST)) { props.setProperty(PROP_BOB_HOST, "localhost"); + save = true; + } + // PROP_RELIABILITY_NONE, PROP_RELIABILITY_BEST_EFFORT, PROP_RELIABILITY_GUARANTEED + if (!props.containsKey(PROP_CFG_VER)) { + props.setProperty(I2PClient.PROP_RELIABILITY, I2PClient.PROP_RELIABILITY_NONE); + props.setProperty(PROP_CFG_VER,"1"); + save = true; } if (save) { File cfg = new File(configLocation); diff --git a/apps/BOB/src/net/i2p/BOB/DoCMDS.java b/apps/BOB/src/net/i2p/BOB/DoCMDS.java index 9894530d810118552bdbe8bae3a43a0c70386673..e070826d05b739ecc3eefdaf8fccba46062c7132 100644 --- a/apps/BOB/src/net/i2p/BOB/DoCMDS.java +++ b/apps/BOB/src/net/i2p/BOB/DoCMDS.java @@ -32,11 +32,12 @@ import java.net.Socket; import java.util.Properties; import java.util.StringTokenizer; import java.util.concurrent.atomic.AtomicBoolean; +import net.i2p.I2PAppContext; import net.i2p.I2PException; import net.i2p.client.I2PClientFactory; -import net.i2p.data.DataFormatException; +//import net.i2p.data.DataFormatException; import net.i2p.data.Destination; -import net.i2p.i2ptunnel.I2PTunnel; +//import net.i2p.i2ptunnel.I2PTunnel; import net.i2p.util.Log; // needed only for debugging. // import java.util.logging.Level; @@ -52,7 +53,7 @@ public class DoCMDS implements Runnable { // FIX ME // I need a better way to do versioning, but this will do for now. - public static final String BMAJ = "00", BMIN = "00", BREV = "0E", BEXT = ""; + public static final String BMAJ = "00", BMIN = "00", BREV = "0F", BEXT = ""; public static final String BOBversion = BMAJ + "." + BMIN + "." + BREV + BEXT; private Socket server; private Properties props; @@ -106,7 +107,7 @@ public class DoCMDS implements Runnable { private static final String C_visit = "visit"; private static final String C_zap = "zap"; - /* all the coomands available, plus description */ + /* all the commands available, plus description */ private static final String C_ALL[][] = { {C_help, C_help + " <command> * Get help on a command."}, {C_clear, C_clear + " * Clear the current nickname out of the list."}, @@ -456,11 +457,14 @@ public class DoCMDS implements Runnable { String reply = null; if (Arg.endsWith(".i2p")) { try { - try { - dest = I2PTunnel.destFromName(Arg); - } catch (DataFormatException ex) { + //try { + //dest = I2PTunnel.destFromName(Arg); + //} catch (DataFormatException ex) { + //} + dest = I2PAppContext.getGlobalContext().namingService().lookup(Arg); + if(dest != null) { + reply = dest.toBase64(); } - reply = dest.toBase64(); } catch (NullPointerException npe) { // Could not find the destination!? } @@ -958,7 +962,7 @@ public class DoCMDS implements Runnable { } catch (Exception e) { break die; } -// Finally say OK. + // Finally say OK. out.println("OK Nickname set to " + Arg); } @@ -1468,7 +1472,7 @@ public class DoCMDS implements Runnable { } // die out.print("ERROR A really bad error just happened, "); } // quit -// Say goodbye. + // Say goodbye. out.println("OK Bye!"); diff --git a/apps/BOB/src/net/i2p/BOB/TCPtoI2P.java b/apps/BOB/src/net/i2p/BOB/TCPtoI2P.java index a537d942f8769d7476140fafbfa9cb28f9a5aed7..0e00f1c50e421dbe3ddd2686f8985a680117dec1 100644 --- a/apps/BOB/src/net/i2p/BOB/TCPtoI2P.java +++ b/apps/BOB/src/net/i2p/BOB/TCPtoI2P.java @@ -36,7 +36,8 @@ import net.i2p.client.streaming.I2PSocket; import net.i2p.client.streaming.I2PSocketManager; import net.i2p.data.DataFormatException; import net.i2p.data.Destination; -import net.i2p.i2ptunnel.I2PTunnel; +//import net.i2p.i2ptunnel.I2PTunnel; +import net.i2p.I2PAppContext; /** * @@ -146,11 +147,11 @@ public class TCPtoI2P implements Runnable { input = line.toLowerCase(); Destination dest = null; if (input.endsWith(".i2p")) { - try { - dest = I2PTunnel.destFromName(input); + //dest = I2PTunnel.destFromName(input); + dest = I2PAppContext.getGlobalContext().namingService().lookup(input); + if (dest != null) { line = dest.toBase64(); - } catch (NullPointerException npe) { - // Could not find the destination!? + } else { Emsg("Can't find destination: " + input, out); return; } diff --git a/apps/addressbook/build.xml b/apps/addressbook/build.xml index 6332c5bcc6d6345d0c42103bf94faf3a949725ee..30750a231fcb8d95bb4bce5572d5ae315f6b96e5 100644 --- a/apps/addressbook/build.xml +++ b/apps/addressbook/build.xml @@ -38,6 +38,7 @@ <target name="compile" depends="init, depend"> <javac debug="true" deprecation="on" source="1.5" target="1.5" + includeAntRuntime="false" srcdir="${src}" destdir="${build}"> <compilerarg line="${javac.compilerargs}" /> <classpath> @@ -47,27 +48,52 @@ </javac> </target> - <target name="jar" depends="compile"> + <!-- unused for now, as we oddly ship addressbook as a .war --> + <target name="jar" depends="compile, changes"> <jar basedir="${build}" destfile="${dist}/${jar}"> <manifest> <attribute name="Main-Class" value="addressbook.Daemon"/> + <attribute name="Build-Date" value="${build.timestamp}" /> + <attribute name="Base-Revision" value="${workspace.version}" /> + <attribute name="Workspace-Changes" value="${workspace.changes}" /> </manifest> </jar> </target> - <target name="war" depends="compile" unless="war.uptodate"> + <target name="war" depends="compile, changes, warUpToDate" unless="war.uptodate"> <mkdir dir="${dist}/tmp"/> <mkdir dir="${dist}/tmp/WEB-INF"/> <mkdir dir="${dist}/tmp/WEB-INF/classes"/> <copy todir="${dist}/tmp/WEB-INF/classes"> <fileset dir="${build}"/> </copy> - <war basedir="${dist}/tmp" webxml="web.xml" destfile="${dist}/${war}"/> + <war basedir="${dist}/tmp" webxml="web.xml" destfile="${dist}/${war}"> + <manifest> + <attribute name="Build-Date" value="${build.timestamp}" /> + <attribute name="Base-Revision" value="${workspace.version}" /> + <attribute name="Workspace-Changes" value="${workspace.changes.tr}" /> + </manifest> + </war> <delete dir="${dist}/tmp"/> </target> - <uptodate property="war.uptodate" targetfile="${dist}/${war}"> - <srcfiles dir= "." includes="${build}/**/*.class, web.xml"/> - </uptodate> + <target name="warUpToDate"> + <uptodate property="war.uptodate" targetfile="${dist}/${war}"> + <srcfiles dir= "." includes="${build}/**/*.class, web.xml"/> + </uptodate> + </target> + <target name="changes"> + <exec executable="mtn" outputproperty="workspace.changes" errorproperty="mtn.error2" failifexecutionfails="false" > + <arg value="list" /> + <arg value="changed" /> + <arg value="." /> + </exec> + <!-- \n in an attribute value generates an invalid manifest --> + <exec executable="tr" inputstring="${workspace.changes}" outputproperty="workspace.changes.tr" errorproperty="mtn.error2" failifexecutionfails="false" > + <arg value="-s" /> + <arg value="[:space:]" /> + <arg value="," /> + </exec> + </target> </project> diff --git a/apps/desktopgui/README b/apps/desktopgui/README new file mode 100644 index 0000000000000000000000000000000000000000..569ca580a9b62c6337508ab9e5c9490174cd6dfd --- /dev/null +++ b/apps/desktopgui/README @@ -0,0 +1,13 @@ +Current setup: +* Build desktopgui: + * 'ant jar' in the desktopgui directory + OR + * 'ant desktopgui' in the i2p.i2p directory +* Place desktopgui.jar in the $I2P/lib/ directory. +* Add to .i2p/clients.config: + #Desktopgui + clientApp.6.args= + clientApp.6.delay=5 + clientApp.6.main=net.i2p.desktopgui.Main + clientApp.6.name=desktopgui + clientApp.6.startOnLoad=true diff --git a/apps/desktopgui/TODO b/apps/desktopgui/TODO new file mode 100644 index 0000000000000000000000000000000000000000..c05b8dcd8ad210120c449b4ff57489ae3c30b493 --- /dev/null +++ b/apps/desktopgui/TODO @@ -0,0 +1,55 @@ +HIGH PRIORITY: +- Allow desktopgui to start, stop and restart I2P. - DONE +- Correct logging system - DONE +- Internationalisation: + * Add strings - DONE + * Add Windows support - NEED TO CHECK + * Might need some kind of trigger to reload the menu (for live language switching) - DONE + * Language choice is not actually set as a parameter in I2P config? + As a result, desktopgui always starts with the default, unless you manually set the language. + DONE - uses routerconsole.lang -- this parameter is now updated in routerconsole as well +- Check if we're inside I2P without using a command-line parameter - DONE +- Modify installer to set I2P directory parameter; or use $I2P? - Is already there +- Include in installer - TODO +- Start desktopgui without adding to clients.config and without adding a dependency on routerconsole! + * One possibility: + Adding some kind of 'ApplicationManager' that allows starting applications. + Extra remark: ApplicationManager should also allow stopping certain applications from launching. + Suggestion: + * ApplicationManager reads/writes clients.config + * ApplicationManager itself: independent from clients.config? + * Upon reboot, ApplicationManager could add a new application to clients.config _if_ the 'application.manager.version' is not there, or is smaller than the current version. + * ApplicationManager can be the clients.config backend for routerconsole, so routerconsole is not the dependency. + * API: + - addConfig(args, name, ...) + - removeConfig(int) + - removeConfig(ConfigFilter) + ConfigFilter() { + boolean filterArgs(String args); + boolean filterMain(String main); + ... + } + - editConfig(args, name, ..., ConfigFilter) + - editConfig(args, name, ..., int) + - editConfigArgs(args, ConfigFilter) + - editConfigArgs(args, int) + - ... + * For now: added in the routerconsole startup (like the old SysTray. - DONE + Possible migration path: startup ApplicationManager in routerconsole the first time. +- Check bug: restart is happening instead of shutdown! +- Check build order (for example: first desktopgui, only later routerconsole) +- Fix tabs versus spaces ;-) +- Add check for Java version 6 in RouterConsoleRunner! +UNKNOWN: +- API to allow applications to add themselves to the menu? + * registerApplication(); -- should return a positive number on success, -1 on failure + * unregisterApplication(int); -- should return nothing (or bool for success?), and the parameter should be the number given when registering the application +- Fetch I2P localhost from the core I2P application? +- Use I2PAppContext::appDir (something like that) for desktopgui data. +- Consider SWT as option + * Check core/java/src/net/i2p/util/FileUtil.java for dynamic jar loading + * Possible logic: + - First try to load SWT (has the most options and is not ugly) + - Then load AWT +- Access router.jar from other JVM? Is this possible? -- no: use I2CP with auth (not ready yet) +- Start desktopgui with another user than the user starting I2P (required for daemon usage). diff --git a/apps/desktopgui/build.xml b/apps/desktopgui/build.xml index 8138f14c5e67919bebe59581408cf0263e61c937..9a2bb13fb676f2f047f3206fdc40e014e8928271 100644 --- a/apps/desktopgui/build.xml +++ b/apps/desktopgui/build.xml @@ -1,119 +1,108 @@ <?xml version="1.0" encoding="UTF-8"?> -<!-- You may freely edit this file. See commented blocks below for --> -<!-- some examples of how to customize the build. --> -<!-- (If you delete it and reopen the project it will be recreated.) --> -<!-- By default, only the Clean and Build commands use this build script. --> -<!-- Commands such as Run, Debug, and Test only use this build script if --> -<!-- the Compile on Save feature is turned off for the project. --> -<!-- You can turn off the Compile on Save (or Deploy on Save) setting --> -<!-- in the project's Project Properties dialog box.--> -<project name="desktopgui" default="default" basedir="."> - <description>Builds, tests, and runs the project desktopgui.</description> - <import file="nbproject/build-impl.xml"/> - <!-- +<project basedir="." default="all" name="desktopgui"> - There exist several targets which are by default empty and which can be - used for execution of your tasks. These targets are usually executed - before and after some main targets. They are: + <property name="src" value="src"/> + <property name="build" value="build"/> + <property name="dist" location="dist"/> + <property name="jar" value="desktopgui.jar"/> + <property name="resources" value="resources"/> + <property name="javadoc" value="javadoc"/> - -pre-init: called before initialization of project properties - -post-init: called after initialization of project properties - -pre-compile: called before javac compilation - -post-compile: called after javac compilation - -pre-compile-single: called before javac compilation of single file - -post-compile-single: called after javac compilation of single file - -pre-compile-test: called before javac compilation of JUnit tests - -post-compile-test: called after javac compilation of JUnit tests - -pre-compile-test-single: called before javac compilation of single JUnit test - -post-compile-test-single: called after javac compilation of single JUunit test - -pre-jar: called before JAR building - -post-jar: called after JAR building - -post-clean: called after cleaning build products + <property name="javac.compilerargs" value=""/> - (Targets beginning with '-' are not intended to be called on their own.) + <target name="init"> + <mkdir dir="${build}"/> + <mkdir dir="${build}/${resources}"/> + <mkdir dir="${build}/${javadoc}"/> + <mkdir dir="${dist}"/> + </target> - Example of inserting an obfuscator after compilation could look like this: + <target name="clean"> + <delete dir="${build}"/> + <delete dir="${dist}"/> + </target> - <target name="-post-compile"> - <obfuscate> - <fileset dir="${build.classes.dir}"/> - </obfuscate> - </target> + <target name="compile" depends="init"> + <javac debug="true" deprecation="on" source="1.5" target="1.5" + includeAntRuntime="false" + srcdir="${src}" destdir="${build}"> + <compilerarg line="${javac.compilerargs}" /> + <classpath> + <pathelement location="../../core/java/build/i2p.jar" /> + <!-- doesn't matter if we're not on win32, we just need the java classes, not the platform-dependent code --> + <pathelement location="../../installer/lib/wrapper/win32/wrapper.jar" /> + <pathelement location="../../router/java/build/router.jar" /> + </classpath> + </javac> + <copy todir="${build}/desktopgui/${resources}"> + <fileset dir="${resources}" /> + </copy> + </target> - For list of available properties check the imported - nbproject/build-impl.xml file. + <target name="jar" depends="compile"> + <exec executable="sh" osfamily="unix" failifexecutionfails="true" > + <arg value="./bundle-messages.sh" /> + </exec> + <exec executable="sh" osfamily="mac" failifexecutionfails="true" > + <arg value="./bundle-messages.sh" /> + </exec> + <!-- multi-lang is optional --> + <exec executable="sh" osfamily="windows" failifexecutionfails="false" > + <arg value="./bundle-messages.sh" /> + </exec> + <exec executable="mtn" outputproperty="workspace.changes" errorproperty="mtn.error2" failifexecutionfails="false" > + <arg value="list" /> + <arg value="changed" /> + <arg value="." /> + </exec> + <!-- \n in an attribute value generates an invalid manifest --> + <exec executable="tr" inputstring="${workspace.changes}" outputproperty="workspace.changes.tr" errorproperty="mtn.error2" failifexecutionfails="false" > + <arg value="-s" /> + <arg value="[:space:]" /> + <arg value="," /> + </exec> + <jar basedir="${build}" destfile="${dist}/${jar}"> + <manifest> + <attribute name="Main-Class" value="net.i2p.desktopgui.Main"/> + <attribute name="Build-Date" value="${build.timestamp}" /> + <attribute name="Base-Revision" value="${workspace.version}" /> + <attribute name="Workspace-Changes" value="${workspace.changes.tr}" /> + </manifest> + </jar> + </target> - - Another way to customize the build is by overriding existing main targets. - The targets of interest are: - - -init-macrodef-javac: defines macro for javac compilation - -init-macrodef-junit: defines macro for junit execution - -init-macrodef-debug: defines macro for class debugging - -init-macrodef-java: defines macro for class execution - -do-jar-with-manifest: JAR building (if you are using a manifest) - -do-jar-without-manifest: JAR building (if you are not using a manifest) - run: execution of project - -javadoc-build: Javadoc generation - test-report: JUnit report generation - - An example of overriding the target for project execution could look like this: - - <target name="run" depends="BOB-impl.jar"> - <exec dir="bin" executable="launcher.exe"> - <arg file="${dist.jar}"/> - </exec> - </target> - - Notice that the overridden target depends on the jar target and not only on - the compile target as the regular run target does. Again, for a list of available - properties which you can use, check the target you are overriding in the - nbproject/build-impl.xml file. - - --> - <property name="build_src" location="src"/> - <property name="build_bin" location="bin"/> - <property name="build_dist" location="dist"/> - <property name="build_lib" location="lib"/> - <property name="build_i2pref" location="../../build"/> - <property name="build_routerconsole" location="../routerconsole/java/build/"/> - <property name="build_i2ptunnel" location="../i2ptunnel/java/build/"/> - - <path id="build_classpath"> - <fileset dir="${build_lib}" includes="**/*.jar"/> - <fileset dir="${build_i2pref}" includes="**/*.jar"/> - <fileset dir="${build_routerconsole}" includes="**/*.jar"/> - <fileset dir="${build_i2ptunnel}" includes="**/*.jar"/> - </path> - <target name="build_init"> - <!-- Create the time stamp --> - <tstamp/> - <mkdir dir="${build_dist}"/> - <mkdir dir="${build_bin}"/> - </target> - <target name="build_compile" depends="build_init" - description="compile the source " > - <!-- Compile the java code from ${src} into ${bin} --> - <javac srcdir="${build_src}" destdir="${build_bin}" classpathref="build_classpath"/> - <copy todir="${build_bin}"> - <fileset dir="${build_src}"> - <exclude name="**/*.java"/> - </fileset> - </copy> + <target name="javadoc"> + <mkdir dir="${build}" /> + <mkdir dir="${build}/${javadoc}" /> + <javadoc + sourcepath="${src}" destdir="${build}/${javadoc}" + packagenames="*" + use="true" + splitindex="true" + windowtitle="Desktopgui"> + <classpath> + <pathelement location="../../router/java/build/router.jar" /> + <pathelement location="../../core/java/build/i2p.jar" /> + </classpath> + </javadoc> </target> - <target name="build_jar" depends="build_compile" - description="generate the distribution" > - <!-- Create the distribution directory --> - <mkdir dir="${build_dist}/lib"/> - <!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file --> - <zip destfile="${build_dist}/desktopgui.jar" basedir="${build_bin}" /> + <target name="poupdate"> + <exec executable="sh" osfamily="unix" failifexecutionfails="true" > + <arg value="./bundle-messages.sh" /> + <arg value="-p" /> + </exec> + <exec executable="sh" osfamily="mac" failifexecutionfails="true" > + <arg value="./bundle-messages.sh" /> + <arg value="-p" /> + </exec> + <exec executable="sh" osfamily="windows" failifexecutionfails="true" > + <arg value="./bundle-messages.sh" /> + <arg value="-p" /> + </exec> </target> - <target name="build_clean" - description="clean up" > - <!-- Delete the ${build} and ${dist} directory trees --> - <delete dir="${build_bin}"/> - <delete dir="${build_dist}"/> - </target> + <target name="dist" depends="jar" /> + <target name="all" depends="jar" /> </project> + diff --git a/apps/desktopgui/bundle-messages.sh b/apps/desktopgui/bundle-messages.sh new file mode 100644 index 0000000000000000000000000000000000000000..420fb5945785eaf118d52cddd4b56298bf38e49a --- /dev/null +++ b/apps/desktopgui/bundle-messages.sh @@ -0,0 +1,111 @@ +# +# Update messages_xx.po and messages_xx.class files, +# from both java and jsp sources. +# Requires installed programs xgettext, msgfmt, msgmerge, and find. +# +# usage: +# bundle-messages.sh (generates the resource bundle from the .po file) +# bundle-messages.sh -p (updates the .po file from the source tags, then generates the resource bundle) +# +# zzz - public domain +# Mathiasdm - modifications for desktopgui +# +CLASS=net.i2p.desktopgui.messages +TMPFILE=build/javafiles.txt +export TZ=UTC + +if [ "$1" = "-p" ] +then + POUPDATE=1 +fi + +# on windows, one must specify the path of commnad find +# since windows has its own retarded version of find. +if which find|grep -q -i windows ; then + export PATH=.:/bin:/usr/local/bin:$PATH +fi +# Fast mode - update ondemond +# set LG2 to the language you need in envrionment varibales to enable this + +# add ../java/ so the refs will work in the po file +JPATHS="src" +for i in locale/messages_*.po +do + # get language + LG=${i#locale/messages_} + LG=${LG%.po} + + # skip, if specified + if [ $LG2 ]; then + [ $LG != $LG2 ] && continue || echo INFO: Language update is set to [$LG2] only. + fi + + if [ "$POUPDATE" = "1" ] + then + # make list of java files newer than the .po file + find $JPATHS -name *.java -newer $i > $TMPFILE + fi + + if [ -s build/net/i2p/desktopgui/messages_$LG.class -a \ + build/net/i2p/desktopgui/messages_$LG.class -nt $i -a \ + ! -s $TMPFILE ] + then + continue + fi + + if [ "$POUPDATE" = "1" ] + then + echo "Updating the $i file from the tags..." + # extract strings from java and jsp files, and update messages.po files + # translate calls must be one of the forms: + # _("foo") + # _x("foo") + # intl._("foo") + # intl.title("foo") + # handler._("foo") + # formhandler._("foo") + # net.i2p.router.web.Messages.getString("foo") + # In a jsp, you must use a helper or handler that has the context set. + # To start a new translation, copy the header from an old translation to the new .po file, + # then ant distclean updater. + find $JPATHS -name *.java > $TMPFILE + xgettext -f $TMPFILE -F -L java --from-code=UTF-8 --add-comments\ + --keyword=_ --keyword=_x --keyword=intl._ --keyword=intl.title \ + --keyword=handler._ --keyword=formhandler._ \ + --keyword=net.i2p.router.web.Messages.getString \ + -o ${i}t + if [ $? -ne 0 ] + then + echo 'Warning - xgettext failed, not updating translations' + rm -f ${i}t + break + fi + msgmerge -U --backup=none $i ${i}t + if [ $? -ne 0 ] + then + echo 'Warning - msgmerge failed, not updating translations' + rm -f ${i}t + break + fi + rm -f ${i}t + # so we don't do this again + touch $i + fi + + if [ "$LG" != "en" ] + then + # only generate for non-source language + echo "Generating ${CLASS}_$LG ResourceBundle..." + + # convert to class files in build + msgfmt --java --statistics -r $CLASS -l $LG -d build $i + if [ $? -ne 0 ] + then + echo 'Warning - msgfmt failed, not updating translations' + break + fi + fi +done +rm -f $TMPFILE +# todo: return failure +exit 0 diff --git a/apps/desktopgui/desktopgui/resources/howto/howto.html b/apps/desktopgui/desktopgui/resources/howto/howto.html deleted file mode 100644 index ea1b025c7b01ab4563d70a7db4396ee341ab9d69..0000000000000000000000000000000000000000 --- a/apps/desktopgui/desktopgui/resources/howto/howto.html +++ /dev/null @@ -1,261 +0,0 @@ -<html> - <head> - <title>Small Guide to I2P</title> - </head> - <body> - <h1>Small Guide to I2P</h1> - - <h2>So, what's this all about?</h2> - - <p>I2P builds up a new net inside the usual internet, connecting nodes together - via encrypted connections. - It is a JAVA prgram with its most used part (the encryption of the data) written - in handoptimized assembler code. - It will use your bandwith, your RAM and your CPU. It will use them all up if you - do not limit it. - I2P will route unknown traffic through your node, even stuff you dislike. - As that data is encrypted, nobody knows whats data went to or drom your node. - </p> - - <p> - First, ALWAYS use the latest stable release. - Development releases are called "mtn version" and are marked with a -, e.g. - 0.6.5-1. Those are usually useable by all but could do harm to your I2P - experience. - You can get the latest MTN builds from my eepsite echelon.i2p, but always - remember: I built them, you need to trust me not to changed the code! - After you get the right "i2pupdate.zip" file, put that file into the I2P - directory and hit restart on the router console http://127.0.0.1:7657. - Do NOT deflate the zip file! - </p> - - <p> - I2P is very dynamic - after startup it tries to get known to other I2P routers - and measures their speed - you need to wait some 10-120 minutes until your - I2P router knows enough other ones to obtain full power of I2P. - </p> - - <h2>Filesharing</h2> - - <p> - I2P is able to do anonymous filesharing. - But as there are NO gateways between real net and I2P, you can only share/ - download torrents from within I2P. Look e.g. postman.i2p or planet.i2p. - You CANNOT use azureus, utorrent or any other usual client. - You cannot download anonymous torrents from mininova, piratebay or else. - You need to use I2P internal torrents and I2P aware programs like - I2Psnark (builtin, suitable for 1-20 torrents) - I2PRufus (external, python, high CPU load, suitable >20 torrents) http://echelon.i2p/i2prufus - I2P-BT (external, python) - I2PsnarkXL (mod of I2Psnark made by fwd) - </p> - - <p> - There are also gnutella and edonkey clients: - i2phex for gnutella (http://echelon.i2p/i2phex) - imule for edonkey (http://echelon.i2p/imule) - </p> - - <p> - Remember, as I2P uses other routers to route your traffic via 1-6 other PCs, - your transferrates in P2P are slower than in usual internet. - But you are anonymous, no one can easily (within 2 months-2 years) get your IP! - torrents inside of I2P reaches up to 50 kb/sec, usual are 10-20 kb/sec per torrent - i2phex reaches up to 20 kb/sec, usually 5-10 kb/sec - imule in times reaches 10 kb/sec, usually 5-10 kb/sec - </p> - - <p> - In I2PHex and imule you can just tell "share file or directory", in torrent - you need to create a .torrent file and upload that (and ONLY that small .torrent) - file to the trackers like tracker.postman.i2p/ - </p> - - <p> - I2P is a smaller net (1000 users) which grows slowly. As of which amount of shared - data will slowly rise. - </p> - - <p> - I2P is anonymous and it does not censor - there is no administrator. - There IS unwanted stuff like kiddyporn, nazism, or else. - If you dislike all this, do not use I2P. - There is NO way to prohibite this stuff to appear in a anonymous net like I2P. - (as that stuff is available shows the anonymity and transfer function of I2P - is working well enough) - You can delete the destinations in question from your local hosts.txt file (or - deface them) which will partly prevent you to reach those bad sies by accident. - </p> - - <h2>Internet (the websites)</h2> - - <p> - Only one outproxy (gateway I2P - webpages in usual Internet) is working. - It is NOT official from I2P, I2P does work without. - If that outproxy is slow, offline, gone,.. I2P still works on and cannot do - anything to change that failure. - That outproxy translates usual internet webpages into the I2P net and you can - reach them via your Router. - The best way for usual webpages is TOR, not that outproxy. - Remember: the owner of the outproxy got ALL traffic from all I2P users - visiting Internet pages and will risk that into the police! - </p> - - <p> - This proxy is false.i2p. In newer I2P routers it is enabled, but not in - older ones. Go to http://127.0.0.1:7657/i2ptunnel/index.jsp tunnels page and - click on the eepProxy tunnel. Change the entry for the "Outproxies" to false.i2p - and save. On the tunnels page, stop the epproxy tunnel and start it again, - now your router will use the false.i2p outproxy. - </p> - - <p> - No other (known) gateways are setup and running. No one we know will run - the gateway for torrent or any other P2P data (and risk his life). - </p> - - <h2>Bandwidth</h2> - - <p>http://127.0.0.1:7657/config.jsp</p> - - <p>Setup your bandwith wisely. Know your linespeed!</p> - - <p> - E.g. most common terms are: - 1Mbit = roughly 100 kbyte/sec - 10 MBit = roughly 1100 kbyte/sec - 512 kbit = roughly 50 kbyte/sec - or in germany: - 16000er = roughly 1500 kbyte/sec - 6000er = roughly 600 kbyte/sec - 1000er = roughly 100 kb/sec - </p> - - <p> - Set your bandwith limits to 10% under your line speed and burst rate to - your line speed. - Set the bandwith share percentage to: - >80% if lowest bandwith setting is >50k - >50% if lowest bandwith setting is >30k - >20% if lowest bandwith setting is >16k - </p> - - <p>There is no shared bandwith under 16k.</p> - - <p> - Limit your participating tunnels (shared bandwith) on: - http://127.0.0.1:7657/configadvanced.jsp - with the line: - router.maxParticipatingTunnels=500 - </p> - - <p> - 2000 is for roughly 600 kb/sec - very high value with high CPU load - 1000 is for roughly 300 kb/sec - 600 is a good value for 150-200kb/sec - 300 is roughly 90 kb/sec - 150 roughly 50 kb/sec - Remember: even failed tunnel requests will result in a part tunnel on the hops in between! - Those said, there are far more part tunnels unused than used in the live net under load, which - results in slower bandwith per tunnel in the end. - It is wise to first limit the bandwith and afterwards the part tunnels, e.g. set some more part - tunnels and let I2P reach the bandwith limit instead of the part tunnels limit! - </p> - - <h2>What is shared bandwidth?</h2> - - <p> - I2P transports your date from the client to the server through 1-6 hops - (other I2P routers). Each of this hops sees the data from you as "participating - tunnel" - which is the shared bandwith of them. - With this in mind, I2P needs some amount of this shared bandwith at some - amount of routers. - Share as much as you are able of - others will thank you! - </p> - - <p> - With the "share percentage" set like above, you will obtain enough speed for - your own traffic and obtain some participating tunnels (if >16kb/sec) with some - noise traffic to hide your traffic in the stream. - </p> - - <p> - With release 0.6.5 there is some method to prefer your own traffic ahead - of shared traffic which will result in better experience to you! - </p> - - <h2>Addressbook</h2> - - <p> - I2P uses a local addressbook to link short DNS names with the internal used 512bit - hashes (which are destination IDs). - Those links are saved insside the hosts.txt and userhosts.txt files in the i2p - directory. - Hosts which are not in those files cannot be reached via the short DNS names - and a error message with "jumper links" will appear. Those links will ask - some hosts services and forward to the correct site (if the site is known to them). - Those hosts services just made a form to add new "hosts" and those results public - available. - You can subscribe to those hosts service and let your hosts.txt file be updated - automatic. Go to http://127.0.0.1:7657/susidns/subscriptions.jsp SusiDNS - and enter the hosts services into the textbox (and save afterwards): - http://www.i2p2.i2p/hosts.txt - http://stats.i2p/cgi-bin/newhosts.txt - http://tino.i2p/hosts.txt - http://i2host.i2p/cgi-bin/i2hostag - You can add one of them, two or all. - SusiDNS will now ask those hosts for new entries to the hosts.txt and those - will be added to your hosts.txt. The userhosts.txt will ONLY be updated by - yourself (the user) and not be published into the net! - Remember, names once set could not be changed! If you loose your key (destination - ID) to your eepsite, service,..., there is no way to change the linking - between the DNS name and the (lost) destination ID automatic! Only manual by each - user itself - great topic to discuss of need to renew DNS hostnames. - As this subscription will not update old entries, you can "deface" unwanted - eepsites with a false key and if you hit the bad name in browser by accident, - you will not see the bad stuff! - </p> - - <h2>Out of Memory errors </h2> - - <p> - If your router hits the Out of Memory error - check your logs! - Usual point for OOM are to much torrents in i2psnark - i2psnark is a real - memory hogg and >10 torrents it requiers hell a lot of memory! - </p> - - <p> - Maybe it is possible for you to increase the wrapper memory config. - This ONLY works if you start the I2P service restartable with console - (on Windows). - In I2P directory edit the wrapper.config file and change the values: - wrapper.java.maxmemory=256 (or even to 512, IF possible) - Afterwards shutdown I2P complete (the service) and restart it. - </p> - - <h2>Blocklists</h2> - - <p> - Sometimes attackers trying to flood the I2P net and try to do some harm. - And some folks setting localnet IPs as their internet reachable address. - To prevent those bad router to harm the local router, I2P implemented - a local blocklist system. It is NOT integrated automatic as it could - really harm your I2P experience if setup the wrong way. - The way to enable blocklists is: - Get the file http://zzz.i2p/files/blocklist.txt and copy this file into the - I2P directory. - On http://127.0.0.1:7657/configadvanced.jsp set the option - router.blocklist.enable=true - click on Apply and restart the router - with the restart link left on router console. - The blockfile.txt file follows a special order, you´ll get it if you read it. - The first entry is the reason to be shown on http://127.0.0.1:7657/profiles.jsp - at the bottom in the shitlist section. - The second entry is the IP or the dest ID of a router. - Right now there are only private subnets in the blocklist AND one chinese router - which floods the floodfill DB while restarting every few minutes with a different - router ID and far to less bandwith for being a floodfill router. - </p> - - <p>(By echelon -- echelon.i2p )</p> - </body> -</html> diff --git a/apps/desktopgui/lib/appframework.jar b/apps/desktopgui/lib/appframework.jar deleted file mode 100644 index 0b8ff0145f010a8e1e9bfe065704cb4ad675f761..0000000000000000000000000000000000000000 Binary files a/apps/desktopgui/lib/appframework.jar and /dev/null differ diff --git a/apps/desktopgui/lib/swing-worker.jar b/apps/desktopgui/lib/swing-worker.jar deleted file mode 100644 index bcdd9d9102c05f881b9283b252c29d98a0187691..0000000000000000000000000000000000000000 Binary files a/apps/desktopgui/lib/swing-worker.jar and /dev/null differ diff --git a/apps/desktopgui/locale/messages_ar.po b/apps/desktopgui/locale/messages_ar.po new file mode 100644 index 0000000000000000000000000000000000000000..e908adb7041099a540cc9fd08bba798f3f5eb89a --- /dev/null +++ b/apps/desktopgui/locale/messages_ar.po @@ -0,0 +1,55 @@ +# I2P +# Copyright (C) 2009 The I2P Project +# This file is distributed under the same license as the desktopgui package. +# To contribute translations, see http://www.i2p2.de/newdevelopers +# foo <foo@bar>, 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: I2P desktopgui\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-02-20 11:53+0000\n" +"PO-Revision-Date: 2011-02-26 19:46-0000\n" +"Last-Translator: hamada <hamada@mail.i2p>\n" +"Language-Team: duck <duck@mail.i2p>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: src/net/i2p/desktopgui/ExternalTrayManager.java:23 +msgid "Start I2P" +msgstr "ابدأ I2P" + +#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 +msgid "I2P is starting!" +msgstr "جاري تشغيل I2P" + +#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 +msgid "Starting" +msgstr "جاري البدأ" + +#: src/net/i2p/desktopgui/InternalTrayManager.java:26 +msgid "Launch I2P Browser" +msgstr " تشغيل متصÙØ I2P" + +#: src/net/i2p/desktopgui/InternalTrayManager.java:50 +msgid "Configure desktopgui" +msgstr "اعدادات" + +#: src/net/i2p/desktopgui/InternalTrayManager.java:67 +msgid "Restart I2P" +msgstr "اعادة تشغيل" + +#: src/net/i2p/desktopgui/InternalTrayManager.java:85 +msgid "Stop I2P" +msgstr "توقي٠I2P" + +#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:44 +msgid "Tray icon configuration" +msgstr "اعدادات الأيقونة" + +#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:47 +msgid "Should tray icon be enabled?" +msgstr "هل ترغب ÙÙŠ تÙعيل الأيقونة؟" + diff --git a/apps/desktopgui/locale/messages_de.po b/apps/desktopgui/locale/messages_de.po new file mode 100644 index 0000000000000000000000000000000000000000..7963075df58038ba79ccbc965b514a9499261c24 --- /dev/null +++ b/apps/desktopgui/locale/messages_de.po @@ -0,0 +1,55 @@ +# I2P +# Copyright (C) 2009 The I2P Project +# This file is distributed under the same license as the desktopgui package. +# To contribute translations, see http://www.i2p2.de/newdevelopers +# foo <foo@bar>, 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: I2P\n" +"Report-Msgid-Bugs-To: https://trac.i2p2.de/\n" +"POT-Creation-Date: 2011-03-03 18:29+0000\n" +"PO-Revision-Date: 2011-03-22 15:49+0000\n" +"Last-Translator: blabla <blabla@trash-mail.com>\n" +"Language-Team: German <>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: src/net/i2p/desktopgui/ExternalTrayManager.java:23 +msgid "Start I2P" +msgstr "I2P starten" + +#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 +msgid "I2P is starting!" +msgstr "I2P startet gerade!" + +#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 +msgid "Starting" +msgstr "Startend" + +#: src/net/i2p/desktopgui/InternalTrayManager.java:26 +msgid "Launch I2P Browser" +msgstr "I2P-Browser öffnen" + +#: src/net/i2p/desktopgui/InternalTrayManager.java:50 +msgid "Configure desktopgui" +msgstr "Desktopgui konfigurieren" + +#: src/net/i2p/desktopgui/InternalTrayManager.java:67 +msgid "Restart I2P" +msgstr "I2P neustarten" + +#: src/net/i2p/desktopgui/InternalTrayManager.java:85 +msgid "Stop I2P" +msgstr "I2P beenden" + +#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:44 +msgid "Tray icon configuration" +msgstr "Systemleistensymbol konfigurieren" + +#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:47 +msgid "Should tray icon be enabled?" +msgstr "Systemleistensymbol aktivieren?" diff --git a/apps/desktopgui/locale/messages_en.po b/apps/desktopgui/locale/messages_en.po new file mode 100644 index 0000000000000000000000000000000000000000..e92250e67838d65d527ba1f8d41f82f1c54f4982 --- /dev/null +++ b/apps/desktopgui/locale/messages_en.po @@ -0,0 +1,55 @@ +# I2P +# Copyright (C) 2009 The I2P Project +# This file is distributed under the same license as the desktopgui package. +# To contribute translations, see http://www.i2p2.de/newdevelopers +# foo <foo@bar>, 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: I2P desktopgui\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-03-03 18:29+0000\n" +"PO-Revision-Date: 2010-06-15 14:09+0100\n" +"Last-Translator: duck <duck@mail.i2p>\n" +"Language-Team: duck <duck@mail.i2p>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: src/net/i2p/desktopgui/ExternalTrayManager.java:23 +msgid "Start I2P" +msgstr "" + +#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 +msgid "I2P is starting!" +msgstr "" + +#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 +msgid "Starting" +msgstr "" + +#: src/net/i2p/desktopgui/InternalTrayManager.java:26 +msgid "Launch I2P Browser" +msgstr "" + +#: src/net/i2p/desktopgui/InternalTrayManager.java:50 +msgid "Configure desktopgui" +msgstr "" + +#: src/net/i2p/desktopgui/InternalTrayManager.java:67 +msgid "Restart I2P" +msgstr "" + +#: src/net/i2p/desktopgui/InternalTrayManager.java:85 +msgid "Stop I2P" +msgstr "" + +#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:44 +msgid "Tray icon configuration" +msgstr "" + +#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:47 +msgid "Should tray icon be enabled?" +msgstr "" diff --git a/apps/desktopgui/locale/messages_es.po b/apps/desktopgui/locale/messages_es.po new file mode 100644 index 0000000000000000000000000000000000000000..a458f3ad7861a77c7b478c6751f92cd63a67bf6e --- /dev/null +++ b/apps/desktopgui/locale/messages_es.po @@ -0,0 +1,56 @@ +# I2P +# Copyright (C) 2009 The I2P Project +# This file is distributed under the same license as the desktopgui package. +# To contribute translations, see http://www.i2p2.de/newdevelopers +# foo <foo@bar>, 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: I2P\n" +"Report-Msgid-Bugs-To: https://trac.i2p2.de/\n" +"POT-Creation-Date: 2011-03-03 18:29+0000\n" +"PO-Revision-Date: 2011-04-02 23:57+0100\n" +"Last-Translator: mixxy <m1xxy@mail.i2p>\n" +"Language-Team: Spanish (Castilian) <None>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: src/net/i2p/desktopgui/ExternalTrayManager.java:23 +msgid "Start I2P" +msgstr "Iniciar I2P" + +#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 +msgid "I2P is starting!" +msgstr "I2P está iniciando!" + +#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 +msgid "Starting" +msgstr "Iniciando" + +#: src/net/i2p/desktopgui/InternalTrayManager.java:26 +msgid "Launch I2P Browser" +msgstr "Lanzar navegador I2P" + +#: src/net/i2p/desktopgui/InternalTrayManager.java:50 +msgid "Configure desktopgui" +msgstr "Configurar desktopgui" + +#: src/net/i2p/desktopgui/InternalTrayManager.java:67 +msgid "Restart I2P" +msgstr "Reiniciar I2P" + +#: src/net/i2p/desktopgui/InternalTrayManager.java:85 +msgid "Stop I2P" +msgstr "Detener I2P" + +#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:44 +msgid "Tray icon configuration" +msgstr "Configuración del Ãcono de la barra de tareas" + +#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:47 +msgid "Should tray icon be enabled?" +msgstr "¿DeberÃa estar activado el Ãcono de la barra de tareas?" + diff --git a/apps/desktopgui/locale/messages_fr.po b/apps/desktopgui/locale/messages_fr.po new file mode 100644 index 0000000000000000000000000000000000000000..f816891d03f6ebd93fc17273c67ecd1dcc5489a1 --- /dev/null +++ b/apps/desktopgui/locale/messages_fr.po @@ -0,0 +1,56 @@ +# I2P +# Copyright (C) 2009 The I2P Project +# This file is distributed under the same license as the desktopgui package. +# To contribute translations, see http://www.i2p2.de/newdevelopers +# foo <foo@bar>, 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: I2P desktopgui\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-03-03 18:29+0000\n" +"PO-Revision-Date: 2011-03-30 21:58+0100\n" +"Last-Translator: magma <magma@mail.i2p>\n" +"Language-Team: duck <duck@mail.i2p>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: src/net/i2p/desktopgui/ExternalTrayManager.java:23 +msgid "Start I2P" +msgstr "Démarrer I2P" + +#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 +msgid "I2P is starting!" +msgstr "I2P démarre!" + +#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 +msgid "Starting" +msgstr "Démarrage" + +#: src/net/i2p/desktopgui/InternalTrayManager.java:26 +msgid "Launch I2P Browser" +msgstr "Lancer le navigateur" + +#: src/net/i2p/desktopgui/InternalTrayManager.java:50 +msgid "Configure desktopgui" +msgstr "Configurer l'interface de bureau" + +#: src/net/i2p/desktopgui/InternalTrayManager.java:67 +msgid "Restart I2P" +msgstr "Redémarrer I2P" + +#: src/net/i2p/desktopgui/InternalTrayManager.java:85 +msgid "Stop I2P" +msgstr "Arrêter I2P" + +#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:44 +msgid "Tray icon configuration" +msgstr "Configuration de l'icône de notification" + +#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:47 +msgid "Should tray icon be enabled?" +msgstr "Activer l'icône de notification" + diff --git a/apps/desktopgui/locale/messages_nl.po b/apps/desktopgui/locale/messages_nl.po new file mode 100644 index 0000000000000000000000000000000000000000..26973bd7835569075ef06edd41bc6eabc865faed --- /dev/null +++ b/apps/desktopgui/locale/messages_nl.po @@ -0,0 +1,55 @@ +# I2P +# Copyright (C) 2009 The I2P Project +# This file is distributed under the same license as the desktopgui package. +# To contribute translations, see http://www.i2p2.de/newdevelopers +# foo <foo@bar>, 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: I2P\n" +"Report-Msgid-Bugs-To: http://trac.i2p2.de/\n" +"POT-Creation-Date: 2011-02-20 11:53+0000\n" +"PO-Revision-Date: 2011-02-20 12:15+0000\n" +"Last-Translator: ducki2p <ducki2p@gmail.com>\n" +"Language-Team: Dutch <>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nl\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: src/net/i2p/desktopgui/ExternalTrayManager.java:23 +msgid "Start I2P" +msgstr "I2P starten" + +#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 +msgid "I2P is starting!" +msgstr "I2P is aan het starten!" + +#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 +msgid "Starting" +msgstr "Bezig met starten" + +#: src/net/i2p/desktopgui/InternalTrayManager.java:26 +msgid "Launch I2P Browser" +msgstr "Start I2P Browser" + +#: src/net/i2p/desktopgui/InternalTrayManager.java:50 +msgid "Configure desktopgui" +msgstr "Configureer desktopgui" + +#: src/net/i2p/desktopgui/InternalTrayManager.java:67 +msgid "Restart I2P" +msgstr "I2P herstarten" + +#: src/net/i2p/desktopgui/InternalTrayManager.java:85 +msgid "Stop I2P" +msgstr "I2P stoppen" + +#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:44 +msgid "Tray icon configuration" +msgstr "Systeemvak icoon configuratie" + +#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:47 +msgid "Should tray icon be enabled?" +msgstr "Systeemvak icoon inschakelen?" diff --git a/apps/desktopgui/locale/messages_ru.po b/apps/desktopgui/locale/messages_ru.po new file mode 100644 index 0000000000000000000000000000000000000000..aa5a21a62a888f9bac1c683cc954c2908d35f608 --- /dev/null +++ b/apps/desktopgui/locale/messages_ru.po @@ -0,0 +1,56 @@ +# I2P +# Copyright (C) 2009 The I2P Project +# This file is distributed under the same license as the desktopgui package. +# To contribute translations, see http://www.i2p2.de/newdevelopers +# foo <foo@bar>, 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: I2P desktopgui\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-02-19 17:26+0000\n" +"PO-Revision-Date: 2011-02-23 10:23+0500\n" +"Last-Translator: Hidden Z <hiddenz@mail.i2p>\n" +"Language-Team: duck <duck@mail.i2p>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: src/net/i2p/desktopgui/ExternalTrayManager.java:23 +msgid "Start I2P" +msgstr "ЗапуÑтить I2P" + +#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 +msgid "I2P is starting!" +msgstr "I2P запуÑкаетÑÑ!" + +#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 +msgid "Starting" +msgstr "ЗапуÑкаетÑÑ" + +#: src/net/i2p/desktopgui/InternalTrayManager.java:26 +msgid "Launch I2P Browser" +msgstr "ЗапуÑтить I2P браузер" + +#: src/net/i2p/desktopgui/InternalTrayManager.java:50 +msgid "Configure desktopgui" +msgstr "ÐаÑтроить desktopgui" + +#: src/net/i2p/desktopgui/InternalTrayManager.java:67 +msgid "Restart I2P" +msgstr "ПерезапуÑтить I2P" + +#: src/net/i2p/desktopgui/InternalTrayManager.java:85 +msgid "Stop I2P" +msgstr "ОÑтановить I2P" + +#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:44 +msgid "Tray icon configuration" +msgstr "ÐаÑтройка иконки в трее" + +#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:47 +msgid "Should tray icon be enabled?" +msgstr "Отображать ли иконку в трее?" + diff --git a/apps/desktopgui/locale/messages_zh.po b/apps/desktopgui/locale/messages_zh.po new file mode 100644 index 0000000000000000000000000000000000000000..0cb5229f85e168a757ed2ededd57b173033177a2 --- /dev/null +++ b/apps/desktopgui/locale/messages_zh.po @@ -0,0 +1,50 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-02-16 17:10+0000\n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/net/i2p/desktopgui/ExternalTrayManager.java:23 +msgid "Start I2P" +msgstr "å¯åŠ¨ I2P" + +#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 +msgid "I2P is starting!" +msgstr "æ£åœ¨å¯åŠ¨ I2P !" + +#: src/net/i2p/desktopgui/ExternalTrayManager.java:38 +msgid "Starting" +msgstr "æ£åœ¨å¯åŠ¨" + +#: src/net/i2p/desktopgui/InternalTrayManager.java:26 +msgid "Launch I2P Browser" +msgstr "æ£åœ¨å¯åŠ¨I2Pæµè§ˆå™¨" + +#: src/net/i2p/desktopgui/InternalTrayManager.java:50 +msgid "Configure desktopgui" +msgstr "ç•Œé¢è®¾ç½®" + +#: src/net/i2p/desktopgui/InternalTrayManager.java:67 +msgid "Restart I2P" +msgstr "é‡å¯ I2P" + +#: src/net/i2p/desktopgui/InternalTrayManager.java:85 +msgid "Stop I2P" +msgstr "åœæ¢ I2P" + +#. Translate interface +#: src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java:26 +msgid "Should tray icon be enabled?" +msgstr "æ˜¾ç¤ºæ‰˜ç›˜å›¾æ ‡ã€‚" + +#~ msgid "Browser not found" +#~ msgstr "Browser niet gevonden" +#~ msgid "The default browser for your system was not found." +#~ msgstr "De standaard webbrowser voor je systeem werd niet gevonden." + diff --git a/apps/desktopgui/manifest.mf b/apps/desktopgui/manifest.mf deleted file mode 100644 index 328e8e5bc3b7f1f7bad2bc0751a933e00c801983..0000000000000000000000000000000000000000 --- a/apps/desktopgui/manifest.mf +++ /dev/null @@ -1,3 +0,0 @@ -Manifest-Version: 1.0 -X-COMMENT: Main-Class will be added automatically by build - diff --git a/apps/desktopgui/nbproject/build-impl.xml b/apps/desktopgui/nbproject/build-impl.xml deleted file mode 100644 index 039f8788f1ca19268562c37f54c28030b53894f8..0000000000000000000000000000000000000000 --- a/apps/desktopgui/nbproject/build-impl.xml +++ /dev/null @@ -1,642 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -*** GENERATED FROM project.xml - DO NOT EDIT *** -*** EDIT ../build.xml INSTEAD *** - -For the purpose of easier reading the script -is divided into following sections: - - - initialization - - compilation - - jar - - execution - - debugging - - javadoc - - junit compilation - - junit execution - - junit debugging - - applet - - cleanup - - --> -<project xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" basedir=".." default="default" name="desktopgui-impl"> - <target depends="test,jar,javadoc" description="Build and test whole project." name="default"/> - <!-- - ====================== - INITIALIZATION SECTION - ====================== - --> - <target name="-pre-init"> - <!-- Empty placeholder for easier customization. --> - <!-- You can override this target in the ../build.xml file. --> - </target> - <target depends="-pre-init" name="-init-private"> - <property file="nbproject/private/config.properties"/> - <property file="nbproject/private/configs/${config}.properties"/> - <property file="nbproject/private/private.properties"/> - </target> - <target depends="-pre-init,-init-private" name="-init-user"> - <property file="${user.properties.file}"/> - <!-- The two properties below are usually overridden --> - <!-- by the active platform. Just a fallback. --> - <property name="default.javac.source" value="1.4"/> - <property name="default.javac.target" value="1.4"/> - </target> - <target depends="-pre-init,-init-private,-init-user" name="-init-project"> - <property file="nbproject/configs/${config}.properties"/> - <property file="nbproject/project.properties"/> - </target> - <target depends="-pre-init,-init-private,-init-user,-init-project,-init-macrodef-property" name="-do-init"> - <available file="${manifest.file}" property="manifest.available"/> - <condition property="manifest.available+main.class"> - <and> - <isset property="manifest.available"/> - <isset property="main.class"/> - <not> - <equals arg1="${main.class}" arg2="" trim="true"/> - </not> - </and> - </condition> - <condition property="manifest.available+main.class+mkdist.available"> - <and> - <istrue value="${manifest.available+main.class}"/> - <isset property="libs.CopyLibs.classpath"/> - </and> - </condition> - <condition property="have.tests"> - <or> - <available file="${test.src.dir}"/> - </or> - </condition> - <condition property="have.sources"> - <or> - <available file="${src.dir}"/> - </or> - </condition> - <condition property="netbeans.home+have.tests"> - <and> - <isset property="netbeans.home"/> - <isset property="have.tests"/> - </and> - </condition> - <condition property="no.javadoc.preview"> - <and> - <isset property="javadoc.preview"/> - <isfalse value="${javadoc.preview}"/> - </and> - </condition> - <property name="run.jvmargs" value=""/> - <property name="javac.compilerargs" value=""/> - <property name="work.dir" value="${basedir}"/> - <condition property="no.deps"> - <and> - <istrue value="${no.dependencies}"/> - </and> - </condition> - <property name="javac.debug" value="true"/> - <property name="javadoc.preview" value="true"/> - <property name="application.args" value=""/> - <property name="source.encoding" value="${file.encoding}"/> - <condition property="javadoc.encoding.used" value="${javadoc.encoding}"> - <and> - <isset property="javadoc.encoding"/> - <not> - <equals arg1="${javadoc.encoding}" arg2=""/> - </not> - </and> - </condition> - <property name="javadoc.encoding.used" value="${source.encoding}"/> - <property name="includes" value="**"/> - <property name="excludes" value=""/> - <property name="do.depend" value="false"/> - <condition property="do.depend.true"> - <istrue value="${do.depend}"/> - </condition> - <condition else="" property="javac.compilerargs.jaxws" value="-Djava.endorsed.dirs='${jaxws.endorsed.dir}'"> - <and> - <isset property="jaxws.endorsed.dir"/> - <available file="nbproject/jaxws-build.xml"/> - </and> - </condition> - </target> - <target name="-post-init"> - <!-- Empty placeholder for easier customization. --> - <!-- You can override this target in the ../build.xml file. --> - </target> - <target depends="-pre-init,-init-private,-init-user,-init-project,-do-init" name="-init-check"> - <fail unless="src.dir">Must set src.dir</fail> - <fail unless="test.src.dir">Must set test.src.dir</fail> - <fail unless="build.dir">Must set build.dir</fail> - <fail unless="dist.dir">Must set dist.dir</fail> - <fail unless="build.classes.dir">Must set build.classes.dir</fail> - <fail unless="dist.javadoc.dir">Must set dist.javadoc.dir</fail> - <fail unless="build.test.classes.dir">Must set build.test.classes.dir</fail> - <fail unless="build.test.results.dir">Must set build.test.results.dir</fail> - <fail unless="build.classes.excludes">Must set build.classes.excludes</fail> - <fail unless="dist.jar">Must set dist.jar</fail> - </target> - <target name="-init-macrodef-property"> - <macrodef name="property" uri="http://www.netbeans.org/ns/j2se-project/1"> - <attribute name="name"/> - <attribute name="value"/> - <sequential> - <property name="@{name}" value="${@{value}}"/> - </sequential> - </macrodef> - </target> - <target name="-init-macrodef-javac"> - <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3"> - <attribute default="${src.dir}" name="srcdir"/> - <attribute default="${build.classes.dir}" name="destdir"/> - <attribute default="${javac.classpath}" name="classpath"/> - <attribute default="${includes}" name="includes"/> - <attribute default="${excludes}" name="excludes"/> - <attribute default="${javac.debug}" name="debug"/> - <attribute default="/does/not/exist" name="sourcepath"/> - <element name="customize" optional="true"/> - <sequential> - <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}"> - <classpath> - <path path="@{classpath}"/> - </classpath> - <compilerarg line="${javac.compilerargs} ${javac.compilerargs.jaxws}"/> - <customize/> - </javac> - </sequential> - </macrodef> - <macrodef name="depend" uri="http://www.netbeans.org/ns/j2se-project/3"> - <attribute default="${src.dir}" name="srcdir"/> - <attribute default="${build.classes.dir}" name="destdir"/> - <attribute default="${javac.classpath}" name="classpath"/> - <sequential> - <depend cache="${build.dir}/depcache" destdir="@{destdir}" excludes="${excludes}" includes="${includes}" srcdir="@{srcdir}"> - <classpath> - <path path="@{classpath}"/> - </classpath> - </depend> - </sequential> - </macrodef> - <macrodef name="force-recompile" uri="http://www.netbeans.org/ns/j2se-project/3"> - <attribute default="${build.classes.dir}" name="destdir"/> - <sequential> - <fail unless="javac.includes">Must set javac.includes</fail> - <pathconvert pathsep="," property="javac.includes.binary"> - <path> - <filelist dir="@{destdir}" files="${javac.includes}"/> - </path> - <globmapper from="*.java" to="*.class"/> - </pathconvert> - <delete> - <files includes="${javac.includes.binary}"/> - </delete> - </sequential> - </macrodef> - </target> - <target name="-init-macrodef-junit"> - <macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3"> - <attribute default="${includes}" name="includes"/> - <attribute default="${excludes}" name="excludes"/> - <attribute default="**" name="testincludes"/> - <sequential> - <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" showoutput="true"> - <batchtest todir="${build.test.results.dir}"> - <fileset dir="${test.src.dir}" excludes="@{excludes},${excludes}" includes="@{includes}"> - <filename name="@{testincludes}"/> - </fileset> - </batchtest> - <classpath> - <path path="${run.test.classpath}"/> - </classpath> - <syspropertyset> - <propertyref prefix="test-sys-prop."/> - <mapper from="test-sys-prop.*" to="*" type="glob"/> - </syspropertyset> - <formatter type="brief" usefile="false"/> - <formatter type="xml"/> - <jvmarg line="${run.jvmargs}"/> - </junit> - </sequential> - </macrodef> - </target> - <target depends="-init-debug-args" name="-init-macrodef-nbjpda"> - <macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1"> - <attribute default="${main.class}" name="name"/> - <attribute default="${debug.classpath}" name="classpath"/> - <attribute default="" name="stopclassname"/> - <sequential> - <nbjpdastart addressproperty="jpda.address" name="@{name}" stopclassname="@{stopclassname}" transport="${debug-transport}"> - <classpath> - <path path="@{classpath}"/> - </classpath> - </nbjpdastart> - </sequential> - </macrodef> - <macrodef name="nbjpdareload" uri="http://www.netbeans.org/ns/j2se-project/1"> - <attribute default="${build.classes.dir}" name="dir"/> - <sequential> - <nbjpdareload> - <fileset dir="@{dir}" includes="${fix.classes}"> - <include name="${fix.includes}*.class"/> - </fileset> - </nbjpdareload> - </sequential> - </macrodef> - </target> - <target name="-init-debug-args"> - <property name="version-output" value="java version "${ant.java.version}"/> - <condition property="have-jdk-older-than-1.4"> - <or> - <contains string="${version-output}" substring="java version "1.0"/> - <contains string="${version-output}" substring="java version "1.1"/> - <contains string="${version-output}" substring="java version "1.2"/> - <contains string="${version-output}" substring="java version "1.3"/> - </or> - </condition> - <condition else="-Xdebug" property="debug-args-line" value="-Xdebug -Xnoagent -Djava.compiler=none"> - <istrue value="${have-jdk-older-than-1.4}"/> - </condition> - <condition else="dt_socket" property="debug-transport-by-os" value="dt_shmem"> - <os family="windows"/> - </condition> - <condition else="${debug-transport-by-os}" property="debug-transport" value="${debug.transport}"> - <isset property="debug.transport"/> - </condition> - </target> - <target depends="-init-debug-args" name="-init-macrodef-debug"> - <macrodef name="debug" uri="http://www.netbeans.org/ns/j2se-project/3"> - <attribute default="${main.class}" name="classname"/> - <attribute default="${debug.classpath}" name="classpath"/> - <element name="customize" optional="true"/> - <sequential> - <java classname="@{classname}" dir="${work.dir}" fork="true"> - <jvmarg line="${debug-args-line}"/> - <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/> - <jvmarg line="${run.jvmargs}"/> - <classpath> - <path path="@{classpath}"/> - </classpath> - <syspropertyset> - <propertyref prefix="run-sys-prop."/> - <mapper from="run-sys-prop.*" to="*" type="glob"/> - </syspropertyset> - <customize/> - </java> - </sequential> - </macrodef> - </target> - <target name="-init-macrodef-java"> - <macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1"> - <attribute default="${main.class}" name="classname"/> - <element name="customize" optional="true"/> - <sequential> - <java classname="@{classname}" dir="${work.dir}" fork="true"> - <jvmarg line="${run.jvmargs}"/> - <classpath> - <path path="${run.classpath}"/> - </classpath> - <syspropertyset> - <propertyref prefix="run-sys-prop."/> - <mapper from="run-sys-prop.*" to="*" type="glob"/> - </syspropertyset> - <customize/> - </java> - </sequential> - </macrodef> - </target> - <target name="-init-presetdef-jar"> - <presetdef name="jar" uri="http://www.netbeans.org/ns/j2se-project/1"> - <jar compress="${jar.compress}" jarfile="${dist.jar}"> - <j2seproject1:fileset dir="${build.classes.dir}"/> - </jar> - </presetdef> - </target> - <target depends="-pre-init,-init-private,-init-user,-init-project,-do-init,-post-init,-init-check,-init-macrodef-property,-init-macrodef-javac,-init-macrodef-junit,-init-macrodef-nbjpda,-init-macrodef-debug,-init-macrodef-java,-init-presetdef-jar" name="init"/> - <!-- - =================== - COMPILATION SECTION - =================== - --> - <target depends="init" name="deps-jar" unless="no.deps"/> - <target depends="init,-check-automatic-build,-clean-after-automatic-build" name="-verify-automatic-build"/> - <target depends="init" name="-check-automatic-build"> - <available file="${build.classes.dir}/.netbeans_automatic_build" property="netbeans.automatic.build"/> - </target> - <target depends="init" if="netbeans.automatic.build" name="-clean-after-automatic-build"> - <antcall target="clean"/> - </target> - <target depends="init,deps-jar" name="-pre-pre-compile"> - <mkdir dir="${build.classes.dir}"/> - </target> - <target name="-pre-compile"> - <!-- Empty placeholder for easier customization. --> - <!-- You can override this target in the ../build.xml file. --> - </target> - <target if="do.depend.true" name="-compile-depend"> - <j2seproject3:depend/> - </target> - <target depends="init,deps-jar,-pre-pre-compile,-pre-compile,-compile-depend" if="have.sources" name="-do-compile"> - <j2seproject3:javac/> - <copy todir="${build.classes.dir}"> - <fileset dir="${src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/> - </copy> - </target> - <target name="-post-compile"> - <!-- Empty placeholder for easier customization. --> - <!-- You can override this target in the ../build.xml file. --> - </target> - <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile,-do-compile,-post-compile" description="Compile project." name="compile"/> - <target name="-pre-compile-single"> - <!-- Empty placeholder for easier customization. --> - <!-- You can override this target in the ../build.xml file. --> - </target> - <target depends="init,deps-jar,-pre-pre-compile" name="-do-compile-single"> - <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail> - <j2seproject3:force-recompile/> - <j2seproject3:javac excludes="" includes="${javac.includes}" sourcepath="${src.dir}"/> - </target> - <target name="-post-compile-single"> - <!-- Empty placeholder for easier customization. --> - <!-- You can override this target in the ../build.xml file. --> - </target> - <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile-single,-do-compile-single,-post-compile-single" name="compile-single"/> - <!-- - ==================== - JAR BUILDING SECTION - ==================== - --> - <target depends="init" name="-pre-pre-jar"> - <dirname file="${dist.jar}" property="dist.jar.dir"/> - <mkdir dir="${dist.jar.dir}"/> - </target> - <target name="-pre-jar"> - <!-- Empty placeholder for easier customization. --> - <!-- You can override this target in the ../build.xml file. --> - </target> - <target depends="init,compile,-pre-pre-jar,-pre-jar" name="-do-jar-without-manifest" unless="manifest.available"> - <j2seproject1:jar/> - </target> - <target depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available" name="-do-jar-with-manifest" unless="manifest.available+main.class"> - <j2seproject1:jar manifest="${manifest.file}"/> - </target> - <target depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available+main.class" name="-do-jar-with-mainclass" unless="manifest.available+main.class+mkdist.available"> - <j2seproject1:jar manifest="${manifest.file}"> - <j2seproject1:manifest> - <j2seproject1:attribute name="Main-Class" value="${main.class}"/> - </j2seproject1:manifest> - </j2seproject1:jar> - <echo>To run this application from the command line without Ant, try:</echo> - <property location="${build.classes.dir}" name="build.classes.dir.resolved"/> - <property location="${dist.jar}" name="dist.jar.resolved"/> - <pathconvert property="run.classpath.with.dist.jar"> - <path path="${run.classpath}"/> - <map from="${build.classes.dir.resolved}" to="${dist.jar.resolved}"/> - </pathconvert> - <echo>java -cp "${run.classpath.with.dist.jar}" ${main.class}</echo> - </target> - <target depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available+main.class+mkdist.available" name="-do-jar-with-libraries"> - <property location="${build.classes.dir}" name="build.classes.dir.resolved"/> - <pathconvert property="run.classpath.without.build.classes.dir"> - <path path="${run.classpath}"/> - <map from="${build.classes.dir.resolved}" to=""/> - </pathconvert> - <pathconvert pathsep=" " property="jar.classpath"> - <path path="${run.classpath.without.build.classes.dir}"/> - <chainedmapper> - <flattenmapper/> - <globmapper from="*" to="lib/*"/> - </chainedmapper> - </pathconvert> - <taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/> - <copylibs compress="${jar.compress}" jarfile="${dist.jar}" manifest="${manifest.file}" runtimeclasspath="${run.classpath.without.build.classes.dir}"> - <fileset dir="${build.classes.dir}"/> - <manifest> - <attribute name="Main-Class" value="${main.class}"/> - <attribute name="Class-Path" value="${jar.classpath}"/> - </manifest> - </copylibs> - <echo>To run this application from the command line without Ant, try:</echo> - <property location="${dist.jar}" name="dist.jar.resolved"/> - <echo>java -jar "${dist.jar.resolved}"</echo> - </target> - <target name="-post-jar"> - <!-- Empty placeholder for easier customization. --> - <!-- You can override this target in the ../build.xml file. --> - </target> - <target depends="init,compile,-pre-jar,-do-jar-with-manifest,-do-jar-without-manifest,-do-jar-with-mainclass,-do-jar-with-libraries,-post-jar" description="Build JAR." name="jar"/> - <!-- - ================= - EXECUTION SECTION - ================= - --> - <target depends="init,compile" description="Run a main class." name="run"> - <j2seproject1:java> - <customize> - <arg line="${application.args}"/> - </customize> - </j2seproject1:java> - </target> - <target name="-do-not-recompile"> - <property name="javac.includes.binary" value=""/> - </target> - <target depends="init,-do-not-recompile,compile-single" name="run-single"> - <fail unless="run.class">Must select one file in the IDE or set run.class</fail> - <j2seproject1:java classname="${run.class}"/> - </target> - <!-- - ================= - DEBUGGING SECTION - ================= - --> - <target depends="init" if="netbeans.home" name="-debug-start-debugger"> - <j2seproject1:nbjpdastart name="${debug.class}"/> - </target> - <target depends="init,compile" name="-debug-start-debuggee"> - <j2seproject3:debug> - <customize> - <arg line="${application.args}"/> - </customize> - </j2seproject3:debug> - </target> - <target depends="init,compile,-debug-start-debugger,-debug-start-debuggee" description="Debug project in IDE." if="netbeans.home" name="debug"/> - <target depends="init" if="netbeans.home" name="-debug-start-debugger-stepinto"> - <j2seproject1:nbjpdastart stopclassname="${main.class}"/> - </target> - <target depends="init,compile,-debug-start-debugger-stepinto,-debug-start-debuggee" if="netbeans.home" name="debug-stepinto"/> - <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-single"> - <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail> - <j2seproject3:debug classname="${debug.class}"/> - </target> - <target depends="init,-do-not-recompile,compile-single,-debug-start-debugger,-debug-start-debuggee-single" if="netbeans.home" name="debug-single"/> - <target depends="init" name="-pre-debug-fix"> - <fail unless="fix.includes">Must set fix.includes</fail> - <property name="javac.includes" value="${fix.includes}.java"/> - </target> - <target depends="init,-pre-debug-fix,compile-single" if="netbeans.home" name="-do-debug-fix"> - <j2seproject1:nbjpdareload/> - </target> - <target depends="init,-pre-debug-fix,-do-debug-fix" if="netbeans.home" name="debug-fix"/> - <!-- - =============== - JAVADOC SECTION - =============== - --> - <target depends="init" name="-javadoc-build"> - <mkdir dir="${dist.javadoc.dir}"/> - <javadoc additionalparam="${javadoc.additionalparam}" author="${javadoc.author}" charset="UTF-8" destdir="${dist.javadoc.dir}" docencoding="UTF-8" encoding="${javadoc.encoding.used}" failonerror="true" noindex="${javadoc.noindex}" nonavbar="${javadoc.nonavbar}" notree="${javadoc.notree}" private="${javadoc.private}" source="${javac.source}" splitindex="${javadoc.splitindex}" use="${javadoc.use}" useexternalfile="true" version="${javadoc.version}" windowtitle="${javadoc.windowtitle}"> - <classpath> - <path path="${javac.classpath}"/> - </classpath> - <fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}"> - <filename name="**/*.java"/> - </fileset> - </javadoc> - </target> - <target depends="init,-javadoc-build" if="netbeans.home" name="-javadoc-browse" unless="no.javadoc.preview"> - <nbbrowse file="${dist.javadoc.dir}/index.html"/> - </target> - <target depends="init,-javadoc-build,-javadoc-browse" description="Build Javadoc." name="javadoc"/> - <!-- - ========================= - JUNIT COMPILATION SECTION - ========================= - --> - <target depends="init,compile" if="have.tests" name="-pre-pre-compile-test"> - <mkdir dir="${build.test.classes.dir}"/> - </target> - <target name="-pre-compile-test"> - <!-- Empty placeholder for easier customization. --> - <!-- You can override this target in the ../build.xml file. --> - </target> - <target if="do.depend.true" name="-compile-test-depend"> - <j2seproject3:depend classpath="${javac.test.classpath}" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/> - </target> - <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-compile-test-depend" if="have.tests" name="-do-compile-test"> - <j2seproject3:javac classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/> - <copy todir="${build.test.classes.dir}"> - <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/> - </copy> - </target> - <target name="-post-compile-test"> - <!-- Empty placeholder for easier customization. --> - <!-- You can override this target in the ../build.xml file. --> - </target> - <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-do-compile-test,-post-compile-test" name="compile-test"/> - <target name="-pre-compile-test-single"> - <!-- Empty placeholder for easier customization. --> - <!-- You can override this target in the ../build.xml file. --> - </target> - <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single" if="have.tests" name="-do-compile-test-single"> - <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail> - <j2seproject3:force-recompile destdir="${build.test.classes.dir}"/> - <j2seproject3:javac classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" excludes="" includes="${javac.includes}" sourcepath="${test.src.dir}" srcdir="${test.src.dir}"/> - <copy todir="${build.test.classes.dir}"> - <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/> - </copy> - </target> - <target name="-post-compile-test-single"> - <!-- Empty placeholder for easier customization. --> - <!-- You can override this target in the ../build.xml file. --> - </target> - <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single,-do-compile-test-single,-post-compile-test-single" name="compile-test-single"/> - <!-- - ======================= - JUNIT EXECUTION SECTION - ======================= - --> - <target depends="init" if="have.tests" name="-pre-test-run"> - <mkdir dir="${build.test.results.dir}"/> - </target> - <target depends="init,compile-test,-pre-test-run" if="have.tests" name="-do-test-run"> - <j2seproject3:junit testincludes="**/*Test.java"/> - </target> - <target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run"> - <fail if="tests.failed">Some tests failed; see details above.</fail> - </target> - <target depends="init" if="have.tests" name="test-report"/> - <target depends="init" if="netbeans.home+have.tests" name="-test-browse"/> - <target depends="init,compile-test,-pre-test-run,-do-test-run,test-report,-post-test-run,-test-browse" description="Run unit tests." name="test"/> - <target depends="init" if="have.tests" name="-pre-test-run-single"> - <mkdir dir="${build.test.results.dir}"/> - </target> - <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single"> - <fail unless="test.includes">Must select some files in the IDE or set test.includes</fail> - <j2seproject3:junit excludes="" includes="${test.includes}"/> - </target> - <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single" if="have.tests" name="-post-test-run-single"> - <fail if="tests.failed">Some tests failed; see details above.</fail> - </target> - <target depends="init,-do-not-recompile,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/> - <!-- - ======================= - JUNIT DEBUGGING SECTION - ======================= - --> - <target depends="init,compile-test" if="have.tests" name="-debug-start-debuggee-test"> - <fail unless="test.class">Must select one file in the IDE or set test.class</fail> - <property location="${build.test.results.dir}/TEST-${test.class}.xml" name="test.report.file"/> - <delete file="${test.report.file}"/> - <mkdir dir="${build.test.results.dir}"/> - <j2seproject3:debug classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner" classpath="${ant.home}/lib/ant.jar:${ant.home}/lib/ant-junit.jar:${debug.test.classpath}"> - <customize> - <syspropertyset> - <propertyref prefix="test-sys-prop."/> - <mapper from="test-sys-prop.*" to="*" type="glob"/> - </syspropertyset> - <arg value="${test.class}"/> - <arg value="showoutput=true"/> - <arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.BriefJUnitResultFormatter"/> - <arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter,${test.report.file}"/> - </customize> - </j2seproject3:debug> - </target> - <target depends="init,compile-test" if="netbeans.home+have.tests" name="-debug-start-debugger-test"> - <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${test.class}"/> - </target> - <target depends="init,-do-not-recompile,compile-test-single,-debug-start-debugger-test,-debug-start-debuggee-test" name="debug-test"/> - <target depends="init,-pre-debug-fix,compile-test-single" if="netbeans.home" name="-do-debug-fix-test"> - <j2seproject1:nbjpdareload dir="${build.test.classes.dir}"/> - </target> - <target depends="init,-pre-debug-fix,-do-debug-fix-test" if="netbeans.home" name="debug-fix-test"/> - <!-- - ========================= - APPLET EXECUTION SECTION - ========================= - --> - <target depends="init,compile-single" name="run-applet"> - <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail> - <j2seproject1:java classname="sun.applet.AppletViewer"> - <customize> - <arg value="${applet.url}"/> - </customize> - </j2seproject1:java> - </target> - <!-- - ========================= - APPLET DEBUGGING SECTION - ========================= - --> - <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-applet"> - <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail> - <j2seproject3:debug classname="sun.applet.AppletViewer"> - <customize> - <arg value="${applet.url}"/> - </customize> - </j2seproject3:debug> - </target> - <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-applet" if="netbeans.home" name="debug-applet"/> - <!-- - =============== - CLEANUP SECTION - =============== - --> - <target depends="init" name="deps-clean" unless="no.deps"/> - <target depends="init" name="-do-clean"> - <delete dir="${build.dir}"/> - <delete dir="${dist.dir}"/> - </target> - <target name="-post-clean"> - <!-- Empty placeholder for easier customization. --> - <!-- You can override this target in the ../build.xml file. --> - </target> - <target depends="init,deps-clean,-do-clean,-post-clean" description="Clean build products." name="clean"/> -</project> diff --git a/apps/desktopgui/nbproject/genfiles.properties b/apps/desktopgui/nbproject/genfiles.properties deleted file mode 100644 index f6b0f837bcfabb640d6b0fd4fb85db89aa0b70da..0000000000000000000000000000000000000000 --- a/apps/desktopgui/nbproject/genfiles.properties +++ /dev/null @@ -1,8 +0,0 @@ -build.xml.data.CRC32=c4b345cd -build.xml.script.CRC32=9785bb9a -build.xml.stylesheet.CRC32=be360661 -# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. -# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. -nbproject/build-impl.xml.data.CRC32=f630f8db -nbproject/build-impl.xml.script.CRC32=8c02c081 -nbproject/build-impl.xml.stylesheet.CRC32=65b8de21 diff --git a/apps/desktopgui/nbproject/project.properties b/apps/desktopgui/nbproject/project.properties deleted file mode 100644 index a02ea82072b17a2b6c5cc87f068911a19a639f32..0000000000000000000000000000000000000000 --- a/apps/desktopgui/nbproject/project.properties +++ /dev/null @@ -1,81 +0,0 @@ -application.desc=An anonymous communication network. -application.homepage=http://www.i2p2.de -application.title=I2P Desktop GUI -application.vendor=I2P Developers -build.classes.dir=${build.dir}/classes -build.classes.excludes=**/*.java,**/*.form -# This directory is removed when the project is cleaned: -build.dir=build -build.generated.dir=${build.dir}/generated -# Only compile against the classpath explicitly listed here: -build.sysclasspath=ignore -build.test.classes.dir=${build.dir}/test/classes -build.test.results.dir=${build.dir}/test/results -debug.classpath=\ - ${run.classpath} -debug.test.classpath=\ - ${run.test.classpath} -# This directory is removed when the project is cleaned: -dist.dir=dist -dist.jar=${dist.dir}/desktopgui.jar -dist.javadoc.dir=${dist.dir}/javadoc -excludes= -file.reference.appframework.jar=lib/appframework.jar -file.reference.i2p.jar=../../core/java/build/i2p.jar -file.reference.i2ptunnel.jar=../i2ptunnel/java/build/i2ptunnel.jar -file.reference.router.jar=../../router/java/build/router.jar -file.reference.routerconsole.jar=../routerconsole/java/build/routerconsole.jar -file.reference.swing-worker.jar=lib/swing-worker.jar -includes=** -jar.compress=false -javac.classpath=\ - ${file.reference.router.jar}:\ - ${file.reference.appframework.jar}:\ - ${file.reference.swing-worker.jar}:\ - ${file.reference.i2p.jar}:\ - ${file.reference.routerconsole.jar}:\ - ${file.reference.i2ptunnel.jar} -# Space-separated list of extra javac options -javac.compilerargs= -javac.deprecation=false -javac.source=1.6 -javac.target=1.6 -javac.test.classpath=\ - ${javac.classpath}:\ - ${build.classes.dir}:\ - ${libs.junit.classpath}:\ - ${libs.junit_4.classpath} -javadoc.additionalparam= -javadoc.author=false -javadoc.encoding=${source.encoding} -javadoc.encoding.used=${javadoc.encoding} -javadoc.noindex=false -javadoc.nonavbar=false -javadoc.notree=false -javadoc.private=false -javadoc.splitindex=true -javadoc.use=true -javadoc.version=false -javadoc.windowtitle= -jnlp.codebase.type=local -jnlp.codebase.url=file:/home/mathias/Documenten/Programmeren/i2p_monotone/repo/i2p.i2p/apps/desktopgui/dist/ -jnlp.enabled=false -jnlp.offline-allowed=false -jnlp.signed=false -main.class=net.i2p.desktopgui.desktopgui.Main -manifest.file=manifest.mf -meta.inf.dir=${src.dir}/META-INF -platform.active=default_platform -run.classpath=\ - ${javac.classpath}:\ - ${build.classes.dir} -# Space-separated list of JVM arguments used when running the project -# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value -# or test-sys-prop.name=value to set system properties for unit tests): -run.jvmargs= -run.test.classpath=\ - ${javac.test.classpath}:\ - ${build.test.classes.dir} -source.encoding=UTF-8 -src.dir=src -test.src.dir=test diff --git a/apps/desktopgui/nbproject/project.xml b/apps/desktopgui/nbproject/project.xml deleted file mode 100644 index 9dba9493c19d106655401d5e0fabc02381858ef8..0000000000000000000000000000000000000000 --- a/apps/desktopgui/nbproject/project.xml +++ /dev/null @@ -1,19 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project xmlns="http://www.netbeans.org/ns/project/1"> - <type>org.netbeans.modules.java.j2seproject</type> - <configuration> - <data xmlns="http://www.netbeans.org/ns/j2se-project/3"> - <name>desktopgui</name> - <minimum-ant-version>1.6.5</minimum-ant-version> - <source-roots> - <root id="src.dir"/> - </source-roots> - <test-roots> - <root id="test.src.dir"/> - </test-roots> - </data> - <swingapp xmlns="http://www.netbeans.org/ns/form-swingapp/1"> - <application-class name="net.i2p.desktopgui.desktopgui.Main"/> - </swingapp> - </configuration> -</project> diff --git a/apps/desktopgui/desktopgui/resources/logo/logo.jpg b/apps/desktopgui/resources/images/logo.jpg similarity index 100% rename from apps/desktopgui/desktopgui/resources/logo/logo.jpg rename to apps/desktopgui/resources/images/logo.jpg diff --git a/apps/desktopgui/resources/images/logo.png b/apps/desktopgui/resources/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ad89a98643d2fd0a323a9beadd1a70f05de9d159 Binary files /dev/null and b/apps/desktopgui/resources/images/logo.png differ diff --git a/apps/desktopgui/desktopgui/resources/logo/logo_green.jpg b/apps/desktopgui/resources/images/logo_green.jpg similarity index 100% rename from apps/desktopgui/desktopgui/resources/logo/logo_green.jpg rename to apps/desktopgui/resources/images/logo_green.jpg diff --git a/apps/desktopgui/desktopgui/resources/logo/logo_orange.jpg b/apps/desktopgui/resources/images/logo_orange.jpg similarity index 100% rename from apps/desktopgui/desktopgui/resources/logo/logo_orange.jpg rename to apps/desktopgui/resources/images/logo_orange.jpg diff --git a/apps/desktopgui/desktopgui/resources/logo/logo_red.jpg b/apps/desktopgui/resources/images/logo_red.jpg similarity index 100% rename from apps/desktopgui/desktopgui/resources/logo/logo_red.jpg rename to apps/desktopgui/resources/images/logo_red.jpg diff --git a/apps/desktopgui/src/META-INF/services/org.jdesktop.application.Application b/apps/desktopgui/src/META-INF/services/org.jdesktop.application.Application deleted file mode 100644 index 6cd2ac1fb1e0d136a361ca63d6a74783b33fddb7..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/META-INF/services/org.jdesktop.application.Application +++ /dev/null @@ -1 +0,0 @@ -desktopgui.Main \ No newline at end of file diff --git a/apps/desktopgui/src/net/i2p/desktopgui/ExternalTrayManager.java b/apps/desktopgui/src/net/i2p/desktopgui/ExternalTrayManager.java new file mode 100644 index 0000000000000000000000000000000000000000..6fea46fef5fb117801e05b57c4f23210b581404f --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/ExternalTrayManager.java @@ -0,0 +1,52 @@ +package net.i2p.desktopgui; + +import java.awt.MenuItem; +import java.awt.PopupMenu; +import java.awt.TrayIcon; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.SwingWorker; + +import net.i2p.desktopgui.router.RouterManager; +import net.i2p.util.Log; + +public class ExternalTrayManager extends TrayManager { + + private final static Log log = new Log(ExternalTrayManager.class); + + protected ExternalTrayManager() {} + + @Override + public PopupMenu getMainMenu() { + PopupMenu popup = new PopupMenu(); + MenuItem startItem = new MenuItem(_("Start I2P")); + startItem.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent arg0) { + new SwingWorker<Object, Object>() { + + @Override + protected Object doInBackground() throws Exception { + RouterManager.start(); + return null; + } + + @Override + protected void done() { + trayIcon.displayMessage(_("Starting"), _("I2P is starting!"), TrayIcon.MessageType.INFO); + //Hide the tray icon. + //We cannot stop the desktopgui program entirely, + //since that risks killing the I2P process as well. + tray.remove(trayIcon); + } + + }.execute(); + } + + }); + popup.add(startItem); + return popup; + } +} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/InternalTrayManager.java b/apps/desktopgui/src/net/i2p/desktopgui/InternalTrayManager.java new file mode 100644 index 0000000000000000000000000000000000000000..e1247dde6c53a44a8731ffd3446f38763ac077f8 --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/InternalTrayManager.java @@ -0,0 +1,113 @@ +package net.i2p.desktopgui; + +import java.awt.MenuItem; +import java.awt.PopupMenu; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.SwingWorker; +import net.i2p.desktopgui.gui.DesktopguiConfigurationFrame; + +import net.i2p.desktopgui.router.RouterManager; +import net.i2p.desktopgui.util.BrowseException; +import net.i2p.desktopgui.util.I2PDesktop; +import net.i2p.util.Log; + +public class InternalTrayManager extends TrayManager { + + private final static Log log = new Log(InternalTrayManager.class); + + protected InternalTrayManager() {} + + @Override + public PopupMenu getMainMenu() { + PopupMenu popup = new PopupMenu(); + + MenuItem browserLauncher = new MenuItem(_("Launch I2P Browser")); + browserLauncher.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent arg0) { + new SwingWorker<Object, Object>() { + + @Override + protected Object doInBackground() throws Exception { + return null; + } + + @Override + protected void done() { + try { + I2PDesktop.browse("http://localhost:7657"); + } catch (BrowseException e1) { + log.log(Log.WARN, "Failed to open browser!", e1); + } + } + + }.execute(); + } + }); + MenuItem desktopguiConfigurationLauncher = new MenuItem(_("Configure desktopgui")); + desktopguiConfigurationLauncher.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent arg0) { + new SwingWorker<Object, Object>() { + + @Override + protected Object doInBackground() throws Exception { + new DesktopguiConfigurationFrame().setVisible(true); + return null; + } + + }.execute(); + } + + }); + MenuItem restartItem = new MenuItem(_("Restart I2P")); + restartItem.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent arg0) { + new SwingWorker<Object, Object>() { + + @Override + protected Object doInBackground() throws Exception { + RouterManager.restart(); + return null; + } + + }.execute(); + + } + + }); + MenuItem stopItem = new MenuItem(_("Stop I2P")); + stopItem.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent arg0) { + new SwingWorker<Object, Object>() { + + @Override + protected Object doInBackground() throws Exception { + RouterManager.shutDown(); + return null; + } + + }.execute(); + + } + + }); + + popup.add(browserLauncher); + popup.addSeparator(); + popup.add(desktopguiConfigurationLauncher); + popup.addSeparator(); + popup.add(restartItem); + popup.add(stopItem); + + return popup; + } +} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/Main.java b/apps/desktopgui/src/net/i2p/desktopgui/Main.java new file mode 100644 index 0000000000000000000000000000000000000000..993970e30c8a32c1c5407eda8910eea1a6fc586b --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/Main.java @@ -0,0 +1,125 @@ +package net.i2p.desktopgui; + +/* + * Main.java + */ + +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import java.awt.GraphicsEnvironment; + +import net.i2p.I2PAppContext; +import net.i2p.desktopgui.router.RouterManager; +import net.i2p.desktopgui.util.*; +import net.i2p.util.Log; +import net.i2p.util.Translate; +import net.i2p.util.I2PProperties.I2PPropertyCallback; + +/** + * The main class of the application. + */ +public class Main { + + ///Manages the lifetime of the tray icon. + private TrayManager trayManager = null; + private final static Log log = new Log(Main.class); + + /** + * Start the tray icon code (loads tray icon in the tray area). + * @throws Exception + */ + public void startUp() throws Exception { + trayManager = TrayManager.getInstance(); + trayManager.startManager(); + + if(RouterManager.inI2P()) { + RouterManager.getRouterContext().addPropertyCallback(new I2PPropertyCallback() { + + @Override + public void propertyChanged(String arg0, String arg1) { + if(arg0.equals(Translate.PROP_LANG)) { + trayManager.languageChanged(); + } + } + + }); + } + } + + public static void main(String[] args) { + beginStartup(args); + } + + /** + * Main method launching the application. + */ + public static void beginStartup(String[] args) { + try { + String headless = System.getProperty("java.awt.headless"); + boolean isHeadless = Boolean.parseBoolean(headless); + if(isHeadless) { + log.warn("Headless environment: not starting desktopgui!"); + return; + } + } + catch(Exception e) { + return; + } + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException ex) { + log.log(Log.ERROR, null, ex); + } catch (InstantiationException ex) { + log.log(Log.ERROR, null, ex); + } catch (IllegalAccessException ex) { + log.log(Log.ERROR, null, ex); + } catch (UnsupportedLookAndFeelException ex) { + log.log(Log.ERROR, null, ex); + } + + ConfigurationManager.getInstance().loadArguments(args); + + final Main main = new Main(); + + main.launchForeverLoop(); + //We'll be doing GUI work, so let's stay in the event dispatcher thread. + SwingUtilities.invokeLater(new Runnable() { + + @Override + public void run() { + try { + main.startUp(); + } + catch(Exception e) { + log.error("Failed while running desktopgui!", e); + } + + } + + }); + + } + + /** + * Avoids the app terminating because no Window is opened anymore. + * More info: http://java.sun.com/javase/6/docs/api/java/awt/doc-files/AWTThreadIssues.html#Autoshutdown + */ + public void launchForeverLoop() { + Runnable r = new Runnable() { + public void run() { + try { + Object o = new Object(); + synchronized (o) { + o.wait(); + } + } catch (InterruptedException ie) { + } + } + }; + Thread t = new Thread(r); + t.setDaemon(false); + t.start(); + } + +} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/TrayManager.java b/apps/desktopgui/src/net/i2p/desktopgui/TrayManager.java new file mode 100644 index 0000000000000000000000000000000000000000..1a29d8871bd201201967ad7a3020816920aec42e --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/TrayManager.java @@ -0,0 +1,97 @@ +package net.i2p.desktopgui; + +import java.awt.AWTException; +import java.awt.Desktop; +import java.awt.Image; +import java.awt.MenuItem; +import java.awt.PopupMenu; +import java.awt.SystemTray; +import java.awt.Toolkit; +import java.awt.TrayIcon; +import java.awt.Desktop.Action; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; + +import javax.swing.SwingWorker; + +import net.i2p.desktopgui.i18n.DesktopguiTranslator; +import net.i2p.desktopgui.router.RouterManager; +import net.i2p.desktopgui.util.BrowseException; +import net.i2p.desktopgui.util.ConfigurationManager; +import net.i2p.desktopgui.util.I2PDesktop; +import net.i2p.util.Log; + +/** + * Manages the tray icon life. + */ +public abstract class TrayManager { + + private static TrayManager instance = null; + ///The tray area, or null if unsupported + protected SystemTray tray = null; + ///Our tray icon, or null if unsupported + protected TrayIcon trayIcon = null; + private final static Log log = new Log(TrayManager.class); + + /** + * Instantiate tray manager. + */ + protected TrayManager() {} + + protected static TrayManager getInstance() { + if(instance == null) { + boolean inI2P = RouterManager.inI2P(); + if(inI2P) { + instance = new InternalTrayManager(); + } + else { + instance = new ExternalTrayManager(); + } + } + return instance; + } + + /** + * Add the tray icon to the system tray and start everything up. + */ + protected void startManager() { + if(SystemTray.isSupported()) { + tray = SystemTray.getSystemTray(); + trayIcon = new TrayIcon(getTrayImage(), "I2P", getMainMenu()); + trayIcon.setImageAutoSize(true); //Resize image to fit the system tray + try { + tray.add(trayIcon); + } catch (AWTException e) { + log.log(Log.WARN, "Problem creating system tray icon!", e); + } + } + } + + protected void languageChanged() { + trayIcon.setPopupMenu(getMainMenu()); + } + + /** + * Build a popup menu, adding callbacks to the different items. + * @return popup menu + */ + protected abstract PopupMenu getMainMenu(); + + /** + * Get tray icon image from the desktopgui resources in the jar file. + * @return image used for the tray icon + */ + private Image getTrayImage() { + URL url = getClass().getResource("/desktopgui/resources/images/logo.png"); + Image image = Toolkit.getDefaultToolkit().getImage(url); + return image; + } + + protected static String _(String s) { + return DesktopguiTranslator._(s); + } +} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/GUIVersion.java b/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/GUIVersion.java deleted file mode 100644 index 21f0e04cf92ce3c2a0ca783cc239419e22c69aa3..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/GUIVersion.java +++ /dev/null @@ -1,14 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ - -package net.i2p.desktopgui.desktopgui; - -/** - * - * @author mathias - */ -public class GUIVersion { - public static final String VERSION = "0.0.2"; -} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/Main.java b/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/Main.java deleted file mode 100644 index c3078163d4c64ff29d6c58927c3c3e71ddf3efd3..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/Main.java +++ /dev/null @@ -1,109 +0,0 @@ -package net.i2p.desktopgui.desktopgui; - -/* - * Main.java - */ - - - -import net.i2p.desktopgui.gui.Tray; -import net.i2p.desktopgui.gui.SpeedSelector; -import java.awt.SystemTray; -import java.util.Properties; -import java.util.logging.Level; -import java.util.logging.Logger; -import javax.swing.UIManager; -import javax.swing.UnsupportedLookAndFeelException; -import org.jdesktop.application.Application; -import org.jdesktop.application.SingleFrameApplication; -import net.i2p.desktopgui.persistence.PropertyManager; - -/** - * The main class of the application. - */ -public class Main extends SingleFrameApplication { - - /** - * At startup create and show the main frame of the application. - */ - @Override protected void startup() { - Properties props = PropertyManager.loadProps(); - - //First load: present screen with information (to help choose I2P settings) - if(props.getProperty(FIRSTLOAD).equals("true")) { - props.setProperty(FIRSTLOAD, "false"); - PropertyManager.saveProps(props); - new SpeedSelector(); //Start speed selector GUI - } - - if(SystemTray.isSupported()) { - tray = new Tray(); - } - else { //Alternative if SystemTray is not supported on the platform - } - } - - /** - * This method is to initialize the specified window by injecting resources. - * Windows shown in our application come fully initialized from the GUI - * builder, so this additional configuration is not needed. - */ - @Override protected void configureWindow(java.awt.Window root) { - } - - /** - * A convenient static getter for the application instance. - * @return the instance of Main - */ - public static Main getApplication() { - return Application.getInstance(Main.class); - } - - /** - * Main method launching the application. - */ - public static void main(String[] args) { - System.setProperty("java.awt.headless", "false"); //Make sure I2P is running in GUI mode for our application - try { - UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); - } catch (ClassNotFoundException ex) { - Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); - } catch (InstantiationException ex) { - Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); - } catch (IllegalAccessException ex) { - Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); - } catch (UnsupportedLookAndFeelException ex) { - Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); - } - - Main main = getApplication(); - main.launchForeverLoop(); - main.startup(); - } - - /** - * Avoids the app terminating because no Window is opened anymore. - * More info: http://java.sun.com/javase/6/docs/api/java/awt/doc-files/AWTThreadIssues.html#Autoshutdown - */ - public void launchForeverLoop() { - Runnable r = new Runnable() { - public void run() { - try { - Object o = new Object(); - synchronized (o) { - o.wait(); - } - } catch (InterruptedException ie) { - } - } - }; - Thread t = new Thread(r); - t.setDaemon(false); - t.start(); - } - - private Tray tray = null; - ///Indicates if this is the first time the application loads - ///(is only true at the very start of loading the first time!) - private static final String FIRSTLOAD = "firstLoad"; -} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/resources/Main.properties b/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/resources/Main.properties deleted file mode 100644 index fb7218ceaeb440ed2c318fd278e546db25b1f12e..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/resources/Main.properties +++ /dev/null @@ -1,11 +0,0 @@ -# Application global resources - -Application.name = desktopgui -Application.title = I2P Desktop GUI -Application.version = 0.7.1 -Application.vendor = I2P Developers -Application.homepage = http://www.i2p2.de -Application.description = An anonymous communication network. -Application.vendorId = I2P -Application.id = desktopgui -Application.lookAndFeel = system diff --git a/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/resources/Main_nl_BE.properties b/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/resources/Main_nl_BE.properties deleted file mode 100644 index 81107aca914da828f44581523375ef8ff4500e89..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/resources/Main_nl_BE.properties +++ /dev/null @@ -1,11 +0,0 @@ -# Application global resources - -Application.name = desktopgui -Application.title = I2P Desktop GUI -Application.version = 0.7.1 -Application.vendor = I2P Ontwikkelaars -Application.homepage = http://www.i2p2.de -Application.description = Een anoniem communicatienetwerk. -Application.vendorId = I2P -Application.id = desktopgui -Application.lookAndFeel = system diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/ClientTunnelWindow.form b/apps/desktopgui/src/net/i2p/desktopgui/gui/ClientTunnelWindow.form deleted file mode 100644 index 0f07284d5a2f6d0733b4a3212295202ed18b1da4..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/gui/ClientTunnelWindow.form +++ /dev/null @@ -1,396 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> - -<Form version="1.5" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JFrameFormInfo"> - <Properties> - <Property name="defaultCloseOperation" type="int" value="3"/> - <Property name="title" type="java.lang.String" resourceKey="Form.title"/> - <Property name="name" type="java.lang.String" value="Form" noResource="true"/> - </Properties> - <SyntheticProperties> - <SyntheticProperty name="formSizePolicy" type="int" value="1"/> - </SyntheticProperties> - <AuxValues> - <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/> - <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/> - <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/> - <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/> - <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/> - <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/> - <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/> - <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/> - <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/> - <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,2,48,0,0,2,48"/> - </AuxValues> - - <Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout"> - <Property name="useNullLayout" type="boolean" value="true"/> - </Layout> - <SubComponents> - <Component class="javax.swing.JLabel" name="tunnelNameLabel"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="tunnelNameLabel.text"/> - <Property name="name" type="java.lang.String" value="tunnelNameLabel" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="20" y="20" width="120" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JLabel" name="tunnelTypeLabel"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="tunnelTypeLabel.text"/> - <Property name="name" type="java.lang.String" value="tunnelTypeLabel" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="20" y="50" width="120" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JLabel" name="tunnelPortLabel"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="tunnelPortLabel.text"/> - <Property name="name" type="java.lang.String" value="tunnelPortLabel" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="20" y="80" width="110" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JLabel" name="tunnelDestinationLabel"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="tunnelDestinationLabel.text"/> - <Property name="name" type="java.lang.String" value="tunnelDestinationLabel" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="20" y="110" width="110" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JLabel" name="tunnelProfileLabel"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="tunnelProfileLabel.text"/> - <Property name="name" type="java.lang.String" value="tunnelProfileLabel" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="20" y="140" width="110" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JCheckBox" name="delayConnect"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="delayConnect.text"/> - <Property name="name" type="java.lang.String" value="delayConnect" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="20" y="170" width="160" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JCheckBox" name="sharedClient"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="sharedClient.text"/> - <Property name="name" type="java.lang.String" value="sharedClient" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="20" y="200" width="160" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JCheckBox" name="autoStart"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="autoStart.text"/> - <Property name="name" type="java.lang.String" value="autoStart" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="20" y="230" width="160" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JSeparator" name="jSeparator1"> - <Properties> - <Property name="name" type="java.lang.String" value="jSeparator1" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="0" y="510" width="750" height="10"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JLabel" name="tunnelDepthLabel"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="tunnelDepthLabel.text"/> - <Property name="name" type="java.lang.String" value="tunnelDepthLabel" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="20" y="280" width="160" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JLabel" name="depthVarianceLabel"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="depthVarianceLabel.text"/> - <Property name="name" type="java.lang.String" value="depthVarianceLabel" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="20" y="310" width="160" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JLabel" name="tunnelCountLabel"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="tunnelCountLabel.text"/> - <Property name="name" type="java.lang.String" value="tunnelCountLabel" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="20" y="340" width="160" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JLabel" name="backupTunnelCountLabel"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="backupTunnelCountLabel.text"/> - <Property name="name" type="java.lang.String" value="backupTunnelCountLabel" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="20" y="370" width="170" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JSeparator" name="jSeparator2"> - <Properties> - <Property name="name" type="java.lang.String" value="jSeparator2" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="0" y="260" width="750" height="10"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JCheckBox" name="reduceIdle"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="reduceIdle.text"/> - <Property name="name" type="java.lang.String" value="reduceIdle" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="20" y="420" width="300" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JCheckBox" name="closeIdle"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="closeIdle.text"/> - <Property name="name" type="java.lang.String" value="closeIdle" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="20" y="450" width="370" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JCheckBox" name="delayIdle"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="delayIdle.text"/> - <Property name="name" type="java.lang.String" value="delayIdle" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="20" y="480" width="400" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JSeparator" name="jSeparator3"> - <Properties> - <Property name="name" type="java.lang.String" value="jSeparator3" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="0" y="400" width="760" height="10"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JButton" name="save"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="save.text"/> - <Property name="name" type="java.lang.String" value="save" noResource="true"/> - </Properties> - <Events> - <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="saveActionPerformed"/> - </Events> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="10" y="520" width="-1" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JButton" name="cancel"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="cancel.text"/> - <Property name="name" type="java.lang.String" value="cancel" noResource="true"/> - </Properties> - <Events> - <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="cancelActionPerformed"/> - </Events> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="60" y="520" width="-1" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JTextField" name="tunnelName"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="tunnelName.text"/> - <Property name="name" type="java.lang.String" value="tunnelName" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="200" y="20" width="340" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JLabel" name="tunnelType"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="tunnelType.text"/> - <Property name="name" type="java.lang.String" value="tunnelType" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="200" y="50" width="340" height="20"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JTextField" name="tunnelPort"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="tunnelPort.text"/> - <Property name="name" type="java.lang.String" value="tunnelPort" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="200" y="70" width="340" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JTextField" name="tunnelDestination"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="tunnelDestination.text"/> - <Property name="name" type="java.lang.String" value="tunnelDestination" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="200" y="100" width="340" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JComboBox" name="tunnelProfile"> - <Properties> - <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor"> - <StringArray count="2"> - <StringItem index="0" value="Interactive connection (Instant messaging)"/> - <StringItem index="1" value="Bulk connection (Downloads, websites...)"/> - </StringArray> - </Property> - <Property name="name" type="java.lang.String" value="tunnelProfile" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="200" y="130" width="340" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JComboBox" name="tunnelDepth"> - <Properties> - <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor"> - <StringArray count="4"> - <StringItem index="0" value="0 hop tunnel (no anonymity, low latency)"/> - <StringItem index="1" value="1 hop tunnel (low anonymity, low latency)"/> - <StringItem index="2" value="2 hop tunnel (medium anonymity, medium latency)"/> - <StringItem index="3" value="3 hop tunnel (high anonymity, high latency)"/> - </StringArray> - </Property> - <Property name="name" type="java.lang.String" value="tunnelDepth" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="200" y="280" width="350" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JComboBox" name="depthVariance"> - <Properties> - <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor"> - <StringArray count="5"> - <StringItem index="0" value="0 hop variance (no random, good performance)"/> - <StringItem index="1" value="+ 0-1 hop variance (slightly random, lower performance)"/> - <StringItem index="2" value="+ 0-2 hop variance (very random, lower performance)"/> - <StringItem index="3" value="+/- 0-1 hop variance (slightly random, standard performance)"/> - <StringItem index="4" value="+/- 0-2 hop variance (not recommended)"/> - </StringArray> - </Property> - <Property name="name" type="java.lang.String" value="depthVariance" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="200" y="310" width="350" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JComboBox" name="tunnelCount"> - <Properties> - <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor"> - <StringArray count="3"> - <StringItem index="0" value="1 tunnel (low bandwidth usage, low reliability)"/> - <StringItem index="1" value="2 tunnels (standard bandwidth usage, standard reliability)"/> - <StringItem index="2" value="3 tunnels (high bandwidth usage, high reliability)"/> - </StringArray> - </Property> - <Property name="name" type="java.lang.String" value="tunnelCount" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="200" y="340" width="350" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JComboBox" name="backupTunnelCount"> - <Properties> - <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor"> - <StringArray count="4"> - <StringItem index="0" value="0 backup tunnels (no redundancy, no resource usage)"/> - <StringItem index="1" value="1 backup tunnel (low redundancy, low resource usage)"/> - <StringItem index="2" value="2 backup tunnels (medium redundancy, medium resource usage)"/> - <StringItem index="3" value="3 backup tunnels (high redundancy, high resource usage)"/> - </StringArray> - </Property> - <Property name="name" type="java.lang.String" value="backupTunnelCount" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="200" y="370" width="350" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JButton" name="changeTunnelState"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="changeTunnelState.text"/> - <Property name="name" type="java.lang.String" value="changeTunnelState" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="160" y="520" width="150" height="-1"/> - </Constraint> - </Constraints> - </Component> - </SubComponents> -</Form> diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/ClientTunnelWindow.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/ClientTunnelWindow.java deleted file mode 100644 index b7102b3ce18702fdef58c51662f2db1014a13d0c..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/gui/ClientTunnelWindow.java +++ /dev/null @@ -1,434 +0,0 @@ -/* - * ClientTunnelWindow.java - * - * Created on 10-jun-2009, 16:49:12 - */ - -package net.i2p.desktopgui.gui; - -import net.i2p.i2ptunnel.web.EditBean; -import java.awt.event.ActionListener; - -/** - * - * @author mathias - */ -public class ClientTunnelWindow extends javax.swing.JFrame { - - /** Creates new form ClientTunnelWindow */ - public ClientTunnelWindow(int tunnelNumber, ActionListener al) { - initComponents(); - this.tunnelNumber = tunnelNumber; - this.al = al; - extraInitComponents(); - this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); - this.setSize(600, 600); - this.setLocationRelativeTo(null); - this.requestFocus(); - this.changeTunnelState.setVisible(false); //TODO: implement tunnel state change - this.setVisible(true); - } - - public void extraInitComponents() { - EditBean bean = new EditBean(); - if(!bean.isClient(tunnelNumber)) { - this.dispose(); - } - else { - this.tunnelName.setText(bean.getTunnelName(tunnelNumber)); - this.tunnelType.setText(bean.getTunnelType(tunnelNumber)); - this.tunnelPort.setText(bean.getClientPort(tunnelNumber)); - this.tunnelDestination.setText(bean.getClientDestination(tunnelNumber)); - - if(bean.getTunnelType(tunnelNumber).equals(TYPE_STREAMR_CLIENT)) { - tunnelProfile.setVisible(false); - tunnelProfileLabel.setVisible(false); - this.delayConnect.setVisible(false); - this.sharedClient.setVisible(false); - this.autoStart.setVisible(false); - } - else { - if(bean.isInteractive(tunnelNumber)) { - tunnelProfile.setSelectedIndex(TUNNEL_INTERACTIVE); - } - else { - tunnelProfile.setSelectedIndex(TUNNEL_BULK); - } - - this.delayConnect.setSelected(bean.shouldDelay(tunnelNumber)); - this.sharedClient.setSelected(bean.isSharedClient(tunnelNumber)); - this.autoStart.setSelected(bean.startAutomatically(tunnelNumber)); - } - - this.tunnelDepth.setSelectedIndex(bean.getTunnelDepth(tunnelNumber, 2)); - - int variance = bean.getTunnelVariance(tunnelNumber, 0); - if(variance == 0) { - this.depthVariance.setSelectedIndex(0); - } - else if(variance == 1) { - this.depthVariance.setSelectedIndex(1); - } - else if(variance == 2) { - this.depthVariance.setSelectedIndex(2); - } - else if(variance == -1) { - this.depthVariance.setSelectedIndex(3); - } - else if(variance == -2) { - this.depthVariance.setSelectedIndex(4); - } - - int tunnelQuantity = bean.getTunnelQuantity(tunnelNumber, 2) - 1; - if(tunnelQuantity >= 0 && tunnelQuantity <= 2) { - this.tunnelCount.setSelectedIndex(tunnelQuantity); - } - - int backupTunnelQuantity = bean.getTunnelBackupQuantity(tunnelNumber, 0); - if(backupTunnelQuantity >= 0 && backupTunnelQuantity <= 3) { - this.backupTunnelCount.setSelectedIndex(backupTunnelQuantity); - } - - - if(bean.getTunnelType(tunnelNumber).equals(TYPE_STREAMR_CLIENT)) { - this.reduceIdle.setVisible(false); - this.closeIdle.setVisible(false); - this.delayIdle.setVisible(false); - } - else { - this.reduceIdle.setSelected(bean.getReduce(tunnelNumber)); - this.closeIdle.setSelected(bean.getClose(tunnelNumber)); - this.delayIdle.setSelected(bean.getDelayOpen(tunnelNumber)); - } - } - } - - /** This method is called from within the constructor to - * initialize the form. - * WARNING: Do NOT modify this code. The content of this method is - * always regenerated by the Form Editor. - */ - @SuppressWarnings("unchecked") - // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents - private void initComponents() { - - tunnelNameLabel = new javax.swing.JLabel(); - tunnelTypeLabel = new javax.swing.JLabel(); - tunnelPortLabel = new javax.swing.JLabel(); - tunnelDestinationLabel = new javax.swing.JLabel(); - tunnelProfileLabel = new javax.swing.JLabel(); - delayConnect = new javax.swing.JCheckBox(); - sharedClient = new javax.swing.JCheckBox(); - autoStart = new javax.swing.JCheckBox(); - jSeparator1 = new javax.swing.JSeparator(); - tunnelDepthLabel = new javax.swing.JLabel(); - depthVarianceLabel = new javax.swing.JLabel(); - tunnelCountLabel = new javax.swing.JLabel(); - backupTunnelCountLabel = new javax.swing.JLabel(); - jSeparator2 = new javax.swing.JSeparator(); - reduceIdle = new javax.swing.JCheckBox(); - closeIdle = new javax.swing.JCheckBox(); - delayIdle = new javax.swing.JCheckBox(); - jSeparator3 = new javax.swing.JSeparator(); - save = new javax.swing.JButton(); - cancel = new javax.swing.JButton(); - tunnelName = new javax.swing.JTextField(); - tunnelType = new javax.swing.JLabel(); - tunnelPort = new javax.swing.JTextField(); - tunnelDestination = new javax.swing.JTextField(); - tunnelProfile = new javax.swing.JComboBox(); - tunnelDepth = new javax.swing.JComboBox(); - depthVariance = new javax.swing.JComboBox(); - tunnelCount = new javax.swing.JComboBox(); - backupTunnelCount = new javax.swing.JComboBox(); - changeTunnelState = new javax.swing.JButton(); - - setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); - org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(net.i2p.desktopgui.desktopgui.Main.class).getContext().getResourceMap(ClientTunnelWindow.class); - setTitle(resourceMap.getString("Form.title")); // NOI18N - setName("Form"); // NOI18N - getContentPane().setLayout(null); - - tunnelNameLabel.setText(resourceMap.getString("tunnelNameLabel.text")); // NOI18N - tunnelNameLabel.setName("tunnelNameLabel"); // NOI18N - getContentPane().add(tunnelNameLabel); - tunnelNameLabel.setBounds(20, 20, 120, 17); - - tunnelTypeLabel.setText(resourceMap.getString("tunnelTypeLabel.text")); // NOI18N - tunnelTypeLabel.setName("tunnelTypeLabel"); // NOI18N - getContentPane().add(tunnelTypeLabel); - tunnelTypeLabel.setBounds(20, 50, 120, 17); - - tunnelPortLabel.setText(resourceMap.getString("tunnelPortLabel.text")); // NOI18N - tunnelPortLabel.setName("tunnelPortLabel"); // NOI18N - getContentPane().add(tunnelPortLabel); - tunnelPortLabel.setBounds(20, 80, 110, 17); - - tunnelDestinationLabel.setText(resourceMap.getString("tunnelDestinationLabel.text")); // NOI18N - tunnelDestinationLabel.setName("tunnelDestinationLabel"); // NOI18N - getContentPane().add(tunnelDestinationLabel); - tunnelDestinationLabel.setBounds(20, 110, 110, 17); - - tunnelProfileLabel.setText(resourceMap.getString("tunnelProfileLabel.text")); // NOI18N - tunnelProfileLabel.setName("tunnelProfileLabel"); // NOI18N - getContentPane().add(tunnelProfileLabel); - tunnelProfileLabel.setBounds(20, 140, 110, 17); - - delayConnect.setText(resourceMap.getString("delayConnect.text")); // NOI18N - delayConnect.setName("delayConnect"); // NOI18N - getContentPane().add(delayConnect); - delayConnect.setBounds(20, 170, 160, 22); - - sharedClient.setText(resourceMap.getString("sharedClient.text")); // NOI18N - sharedClient.setName("sharedClient"); // NOI18N - getContentPane().add(sharedClient); - sharedClient.setBounds(20, 200, 160, 22); - - autoStart.setText(resourceMap.getString("autoStart.text")); // NOI18N - autoStart.setName("autoStart"); // NOI18N - getContentPane().add(autoStart); - autoStart.setBounds(20, 230, 160, 22); - - jSeparator1.setName("jSeparator1"); // NOI18N - getContentPane().add(jSeparator1); - jSeparator1.setBounds(0, 510, 750, 10); - - tunnelDepthLabel.setText(resourceMap.getString("tunnelDepthLabel.text")); // NOI18N - tunnelDepthLabel.setName("tunnelDepthLabel"); // NOI18N - getContentPane().add(tunnelDepthLabel); - tunnelDepthLabel.setBounds(20, 280, 160, 17); - - depthVarianceLabel.setText(resourceMap.getString("depthVarianceLabel.text")); // NOI18N - depthVarianceLabel.setName("depthVarianceLabel"); // NOI18N - getContentPane().add(depthVarianceLabel); - depthVarianceLabel.setBounds(20, 310, 160, 17); - - tunnelCountLabel.setText(resourceMap.getString("tunnelCountLabel.text")); // NOI18N - tunnelCountLabel.setName("tunnelCountLabel"); // NOI18N - getContentPane().add(tunnelCountLabel); - tunnelCountLabel.setBounds(20, 340, 160, 17); - - backupTunnelCountLabel.setText(resourceMap.getString("backupTunnelCountLabel.text")); // NOI18N - backupTunnelCountLabel.setName("backupTunnelCountLabel"); // NOI18N - getContentPane().add(backupTunnelCountLabel); - backupTunnelCountLabel.setBounds(20, 370, 170, 17); - - jSeparator2.setName("jSeparator2"); // NOI18N - getContentPane().add(jSeparator2); - jSeparator2.setBounds(0, 260, 750, 10); - - reduceIdle.setText(resourceMap.getString("reduceIdle.text")); // NOI18N - reduceIdle.setName("reduceIdle"); // NOI18N - getContentPane().add(reduceIdle); - reduceIdle.setBounds(20, 420, 300, 22); - - closeIdle.setText(resourceMap.getString("closeIdle.text")); // NOI18N - closeIdle.setName("closeIdle"); // NOI18N - getContentPane().add(closeIdle); - closeIdle.setBounds(20, 450, 370, 22); - - delayIdle.setText(resourceMap.getString("delayIdle.text")); // NOI18N - delayIdle.setName("delayIdle"); // NOI18N - getContentPane().add(delayIdle); - delayIdle.setBounds(20, 480, 400, 22); - - jSeparator3.setName("jSeparator3"); // NOI18N - getContentPane().add(jSeparator3); - jSeparator3.setBounds(0, 400, 760, 10); - - save.setText(resourceMap.getString("save.text")); // NOI18N - save.setName("save"); // NOI18N - save.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - saveActionPerformed(evt); - } - }); - getContentPane().add(save); - save.setBounds(10, 520, 44, 29); - - cancel.setText(resourceMap.getString("cancel.text")); // NOI18N - cancel.setName("cancel"); // NOI18N - cancel.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - cancelActionPerformed(evt); - } - }); - getContentPane().add(cancel); - cancel.setBounds(60, 520, 55, 29); - - tunnelName.setText(resourceMap.getString("tunnelName.text")); // NOI18N - tunnelName.setName("tunnelName"); // NOI18N - getContentPane().add(tunnelName); - tunnelName.setBounds(200, 20, 340, 27); - - tunnelType.setText(resourceMap.getString("tunnelType.text")); // NOI18N - tunnelType.setName("tunnelType"); // NOI18N - getContentPane().add(tunnelType); - tunnelType.setBounds(200, 50, 340, 20); - - tunnelPort.setText(resourceMap.getString("tunnelPort.text")); // NOI18N - tunnelPort.setName("tunnelPort"); // NOI18N - getContentPane().add(tunnelPort); - tunnelPort.setBounds(200, 70, 340, 27); - - tunnelDestination.setText(resourceMap.getString("tunnelDestination.text")); // NOI18N - tunnelDestination.setName("tunnelDestination"); // NOI18N - getContentPane().add(tunnelDestination); - tunnelDestination.setBounds(200, 100, 340, 27); - - tunnelProfile.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Interactive connection (Instant messaging)", "Bulk connection (Downloads, websites...)" })); - tunnelProfile.setName("tunnelProfile"); // NOI18N - getContentPane().add(tunnelProfile); - tunnelProfile.setBounds(200, 130, 340, 27); - - tunnelDepth.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "0 hop tunnel (no anonymity, low latency)", "1 hop tunnel (low anonymity, low latency)", "2 hop tunnel (medium anonymity, medium latency)", "3 hop tunnel (high anonymity, high latency)" })); - tunnelDepth.setName("tunnelDepth"); // NOI18N - getContentPane().add(tunnelDepth); - tunnelDepth.setBounds(200, 280, 350, 27); - - depthVariance.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "0 hop variance (no random, good performance)", "+ 0-1 hop variance (slightly random, lower performance)", "+ 0-2 hop variance (very random, lower performance)", "+/- 0-1 hop variance (slightly random, standard performance)", "+/- 0-2 hop variance (not recommended)" })); - depthVariance.setName("depthVariance"); // NOI18N - getContentPane().add(depthVariance); - depthVariance.setBounds(200, 310, 350, 27); - - tunnelCount.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "1 tunnel (low bandwidth usage, low reliability)", "2 tunnels (standard bandwidth usage, standard reliability)", "3 tunnels (high bandwidth usage, high reliability)" })); - tunnelCount.setName("tunnelCount"); // NOI18N - getContentPane().add(tunnelCount); - tunnelCount.setBounds(200, 340, 350, 27); - - backupTunnelCount.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "0 backup tunnels (no redundancy, no resource usage)", "1 backup tunnel (low redundancy, low resource usage)", "2 backup tunnels (medium redundancy, medium resource usage)", "3 backup tunnels (high redundancy, high resource usage)" })); - backupTunnelCount.setName("backupTunnelCount"); // NOI18N - getContentPane().add(backupTunnelCount); - backupTunnelCount.setBounds(200, 370, 350, 27); - - changeTunnelState.setText(resourceMap.getString("changeTunnelState.text")); // NOI18N - changeTunnelState.setName("changeTunnelState"); // NOI18N - getContentPane().add(changeTunnelState); - changeTunnelState.setBounds(160, 520, 150, 29); - - pack(); - }// </editor-fold>//GEN-END:initComponents - - private void saveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saveActionPerformed - EditBean bean = new EditBean(); - if(!bean.isClient(tunnelNumber)) { - al.actionPerformed(evt); - this.dispose(); - } - else { - bean.setTunnel("" + tunnelNumber); - bean.setName(tunnelName.getText()); - bean.setPort(tunnelPort.getText()); - bean.setTargetDestination(tunnelDestination.getText()); - if(!bean.getTunnelType(tunnelNumber).equals(TYPE_STREAMR_CLIENT)) { - if(tunnelProfile.getSelectedIndex() == TUNNEL_INTERACTIVE) { - bean.setProfile("interactive"); - } - else { - bean.setProfile("bulk"); - } - - if(delayConnect.isSelected()) { - bean.setConnectDelay("true"); - } - else { - bean.setConnectDelay("false"); - } - - if(sharedClient.isSelected()) { - bean.setShared(true); - } - else { - bean.setShared(false); - } - - if(autoStart.isSelected()) { - bean.setStartOnLoad("true"); - } - else { - } - } - bean.setTunnelDepth("" + tunnelDepth.getSelectedIndex()); - - int variance = depthVariance.getSelectedIndex(); - if(variance >= 0 && variance <= 2) { - bean.setTunnelVariance("" + variance); - } - else if(variance == 3) { - bean.setTunnelVariance("-1"); - } - else if(variance == 4) { - bean.setTunnelVariance("-2"); - } - - bean.setTunnelQuantity("" + tunnelCount.getSelectedIndex() + 1); - - bean.setTunnelBackupQuantity("" + backupTunnelCount.getSelectedIndex()); - - if(!bean.getTunnelType(tunnelNumber).equals(TYPE_STREAMR_CLIENT)) { - if(reduceIdle.isSelected()) { - bean.setReduce("true"); - } - else { - } - - if(closeIdle.isSelected()) { - bean.setClose("true"); - } - else { - } - - if(delayIdle.isSelected()) { - bean.setDelayOpen("true"); - } - } - - } - - al.actionPerformed(evt); - this.dispose(); -}//GEN-LAST:event_saveActionPerformed - - private void cancelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelActionPerformed - al.actionPerformed(evt); - this.dispose(); - }//GEN-LAST:event_cancelActionPerformed - - // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JCheckBox autoStart; - private javax.swing.JComboBox backupTunnelCount; - private javax.swing.JLabel backupTunnelCountLabel; - private javax.swing.JButton cancel; - private javax.swing.JButton changeTunnelState; - private javax.swing.JCheckBox closeIdle; - private javax.swing.JCheckBox delayConnect; - private javax.swing.JCheckBox delayIdle; - private javax.swing.JComboBox depthVariance; - private javax.swing.JLabel depthVarianceLabel; - private javax.swing.JSeparator jSeparator1; - private javax.swing.JSeparator jSeparator2; - private javax.swing.JSeparator jSeparator3; - private javax.swing.JCheckBox reduceIdle; - private javax.swing.JButton save; - private javax.swing.JCheckBox sharedClient; - private javax.swing.JComboBox tunnelCount; - private javax.swing.JLabel tunnelCountLabel; - private javax.swing.JComboBox tunnelDepth; - private javax.swing.JLabel tunnelDepthLabel; - private javax.swing.JTextField tunnelDestination; - private javax.swing.JLabel tunnelDestinationLabel; - private javax.swing.JTextField tunnelName; - private javax.swing.JLabel tunnelNameLabel; - private javax.swing.JTextField tunnelPort; - private javax.swing.JLabel tunnelPortLabel; - private javax.swing.JComboBox tunnelProfile; - private javax.swing.JLabel tunnelProfileLabel; - private javax.swing.JLabel tunnelType; - private javax.swing.JLabel tunnelTypeLabel; - // End of variables declaration//GEN-END:variables - private int tunnelNumber; - private ActionListener al; - private static final int TUNNEL_INTERACTIVE = 0; - private static final int TUNNEL_BULK = 1; - private static final String TYPE_STREAMR_CLIENT = "Streamr client"; -} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java new file mode 100644 index 0000000000000000000000000000000000000000..ae45bf24712da3d906c94a7287b89902d15f3d78 --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java @@ -0,0 +1,132 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +/* + * ConfigurationFrame.java + * + * Created on Feb 16, 2011, 8:03:14 AM + */ + +package net.i2p.desktopgui.gui; + +import java.util.logging.Level; +import java.util.logging.Logger; +import net.i2p.desktopgui.i18n.DesktopguiTranslator; +import net.i2p.desktopgui.router.RouterManager; + +/** + * + * @author mathias + */ +public class DesktopguiConfigurationFrame extends javax.swing.JFrame { + + /** Creates new form ConfigurationFrame */ + public DesktopguiConfigurationFrame() { + initComponents(); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents + private void initComponents() { + + desktopguiEnabled = new javax.swing.JCheckBox(); + okButton = new javax.swing.JButton(); + cancelButton = new javax.swing.JButton(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + setTitle(_("Tray icon configuration")); + + desktopguiEnabled.setSelected(true); + desktopguiEnabled.setText(_("Should tray icon be enabled?")); + desktopguiEnabled.setActionCommand("shouldDesktopguiBeEnabled"); + + okButton.setText("OK"); + okButton.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseReleased(java.awt.event.MouseEvent evt) { + okButtonMouseReleased(evt); + } + }); + + cancelButton.setText("Cancel"); + cancelButton.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseReleased(java.awt.event.MouseEvent evt) { + cancelButtonMouseReleased(evt); + } + }); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(desktopguiEnabled) + .addGroup(layout.createSequentialGroup() + .addComponent(okButton) + .addGap(18, 18, 18) + .addComponent(cancelButton))) + .addContainerGap(237, Short.MAX_VALUE)) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(desktopguiEnabled) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(okButton) + .addComponent(cancelButton)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + + pack(); + }// </editor-fold>//GEN-END:initComponents + + private void cancelButtonMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_cancelButtonMouseReleased + System.out.println("Cancelling configuration change."); + this.dispose(); + }//GEN-LAST:event_cancelButtonMouseReleased + + private void okButtonMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_okButtonMouseReleased + configureDesktopgui(); + }//GEN-LAST:event_okButtonMouseReleased + + protected static String _(String s) { + return DesktopguiTranslator._(s); + } + + private void configureDesktopgui() { + String property = "desktopgui.enabled"; + String value; + if(!desktopguiEnabled.isSelected()) { + value = "false"; + System.out.println("Disabling desktopgui"); + } + else { + value = "true"; + System.out.println("Enabling desktopgui"); + } + try { + RouterManager.getRouterContext().setProperty(property, value); + } catch (Exception ex) { + Logger.getLogger(DesktopguiConfigurationFrame.class.getName()).log(Level.SEVERE, null, ex); + } + System.out.println("Applying desktopgui configuration!"); + this.dispose(); + } + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton cancelButton; + private javax.swing.JCheckBox desktopguiEnabled; + private javax.swing.JButton okButton; + // End of variables declaration//GEN-END:variables + +} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/GeneralConfiguration.form b/apps/desktopgui/src/net/i2p/desktopgui/gui/GeneralConfiguration.form deleted file mode 100644 index 589f5cee2ef35593e0fb482cfe581b4374d13f99..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/gui/GeneralConfiguration.form +++ /dev/null @@ -1,645 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> - -<Form version="1.5" maxVersion="1.6" type="org.netbeans.modules.form.forminfo.JFrameFormInfo"> - <NonVisualComponents> - <Component class="javax.swing.ButtonGroup" name="updateButtonGroup"> - </Component> - </NonVisualComponents> - <Properties> - <Property name="defaultCloseOperation" type="int" value="3"/> - <Property name="title" type="java.lang.String" resourceKey="Form.title"/> - <Property name="name" type="java.lang.String" value="Form" noResource="true"/> - </Properties> - <SyntheticProperties> - <SyntheticProperty name="formSizePolicy" type="int" value="1"/> - </SyntheticProperties> - <AuxValues> - <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/> - <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/> - <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/> - <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/> - <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/> - <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/> - <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/> - <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/> - <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/> - </AuxValues> - - <Layout> - <DimensionLayout dim="0"> - <Group type="103" groupAlignment="0" attributes="0"> - <Component id="applyPanel" alignment="0" max="32767" attributes="0"/> - <Group type="102" attributes="0"> - <EmptySpace min="12" pref="12" max="12" attributes="0"/> - <Component id="settingsPanel" pref="566" max="32767" attributes="0"/> - </Group> - </Group> - </DimensionLayout> - <DimensionLayout dim="1"> - <Group type="103" groupAlignment="0" attributes="0"> - <Group type="102" alignment="1" attributes="0"> - <Component id="settingsPanel" max="32767" attributes="0"/> - <EmptySpace max="-2" attributes="0"/> - <Component id="applyPanel" min="-2" max="-2" attributes="0"/> - </Group> - </Group> - </DimensionLayout> - </Layout> - <SubComponents> - <Container class="javax.swing.JPanel" name="applyPanel"> - <Properties> - <Property name="name" type="java.lang.String" value="applyPanel" noResource="true"/> - </Properties> - - <Layout> - <DimensionLayout dim="0"> - <Group type="103" groupAlignment="0" attributes="0"> - <Group type="102" alignment="1" attributes="0"> - <EmptySpace pref="475" max="32767" attributes="0"/> - <Component id="ok" min="-2" max="-2" attributes="0"/> - <EmptySpace max="-2" attributes="0"/> - <Component id="cancel" min="-2" max="-2" attributes="0"/> - <EmptySpace max="-2" attributes="0"/> - </Group> - </Group> - </DimensionLayout> - <DimensionLayout dim="1"> - <Group type="103" groupAlignment="0" attributes="0"> - <Group type="102" alignment="0" attributes="0"> - <Group type="103" groupAlignment="3" attributes="0"> - <Component id="cancel" alignment="3" min="-2" max="-2" attributes="0"/> - <Component id="ok" alignment="3" min="-2" max="-2" attributes="0"/> - </Group> - <EmptySpace pref="14" max="32767" attributes="0"/> - </Group> - </Group> - </DimensionLayout> - </Layout> - <SubComponents> - <Component class="javax.swing.JToggleButton" name="cancel"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="cancel.text"/> - <Property name="name" type="java.lang.String" value="cancel" noResource="true"/> - </Properties> - <Events> - <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="cancelMouseClicked"/> - </Events> - </Component> - <Component class="javax.swing.JToggleButton" name="ok"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="ok.text"/> - <Property name="name" type="java.lang.String" value="ok" noResource="true"/> - </Properties> - <Events> - <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="okMouseClicked"/> - </Events> - </Component> - </SubComponents> - </Container> - <Container class="javax.swing.JTabbedPane" name="settingsPanel"> - <Properties> - <Property name="name" type="java.lang.String" value="settingsPanel" noResource="true"/> - </Properties> - - <Layout class="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout"/> - <SubComponents> - <Container class="javax.swing.JPanel" name="speedPanel"> - <Properties> - <Property name="name" type="java.lang.String" value="speedPanel" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription"> - <JTabbedPaneConstraints tabName="Speed"> - <Property name="tabTitle" type="java.lang.String" resourceKey="speedPanel.TabConstraints.tabTitle"/> - </JTabbedPaneConstraints> - </Constraint> - </Constraints> - - <Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout"> - <Property name="useNullLayout" type="boolean" value="true"/> - </Layout> - <SubComponents> - <Component class="javax.swing.JLabel" name="uploadSpeedLabel"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="uploadSpeedLabel.text"/> - <Property name="name" type="java.lang.String" value="uploadSpeedLabel" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="20" y="20" width="140" height="30"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JLabel" name="downloadSpeedLabel"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="downloadSpeedLabel.text"/> - <Property name="name" type="java.lang.String" value="downloadSpeedLabel" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="20" y="60" width="140" height="30"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JTextField" name="uploadspeed"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="uploadspeed.text"/> - <Property name="name" type="java.lang.String" value="uploadspeed" noResource="true"/> - </Properties> - <Events> - <EventHandler event="keyReleased" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="speedKeyReleased"/> - </Events> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="160" y="20" width="-1" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JTextField" name="downloadspeed"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="downloadspeed.text"/> - <Property name="name" type="java.lang.String" value="downloadspeed" noResource="true"/> - </Properties> - <Events> - <EventHandler event="keyReleased" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="speedKeyReleased"/> - </Events> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="160" y="60" width="-1" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JComboBox" name="uploadkbps"> - <Properties> - <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor"> - <StringArray count="2"> - <StringItem index="0" value="kbps"/> - <StringItem index="1" value="kBps"/> - </StringArray> - </Property> - <Property name="name" type="java.lang.String" value="uploadkbps" noResource="true"/> - </Properties> - <Events> - <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="uploadkbpsActionPerformed"/> - </Events> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="240" y="20" width="-1" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JComboBox" name="downloadkbps"> - <Properties> - <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor"> - <StringArray count="2"> - <StringItem index="0" value="kbps"/> - <StringItem index="1" value="kBps"/> - </StringArray> - </Property> - <Property name="name" type="java.lang.String" value="downloadkbps" noResource="true"/> - </Properties> - <Events> - <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="downloadkbpsActionPerformed"/> - </Events> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="240" y="60" width="-1" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JLabel" name="uploadUsageLabel"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="uploadUsageLabel.text"/> - <Property name="name" type="java.lang.String" value="uploadUsageLabel" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="330" y="20" width="-1" height="30"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JLabel" name="downloadUsageLabel"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="downloadUsageLabel.text"/> - <Property name="name" type="java.lang.String" value="downloadUsageLabel" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="330" y="60" width="-1" height="30"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JTextField" name="uploadgb"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="uploadgb.text"/> - <Property name="name" type="java.lang.String" value="uploadgb" noResource="true"/> - </Properties> - <Events> - <EventHandler event="keyReleased" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="monthKeyReleased"/> - </Events> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="440" y="20" width="60" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JTextField" name="downloadgb"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="downloadgb.text"/> - <Property name="name" type="java.lang.String" value="downloadgb" noResource="true"/> - </Properties> - <Events> - <EventHandler event="keyReleased" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="monthKeyReleased"/> - </Events> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="440" y="60" width="60" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JLabel" name="gbUploadLabel"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="gbUploadLabel.text"/> - <Property name="name" type="java.lang.String" value="gbUploadLabel" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="510" y="20" width="-1" height="30"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JLabel" name="gbDownloadLabel"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="gbDownloadLabel.text"/> - <Property name="name" type="java.lang.String" value="gbDownloadLabel" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="510" y="60" width="-1" height="30"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JLabel" name="uploadDownloadExplanation"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="uploadDownloadExplanation.text"/> - <Property name="name" type="java.lang.String" value="uploadDownloadExplanation" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="20" y="100" width="520" height="70"/> - </Constraint> - </Constraints> - </Component> - </SubComponents> - </Container> - <Container class="javax.swing.JPanel" name="updatesPanel"> - <Properties> - <Property name="name" type="java.lang.String" value="updatesPanel" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription"> - <JTabbedPaneConstraints tabName="Updates"> - <Property name="tabTitle" type="java.lang.String" resourceKey="updatesPanel.TabConstraints.tabTitle"/> - </JTabbedPaneConstraints> - </Constraint> - </Constraints> - - <Layout> - <DimensionLayout dim="0"> - <Group type="103" groupAlignment="0" attributes="0"> - <Group type="102" attributes="0"> - <Group type="103" groupAlignment="0" attributes="0"> - <Group type="102" alignment="0" attributes="0"> - <EmptySpace min="-2" pref="20" max="-2" attributes="0"/> - <Group type="103" groupAlignment="0" attributes="0"> - <Component id="updateMethod" alignment="0" min="-2" max="-2" attributes="0"/> - <Group type="102" alignment="0" attributes="0"> - <Component id="checkUpdates" min="-2" max="-2" attributes="0"/> - <EmptySpace type="separate" max="-2" attributes="0"/> - <Component id="updateNow" min="-2" max="-2" attributes="0"/> - </Group> - </Group> - </Group> - <Group type="102" alignment="0" attributes="0"> - <EmptySpace min="40" pref="40" max="40" attributes="0"/> - <Group type="103" groupAlignment="0" max="-2" attributes="0"> - <Component id="updateInform" alignment="0" pref="377" max="32767" attributes="1"/> - <Component id="updateDownload" alignment="0" max="32767" attributes="1"/> - <Component id="updateDownloadRestart" alignment="0" max="32767" attributes="1"/> - </Group> - </Group> - </Group> - <EmptySpace min="-2" max="-2" attributes="0"/> - </Group> - <Group type="102" alignment="1" attributes="0"> - <EmptySpace pref="339" max="32767" attributes="0"/> - <Component id="advancedUpdateConfig" min="-2" max="-2" attributes="0"/> - <EmptySpace max="-2" attributes="0"/> - </Group> - </Group> - </DimensionLayout> - <DimensionLayout dim="1"> - <Group type="103" groupAlignment="0" attributes="0"> - <Group type="102" attributes="0"> - <EmptySpace max="-2" attributes="0"/> - <Component id="updateMethod" min="-2" max="-2" attributes="0"/> - <EmptySpace type="unrelated" max="-2" attributes="0"/> - <Component id="updateInform" min="-2" max="-2" attributes="0"/> - <EmptySpace max="-2" attributes="0"/> - <Component id="updateDownload" min="-2" max="-2" attributes="0"/> - <EmptySpace max="-2" attributes="0"/> - <Component id="updateDownloadRestart" min="-2" max="-2" attributes="0"/> - <EmptySpace type="separate" max="-2" attributes="0"/> - <Group type="103" groupAlignment="3" attributes="0"> - <Component id="checkUpdates" alignment="3" min="-2" max="-2" attributes="0"/> - <Component id="updateNow" alignment="3" min="-2" max="-2" attributes="0"/> - </Group> - <EmptySpace pref="181" max="32767" attributes="0"/> - <Component id="advancedUpdateConfig" min="-2" max="-2" attributes="0"/> - <EmptySpace max="-2" attributes="0"/> - </Group> - </Group> - </DimensionLayout> - </Layout> - <SubComponents> - <Component class="javax.swing.JLabel" name="updateMethod"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="updateMethod.text"/> - <Property name="name" type="java.lang.String" value="updateMethod" noResource="true"/> - </Properties> - </Component> - <Component class="javax.swing.JRadioButton" name="updateInform"> - <Properties> - <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor"> - <ComponentRef name="updateButtonGroup"/> - </Property> - <Property name="text" type="java.lang.String" resourceKey="updateInform.text"/> - <Property name="name" type="java.lang.String" value="updateInform" noResource="true"/> - </Properties> - </Component> - <Component class="javax.swing.JRadioButton" name="updateDownload"> - <Properties> - <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor"> - <ComponentRef name="updateButtonGroup"/> - </Property> - <Property name="text" type="java.lang.String" resourceKey="updateDownload.text"/> - <Property name="name" type="java.lang.String" value="updateDownload" noResource="true"/> - </Properties> - </Component> - <Component class="javax.swing.JRadioButton" name="updateDownloadRestart"> - <Properties> - <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor"> - <ComponentRef name="updateButtonGroup"/> - </Property> - <Property name="text" type="java.lang.String" resourceKey="updateDownloadRestart.text"/> - <Property name="name" type="java.lang.String" value="updateDownloadRestart" noResource="true"/> - </Properties> - </Component> - <Component class="javax.swing.JToggleButton" name="checkUpdates"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="checkUpdates.text"/> - <Property name="name" type="java.lang.String" value="checkUpdates" noResource="true"/> - </Properties> - <Events> - <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="checkUpdatesActionPerformed"/> - </Events> - </Component> - <Component class="javax.swing.JToggleButton" name="updateNow"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="updateNow.text"/> - <Property name="name" type="java.lang.String" value="updateNow" noResource="true"/> - </Properties> - <Events> - <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="updateNowActionPerformed"/> - </Events> - </Component> - <Component class="javax.swing.JToggleButton" name="advancedUpdateConfig"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="advancedUpdateConfig.text"/> - <Property name="name" type="java.lang.String" value="advancedUpdateConfig" noResource="true"/> - </Properties> - <Events> - <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="advancedUpdateConfigActionPerformed"/> - </Events> - </Component> - </SubComponents> - </Container> - <Container class="javax.swing.JPanel" name="tunnelPanel"> - <Properties> - <Property name="name" type="java.lang.String" value="tunnelPanel" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription"> - <JTabbedPaneConstraints tabName="Tunnels/Services"> - <Property name="tabTitle" type="java.lang.String" resourceKey="tunnelPanel.TabConstraints.tabTitle"/> - </JTabbedPaneConstraints> - </Constraint> - </Constraints> - - <Layout> - <DimensionLayout dim="0"> - <Group type="103" groupAlignment="0" attributes="0"> - <Group type="102" alignment="1" attributes="0"> - <EmptySpace max="-2" attributes="0"/> - <Group type="103" groupAlignment="1" attributes="0"> - <Component id="tunnelsExplanation" alignment="0" pref="538" max="32767" attributes="0"/> - <Component id="serverFrame" alignment="1" pref="538" max="32767" attributes="0"/> - <Component id="clientTunnelLabel" alignment="0" min="-2" max="-2" attributes="0"/> - <Component id="clientFrame" alignment="0" pref="538" max="32767" attributes="0"/> - <Component id="serverTunnelLabel" alignment="0" min="-2" max="-2" attributes="0"/> - </Group> - <EmptySpace max="-2" attributes="0"/> - </Group> - </Group> - </DimensionLayout> - <DimensionLayout dim="1"> - <Group type="103" groupAlignment="0" attributes="0"> - <Group type="102" alignment="0" attributes="0"> - <EmptySpace min="-2" max="-2" attributes="0"/> - <Component id="clientTunnelLabel" min="-2" max="-2" attributes="0"/> - <EmptySpace min="-2" max="-2" attributes="0"/> - <Component id="clientFrame" pref="119" max="32767" attributes="0"/> - <EmptySpace min="-2" max="-2" attributes="0"/> - <Component id="serverTunnelLabel" min="-2" max="-2" attributes="0"/> - <EmptySpace min="-2" max="-2" attributes="0"/> - <Component id="serverFrame" pref="122" max="32767" attributes="0"/> - <EmptySpace max="-2" attributes="0"/> - <Component id="tunnelsExplanation" min="-2" pref="45" max="-2" attributes="0"/> - <EmptySpace min="-2" pref="32" max="-2" attributes="0"/> - </Group> - </Group> - </DimensionLayout> - </Layout> - <SubComponents> - <Container class="javax.swing.JScrollPane" name="clientFrame"> - <Properties> - <Property name="name" type="java.lang.String" value="clientFrame" noResource="true"/> - </Properties> - - <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/> - <SubComponents> - <Component class="javax.swing.JTable" name="clientTable"> - <Properties> - <Property name="model" type="javax.swing.table.TableModel" editor="org.netbeans.modules.form.editors2.TableModelEditor"> - <Table columnCount="4" rowCount="0"> - <Column editable="true" title="Name" type="java.lang.Object"/> - <Column editable="true" title="Type" type="java.lang.Object"/> - <Column editable="true" title="Address" type="java.lang.Object"/> - <Column editable="true" title="Status" type="java.lang.Object"/> - </Table> - </Property> - <Property name="columnModel" type="javax.swing.table.TableColumnModel" editor="org.netbeans.modules.form.editors2.TableColumnModelEditor"> - <TableColumnModel selectionModel="0"> - <Column maxWidth="-1" minWidth="-1" prefWidth="-1" resizable="true"> - <Title resourceKey="clientTable.columnModel.title0"/> - <Editor/> - <Renderer/> - </Column> - <Column maxWidth="-1" minWidth="-1" prefWidth="-1" resizable="true"> - <Title resourceKey="clientTable.columnModel.title1"/> - <Editor/> - <Renderer/> - </Column> - <Column maxWidth="-1" minWidth="-1" prefWidth="-1" resizable="true"> - <Title resourceKey="clientTable.columnModel.title2"/> - <Editor/> - <Renderer/> - </Column> - <Column maxWidth="-1" minWidth="-1" prefWidth="-1" resizable="true"> - <Title resourceKey="clientTable.columnModel.title3"/> - <Editor/> - <Renderer/> - </Column> - </TableColumnModel> - </Property> - <Property name="name" type="java.lang.String" value="clientTable" noResource="true"/> - <Property name="tableHeader" type="javax.swing.table.JTableHeader" editor="org.netbeans.modules.form.editors2.JTableHeaderEditor"> - <TableHeader reorderingAllowed="true" resizingAllowed="true"/> - </Property> - </Properties> - <Events> - <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="clientTableMouseClicked"/> - </Events> - </Component> - </SubComponents> - </Container> - <Container class="javax.swing.JScrollPane" name="serverFrame"> - <Properties> - <Property name="name" type="java.lang.String" value="serverFrame" noResource="true"/> - </Properties> - - <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/> - <SubComponents> - <Component class="javax.swing.JTable" name="serverTable"> - <Properties> - <Property name="model" type="javax.swing.table.TableModel" editor="org.netbeans.modules.form.editors2.TableModelEditor"> - <Table columnCount="3" rowCount="4"> - <Column editable="true" title="Name" type="java.lang.Object"/> - <Column editable="true" title="Address" type="java.lang.Object"/> - <Column editable="true" title="Status" type="java.lang.Object"/> - </Table> - </Property> - <Property name="columnModel" type="javax.swing.table.TableColumnModel" editor="org.netbeans.modules.form.editors2.TableColumnModelEditor"> - <TableColumnModel selectionModel="0"> - <Column maxWidth="-1" minWidth="-1" prefWidth="-1" resizable="true"> - <Title resourceKey="serverTable.columnModel.title0"/> - <Editor/> - <Renderer/> - </Column> - <Column maxWidth="-1" minWidth="-1" prefWidth="-1" resizable="true"> - <Title resourceKey="serverTable.columnModel.title1"/> - <Editor/> - <Renderer/> - </Column> - <Column maxWidth="-1" minWidth="-1" prefWidth="-1" resizable="true"> - <Title resourceKey="serverTable.columnModel.title2"/> - <Editor/> - <Renderer/> - </Column> - </TableColumnModel> - </Property> - <Property name="name" type="java.lang.String" value="serverTable" noResource="true"/> - <Property name="tableHeader" type="javax.swing.table.JTableHeader" editor="org.netbeans.modules.form.editors2.JTableHeaderEditor"> - <TableHeader reorderingAllowed="true" resizingAllowed="true"/> - </Property> - </Properties> - <Events> - <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="serverTableMouseClicked"/> - </Events> - </Component> - </SubComponents> - </Container> - <Component class="javax.swing.JLabel" name="tunnelsExplanation"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="tunnelsExplanation.text"/> - <Property name="name" type="java.lang.String" value="tunnelsExplanation" noResource="true"/> - </Properties> - </Component> - <Component class="javax.swing.JLabel" name="clientTunnelLabel"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="clientTunnelLabel.text"/> - <Property name="name" type="java.lang.String" value="clientTunnelLabel" noResource="true"/> - </Properties> - </Component> - <Component class="javax.swing.JLabel" name="serverTunnelLabel"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="serverTunnelLabel.text"/> - <Property name="name" type="java.lang.String" value="serverTunnelLabel" noResource="true"/> - </Properties> - </Component> - </SubComponents> - </Container> - <Container class="javax.swing.JPanel" name="networkPanel"> - <Properties> - <Property name="name" type="java.lang.String" value="networkPanel" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription"> - <JTabbedPaneConstraints tabName="Network"> - <Property name="tabTitle" type="java.lang.String" resourceKey="networkPanel.TabConstraints.tabTitle"/> - </JTabbedPaneConstraints> - </Constraint> - </Constraints> - - <Layout> - <DimensionLayout dim="0"> - <Group type="103" groupAlignment="0" attributes="0"> - <EmptySpace min="0" pref="562" max="32767" attributes="0"/> - </Group> - </DimensionLayout> - <DimensionLayout dim="1"> - <Group type="103" groupAlignment="0" attributes="0"> - <EmptySpace min="0" pref="388" max="32767" attributes="0"/> - </Group> - </DimensionLayout> - </Layout> - </Container> - <Container class="javax.swing.JPanel" name="advancedPanel"> - <Properties> - <Property name="name" type="java.lang.String" value="advancedPanel" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription"> - <JTabbedPaneConstraints tabName="Advanced"> - <Property name="tabTitle" type="java.lang.String" resourceKey="advancedPanel.TabConstraints.tabTitle"/> - </JTabbedPaneConstraints> - </Constraint> - </Constraints> - - <Layout> - <DimensionLayout dim="0"> - <Group type="103" groupAlignment="0" attributes="0"> - <EmptySpace min="0" pref="562" max="32767" attributes="0"/> - </Group> - </DimensionLayout> - <DimensionLayout dim="1"> - <Group type="103" groupAlignment="0" attributes="0"> - <EmptySpace min="0" pref="388" max="32767" attributes="0"/> - </Group> - </DimensionLayout> - </Layout> - </Container> - </SubComponents> - </Container> - </SubComponents> -</Form> diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/GeneralConfiguration.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/GeneralConfiguration.java deleted file mode 100644 index 3e4a17fd21d33f3c4555e141c9e10544dc8aae9e..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/gui/GeneralConfiguration.java +++ /dev/null @@ -1,839 +0,0 @@ -/* - * GeneralConfiguration.java - * - * Created on 10 april 2009, 19:04 - */ - -package net.i2p.desktopgui.gui; - -import java.awt.Desktop; -import java.awt.event.ActionEvent; -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.logging.Level; -import java.util.logging.Logger; -import net.i2p.desktopgui.router.configuration.SpeedHelper; -import javax.swing.JComboBox; -import javax.swing.ButtonModel; -import javax.swing.JTextField; -import net.i2p.desktopgui.router.RouterHelper; -import net.i2p.desktopgui.router.configuration.SpeedHandler; -import net.i2p.desktopgui.router.configuration.UpdateHelper; -import net.i2p.router.web.NewsFetcher; -import net.i2p.desktopgui.router.configuration.UpdateHandler; -import java.util.Date; -import javax.swing.SwingWorker; -import net.i2p.i2ptunnel.web.IndexBean; -import javax.swing.table.DefaultTableModel; -import java.awt.event.ActionListener; - -/** - * - * @author mathias - */ -public class GeneralConfiguration extends javax.swing.JFrame { - - /** Creates new form GeneralConfiguration */ - public GeneralConfiguration() { - initComponents(); - extraInitComponents(); - this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); - this.setLocationRelativeTo(null); - this.requestFocus(); - this.setVisible(true); - } - - private void extraInitComponents() { - initSpeedTab(); - initUpdateTab(); - initTunnelTab(); - } - - private void initSpeedTab() { - try { - String inbound = SpeedHelper.getInboundBandwidth(); - String outbound = SpeedHelper.getOutboundBandwidth(); - - initSpeeds("" + Integer.parseInt(inbound)*8, "" + Integer.parseInt(outbound)*8); - initUsage("" + Integer.parseInt(inbound), "" + Integer.parseInt(outbound)); - } - catch(Exception e) { - e.printStackTrace(); - System.out.println("Exception noticed, probably running desktopgui in a debugger instead of along with I2P!?"); - initSpeeds("100", "100"); - initUsage("12", "12"); - } - } - - private void initUpdateTab() { - //Set update policy - String updatePolicy = UpdateHelper.getUpdatePolicy(); - if(updatePolicy.equals(UpdateHelper.NOTIFY_UPDATE_POLICY)) { - updateButtonGroup.setSelected(updateInform.getModel(), true); - } - else if(updatePolicy.equals(UpdateHelper.DOWNLOAD_UPDATE_POLICY)) { - updateButtonGroup.setSelected(updateDownload.getModel(), true); - } - else if(updatePolicy.equals(UpdateHelper.INSTALL_UPDATE_POLICY)) { - updateButtonGroup.setSelected(updateDownloadRestart.getModel(), true); - } - else { - System.out.println("desktopgui: no updates for you!"); - } - - //Check if an update is available - //TODO: move this method out of the routerconsole so desktopgui doesn't depend on routerconsole!!! - if(NewsFetcher.getInstance(RouterHelper.getContext()).updateAvailable()) { - updateNow.setVisible(true); - } - else { - updateNow.setVisible(false); - } - } - - private void initTunnelTab() { - while(((DefaultTableModel) clientTable.getModel()).getRowCount() > 0) { - ((DefaultTableModel) clientTable.getModel()).removeRow(0); - } - while(((DefaultTableModel) serverTable.getModel()).getRowCount() > 0) { - ((DefaultTableModel) serverTable.getModel()).removeRow(0); - } - IndexBean bean = new IndexBean(); - for(int i=0; i<bean.getTunnelCount(); i++) { - if(bean.isClient(i)) { - Object[] row = {bean.getTunnelName(i), bean.getTunnelType(i), - bean.getClientInterface(i) + ":" + bean.getClientPort(i), - getTunnelStatus(bean.getTunnelStatus(i))}; - ((DefaultTableModel) clientTable.getModel()).addRow(row); - } - else { - Object[] row = {bean.getTunnelName(i), - bean.getServerTarget(i), - getTunnelStatus(bean.getTunnelStatus(i))}; - ((DefaultTableModel) serverTable.getModel()).addRow(row); - } - } - } - - public String getTunnelStatus(int status) { - if(status == IndexBean.NOT_RUNNING) { - return "Not running"; - } - else if(status == IndexBean.RUNNING) { - return "Running"; - } - else if(status == IndexBean.STANDBY) { - return "Standby"; - } - else if(status == IndexBean.STARTING) { - return "Starting"; - } - else { - return "Error: status not found"; - } - } - - /** This method is called from within the constructor to - * initialize the form. - * WARNING: Do NOT modify this code. The content of this method is - * always regenerated by the Form Editor. - */ - @SuppressWarnings("unchecked") - // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents - private void initComponents() { - - updateButtonGroup = new javax.swing.ButtonGroup(); - applyPanel = new javax.swing.JPanel(); - cancel = new javax.swing.JToggleButton(); - ok = new javax.swing.JToggleButton(); - settingsPanel = new javax.swing.JTabbedPane(); - speedPanel = new javax.swing.JPanel(); - uploadSpeedLabel = new javax.swing.JLabel(); - downloadSpeedLabel = new javax.swing.JLabel(); - uploadspeed = new javax.swing.JTextField(); - downloadspeed = new javax.swing.JTextField(); - uploadkbps = new javax.swing.JComboBox(); - downloadkbps = new javax.swing.JComboBox(); - uploadUsageLabel = new javax.swing.JLabel(); - downloadUsageLabel = new javax.swing.JLabel(); - uploadgb = new javax.swing.JTextField(); - downloadgb = new javax.swing.JTextField(); - gbUploadLabel = new javax.swing.JLabel(); - gbDownloadLabel = new javax.swing.JLabel(); - uploadDownloadExplanation = new javax.swing.JLabel(); - updatesPanel = new javax.swing.JPanel(); - updateMethod = new javax.swing.JLabel(); - updateInform = new javax.swing.JRadioButton(); - updateDownload = new javax.swing.JRadioButton(); - updateDownloadRestart = new javax.swing.JRadioButton(); - checkUpdates = new javax.swing.JToggleButton(); - updateNow = new javax.swing.JToggleButton(); - advancedUpdateConfig = new javax.swing.JToggleButton(); - tunnelPanel = new javax.swing.JPanel(); - clientFrame = new javax.swing.JScrollPane(); - clientTable = new javax.swing.JTable(); - serverFrame = new javax.swing.JScrollPane(); - serverTable = new javax.swing.JTable(); - tunnelsExplanation = new javax.swing.JLabel(); - clientTunnelLabel = new javax.swing.JLabel(); - serverTunnelLabel = new javax.swing.JLabel(); - networkPanel = new javax.swing.JPanel(); - advancedPanel = new javax.swing.JPanel(); - - setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); - org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(net.i2p.desktopgui.desktopgui.Main.class).getContext().getResourceMap(GeneralConfiguration.class); - setTitle(resourceMap.getString("Form.title")); // NOI18N - setName("Form"); // NOI18N - - applyPanel.setName("applyPanel"); // NOI18N - - cancel.setText(resourceMap.getString("cancel.text")); // NOI18N - cancel.setName("cancel"); // NOI18N - cancel.addMouseListener(new java.awt.event.MouseAdapter() { - public void mouseClicked(java.awt.event.MouseEvent evt) { - cancelMouseClicked(evt); - } - }); - - ok.setText(resourceMap.getString("ok.text")); // NOI18N - ok.setName("ok"); // NOI18N - ok.addMouseListener(new java.awt.event.MouseAdapter() { - public void mouseClicked(java.awt.event.MouseEvent evt) { - okMouseClicked(evt); - } - }); - - javax.swing.GroupLayout applyPanelLayout = new javax.swing.GroupLayout(applyPanel); - applyPanel.setLayout(applyPanelLayout); - applyPanelLayout.setHorizontalGroup( - applyPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, applyPanelLayout.createSequentialGroup() - .addContainerGap(475, Short.MAX_VALUE) - .addComponent(ok) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(cancel) - .addContainerGap()) - ); - applyPanelLayout.setVerticalGroup( - applyPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(applyPanelLayout.createSequentialGroup() - .addGroup(applyPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(cancel) - .addComponent(ok)) - .addContainerGap(14, Short.MAX_VALUE)) - ); - - settingsPanel.setName("settingsPanel"); // NOI18N - - speedPanel.setName("speedPanel"); // NOI18N - speedPanel.setLayout(null); - - uploadSpeedLabel.setText(resourceMap.getString("uploadSpeedLabel.text")); // NOI18N - uploadSpeedLabel.setName("uploadSpeedLabel"); // NOI18N - speedPanel.add(uploadSpeedLabel); - uploadSpeedLabel.setBounds(20, 20, 140, 30); - - downloadSpeedLabel.setText(resourceMap.getString("downloadSpeedLabel.text")); // NOI18N - downloadSpeedLabel.setName("downloadSpeedLabel"); // NOI18N - speedPanel.add(downloadSpeedLabel); - downloadSpeedLabel.setBounds(20, 60, 140, 30); - - uploadspeed.setText(resourceMap.getString("uploadspeed.text")); // NOI18N - uploadspeed.setName("uploadspeed"); // NOI18N - uploadspeed.addKeyListener(new java.awt.event.KeyAdapter() { - public void keyReleased(java.awt.event.KeyEvent evt) { - speedKeyReleased(evt); - } - }); - speedPanel.add(uploadspeed); - uploadspeed.setBounds(160, 20, 77, 27); - - downloadspeed.setText(resourceMap.getString("downloadspeed.text")); // NOI18N - downloadspeed.setName("downloadspeed"); // NOI18N - downloadspeed.addKeyListener(new java.awt.event.KeyAdapter() { - public void keyReleased(java.awt.event.KeyEvent evt) { - speedKeyReleased(evt); - } - }); - speedPanel.add(downloadspeed); - downloadspeed.setBounds(160, 60, 77, 27); - - uploadkbps.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "kbps", "kBps" })); - uploadkbps.setName("uploadkbps"); // NOI18N - uploadkbps.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - uploadkbpsActionPerformed(evt); - } - }); - speedPanel.add(uploadkbps); - uploadkbps.setBounds(240, 20, 68, 27); - - downloadkbps.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "kbps", "kBps" })); - downloadkbps.setName("downloadkbps"); // NOI18N - downloadkbps.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - downloadkbpsActionPerformed(evt); - } - }); - speedPanel.add(downloadkbps); - downloadkbps.setBounds(240, 60, 68, 27); - - uploadUsageLabel.setText(resourceMap.getString("uploadUsageLabel.text")); // NOI18N - uploadUsageLabel.setName("uploadUsageLabel"); // NOI18N - speedPanel.add(uploadUsageLabel); - uploadUsageLabel.setBounds(330, 20, 97, 30); - - downloadUsageLabel.setText(resourceMap.getString("downloadUsageLabel.text")); // NOI18N - downloadUsageLabel.setName("downloadUsageLabel"); // NOI18N - speedPanel.add(downloadUsageLabel); - downloadUsageLabel.setBounds(330, 60, 97, 30); - - uploadgb.setText(resourceMap.getString("uploadgb.text")); // NOI18N - uploadgb.setName("uploadgb"); // NOI18N - uploadgb.addKeyListener(new java.awt.event.KeyAdapter() { - public void keyReleased(java.awt.event.KeyEvent evt) { - monthKeyReleased(evt); - } - }); - speedPanel.add(uploadgb); - uploadgb.setBounds(440, 20, 60, 27); - - downloadgb.setText(resourceMap.getString("downloadgb.text")); // NOI18N - downloadgb.setName("downloadgb"); // NOI18N - downloadgb.addKeyListener(new java.awt.event.KeyAdapter() { - public void keyReleased(java.awt.event.KeyEvent evt) { - monthKeyReleased(evt); - } - }); - speedPanel.add(downloadgb); - downloadgb.setBounds(440, 60, 60, 27); - - gbUploadLabel.setText(resourceMap.getString("gbUploadLabel.text")); // NOI18N - gbUploadLabel.setName("gbUploadLabel"); // NOI18N - speedPanel.add(gbUploadLabel); - gbUploadLabel.setBounds(510, 20, 19, 30); - - gbDownloadLabel.setText(resourceMap.getString("gbDownloadLabel.text")); // NOI18N - gbDownloadLabel.setName("gbDownloadLabel"); // NOI18N - speedPanel.add(gbDownloadLabel); - gbDownloadLabel.setBounds(510, 60, 19, 30); - - uploadDownloadExplanation.setText(resourceMap.getString("uploadDownloadExplanation.text")); // NOI18N - uploadDownloadExplanation.setName("uploadDownloadExplanation"); // NOI18N - speedPanel.add(uploadDownloadExplanation); - uploadDownloadExplanation.setBounds(20, 100, 520, 70); - - settingsPanel.addTab(resourceMap.getString("speedPanel.TabConstraints.tabTitle"), speedPanel); // NOI18N - - updatesPanel.setName("updatesPanel"); // NOI18N - - updateMethod.setText(resourceMap.getString("updateMethod.text")); // NOI18N - updateMethod.setName("updateMethod"); // NOI18N - - updateButtonGroup.add(updateInform); - updateInform.setText(resourceMap.getString("updateInform.text")); // NOI18N - updateInform.setName("updateInform"); // NOI18N - - updateButtonGroup.add(updateDownload); - updateDownload.setText(resourceMap.getString("updateDownload.text")); // NOI18N - updateDownload.setName("updateDownload"); // NOI18N - - updateButtonGroup.add(updateDownloadRestart); - updateDownloadRestart.setText(resourceMap.getString("updateDownloadRestart.text")); // NOI18N - updateDownloadRestart.setName("updateDownloadRestart"); // NOI18N - - checkUpdates.setText(resourceMap.getString("checkUpdates.text")); // NOI18N - checkUpdates.setName("checkUpdates"); // NOI18N - checkUpdates.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - checkUpdatesActionPerformed(evt); - } - }); - - updateNow.setText(resourceMap.getString("updateNow.text")); // NOI18N - updateNow.setName("updateNow"); // NOI18N - updateNow.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - updateNowActionPerformed(evt); - } - }); - - advancedUpdateConfig.setText(resourceMap.getString("advancedUpdateConfig.text")); // NOI18N - advancedUpdateConfig.setName("advancedUpdateConfig"); // NOI18N - advancedUpdateConfig.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - advancedUpdateConfigActionPerformed(evt); - } - }); - - javax.swing.GroupLayout updatesPanelLayout = new javax.swing.GroupLayout(updatesPanel); - updatesPanel.setLayout(updatesPanelLayout); - updatesPanelLayout.setHorizontalGroup( - updatesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(updatesPanelLayout.createSequentialGroup() - .addGroup(updatesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(updatesPanelLayout.createSequentialGroup() - .addGap(20, 20, 20) - .addGroup(updatesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(updateMethod) - .addGroup(updatesPanelLayout.createSequentialGroup() - .addComponent(checkUpdates) - .addGap(18, 18, 18) - .addComponent(updateNow)))) - .addGroup(updatesPanelLayout.createSequentialGroup() - .addGap(40, 40, 40) - .addGroup(updatesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) - .addComponent(updateInform, javax.swing.GroupLayout.DEFAULT_SIZE, 377, Short.MAX_VALUE) - .addComponent(updateDownload, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(updateDownloadRestart, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))) - .addContainerGap()) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, updatesPanelLayout.createSequentialGroup() - .addContainerGap(339, Short.MAX_VALUE) - .addComponent(advancedUpdateConfig) - .addContainerGap()) - ); - updatesPanelLayout.setVerticalGroup( - updatesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(updatesPanelLayout.createSequentialGroup() - .addContainerGap() - .addComponent(updateMethod) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addComponent(updateInform) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(updateDownload) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(updateDownloadRestart) - .addGap(18, 18, 18) - .addGroup(updatesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(checkUpdates) - .addComponent(updateNow)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 181, Short.MAX_VALUE) - .addComponent(advancedUpdateConfig) - .addContainerGap()) - ); - - settingsPanel.addTab(resourceMap.getString("updatesPanel.TabConstraints.tabTitle"), updatesPanel); // NOI18N - - tunnelPanel.setName("tunnelPanel"); // NOI18N - - clientFrame.setName("clientFrame"); // NOI18N - - clientTable.setModel(new javax.swing.table.DefaultTableModel( - new Object [][] { - - }, - new String [] { - "Name", "Type", "Address", "Status" - } - )); - clientTable.setName("clientTable"); // NOI18N - clientTable.addMouseListener(new java.awt.event.MouseAdapter() { - public void mouseClicked(java.awt.event.MouseEvent evt) { - clientTableMouseClicked(evt); - } - }); - clientFrame.setViewportView(clientTable); - clientTable.getColumnModel().getColumn(0).setHeaderValue(resourceMap.getString("clientTable.columnModel.title0")); // NOI18N - clientTable.getColumnModel().getColumn(1).setHeaderValue(resourceMap.getString("clientTable.columnModel.title1")); // NOI18N - clientTable.getColumnModel().getColumn(2).setHeaderValue(resourceMap.getString("clientTable.columnModel.title2")); // NOI18N - clientTable.getColumnModel().getColumn(3).setHeaderValue(resourceMap.getString("clientTable.columnModel.title3")); // NOI18N - - serverFrame.setName("serverFrame"); // NOI18N - - serverTable.setModel(new javax.swing.table.DefaultTableModel( - new Object [][] { - {null, null, null}, - {null, null, null}, - {null, null, null}, - {null, null, null} - }, - new String [] { - "Name", "Address", "Status" - } - )); - serverTable.setName("serverTable"); // NOI18N - serverTable.addMouseListener(new java.awt.event.MouseAdapter() { - public void mouseClicked(java.awt.event.MouseEvent evt) { - serverTableMouseClicked(evt); - } - }); - serverFrame.setViewportView(serverTable); - serverTable.getColumnModel().getColumn(0).setHeaderValue(resourceMap.getString("serverTable.columnModel.title0")); // NOI18N - serverTable.getColumnModel().getColumn(1).setHeaderValue(resourceMap.getString("serverTable.columnModel.title1")); // NOI18N - serverTable.getColumnModel().getColumn(2).setHeaderValue(resourceMap.getString("serverTable.columnModel.title2")); // NOI18N - - tunnelsExplanation.setText(resourceMap.getString("tunnelsExplanation.text")); // NOI18N - tunnelsExplanation.setName("tunnelsExplanation"); // NOI18N - - clientTunnelLabel.setText(resourceMap.getString("clientTunnelLabel.text")); // NOI18N - clientTunnelLabel.setName("clientTunnelLabel"); // NOI18N - - serverTunnelLabel.setText(resourceMap.getString("serverTunnelLabel.text")); // NOI18N - serverTunnelLabel.setName("serverTunnelLabel"); // NOI18N - - javax.swing.GroupLayout tunnelPanelLayout = new javax.swing.GroupLayout(tunnelPanel); - tunnelPanel.setLayout(tunnelPanelLayout); - tunnelPanelLayout.setHorizontalGroup( - tunnelPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, tunnelPanelLayout.createSequentialGroup() - .addContainerGap() - .addGroup(tunnelPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(tunnelsExplanation, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 538, Short.MAX_VALUE) - .addComponent(serverFrame, javax.swing.GroupLayout.DEFAULT_SIZE, 538, Short.MAX_VALUE) - .addComponent(clientTunnelLabel, javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(clientFrame, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 538, Short.MAX_VALUE) - .addComponent(serverTunnelLabel, javax.swing.GroupLayout.Alignment.LEADING)) - .addContainerGap()) - ); - tunnelPanelLayout.setVerticalGroup( - tunnelPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(tunnelPanelLayout.createSequentialGroup() - .addContainerGap() - .addComponent(clientTunnelLabel) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(clientFrame, javax.swing.GroupLayout.DEFAULT_SIZE, 119, Short.MAX_VALUE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(serverTunnelLabel) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(serverFrame, javax.swing.GroupLayout.DEFAULT_SIZE, 122, Short.MAX_VALUE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(tunnelsExplanation, javax.swing.GroupLayout.PREFERRED_SIZE, 45, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(32, 32, 32)) - ); - - settingsPanel.addTab(resourceMap.getString("tunnelPanel.TabConstraints.tabTitle"), tunnelPanel); // NOI18N - - networkPanel.setName("networkPanel"); // NOI18N - - javax.swing.GroupLayout networkPanelLayout = new javax.swing.GroupLayout(networkPanel); - networkPanel.setLayout(networkPanelLayout); - networkPanelLayout.setHorizontalGroup( - networkPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 562, Short.MAX_VALUE) - ); - networkPanelLayout.setVerticalGroup( - networkPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 388, Short.MAX_VALUE) - ); - - settingsPanel.addTab(resourceMap.getString("networkPanel.TabConstraints.tabTitle"), networkPanel); // NOI18N - - advancedPanel.setName("advancedPanel"); // NOI18N - - javax.swing.GroupLayout advancedPanelLayout = new javax.swing.GroupLayout(advancedPanel); - advancedPanel.setLayout(advancedPanelLayout); - advancedPanelLayout.setHorizontalGroup( - advancedPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 562, Short.MAX_VALUE) - ); - advancedPanelLayout.setVerticalGroup( - advancedPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGap(0, 388, Short.MAX_VALUE) - ); - - settingsPanel.addTab(resourceMap.getString("advancedPanel.TabConstraints.tabTitle"), advancedPanel); // NOI18N - - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); - getContentPane().setLayout(layout); - layout.setHorizontalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(applyPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addGroup(layout.createSequentialGroup() - .addGap(12, 12, 12) - .addComponent(settingsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 566, Short.MAX_VALUE)) - ); - layout.setVerticalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() - .addComponent(settingsPanel) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(applyPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - ); - - pack(); - }// </editor-fold>//GEN-END:initComponents - - private void speedKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_speedKeyReleased - try { - String upload = ""; - if(uploadkbps.getSelectedIndex() == KILOBIT) - upload = "" + Integer.parseInt(uploadspeed.getText())/8; - else - upload = uploadspeed.getText(); - String download = ""; - if(downloadkbps.getSelectedIndex() == KILOBIT) - download = "" + Integer.parseInt(downloadspeed.getText())/8; - else - download = downloadspeed.getText(); - initUsage(upload, download); - } - catch(NumberFormatException e) { - e.printStackTrace(); - return; - } -}//GEN-LAST:event_speedKeyReleased - -private void uploadkbpsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_uploadkbpsActionPerformed - kbpsSwitchPerformed(uploadkbps, uploadspeed); -}//GEN-LAST:event_uploadkbpsActionPerformed - -private void downloadkbpsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_downloadkbpsActionPerformed - kbpsSwitchPerformed(downloadkbps, downloadspeed); -}//GEN-LAST:event_downloadkbpsActionPerformed - -private void monthKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_monthKeyReleased - try { - int uploadMonthValue = Integer.parseInt(uploadgb.getText()); - int downloadMonthValue = Integer.parseInt(downloadgb.getText()); - - String upload = ""; - String burstUpload = ""; - String download = ""; - String burstDownload = ""; - - if(uploadkbps.getSelectedIndex() == KILOBIT) - upload = "" + SpeedHelper.calculateSpeed(uploadMonthValue)*8; //kbit - else - upload = "" + SpeedHelper.calculateSpeed(uploadMonthValue); //kbyte - - if(downloadkbps.getSelectedIndex() == KILOBIT) - download = "" + SpeedHelper.calculateSpeed(downloadMonthValue)*8; //kbit - else - download = "" + SpeedHelper.calculateSpeed(downloadMonthValue); //kbyte - - initSpeeds(upload, download); - } - catch(NumberFormatException e) { - e.printStackTrace(); - return; - } -}//GEN-LAST:event_monthKeyReleased - -private void cancelMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_cancelMouseClicked - this.dispose(); -}//GEN-LAST:event_cancelMouseClicked - -private void okMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_okMouseClicked - saveSpeeds(); - saveUpdatePolicy(); - this.dispose(); -}//GEN-LAST:event_okMouseClicked - -private void checkUpdatesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkUpdatesActionPerformed - long current = new Date().getTime(); - if(current < newsLastFetched + 5*60*1000) { - return; - } - checkUpdates.setText("Checking for updates"); - checkUpdates.setEnabled(false); - newsLastFetched = current; - SwingWorker sw = new SwingWorker() { - - @Override - protected Object doInBackground() throws Exception { - NewsFetcher.getInstance(RouterHelper.getContext()).fetchNews(); - return null; - } - - @Override - protected void done() { - checkUpdates.setText("Check for updates now"); - checkUpdates.setEnabled(true); - if(NewsFetcher.getInstance(RouterHelper.getContext()).updateAvailable()) { - updateNow.setVisible(true); - } - } - - }; -}//GEN-LAST:event_checkUpdatesActionPerformed - -private void updateNowActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_updateNowActionPerformed - SwingWorker sw = new SwingWorker() { - - @Override - protected Object doInBackground() throws Exception { - new net.i2p.router.web.UpdateHandler().update(); - return null; - } - - }; - updateNow.setEnabled(false); - updateNow.setText("Updating..."); - checkUpdates.setEnabled(false); - -}//GEN-LAST:event_updateNowActionPerformed - -private void advancedUpdateConfigActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_advancedUpdateConfigActionPerformed - try { - Desktop.getDesktop().browse(new URI("http://127.0.0.1:7657/configupdate.jsp")); - } catch (URISyntaxException ex) { - Logger.getLogger(GeneralConfiguration.class.getName()).log(Level.SEVERE, null, ex); - } - catch (IOException ex) { - Logger.getLogger(GeneralConfiguration.class.getName()).log(Level.SEVERE, null, ex); - } -}//GEN-LAST:event_advancedUpdateConfigActionPerformed - -private void clientTableMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_clientTableMouseClicked - int row = clientTable.getSelectedRow(); - if(row == -1) { //No selected row - return; - } - else { - IndexBean bean = new IndexBean(); - /* - * TODO: This is not entirely good: if one adds/removes a tunnel without desktopgui, this number will be wrong - */ - int clientNumber = 0; - int i = 0; - for(clientNumber=0; clientNumber<bean.getTunnelCount(); clientNumber++) { - if(bean.isClient(clientNumber)) { - if(i == row) { - break; - } - i++; - } - } - new ClientTunnelWindow(clientNumber, new ActionListener() { - - @Override - public void actionPerformed(ActionEvent e) { - initTunnelTab(); - } - - }); - } -}//GEN-LAST:event_clientTableMouseClicked - -private void serverTableMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_serverTableMouseClicked - int row = serverTable.getSelectedRow(); - if(row == -1) { //No selected row - return; - } - else { - IndexBean bean = new IndexBean(); - /* - * TODO: This is not entirely good: if one adds/removes a tunnel without desktopgui, this number will be wrong - */ - int serverNumber = 0; - int i = 0; - for(serverNumber=0; serverNumber<bean.getTunnelCount(); serverNumber++) { - if(!bean.isClient(serverNumber)) { - if(i == row) { - break; - } - i++; - } - } - new ServerTunnelWindow(serverNumber, new ActionListener() { - - @Override - public void actionPerformed(ActionEvent e) { - initTunnelTab(); - } - - }); - } -}//GEN-LAST:event_serverTableMouseClicked - - protected void initUsage(String upload, String download) { - uploadgb.setText("" + SpeedHelper.calculateMonthlyUsage(Integer.parseInt(upload))); - downloadgb.setText("" + SpeedHelper.calculateMonthlyUsage(Integer.parseInt(download))); - } - - protected void initSpeeds(String upload, String download) { - uploadspeed.setText(upload); - downloadspeed.setText(download); - } - - private void kbpsSwitchPerformed(JComboBox kbps, JTextField speed) { - int index = kbps.getSelectedIndex(); - int previous = Integer.parseInt(speed.getText()); - if(index == KILOBIT) { - speed.setText("" + previous*8); - } - else { - speed.setText("" + previous/8); - } - } - - protected void saveSpeeds() { - int maxDownload = Integer.parseInt(downloadspeed.getText()); - int maxUpload = Integer.parseInt(uploadspeed.getText()); - if(uploadkbps.getSelectedIndex() == KILOBIT) { - SpeedHandler.setOutboundBandwidth(maxUpload/8); - SpeedHandler.setOutboundBurstBandwidth(maxUpload/8); - } - else { - SpeedHandler.setOutboundBandwidth(maxUpload); - SpeedHandler.setOutboundBurstBandwidth(maxUpload); - } - if(downloadkbps.getSelectedIndex() == KILOBIT) { - SpeedHandler.setInboundBandwidth(maxDownload/8); - SpeedHandler.setInboundBurstBandwidth(maxDownload/8); - } - else { - SpeedHandler.setInboundBandwidth(maxDownload); - SpeedHandler.setInboundBurstBandwidth(maxDownload); - } - } - - protected void saveUpdatePolicy() { - ButtonModel policyButton = updateButtonGroup.getSelection(); - if(policyButton.equals(updateInform.getModel())) { - UpdateHandler.setUpdatePolicy(UpdateHelper.NOTIFY_UPDATE_POLICY); - } - else if(policyButton.equals(updateDownload.getModel())) { - UpdateHandler.setUpdatePolicy(UpdateHelper.DOWNLOAD_UPDATE_POLICY); - } - else if(policyButton.equals(updateDownloadRestart.getModel())) { - UpdateHandler.setUpdatePolicy(UpdateHelper.INSTALL_UPDATE_POLICY); - } - } - - // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JPanel advancedPanel; - private javax.swing.JToggleButton advancedUpdateConfig; - private javax.swing.JPanel applyPanel; - private javax.swing.JToggleButton cancel; - private javax.swing.JToggleButton checkUpdates; - private javax.swing.JScrollPane clientFrame; - private javax.swing.JTable clientTable; - private javax.swing.JLabel clientTunnelLabel; - private javax.swing.JLabel downloadSpeedLabel; - private javax.swing.JLabel downloadUsageLabel; - private javax.swing.JTextField downloadgb; - private javax.swing.JComboBox downloadkbps; - private javax.swing.JTextField downloadspeed; - private javax.swing.JLabel gbDownloadLabel; - private javax.swing.JLabel gbUploadLabel; - private javax.swing.JPanel networkPanel; - private javax.swing.JToggleButton ok; - private javax.swing.JScrollPane serverFrame; - private javax.swing.JTable serverTable; - private javax.swing.JLabel serverTunnelLabel; - private javax.swing.JTabbedPane settingsPanel; - private javax.swing.JPanel speedPanel; - private javax.swing.JPanel tunnelPanel; - private javax.swing.JLabel tunnelsExplanation; - private javax.swing.ButtonGroup updateButtonGroup; - private javax.swing.JRadioButton updateDownload; - private javax.swing.JRadioButton updateDownloadRestart; - private javax.swing.JRadioButton updateInform; - private javax.swing.JLabel updateMethod; - private javax.swing.JToggleButton updateNow; - private javax.swing.JPanel updatesPanel; - private javax.swing.JLabel uploadDownloadExplanation; - private javax.swing.JLabel uploadSpeedLabel; - private javax.swing.JLabel uploadUsageLabel; - private javax.swing.JTextField uploadgb; - private javax.swing.JComboBox uploadkbps; - private javax.swing.JTextField uploadspeed; - // End of variables declaration//GEN-END:variables - - public static final int KILOBIT = 0; - public static final int KILOBYTE = 1; - - private long newsLastFetched = 0; -} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/JPopupTrayIcon.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/JPopupTrayIcon.java deleted file mode 100644 index 1f62df2c27099c0863608ec181204dbe1d3473d2..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/gui/JPopupTrayIcon.java +++ /dev/null @@ -1,185 +0,0 @@ -/* -* Created on Sep 15, 2008 5:51:33 PM -*/ - -/* - * This class is part of fishfarm project: https://fishfarm.dev.java.net/ - * It is licensed under the GPL version 2.0 with Classpath Exception. - * - * Copyright (C) 2008 Michael Bien - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -package net.i2p.desktopgui.gui; - -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.GraphicsEnvironment; -import java.awt.Image; -import java.awt.Point; -import java.awt.PopupMenu; -import java.awt.TrayIcon; -import java.awt.Window; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import javax.swing.JDialog; -import javax.swing.JPopupMenu; -import javax.swing.JWindow; -import javax.swing.RootPaneContainer; -import javax.swing.event.PopupMenuEvent; -import javax.swing.event.PopupMenuListener; -import java.util.Date; - - - -/** - * JPopupMenu compatible TrayIcon based on Alexander Potochkin's JXTrayIcon - * (http://weblogs.java.net/blog/alexfromsun/archive/2008/02/jtrayicon_updat.html) - * but uses a JWindow instead of a JDialog to workaround some bugs on linux. - * - * @author Michael Bien - */ -public class JPopupTrayIcon extends TrayIcon { - - private JPopupMenu menu; - - private Window window; - private PopupMenuListener popupListener; - - private final static boolean IS_WINDOWS = System.getProperty("os.name").toLowerCase().contains("windows"); - - private static MouseEvent previous = null; - private static Date previousTime = new Date(); - private static Date time = new Date(); - - public JPopupTrayIcon(Image image) { - super(image); - init(); - } - - public JPopupTrayIcon(Image image, String tooltip) { - super(image, tooltip); - init(); - } - - public JPopupTrayIcon(Image image, String tooltip, PopupMenu popup) { - super(image, tooltip, popup); - init(); - } - - public JPopupTrayIcon(Image image, String tooltip, JPopupMenu popup) { - super(image, tooltip); - init(); - setJPopupMenu(popup); - } - - - private final void init() { - - - popupListener = new PopupMenuListener() { - - @Override - public void popupMenuWillBecomeVisible(PopupMenuEvent e) { - //System.out.println("popupMenuWillBecomeVisible"); - } - - @Override - public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { - //System.out.println("popupMenuWillBecomeInvisible"); - if(window != null) { - window.dispose(); - window = null; - } - } - - @Override - public void popupMenuCanceled(PopupMenuEvent e) { -// System.out.println("popupMenuCanceled"); - if(window != null) { - window.dispose(); - window = null; - } - } - }; - - addMouseListener(new MouseAdapter() { - @Override - public void mousePressed(MouseEvent e) { - //System.out.println("Pressed " + e.getPoint()); - showJPopupMenu(e, previous); - previous = e; - previousTime = time; - time = new Date(); - } - - @Override - public void mouseReleased(MouseEvent e) { - //System.out.println("Released " + e.getPoint()); - showJPopupMenu(e, previous); - previous = e; - previousTime = time; - time = new Date(); - } - }); - - } - - private final void showJPopupMenu(MouseEvent e, MouseEvent previous) { - if((e.isPopupTrigger() || previous.isPopupTrigger()) && (time.getTime() - previousTime.getTime() < 1000) && menu != null) { - if (window == null) { - - if(IS_WINDOWS) { - window = new JDialog((Frame)null); - ((JDialog)window).setUndecorated(true); - }else{ - window = new JWindow((Frame)null); - } - window.setAlwaysOnTop(true); - Dimension size = menu.getPreferredSize(); - - Point centerPoint = GraphicsEnvironment.getLocalGraphicsEnvironment().getCenterPoint(); - if(e.getY() > centerPoint.getY()) - window.setLocation(e.getX(), e.getY() - size.height); - else - window.setLocation(e.getX(), e.getY()); - - window.setVisible(true); - - menu.show(((RootPaneContainer)window).getContentPane(), 0, 0); - - // popup works only for focused windows - window.toFront(); - - } - } - } - - - public final JPopupMenu getJPopupMenu() { - return menu; - } - - public final void setJPopupMenu(JPopupMenu menu) { - if (this.menu != null) { - this.menu.removePopupMenuListener(popupListener); - } - this.menu = menu; - menu.addPopupMenuListener(popupListener); - } - -} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/LogViewer.form b/apps/desktopgui/src/net/i2p/desktopgui/gui/LogViewer.form deleted file mode 100644 index ed2441319e9e731b289d75c220c71dbf87c906db..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/gui/LogViewer.form +++ /dev/null @@ -1,103 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> - -<Form version="1.5" maxVersion="1.6" type="org.netbeans.modules.form.forminfo.JFrameFormInfo"> - <Properties> - <Property name="defaultCloseOperation" type="int" value="3"/> - <Property name="title" type="java.lang.String" resourceKey="Form.title"/> - <Property name="name" type="java.lang.String" value="Form" noResource="true"/> - </Properties> - <SyntheticProperties> - <SyntheticProperty name="formSizePolicy" type="int" value="1"/> - </SyntheticProperties> - <AuxValues> - <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/> - <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/> - <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/> - <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/> - <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/> - <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/> - <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/> - <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/> - <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/> - </AuxValues> - - <Layout> - <DimensionLayout dim="0"> - <Group type="103" groupAlignment="0" attributes="0"> - <Group type="102" alignment="0" attributes="0"> - <EmptySpace min="12" pref="12" max="12" attributes="0"/> - <Component id="explanationText" min="-2" pref="561" max="-2" attributes="0"/> - <EmptySpace max="-2" attributes="0"/> - </Group> - <Component id="textScroll" alignment="1" pref="722" max="32767" attributes="0"/> - <Group type="102" alignment="0" attributes="0"> - <EmptySpace max="-2" attributes="0"/> - <Component id="refreshButton" min="-2" max="-2" attributes="0"/> - <EmptySpace type="separate" max="-2" attributes="0"/> - <Component id="clearButton" min="-2" max="-2" attributes="0"/> - <EmptySpace pref="587" max="32767" attributes="0"/> - </Group> - </Group> - </DimensionLayout> - <DimensionLayout dim="1"> - <Group type="103" groupAlignment="0" attributes="0"> - <Group type="102" alignment="0" attributes="0"> - <EmptySpace min="-2" max="-2" attributes="0"/> - <Component id="explanationText" min="-2" pref="45" max="-2" attributes="0"/> - <EmptySpace type="unrelated" max="-2" attributes="0"/> - <Group type="103" groupAlignment="3" attributes="0"> - <Component id="refreshButton" alignment="3" min="-2" max="-2" attributes="0"/> - <Component id="clearButton" alignment="3" min="-2" max="-2" attributes="0"/> - </Group> - <EmptySpace min="-2" pref="14" max="-2" attributes="0"/> - <Component id="textScroll" pref="330" max="32767" attributes="0"/> - </Group> - </Group> - </DimensionLayout> - </Layout> - <SubComponents> - <Container class="javax.swing.JScrollPane" name="textScroll"> - <Properties> - <Property name="name" type="java.lang.String" value="textScroll" noResource="true"/> - </Properties> - <AuxValues> - <AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/> - </AuxValues> - - <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/> - <SubComponents> - <Component class="javax.swing.JTextArea" name="logText"> - <Properties> - <Property name="columns" type="int" value="20"/> - <Property name="rows" type="int" value="5"/> - <Property name="name" type="java.lang.String" value="logText" noResource="true"/> - </Properties> - </Component> - </SubComponents> - </Container> - <Component class="javax.swing.JLabel" name="explanationText"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="explanationText.text"/> - <Property name="name" type="java.lang.String" value="explanationText" noResource="true"/> - </Properties> - </Component> - <Component class="javax.swing.JButton" name="refreshButton"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="refreshButton.text"/> - <Property name="name" type="java.lang.String" value="refreshButton" noResource="true"/> - </Properties> - <Events> - <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="refreshButtonActionPerformed"/> - </Events> - </Component> - <Component class="javax.swing.JButton" name="clearButton"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="clearButton.text"/> - <Property name="name" type="java.lang.String" value="clearButton" noResource="true"/> - </Properties> - <Events> - <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="clearButtonActionPerformed"/> - </Events> - </Component> - </SubComponents> -</Form> diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/LogViewer.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/LogViewer.java deleted file mode 100644 index 1edf85b3bf0d169647fceacd52a33e671f90d025..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/gui/LogViewer.java +++ /dev/null @@ -1,164 +0,0 @@ -/* - * LogViewer.java - * - * Created on 10 april 2009, 19:17 - */ - -package net.i2p.desktopgui.gui; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.util.logging.Level; -import java.util.logging.Logger; -import javax.swing.WindowConstants; - -/** - * - * @author mathias - */ -public class LogViewer extends javax.swing.JFrame { - - /** Creates new form LogViewer */ - public LogViewer() { - initComponents(); - readLogText(); - this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); - this.setVisible(true); - } - - private void readLogText() { - Thread t = new Thread(new Runnable() { - - @Override - public void run() { - String s = ""; - File f = new File(LOGLOCATION); - if(f.exists()) { - try { - BufferedReader br = new BufferedReader(new FileReader(f)); - while(true) { - String line = br.readLine(); - if(line != null) - s += JTEXTNEWLINE + line; - else - break; - } - } - catch(Exception e) { - s = "An error has occurred while loading the logfiles:" + JTEXTNEWLINE + e.getMessage(); - } - } - logText.setText(s); - } - - }); - t.start(); - } - - /** This method is called from within the constructor to - * initialize the form. - * WARNING: Do NOT modify this code. The content of this method is - * always regenerated by the Form Editor. - */ - @SuppressWarnings("unchecked") - // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents - private void initComponents() { - - textScroll = new javax.swing.JScrollPane(); - logText = new javax.swing.JTextArea(); - explanationText = new javax.swing.JLabel(); - refreshButton = new javax.swing.JButton(); - clearButton = new javax.swing.JButton(); - - setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); - org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(net.i2p.desktopgui.desktopgui.Main.class).getContext().getResourceMap(LogViewer.class); - setTitle(resourceMap.getString("Form.title")); // NOI18N - setName("Form"); // NOI18N - - textScroll.setName("textScroll"); // NOI18N - - logText.setColumns(20); - logText.setRows(5); - logText.setName("logText"); // NOI18N - textScroll.setViewportView(logText); - - explanationText.setText(resourceMap.getString("explanationText.text")); // NOI18N - explanationText.setName("explanationText"); // NOI18N - - refreshButton.setText(resourceMap.getString("refreshButton.text")); // NOI18N - refreshButton.setName("refreshButton"); // NOI18N - refreshButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - refreshButtonActionPerformed(evt); - } - }); - - clearButton.setText(resourceMap.getString("clearButton.text")); // NOI18N - clearButton.setName("clearButton"); // NOI18N - clearButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - clearButtonActionPerformed(evt); - } - }); - - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); - getContentPane().setLayout(layout); - layout.setHorizontalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addGap(12, 12, 12) - .addComponent(explanationText, javax.swing.GroupLayout.PREFERRED_SIZE, 561, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap()) - .addComponent(textScroll, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 722, Short.MAX_VALUE) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addComponent(refreshButton) - .addGap(18, 18, 18) - .addComponent(clearButton) - .addContainerGap(587, Short.MAX_VALUE)) - ); - layout.setVerticalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addComponent(explanationText, javax.swing.GroupLayout.PREFERRED_SIZE, 45, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(refreshButton) - .addComponent(clearButton)) - .addGap(14, 14, 14) - .addComponent(textScroll, javax.swing.GroupLayout.DEFAULT_SIZE, 330, Short.MAX_VALUE)) - ); - - pack(); - }// </editor-fold>//GEN-END:initComponents - -private void clearButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_clearButtonActionPerformed - File f = new File(LOGLOCATION); - f.delete(); - try { - f.createNewFile();//GEN-LAST:event_clearButtonActionPerformed - } catch (IOException ex) { - Logger.getLogger(LogViewer.class.getName()).log(Level.SEVERE, null, ex); - } - readLogText(); -} - -private void refreshButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_refreshButtonActionPerformed - readLogText(); -}//GEN-LAST:event_refreshButtonActionPerformed - - - // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JButton clearButton; - private javax.swing.JLabel explanationText; - private javax.swing.JTextArea logText; - private javax.swing.JButton refreshButton; - private javax.swing.JScrollPane textScroll; - // End of variables declaration//GEN-END:variables - - private static final String LOGLOCATION = "wrapper.log"; - private static final String JTEXTNEWLINE = "\n"; -} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/ServerTunnelWindow.form b/apps/desktopgui/src/net/i2p/desktopgui/gui/ServerTunnelWindow.form deleted file mode 100644 index 303f49a7f68b67995621c760150d1a2e77235564..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/gui/ServerTunnelWindow.form +++ /dev/null @@ -1,40 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> - -<Form version="1.5" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JFrameFormInfo"> - <Properties> - <Property name="defaultCloseOperation" type="int" value="3"/> - <Property name="name" type="java.lang.String" value="Form" noResource="true"/> - </Properties> - <SyntheticProperties> - <SyntheticProperty name="formSizePolicy" type="int" value="1"/> - </SyntheticProperties> - <AuxValues> - <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/> - <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/> - <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/> - <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/> - <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/> - <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/> - <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/> - <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/> - <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/> - <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/> - </AuxValues> - - <Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout"> - <Property name="useNullLayout" type="boolean" value="true"/> - </Layout> - <SubComponents> - <Component class="javax.swing.JLabel" name="jLabel1"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="jLabel1.text"/> - <Property name="name" type="java.lang.String" value="jLabel1" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="10" y="10" width="-1" height="-1"/> - </Constraint> - </Constraints> - </Component> - </SubComponents> -</Form> diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/ServerTunnelWindow.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/ServerTunnelWindow.java deleted file mode 100644 index 76521014869bf37649706565488696e5f2a0d129..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/gui/ServerTunnelWindow.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ - -/* - * ServerTunnelWindow.java - * - * Created on 11-jun-2009, 14:55:53 - */ - -package net.i2p.desktopgui.gui; - -import java.awt.event.ActionListener; - -/** - * - * @author mathias - */ -public class ServerTunnelWindow extends javax.swing.JFrame { - - /** Creates new form ServerTunnelWindow */ - public ServerTunnelWindow(int tunnelNumber, ActionListener al) { - initComponents(); - this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); - this.setSize(600, 600); - this.setLocationRelativeTo(null); - this.requestFocus(); - this.setVisible(true); - } - - /** This method is called from within the constructor to - * initialize the form. - * WARNING: Do NOT modify this code. The content of this method is - * always regenerated by the Form Editor. - */ - @SuppressWarnings("unchecked") - // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents - private void initComponents() { - - jLabel1 = new javax.swing.JLabel(); - - setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); - setName("Form"); // NOI18N - getContentPane().setLayout(null); - - org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(net.i2p.desktopgui.desktopgui.Main.class).getContext().getResourceMap(ServerTunnelWindow.class); - jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N - jLabel1.setName("jLabel1"); // NOI18N - getContentPane().add(jLabel1); - jLabel1.setBounds(10, 10, 43, 17); - - pack(); - }// </editor-fold>//GEN-END:initComponents - - // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JLabel jLabel1; - // End of variables declaration//GEN-END:variables - -} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector.form b/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector.form deleted file mode 100644 index 5ee7b94ac85c39d02589ebb8741493ec98026232..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector.form +++ /dev/null @@ -1,179 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> - -<Form version="1.5" maxVersion="1.6" type="org.netbeans.modules.form.forminfo.JFrameFormInfo"> - <Properties> - <Property name="defaultCloseOperation" type="int" value="2"/> - <Property name="title" type="java.lang.String" resourceKey="Form.title"/> - <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> - <Dimension value="[610, 330]"/> - </Property> - <Property name="name" type="java.lang.String" value="Form" noResource="true"/> - <Property name="resizable" type="boolean" value="false"/> - </Properties> - <SyntheticProperties> - <SyntheticProperty name="formSizePolicy" type="int" value="1"/> - </SyntheticProperties> - <AuxValues> - <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/> - <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/> - <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/> - <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/> - <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/> - <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/> - <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/> - <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/> - <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/> - <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,56,0,0,2,102"/> - </AuxValues> - - <Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout"> - <Property name="useNullLayout" type="boolean" value="true"/> - </Layout> - <SubComponents> - <Component class="javax.swing.JButton" name="nextButton"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="nextButton.text"/> - <Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> - <Dimension value="[72, 29]"/> - </Property> - <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> - <Dimension value="[72, 29]"/> - </Property> - <Property name="name" type="java.lang.String" value="nextButton" noResource="true"/> - </Properties> - <Events> - <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="nextButtonMouseClicked"/> - </Events> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="440" y="250" width="90" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JLabel" name="uploadLabel"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="uploadLabel.text"/> - <Property name="name" type="java.lang.String" value="uploadLabel" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="20" y="60" width="-1" height="30"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JLabel" name="downloadLabel"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="downloadLabel.text"/> - <Property name="name" type="java.lang.String" value="downloadLabel" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="20" y="110" width="-1" height="30"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JComboBox" name="uploadChoice"> - <Properties> - <Property name="editable" type="boolean" value="true"/> - <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor"> - <StringArray count="11"> - <StringItem index="0" value="100"/> - <StringItem index="1" value="200"/> - <StringItem index="2" value="500"/> - <StringItem index="3" value="1000"/> - <StringItem index="4" value="2000"/> - <StringItem index="5" value="4000"/> - <StringItem index="6" value="8000"/> - <StringItem index="7" value="10000"/> - <StringItem index="8" value="20000"/> - <StringItem index="9" value="50000"/> - <StringItem index="10" value="100000"/> - </StringArray> - </Property> - <Property name="selectedIndex" type="int" value="3"/> - <Property name="name" type="java.lang.String" value="uploadChoice" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="300" y="60" width="-1" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JComboBox" name="downloadChoice"> - <Properties> - <Property name="editable" type="boolean" value="true"/> - <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor"> - <StringArray count="11"> - <StringItem index="0" value="100"/> - <StringItem index="1" value="200"/> - <StringItem index="2" value="500"/> - <StringItem index="3" value="1000"/> - <StringItem index="4" value="2000"/> - <StringItem index="5" value="4000"/> - <StringItem index="6" value="8000"/> - <StringItem index="7" value="10000"/> - <StringItem index="8" value="20000"/> - <StringItem index="9" value="50000"/> - <StringItem index="10" value="100000"/> - </StringArray> - </Property> - <Property name="selectedIndex" type="int" value="3"/> - <Property name="name" type="java.lang.String" value="downloadChoice" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="300" y="110" width="-1" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JLabel" name="speedExplanation"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="speedExplanation.text"/> - <Property name="name" type="java.lang.String" value="speedExplanation" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="20" y="160" width="570" height="60"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JComboBox" name="uploadkbps"> - <Properties> - <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor"> - <StringArray count="2"> - <StringItem index="0" value="kbps"/> - <StringItem index="1" value="kBps"/> - </StringArray> - </Property> - <Property name="name" type="java.lang.String" value="uploadKbit" noResource="true"/> - </Properties> - <Events> - <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="uploadkbpsActionPerformed"/> - </Events> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="470" y="60" width="-1" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JComboBox" name="downloadkbps"> - <Properties> - <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor"> - <StringArray count="2"> - <StringItem index="0" value="kbps"/> - <StringItem index="1" value="kBps"/> - </StringArray> - </Property> - <Property name="name" type="java.lang.String" value="downloadKbit" noResource="true"/> - </Properties> - <Events> - <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="downloadkbpsActionPerformed"/> - </Events> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="470" y="110" width="-1" height="-1"/> - </Constraint> - </Constraints> - </Component> - </SubComponents> -</Form> diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector.java deleted file mode 100644 index 335812e2a99a1ce4dcdd5dd7f58eb3d1e3d25b02..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector.java +++ /dev/null @@ -1,194 +0,0 @@ -/* - * ProfileSelector.java - * - * Created on 3 april 2009, 13:57 - */ - -package net.i2p.desktopgui.gui; - -import java.awt.Point; -import java.util.Properties; -import javax.swing.JComboBox; -import javax.swing.JTextField; -import net.i2p.desktopgui.persistence.PropertyManager; -import net.i2p.desktopgui.util.IntegerVerifier; - -/** - * - * @author mathias - */ -public class SpeedSelector extends javax.swing.JFrame { - - /** Creates new form ProfileSelector */ - public SpeedSelector() { - this.props = PropertyManager.getProps(); - initComponents(); - initComponentsCustom(); - initSpeeds(props); - this.setVisible(true); - this.setLocationRelativeTo(null); - this.requestFocus(); - } - - public SpeedSelector(Point point) { - this(); - this.setLocation(point); - } - - public void initComponentsCustom() { - ((JTextField)uploadChoice.getEditor().getEditorComponent()).setInputVerifier(new IntegerVerifier()); - ((JTextField)downloadChoice.getEditor().getEditorComponent()).setInputVerifier(new IntegerVerifier()); - } - - /** This method is called from within the constructor to - * initialize the form. - * WARNING: Do NOT modify this code. The content of this method is - * always regenerated by the Form Editor. - */ - @SuppressWarnings("unchecked") - // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents - private void initComponents() { - - nextButton = new javax.swing.JButton(); - uploadLabel = new javax.swing.JLabel(); - downloadLabel = new javax.swing.JLabel(); - uploadChoice = new javax.swing.JComboBox(); - downloadChoice = new javax.swing.JComboBox(); - speedExplanation = new javax.swing.JLabel(); - uploadkbps = new javax.swing.JComboBox(); - downloadkbps = new javax.swing.JComboBox(); - - setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); - org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(net.i2p.desktopgui.desktopgui.Main.class).getContext().getResourceMap(SpeedSelector.class); - setTitle(resourceMap.getString("Form.title")); // NOI18N - setMinimumSize(new java.awt.Dimension(610, 330)); - setName("Form"); // NOI18N - setResizable(false); - getContentPane().setLayout(null); - - nextButton.setText(resourceMap.getString("nextButton.text")); // NOI18N - nextButton.setMaximumSize(new java.awt.Dimension(72, 29)); - nextButton.setMinimumSize(new java.awt.Dimension(72, 29)); - nextButton.setName("nextButton"); // NOI18N - nextButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mouseClicked(java.awt.event.MouseEvent evt) { - nextButtonMouseClicked(evt); - } - }); - getContentPane().add(nextButton); - nextButton.setBounds(440, 250, 90, 29); - - uploadLabel.setText(resourceMap.getString("uploadLabel.text")); // NOI18N - uploadLabel.setName("uploadLabel"); // NOI18N - getContentPane().add(uploadLabel); - uploadLabel.setBounds(20, 60, 246, 30); - - downloadLabel.setText(resourceMap.getString("downloadLabel.text")); // NOI18N - downloadLabel.setName("downloadLabel"); // NOI18N - getContentPane().add(downloadLabel); - downloadLabel.setBounds(20, 110, 263, 30); - - uploadChoice.setEditable(true); - uploadChoice.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "100", "200", "500", "1000", "2000", "4000", "8000", "10000", "20000", "50000", "100000" })); - uploadChoice.setSelectedIndex(3); - uploadChoice.setName("uploadChoice"); // NOI18N - getContentPane().add(uploadChoice); - uploadChoice.setBounds(300, 60, 154, 27); - - downloadChoice.setEditable(true); - downloadChoice.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "100", "200", "500", "1000", "2000", "4000", "8000", "10000", "20000", "50000", "100000" })); - downloadChoice.setSelectedIndex(3); - downloadChoice.setName("downloadChoice"); // NOI18N - getContentPane().add(downloadChoice); - downloadChoice.setBounds(300, 110, 154, 27); - - speedExplanation.setText(resourceMap.getString("speedExplanation.text")); // NOI18N - speedExplanation.setName("speedExplanation"); // NOI18N - getContentPane().add(speedExplanation); - speedExplanation.setBounds(20, 160, 570, 60); - - uploadkbps.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "kbps", "kBps" })); - uploadkbps.setName("uploadKbit"); // NOI18N - uploadkbps.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - uploadkbpsActionPerformed(evt); - } - }); - getContentPane().add(uploadkbps); - uploadkbps.setBounds(470, 60, 68, 27); - - downloadkbps.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "kbps", "kBps" })); - downloadkbps.setName("downloadKbit"); // NOI18N - downloadkbps.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - downloadkbpsActionPerformed(evt); - } - }); - getContentPane().add(downloadkbps); - downloadkbps.setBounds(470, 110, 68, 27); - - pack(); - }// </editor-fold>//GEN-END:initComponents - -private void nextButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_nextButtonMouseClicked - if(uploadkbps.getSelectedIndex() == KILOBIT) - props.setProperty(SpeedSelectorConstants.MAXUPLOADCAPABLE, uploadChoice.getSelectedItem().toString()); - else - props.setProperty(SpeedSelectorConstants.MAXUPLOADCAPABLE, "" + Integer.parseInt(uploadChoice.getSelectedItem().toString())*8); - if(downloadkbps.getSelectedIndex() == KILOBIT) - props.setProperty(SpeedSelectorConstants.MAXDOWNLOADCAPABLE, downloadChoice.getSelectedItem().toString()); - else - props.setProperty(SpeedSelectorConstants.MAXDOWNLOADCAPABLE, "" + Integer.parseInt(downloadChoice.getSelectedItem().toString())*8); - PropertyManager.saveProps(props); - new SpeedSelector2(this.getLocationOnScreen()); - this.dispose(); -}//GEN-LAST:event_nextButtonMouseClicked - -private void uploadkbpsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_uploadkbpsActionPerformed - kbpsSwitchPerformed(uploadkbps, uploadChoice); -}//GEN-LAST:event_uploadkbpsActionPerformed - -private void downloadkbpsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_downloadkbpsActionPerformed - kbpsSwitchPerformed(downloadkbps, downloadChoice); -}//GEN-LAST:event_downloadkbpsActionPerformed - -private void kbpsSwitchPerformed(JComboBox kbps, JComboBox speed) { - int index = kbps.getSelectedIndex(); - int previous = Integer.parseInt(speed.getSelectedItem().toString()); - if(index == KILOBIT) { - speed.setSelectedItem("" + previous*8); - } - else { - speed.setSelectedItem("" + previous/8); - } -} - -private void initSpeeds(Properties props) { - String up = props.getProperty(SpeedSelectorConstants.MAXUPLOADCAPABLE); - String down = props.getProperty(SpeedSelectorConstants.MAXDOWNLOADCAPABLE); - - if(up == null) - props.setProperty(SpeedSelectorConstants.MAXUPLOADCAPABLE, "1000"); - if(down == null) - props.setProperty(SpeedSelectorConstants.MAXDOWNLOADCAPABLE, "1000"); - - uploadChoice.setSelectedItem(props.getProperty(SpeedSelectorConstants.MAXUPLOADCAPABLE)); - downloadChoice.setSelectedItem(props.getProperty(SpeedSelectorConstants.MAXDOWNLOADCAPABLE)); -} - - - // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JComboBox downloadChoice; - private javax.swing.JLabel downloadLabel; - private javax.swing.JComboBox downloadkbps; - private javax.swing.JButton nextButton; - private javax.swing.JLabel speedExplanation; - private javax.swing.JComboBox uploadChoice; - private javax.swing.JLabel uploadLabel; - private javax.swing.JComboBox uploadkbps; - // End of variables declaration//GEN-END:variables - - Properties props; - private static final int KILOBIT = 0; - private static final int KILOBYTE = 1; -} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector2.form b/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector2.form deleted file mode 100644 index 54f5fa7262dc3a23f793f4180dc0d1acb83f6cb4..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector2.form +++ /dev/null @@ -1,118 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> - -<Form version="1.5" maxVersion="1.6" type="org.netbeans.modules.form.forminfo.JFrameFormInfo"> - <NonVisualComponents> - <Component class="javax.swing.ButtonGroup" name="buttonGroup1"> - </Component> - </NonVisualComponents> - <Properties> - <Property name="defaultCloseOperation" type="int" value="2"/> - <Property name="title" type="java.lang.String" resourceKey="Form.title"/> - <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> - <Dimension value="[610, 330]"/> - </Property> - <Property name="name" type="java.lang.String" value="Form" noResource="true"/> - <Property name="resizable" type="boolean" value="false"/> - </Properties> - <SyntheticProperties> - <SyntheticProperty name="formSizePolicy" type="int" value="1"/> - </SyntheticProperties> - <AuxValues> - <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/> - <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/> - <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/> - <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/> - <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/> - <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/> - <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/> - <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/> - <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/> - <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,2,105"/> - </AuxValues> - - <Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout"> - <Property name="useNullLayout" type="boolean" value="true"/> - </Layout> - <SubComponents> - <Component class="javax.swing.JButton" name="nextButton"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="nextButton.text"/> - <Property name="name" type="java.lang.String" value="nextButton" noResource="true"/> - </Properties> - <Events> - <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="nextButtonMouseClicked"/> - </Events> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="440" y="250" width="90" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JButton" name="returnButton"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="returnButton.text"/> - <Property name="name" type="java.lang.String" value="returnButton" noResource="true"/> - </Properties> - <Events> - <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="returnButtonMouseClicked"/> - </Events> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="336" y="250" width="90" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JLabel" name="questionLabel"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="questionLabel.text"/> - <Property name="name" type="java.lang.String" value="questionLabel" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="30" y="40" width="-1" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JRadioButton" name="browseButton"> - <Properties> - <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor"> - <ComponentRef name="buttonGroup1"/> - </Property> - <Property name="text" type="java.lang.String" resourceKey="browseButton.text"/> - <Property name="actionCommand" type="java.lang.String" resourceKey="browseButton.actionCommand"/> - <Property name="name" type="java.lang.String" value="browseButton" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="40" y="120" width="-1" height="40"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JRadioButton" name="downloadButton"> - <Properties> - <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor"> - <ComponentRef name="buttonGroup1"/> - </Property> - <Property name="text" type="java.lang.String" resourceKey="downloadButton.text"/> - <Property name="actionCommand" type="java.lang.String" resourceKey="downloadButton.actionCommand"/> - <Property name="name" type="java.lang.String" value="downloadButton" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="40" y="70" width="-1" height="40"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JLabel" name="jLabel1"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="jLabel1.text"/> - <Property name="name" type="java.lang.String" value="jLabel1" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="30" y="170" width="530" height="70"/> - </Constraint> - </Constraints> - </Component> - </SubComponents> -</Form> diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector2.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector2.java deleted file mode 100644 index 772d16918a58a6edf6d65601f708dc8768c35c01..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector2.java +++ /dev/null @@ -1,159 +0,0 @@ -/* - * ProfileSelector2.java - * - * Created on 3 april 2009, 14:36 - */ - -package net.i2p.desktopgui.gui; - -import java.awt.Point; -import java.util.Enumeration; -import java.util.Properties; -import javax.swing.AbstractButton; -import net.i2p.desktopgui.persistence.PropertyManager; - -/** - * - * @author mathias - */ -public class SpeedSelector2 extends javax.swing.JFrame { - Properties props; - - /** Creates new form ProfileSelector2 */ - public SpeedSelector2(Point point) { - this.props = PropertyManager.getProps(); - initComponents(); - this.setLocation(point); - loadButtonSelection(); - this.setVisible(true); - this.requestFocus(); - } - - /** This method is called from within the constructor to - * initialize the form. - * WARNING: Do NOT modify this code. The content of this method is - * always regenerated by the Form Editor. - */ - @SuppressWarnings("unchecked") - // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents - private void initComponents() { - - buttonGroup1 = new javax.swing.ButtonGroup(); - nextButton = new javax.swing.JButton(); - returnButton = new javax.swing.JButton(); - questionLabel = new javax.swing.JLabel(); - browseButton = new javax.swing.JRadioButton(); - downloadButton = new javax.swing.JRadioButton(); - jLabel1 = new javax.swing.JLabel(); - - setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); - org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(net.i2p.desktopgui.desktopgui.Main.class).getContext().getResourceMap(SpeedSelector2.class); - setTitle(resourceMap.getString("Form.title")); // NOI18N - setMinimumSize(new java.awt.Dimension(610, 330)); - setName("Form"); // NOI18N - setResizable(false); - getContentPane().setLayout(null); - - nextButton.setText(resourceMap.getString("nextButton.text")); // NOI18N - nextButton.setName("nextButton"); // NOI18N - nextButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mouseClicked(java.awt.event.MouseEvent evt) { - nextButtonMouseClicked(evt); - } - }); - getContentPane().add(nextButton); - nextButton.setBounds(440, 250, 90, 29); - - returnButton.setText(resourceMap.getString("returnButton.text")); // NOI18N - returnButton.setName("returnButton"); // NOI18N - returnButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mouseClicked(java.awt.event.MouseEvent evt) { - returnButtonMouseClicked(evt); - } - }); - getContentPane().add(returnButton); - returnButton.setBounds(336, 250, 90, 29); - - questionLabel.setText(resourceMap.getString("questionLabel.text")); // NOI18N - questionLabel.setName("questionLabel"); // NOI18N - getContentPane().add(questionLabel); - questionLabel.setBounds(30, 40, 265, 17); - - buttonGroup1.add(browseButton); - browseButton.setText(resourceMap.getString("browseButton.text")); // NOI18N - browseButton.setActionCommand(resourceMap.getString("browseButton.actionCommand")); // NOI18N - browseButton.setName("browseButton"); // NOI18N - getContentPane().add(browseButton); - browseButton.setBounds(40, 120, 520, 40); - - buttonGroup1.add(downloadButton); - downloadButton.setText(resourceMap.getString("downloadButton.text")); // NOI18N - downloadButton.setActionCommand(resourceMap.getString("downloadButton.actionCommand")); // NOI18N - downloadButton.setName("downloadButton"); // NOI18N - getContentPane().add(downloadButton); - downloadButton.setBounds(40, 70, 499, 40); - - jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N - jLabel1.setName("jLabel1"); // NOI18N - getContentPane().add(jLabel1); - jLabel1.setBounds(30, 170, 530, 70); - - pack(); - }// </editor-fold>//GEN-END:initComponents - -private void returnButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_returnButtonMouseClicked - saveButtonSelection(); - PropertyManager.saveProps(props); - new SpeedSelector(this.getLocationOnScreen()); - this.dispose(); -}//GEN-LAST:event_returnButtonMouseClicked - -private void nextButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_nextButtonMouseClicked - saveButtonSelection(); - PropertyManager.saveProps(props); - new SpeedSelector3(this.getLocationOnScreen(), this.getSize()); - this.dispose(); -}//GEN-LAST:event_nextButtonMouseClicked - -private void loadButtonSelection() { - - Enumeration<AbstractButton> elements = buttonGroup1.getElements(); - while(elements.hasMoreElements()) { - AbstractButton button = elements.nextElement(); - if(button == null) - continue; - if(props.getProperty(SpeedSelectorConstants.USERTYPE) == null) - break; - String type = button.getActionCommand(); - if(type.equals(props.getProperty(SpeedSelectorConstants.USERTYPE))) { - button.setSelected(true); - break; - } - } -} - -private void saveButtonSelection() { - Enumeration<AbstractButton> elements = buttonGroup1.getElements(); - while(elements.hasMoreElements()) { - AbstractButton button = elements.nextElement(); - if(button == null) - continue; - if(button.isSelected()) { - String type = button.getActionCommand(); - props.setProperty(SpeedSelectorConstants.USERTYPE, type); - break; - } - } -} - - // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JRadioButton browseButton; - private javax.swing.ButtonGroup buttonGroup1; - private javax.swing.JRadioButton downloadButton; - private javax.swing.JLabel jLabel1; - private javax.swing.JButton nextButton; - private javax.swing.JLabel questionLabel; - private javax.swing.JButton returnButton; - // End of variables declaration//GEN-END:variables - -} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector3.form b/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector3.form deleted file mode 100644 index 8e4aa5b4e8d19b460b4eb3a21575ac3a309fa496..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector3.form +++ /dev/null @@ -1,338 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> - -<Form version="1.5" maxVersion="1.6" type="org.netbeans.modules.form.forminfo.JFrameFormInfo"> - <Properties> - <Property name="defaultCloseOperation" type="int" value="2"/> - <Property name="title" type="java.lang.String" resourceKey="Form.title"/> - <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> - <Dimension value="[670, 330]"/> - </Property> - <Property name="name" type="java.lang.String" value="Form" noResource="true"/> - <Property name="resizable" type="boolean" value="false"/> - </Properties> - <SyntheticProperties> - <SyntheticProperty name="formSizePolicy" type="int" value="1"/> - </SyntheticProperties> - <AuxValues> - <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/> - <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/> - <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/> - <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/> - <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/> - <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/> - <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/> - <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/> - <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/> - <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,74,0,0,2,-108"/> - </AuxValues> - - <Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout"> - <Property name="useNullLayout" type="boolean" value="true"/> - </Layout> - <SubComponents> - <Component class="javax.swing.JButton" name="finishButton"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="finishButton.text"/> - <Property name="name" type="java.lang.String" value="finishButton" noResource="true"/> - </Properties> - <Events> - <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="finishButtonMouseClicked"/> - </Events> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="440" y="250" width="90" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JButton" name="previousButton"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="previousButton.text"/> - <Property name="name" type="java.lang.String" value="previousButton" noResource="true"/> - </Properties> - <Events> - <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="previousButtonMouseClicked"/> - </Events> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="336" y="250" width="90" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JLabel" name="settingsInfo"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="settingsInfo.text"/> - <Property name="name" type="java.lang.String" value="settingsInfo" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="20" y="30" width="-1" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JLabel" name="uploadLabel"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="uploadLabel.text"/> - <Property name="name" type="java.lang.String" value="uploadLabel" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="20" y="70" width="140" height="30"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JLabel" name="downloadLabel"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="downloadLabel.text"/> - <Property name="name" type="java.lang.String" value="downloadLabel" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="340" y="70" width="160" height="30"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JLabel" name="uploadBurstLabel"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="uploadBurstLabel.text"/> - <Property name="name" type="java.lang.String" value="uploadBurstLabel" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="20" y="110" width="140" height="30"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JLabel" name="downloadBurstLabel"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="downloadBurstLabel.text"/> - <Property name="name" type="java.lang.String" value="downloadBurstLabel" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="340" y="110" width="160" height="30"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JLabel" name="uploadUsageLabel"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="uploadUsageLabel.text"/> - <Property name="name" type="java.lang.String" value="uploadUsageLabel" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="20" y="150" width="140" height="30"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JLabel" name="downloadUsageLabel"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="downloadUsageLabel.text"/> - <Property name="name" type="java.lang.String" value="downloadUsageLabel" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="340" y="150" width="160" height="30"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JTextField" name="uploadField"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="uploadField.text"/> - <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> - <Dimension value="[77, 27]"/> - </Property> - <Property name="name" type="java.lang.String" value="uploadField" noResource="true"/> - </Properties> - <Events> - <EventHandler event="keyReleased" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="speedFieldKeyReleased"/> - </Events> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="160" y="70" width="-1" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JTextField" name="uploadBurstField"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="uploadBurstField.text"/> - <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> - <Dimension value="[77, 27]"/> - </Property> - <Property name="name" type="java.lang.String" value="uploadBurstField" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="160" y="110" width="-1" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JTextField" name="downloadField"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="downloadField.text"/> - <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> - <Dimension value="[77, 27]"/> - </Property> - <Property name="name" type="java.lang.String" value="downloadField" noResource="true"/> - </Properties> - <Events> - <EventHandler event="keyReleased" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="speedFieldKeyReleased"/> - </Events> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="500" y="70" width="-1" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JTextField" name="downloadBurstField"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="downloadBurstField.text"/> - <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> - <Dimension value="[77, 27]"/> - </Property> - <Property name="name" type="java.lang.String" value="downloadBurstField" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="500" y="110" width="-1" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JComboBox" name="kbpsBurstDownload"> - <Properties> - <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor"> - <StringArray count="2"> - <StringItem index="0" value="kbps"/> - <StringItem index="1" value="kBps"/> - </StringArray> - </Property> - <Property name="name" type="java.lang.String" value="kbpsBurstDownload" noResource="true"/> - </Properties> - <Events> - <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="kbpsBurstDownloadActionPerformed"/> - </Events> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="580" y="110" width="-1" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JComboBox" name="kbpsUpload"> - <Properties> - <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor"> - <StringArray count="2"> - <StringItem index="0" value="kbps"/> - <StringItem index="1" value="kBps"/> - </StringArray> - </Property> - <Property name="name" type="java.lang.String" value="kbpsUpload" noResource="true"/> - </Properties> - <Events> - <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="kbpsUploadActionPerformed"/> - </Events> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="240" y="70" width="-1" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JComboBox" name="kbpsBurstUpload"> - <Properties> - <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor"> - <StringArray count="2"> - <StringItem index="0" value="kbps"/> - <StringItem index="1" value="kBps"/> - </StringArray> - </Property> - <Property name="name" type="java.lang.String" value="kbpsBurstUpload" noResource="true"/> - </Properties> - <Events> - <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="kbpsBurstUploadActionPerformed"/> - </Events> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="240" y="110" width="-1" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JComboBox" name="kbpsDownload"> - <Properties> - <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor"> - <StringArray count="2"> - <StringItem index="0" value="kbps"/> - <StringItem index="1" value="kBps"/> - </StringArray> - </Property> - <Property name="name" type="java.lang.String" value="kbpsDownload" noResource="true"/> - </Properties> - <Events> - <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="kbpsDownloadActionPerformed"/> - </Events> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="580" y="70" width="-1" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JLabel" name="uploadGB"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="uploadUsageLabel.text"/> - <Property name="name" type="java.lang.String" value="uploadUsageLabel" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="240" y="150" width="45" height="30"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JTextField" name="uploadMonth"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="uploadMonth.text"/> - <Property name="name" type="java.lang.String" value="uploadMonth" noResource="true"/> - </Properties> - <Events> - <EventHandler event="keyReleased" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="monthKeyReleased"/> - </Events> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="160" y="150" width="-1" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JTextField" name="downloadMonth"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="downloadMonth.text"/> - <Property name="name" type="java.lang.String" value="downloadMonth" noResource="true"/> - </Properties> - <Events> - <EventHandler event="keyReleased" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="monthKeyReleased"/> - </Events> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="500" y="150" width="-1" height="-1"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JLabel" name="downloadGB"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="downloadUsageLabel.text"/> - <Property name="name" type="java.lang.String" value="downloadUsageLabel" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="580" y="150" width="40" height="30"/> - </Constraint> - </Constraints> - </Component> - <Component class="javax.swing.JLabel" name="explanation"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="explanation.text"/> - <Property name="name" type="java.lang.String" value="explanation" noResource="true"/> - </Properties> - <Constraints> - <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> - <AbsoluteConstraints x="20" y="180" width="600" height="70"/> - </Constraint> - </Constraints> - </Component> - </SubComponents> -</Form> diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector3.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector3.java deleted file mode 100644 index 933ad3ff2f9489714d1db00c73be96c466d86580..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector3.java +++ /dev/null @@ -1,439 +0,0 @@ -/* - * ProfileSelector3.java - * - * Created on 3 april 2009, 15:17 - */ - -package net.i2p.desktopgui.gui; - -import java.awt.Dimension; -import java.awt.Point; -import java.util.Properties; -import javax.swing.JComboBox; -import javax.swing.JTextField; -import net.i2p.desktopgui.persistence.PropertyManager; -import net.i2p.desktopgui.router.configuration.SpeedHandler; -import net.i2p.desktopgui.router.configuration.SpeedHelper; - -/** - * - * @author mathias - */ -public class SpeedSelector3 extends javax.swing.JFrame { - Properties props; - - /** Creates new form ProfileSelector3 */ - public SpeedSelector3(Point point, Dimension dimension) { - this.props = PropertyManager.getProps(); - initComponents(); - this.setLocation(point); - this.setSize(dimension); - initSpeeds(); - initUsage(); - this.setVisible(true); - this.requestFocus(); - } - - /** This method is called from within the constructor to - * initialize the form. - * WARNING: Do NOT modify this code. The content of this method is - * always regenerated by the Form Editor. - */ - @SuppressWarnings("unchecked") - // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents - private void initComponents() { - - finishButton = new javax.swing.JButton(); - previousButton = new javax.swing.JButton(); - settingsInfo = new javax.swing.JLabel(); - uploadLabel = new javax.swing.JLabel(); - downloadLabel = new javax.swing.JLabel(); - uploadBurstLabel = new javax.swing.JLabel(); - downloadBurstLabel = new javax.swing.JLabel(); - uploadUsageLabel = new javax.swing.JLabel(); - downloadUsageLabel = new javax.swing.JLabel(); - uploadField = new javax.swing.JTextField(); - uploadBurstField = new javax.swing.JTextField(); - downloadField = new javax.swing.JTextField(); - downloadBurstField = new javax.swing.JTextField(); - kbpsBurstDownload = new javax.swing.JComboBox(); - kbpsUpload = new javax.swing.JComboBox(); - kbpsBurstUpload = new javax.swing.JComboBox(); - kbpsDownload = new javax.swing.JComboBox(); - uploadGB = new javax.swing.JLabel(); - uploadMonth = new javax.swing.JTextField(); - downloadMonth = new javax.swing.JTextField(); - downloadGB = new javax.swing.JLabel(); - explanation = new javax.swing.JLabel(); - - setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); - org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(net.i2p.desktopgui.desktopgui.Main.class).getContext().getResourceMap(SpeedSelector3.class); - setTitle(resourceMap.getString("Form.title")); // NOI18N - setMinimumSize(new java.awt.Dimension(670, 330)); - setName("Form"); // NOI18N - setResizable(false); - getContentPane().setLayout(null); - - finishButton.setText(resourceMap.getString("finishButton.text")); // NOI18N - finishButton.setName("finishButton"); // NOI18N - finishButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mouseClicked(java.awt.event.MouseEvent evt) { - finishButtonMouseClicked(evt); - } - }); - getContentPane().add(finishButton); - finishButton.setBounds(440, 250, 90, 29); - - previousButton.setText(resourceMap.getString("previousButton.text")); // NOI18N - previousButton.setName("previousButton"); // NOI18N - previousButton.addMouseListener(new java.awt.event.MouseAdapter() { - public void mouseClicked(java.awt.event.MouseEvent evt) { - previousButtonMouseClicked(evt); - } - }); - getContentPane().add(previousButton); - previousButton.setBounds(336, 250, 90, 29); - - settingsInfo.setText(resourceMap.getString("settingsInfo.text")); // NOI18N - settingsInfo.setName("settingsInfo"); // NOI18N - getContentPane().add(settingsInfo); - settingsInfo.setBounds(20, 30, 532, 17); - - uploadLabel.setText(resourceMap.getString("uploadLabel.text")); // NOI18N - uploadLabel.setName("uploadLabel"); // NOI18N - getContentPane().add(uploadLabel); - uploadLabel.setBounds(20, 70, 140, 30); - - downloadLabel.setText(resourceMap.getString("downloadLabel.text")); // NOI18N - downloadLabel.setName("downloadLabel"); // NOI18N - getContentPane().add(downloadLabel); - downloadLabel.setBounds(340, 70, 160, 30); - - uploadBurstLabel.setText(resourceMap.getString("uploadBurstLabel.text")); // NOI18N - uploadBurstLabel.setName("uploadBurstLabel"); // NOI18N - getContentPane().add(uploadBurstLabel); - uploadBurstLabel.setBounds(20, 110, 140, 30); - - downloadBurstLabel.setText(resourceMap.getString("downloadBurstLabel.text")); // NOI18N - downloadBurstLabel.setName("downloadBurstLabel"); // NOI18N - getContentPane().add(downloadBurstLabel); - downloadBurstLabel.setBounds(340, 110, 160, 30); - - uploadUsageLabel.setText(resourceMap.getString("uploadUsageLabel.text")); // NOI18N - uploadUsageLabel.setName("uploadUsageLabel"); // NOI18N - getContentPane().add(uploadUsageLabel); - uploadUsageLabel.setBounds(20, 150, 140, 30); - - downloadUsageLabel.setText(resourceMap.getString("downloadUsageLabel.text")); // NOI18N - downloadUsageLabel.setName("downloadUsageLabel"); // NOI18N - getContentPane().add(downloadUsageLabel); - downloadUsageLabel.setBounds(340, 150, 160, 30); - - uploadField.setText(resourceMap.getString("uploadField.text")); // NOI18N - uploadField.setMinimumSize(new java.awt.Dimension(77, 27)); - uploadField.setName("uploadField"); // NOI18N - uploadField.addKeyListener(new java.awt.event.KeyAdapter() { - public void keyReleased(java.awt.event.KeyEvent evt) { - speedFieldKeyReleased(evt); - } - }); - getContentPane().add(uploadField); - uploadField.setBounds(160, 70, 77, 27); - - uploadBurstField.setText(resourceMap.getString("uploadBurstField.text")); // NOI18N - uploadBurstField.setMinimumSize(new java.awt.Dimension(77, 27)); - uploadBurstField.setName("uploadBurstField"); // NOI18N - getContentPane().add(uploadBurstField); - uploadBurstField.setBounds(160, 110, 77, 27); - - downloadField.setText(resourceMap.getString("downloadField.text")); // NOI18N - downloadField.setMinimumSize(new java.awt.Dimension(77, 27)); - downloadField.setName("downloadField"); // NOI18N - downloadField.addKeyListener(new java.awt.event.KeyAdapter() { - public void keyReleased(java.awt.event.KeyEvent evt) { - speedFieldKeyReleased(evt); - } - }); - getContentPane().add(downloadField); - downloadField.setBounds(500, 70, 77, 27); - - downloadBurstField.setText(resourceMap.getString("downloadBurstField.text")); // NOI18N - downloadBurstField.setMinimumSize(new java.awt.Dimension(77, 27)); - downloadBurstField.setName("downloadBurstField"); // NOI18N - getContentPane().add(downloadBurstField); - downloadBurstField.setBounds(500, 110, 77, 27); - - kbpsBurstDownload.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "kbps", "kBps" })); - kbpsBurstDownload.setName("kbpsBurstDownload"); // NOI18N - kbpsBurstDownload.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - kbpsBurstDownloadActionPerformed(evt); - } - }); - getContentPane().add(kbpsBurstDownload); - kbpsBurstDownload.setBounds(580, 110, 68, 27); - - kbpsUpload.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "kbps", "kBps" })); - kbpsUpload.setName("kbpsUpload"); // NOI18N - kbpsUpload.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - kbpsUploadActionPerformed(evt); - } - }); - getContentPane().add(kbpsUpload); - kbpsUpload.setBounds(240, 70, 68, 27); - - kbpsBurstUpload.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "kbps", "kBps" })); - kbpsBurstUpload.setName("kbpsBurstUpload"); // NOI18N - kbpsBurstUpload.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - kbpsBurstUploadActionPerformed(evt); - } - }); - getContentPane().add(kbpsBurstUpload); - kbpsBurstUpload.setBounds(240, 110, 68, 27); - - kbpsDownload.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "kbps", "kBps" })); - kbpsDownload.setName("kbpsDownload"); // NOI18N - kbpsDownload.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - kbpsDownloadActionPerformed(evt); - } - }); - getContentPane().add(kbpsDownload); - kbpsDownload.setBounds(580, 70, 68, 27); - - uploadGB.setText(resourceMap.getString("uploadUsageLabel.text")); // NOI18N - uploadGB.setName("uploadUsageLabel"); // NOI18N - getContentPane().add(uploadGB); - uploadGB.setBounds(240, 150, 45, 30); - - uploadMonth.setText(resourceMap.getString("uploadMonth.text")); // NOI18N - uploadMonth.setName("uploadMonth"); // NOI18N - uploadMonth.addKeyListener(new java.awt.event.KeyAdapter() { - public void keyReleased(java.awt.event.KeyEvent evt) { - monthKeyReleased(evt); - } - }); - getContentPane().add(uploadMonth); - uploadMonth.setBounds(160, 150, 77, 27); - - downloadMonth.setText(resourceMap.getString("downloadMonth.text")); // NOI18N - downloadMonth.setName("downloadMonth"); // NOI18N - downloadMonth.addKeyListener(new java.awt.event.KeyAdapter() { - public void keyReleased(java.awt.event.KeyEvent evt) { - monthKeyReleased(evt); - } - }); - getContentPane().add(downloadMonth); - downloadMonth.setBounds(500, 150, 77, 27); - - downloadGB.setText(resourceMap.getString("downloadUsageLabel.text")); // NOI18N - downloadGB.setName("downloadUsageLabel"); // NOI18N - getContentPane().add(downloadGB); - downloadGB.setBounds(580, 150, 40, 30); - - explanation.setText(resourceMap.getString("explanation.text")); // NOI18N - explanation.setName("explanation"); // NOI18N - getContentPane().add(explanation); - explanation.setBounds(20, 180, 600, 70); - - pack(); - }// </editor-fold>//GEN-END:initComponents - -private void previousButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_previousButtonMouseClicked - saveSpeeds(); - PropertyManager.saveProps(props); - new SpeedSelector2(this.getLocationOnScreen()); - this.dispose(); -}//GEN-LAST:event_previousButtonMouseClicked - -private void finishButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_finishButtonMouseClicked - saveSpeeds(); - PropertyManager.saveProps(props); - - int maxDownload = Integer.parseInt(props.getProperty(SpeedSelectorConstants.MAXDOWNLOAD)); - int maxUpload = Integer.parseInt(props.getProperty(SpeedSelectorConstants.MAXUPLOAD)); - int maxUploadBurst = Integer.parseInt(props.getProperty(SpeedSelectorConstants.MAXUPLOADBURST)); - int maxDownloadBurst = Integer.parseInt(props.getProperty(SpeedSelectorConstants.MAXDOWNLOADBURST)); - - //Working in kB, not kb! - SpeedHandler.setInboundBandwidth(maxDownload/8); - SpeedHandler.setOutboundBandwidth(maxUpload/8); - SpeedHandler.setInboundBurstBandwidth(maxDownloadBurst/8); - SpeedHandler.setOutboundBurstBandwidth(maxUploadBurst/8); - - this.dispose(); -}//GEN-LAST:event_finishButtonMouseClicked - -private void speedFieldKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_speedFieldKeyReleased - try { - String upload = ""; - if(kbpsUpload.getSelectedIndex() == KILOBIT) - upload = uploadField.getText(); - else - upload = "" + Integer.parseInt(uploadField.getText())*8; - String download = ""; - if(kbpsDownload.getSelectedIndex() == KILOBIT) - download = downloadField.getText(); - else - download = "" + Integer.parseInt(downloadField.getText())*8; - initUsage(upload, download); - } - catch(NumberFormatException e) { - return; - } -}//GEN-LAST:event_speedFieldKeyReleased - -private void kbpsUploadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_kbpsUploadActionPerformed - kbpsSwitchPerformed(kbpsUpload, uploadField); -}//GEN-LAST:event_kbpsUploadActionPerformed - -private void kbpsBurstUploadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_kbpsBurstUploadActionPerformed - kbpsSwitchPerformed(kbpsBurstUpload, uploadBurstField); -}//GEN-LAST:event_kbpsBurstUploadActionPerformed - -private void kbpsDownloadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_kbpsDownloadActionPerformed - kbpsSwitchPerformed(kbpsDownload, downloadField); -}//GEN-LAST:event_kbpsDownloadActionPerformed - -private void kbpsBurstDownloadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_kbpsBurstDownloadActionPerformed - kbpsSwitchPerformed(kbpsBurstDownload, downloadBurstField); -}//GEN-LAST:event_kbpsBurstDownloadActionPerformed - -private void monthKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_monthKeyReleased - try { - int uploadMonthValue = Integer.parseInt(uploadMonth.getText()); - int downloadMonthValue = Integer.parseInt(downloadMonth.getText()); - - String upload = ""; - String burstUpload = ""; - String download = ""; - String burstDownload = ""; - - if(kbpsUpload.getSelectedIndex() == KILOBIT) - upload = "" + SpeedHelper.calculateSpeed(uploadMonthValue)*8; //kbit - else - upload = "" + SpeedHelper.calculateSpeed(uploadMonthValue); //kbyte - - if(kbpsBurstUpload.getSelectedIndex() == KILOBIT) - burstUpload = "" + SpeedHelper.calculateSpeed(uploadMonthValue)*8; //kbit - else - burstUpload = "" + SpeedHelper.calculateSpeed(uploadMonthValue); //kbyte - - if(kbpsDownload.getSelectedIndex() == KILOBIT) - download = "" + SpeedHelper.calculateSpeed(downloadMonthValue)*8; //kbit - else - download = "" + SpeedHelper.calculateSpeed(downloadMonthValue); //kbyte - - if(kbpsBurstDownload.getSelectedIndex() == KILOBIT) - burstDownload = "" + SpeedHelper.calculateSpeed(downloadMonthValue)*8; //kbit - else - burstDownload = "" + SpeedHelper.calculateSpeed(downloadMonthValue); //kbyte - - initSpeeds(upload, burstUpload, download, burstDownload); - } - catch(NumberFormatException e) { - e.printStackTrace(); - return; - } -}//GEN-LAST:event_monthKeyReleased - -private void kbpsSwitchPerformed(JComboBox kbps, JTextField speed) { - int index = kbps.getSelectedIndex(); - int previous = Integer.parseInt(speed.getText()); - if(index == KILOBIT) { - speed.setText("" + previous*8); - } - else { - speed.setText("" + previous/8); - } -} - - protected void initSpeeds() { - String up = "" + SpeedHelper.calculateSpeed( - props.getProperty(SpeedSelectorConstants.MAXUPLOADCAPABLE), props.getProperty(SpeedSelectorConstants.USERTYPE)); - String upBurst = "" + SpeedHelper.calculateSpeed( - props.getProperty(SpeedSelectorConstants.MAXUPLOADCAPABLE), props.getProperty(SpeedSelectorConstants.USERTYPE)); - String down = "" + SpeedHelper.calculateSpeed( - props.getProperty(SpeedSelectorConstants.MAXDOWNLOADCAPABLE), props.getProperty(SpeedSelectorConstants.USERTYPE)); - String downBurst = "" + SpeedHelper.calculateSpeed( - props.getProperty(SpeedSelectorConstants.MAXDOWNLOADCAPABLE), props.getProperty(SpeedSelectorConstants.USERTYPE)); - String userType = props.getProperty(SpeedSelectorConstants.USERTYPE); - - initSpeeds(up, upBurst, down, downBurst); - } - - protected void initSpeeds(String up, String upBurst, String down, String downBurst) { - uploadField.setText(up); - uploadBurstField.setText(upBurst); - downloadField.setText(down); - downloadBurstField.setText(downBurst); - } - - protected void saveSpeeds() { - if(kbpsUpload.getSelectedIndex() == KILOBIT) - props.setProperty(SpeedSelectorConstants.MAXUPLOAD, uploadField.getText()); - else - props.setProperty(SpeedSelectorConstants.MAXUPLOAD, "" + Integer.parseInt(uploadField.getText())*8); - if(kbpsBurstUpload.getSelectedIndex() == KILOBIT) - props.setProperty(SpeedSelectorConstants.MAXUPLOADBURST, uploadBurstField.getText()); - else - props.setProperty(SpeedSelectorConstants.MAXUPLOADBURST, "" + Integer.parseInt(uploadBurstField.getText())*8); - if(kbpsDownload.getSelectedIndex() == KILOBIT) - props.setProperty(SpeedSelectorConstants.MAXDOWNLOAD, downloadField.getText()); - else - props.setProperty(SpeedSelectorConstants.MAXDOWNLOAD, "" + Integer.parseInt(downloadField.getText())*8); - if(kbpsBurstDownload.getSelectedIndex() == KILOBIT) - props.setProperty(SpeedSelectorConstants.MAXDOWNLOADBURST, downloadBurstField.getText()); - else - props.setProperty(SpeedSelectorConstants.MAXDOWNLOADBURST, "" + Integer.parseInt(downloadBurstField.getText())*8); - } - - protected void initUsage(String upload, String download) { - uploadMonth.setText("" + SpeedHelper.calculateMonthlyUsage(Integer.parseInt(upload)/8)); - downloadMonth.setText("" + SpeedHelper.calculateMonthlyUsage(Integer.parseInt(download)/8)); - } - - protected void initUsage() { - String upload = ""; - if(kbpsUpload.getSelectedIndex() == KILOBIT) - upload = uploadField.getText(); - else - upload = "" + Integer.parseInt(uploadField.getText())/8; - String download = ""; - if(kbpsDownload.getSelectedIndex() == KILOBIT) - download = downloadField.getText(); - else - download = "" + Integer.parseInt(downloadField.getText())/8; - initUsage(upload, download); - } - - // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JTextField downloadBurstField; - private javax.swing.JLabel downloadBurstLabel; - private javax.swing.JTextField downloadField; - private javax.swing.JLabel downloadGB; - private javax.swing.JLabel downloadLabel; - private javax.swing.JTextField downloadMonth; - private javax.swing.JLabel downloadUsageLabel; - private javax.swing.JLabel explanation; - private javax.swing.JButton finishButton; - private javax.swing.JComboBox kbpsBurstDownload; - private javax.swing.JComboBox kbpsBurstUpload; - private javax.swing.JComboBox kbpsDownload; - private javax.swing.JComboBox kbpsUpload; - private javax.swing.JButton previousButton; - private javax.swing.JLabel settingsInfo; - private javax.swing.JTextField uploadBurstField; - private javax.swing.JLabel uploadBurstLabel; - private javax.swing.JTextField uploadField; - private javax.swing.JLabel uploadGB; - private javax.swing.JLabel uploadLabel; - private javax.swing.JTextField uploadMonth; - private javax.swing.JLabel uploadUsageLabel; - // End of variables declaration//GEN-END:variables - - private static final int KILOBIT = 0; - private static final int KILOBYTE = 1; -} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelectorConstants.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelectorConstants.java deleted file mode 100644 index 1088f6957f27bdba770c02a26ecb3f0fee19c1a1..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelectorConstants.java +++ /dev/null @@ -1,25 +0,0 @@ -package net.i2p.desktopgui.gui; - -/** - * - * @author mathias - */ -public class SpeedSelectorConstants { - ///Maximum upload speed for the internet connection - public static final String MAXUPLOADCAPABLE = "maxUploadCapable"; - ///Maximum download speed for the internet connection - public static final String MAXDOWNLOADCAPABLE = "maxDownloadCapable"; - - //User profile type: what behaviour does this user have while using IP2? - public static final String USERTYPE = "userType"; - - //Maximum upload speed for I2P - public static final String MAXUPLOAD = "maxUpload"; - //Maximum upload burst speed for I2P - public static final String MAXUPLOADBURST = "maxUploadBurst"; - - //Maximum download speed for I2P - public static final String MAXDOWNLOAD = "maxDownload"; - //Maximum download burst speed for I2P - public static final String MAXDOWNLOADBURST = "maxDownloadBurst"; -} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/Tray.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/Tray.java deleted file mode 100644 index 02fb5b2df8449d070e81defaaff0f864e66760d3..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/gui/Tray.java +++ /dev/null @@ -1,228 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ - -package net.i2p.desktopgui.gui; - -import net.i2p.desktopgui.desktopgui.*; -import java.awt.AWTException; -import java.awt.Desktop; -import java.awt.Image; -import java.awt.SystemTray; -import java.awt.Toolkit; -import java.awt.TrayIcon; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.logging.Level; -import java.util.logging.Logger; -import javax.swing.JMenu; -import javax.swing.JMenuItem; -import javax.swing.JPopupMenu; -import net.i2p.desktopgui.router.RouterHandler; -import net.i2p.desktopgui.router.RouterHelper; -import net.i2p.desktopgui.router.configuration.PeerHelper; - -/** - * - * @author mathias - */ -public class Tray { - - public Tray() { - tray = SystemTray.getSystemTray(); - loadSystemTray(); - } - - private void loadSystemTray() { - - Image image = Toolkit.getDefaultToolkit().getImage("desktopgui/resources/logo/logo.jpg"); - - final JPopupMenu popup = new JPopupMenu(); - - //Create menu items to put in the popup menu - JMenuItem browserLauncher = new JMenuItem("Launch browser"); - browserLauncher.addActionListener(new ActionListener() { - - @Override - public void actionPerformed(ActionEvent arg0) { - if(Desktop.isDesktopSupported()) { - Desktop desktop = Desktop.getDesktop(); - try { - if(desktop.isSupported(Desktop.Action.BROWSE)) { - desktop.browse(new URI("http://localhost:7657")); - } - else { - trayIcon.displayMessage("Browser not found", "The default browser for your system was not found.", TrayIcon.MessageType.WARNING); - } - } catch (URISyntaxException ex) { - Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); - } catch(IOException ex) { - Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); - } - } - } - - }); - JMenuItem howto = new JMenuItem("How to use I2P"); - howto.addActionListener(new ActionListener() { - - @Override - public void actionPerformed(ActionEvent arg0) { - if(Desktop.isDesktopSupported()) { - Desktop desktop = Desktop.getDesktop(); - try { - File f = new File("desktopgui/resources/howto/howto.html"); - System.out.println(new URI(null, null, null, 0, "file://" + f.getAbsolutePath(), null, null)); - desktop.browse(new URI(null, null, null, 0, "file://" + f.getAbsolutePath(), null, null)); - //desktop.browse(new URI("file://" + f.getAbsolutePath())); - } catch (URISyntaxException ex) { - Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); - } catch(IOException ex) { - Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); - } - } - } - - }); - JMenu config = new JMenu("Configuration"); - JMenuItem speedConfig = new JMenuItem("Speed"); - speedConfig.addActionListener(new ActionListener() { - - @Override - public void actionPerformed(ActionEvent arg0) { - (new SpeedSelector()).setVisible(true); - } - - }); - JMenuItem generalConfig = new JMenuItem("General Configuration"); - generalConfig.addActionListener(new ActionListener() { - - @Override - public void actionPerformed(ActionEvent arg0) { - new GeneralConfiguration(); - } - - }); - JMenuItem advancedConfig = new JMenuItem("Advanced Configuration"); - advancedConfig.addActionListener(new ActionListener() { - - @Override - public void actionPerformed(ActionEvent arg0) { - if(Desktop.isDesktopSupported()) { - Desktop desktop = Desktop.getDesktop(); - try { - desktop.browse(new URI("http://localhost:7657/config.jsp")); - } catch (URISyntaxException ex) { - Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); - } catch(IOException ex) { - Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); - } - } - } - - }); - JMenuItem viewLog = new JMenuItem("View log"); - viewLog.addActionListener(new ActionListener() { - - @Override - public void actionPerformed(ActionEvent arg0) { - new LogViewer(); - } - - }); - JMenuItem version = new JMenuItem("Version"); - version.addActionListener(new ActionListener() { - - @Override - public void actionPerformed(ActionEvent arg0) { - new Version(); - } - - }); - JMenuItem shutdown = new JMenuItem("Shutdown I2P"); - shutdown.addActionListener(new ActionListener() { - - @Override - public void actionPerformed(ActionEvent arg0) { - RouterHandler.setStatus(RouterHandler.SHUTDOWN_GRACEFULLY); - long shutdownTime = RouterHelper.getGracefulShutdownTimeRemaining(); - System.out.println("Shutdowntime remaining: " + shutdownTime); - if(shutdownTime>0) { - trayIcon.displayMessage("Shutting down...", "Shutdown time remaining: " + shutdownTime/1000 + " seconds." - + System.getProperty("line.separator") + "Shutdown will not happen immediately, because we are still participating in the network.", TrayIcon.MessageType.INFO); - } - else { - trayIcon.displayMessage("Shutting down...", "Shutting down immediately.", TrayIcon.MessageType.INFO); - } - } - - }); - - //Add menu items to popup menu - popup.add(browserLauncher); - popup.add(howto); - - popup.addSeparator(); - - config.add(speedConfig); - config.add(generalConfig); - config.add(advancedConfig); - popup.add(config); - - popup.addSeparator(); - - popup.add(viewLog); - popup.add(version); - - popup.addSeparator(); - - popup.add(shutdown); - - //Add tray icon - trayIcon = new JPopupTrayIcon(image, "I2P: the anonymous network", popup); - - try { - tray.add(trayIcon); - } catch (AWTException ex) { - Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); - } - - PeerHelper.addReachabilityListener(new ActionListener() { - - @Override - public void actionPerformed(ActionEvent arg0) { - updateTooltip(); - } - - }); - PeerHelper.addActivePeerListener(new ActionListener() { - - @Override - public void actionPerformed(ActionEvent arg0) { - updateTooltip(); - int activePeers = PeerHelper.getActivePeers(); - if(activePeers == 0) - trayIcon.setImage(Toolkit.getDefaultToolkit().getImage("desktopgui/resources/logo/logo_red.jpg")); - else if(activePeers < 10) - trayIcon.setImage(Toolkit.getDefaultToolkit().getImage("desktopgui/resources/logo/logo_orange.jpg")); - else - trayIcon.setImage(Toolkit.getDefaultToolkit().getImage("desktopgui/resources/logo/logo_green.jpg")); - - } - - }); - } - - public void updateTooltip() { - trayIcon.setToolTip("I2P Network status: " + PeerHelper.getReachability() + " / " + "Active Peers: " + PeerHelper.getActivePeers()); - } - - private SystemTray tray = null; - private JPopupTrayIcon trayIcon = null; - -} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/Version.form b/apps/desktopgui/src/net/i2p/desktopgui/gui/Version.form deleted file mode 100644 index 32ab90b311d119e3fa4034aa8480e47ccbc3cdec..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/gui/Version.form +++ /dev/null @@ -1,102 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> - -<Form version="1.5" maxVersion="1.6" type="org.netbeans.modules.form.forminfo.JDialogFormInfo"> - <Properties> - <Property name="defaultCloseOperation" type="int" value="2"/> - <Property name="title" type="java.lang.String" resourceKey="Form.title"/> - <Property name="name" type="java.lang.String" value="Form" noResource="true"/> - </Properties> - <SyntheticProperties> - <SyntheticProperty name="formSizePolicy" type="int" value="1"/> - </SyntheticProperties> - <AuxValues> - <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/> - <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/> - <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/> - <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/> - <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/> - <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/> - <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/> - <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/> - <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/> - </AuxValues> - - <Layout> - <DimensionLayout dim="0"> - <Group type="103" groupAlignment="0" attributes="0"> - <Group type="102" attributes="0"> - <EmptySpace max="-2" attributes="0"/> - <Group type="103" groupAlignment="0" attributes="0"> - <Group type="102" alignment="0" attributes="0"> - <Group type="103" groupAlignment="1" max="-2" attributes="0"> - <Component id="I2Plabel" alignment="0" max="32767" attributes="0"/> - <Component id="GUILabel" alignment="0" max="32767" attributes="1"/> - </Group> - <EmptySpace type="separate" max="-2" attributes="0"/> - <Group type="103" groupAlignment="0" attributes="0"> - <Component id="I2PVersion" pref="126" max="32767" attributes="0"/> - <Component id="GUIVersion" pref="126" max="32767" attributes="0"/> - </Group> - </Group> - <Component id="okButton" alignment="1" min="-2" max="-2" attributes="0"/> - </Group> - <EmptySpace max="-2" attributes="0"/> - </Group> - </Group> - </DimensionLayout> - <DimensionLayout dim="1"> - <Group type="103" groupAlignment="0" attributes="0"> - <Group type="102" alignment="0" attributes="0"> - <EmptySpace max="-2" attributes="0"/> - <Group type="103" groupAlignment="0" attributes="0"> - <Component id="I2Plabel" min="-2" max="-2" attributes="0"/> - <Component id="I2PVersion" min="-2" max="-2" attributes="0"/> - </Group> - <EmptySpace max="-2" attributes="0"/> - <Group type="103" groupAlignment="0" attributes="0"> - <Component id="GUILabel" min="-2" max="-2" attributes="0"/> - <Component id="GUIVersion" min="-2" max="-2" attributes="0"/> - </Group> - <EmptySpace max="32767" attributes="0"/> - <Component id="okButton" min="-2" max="-2" attributes="0"/> - <EmptySpace max="-2" attributes="0"/> - </Group> - </Group> - </DimensionLayout> - </Layout> - <SubComponents> - <Component class="javax.swing.JButton" name="okButton"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="okButton.text"/> - <Property name="name" type="java.lang.String" value="okButton" noResource="true"/> - </Properties> - <Events> - <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="okButtonActionPerformed"/> - </Events> - </Component> - <Component class="javax.swing.JLabel" name="I2Plabel"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="I2Plabel.text"/> - <Property name="name" type="java.lang.String" value="I2Plabel" noResource="true"/> - </Properties> - </Component> - <Component class="javax.swing.JLabel" name="GUILabel"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="GUILabel.text"/> - <Property name="name" type="java.lang.String" value="GUILabel" noResource="true"/> - </Properties> - </Component> - <Component class="javax.swing.JLabel" name="I2PVersion"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="I2PVersion.text"/> - <Property name="name" type="java.lang.String" value="I2PVersion" noResource="true"/> - </Properties> - </Component> - <Component class="javax.swing.JLabel" name="GUIVersion"> - <Properties> - <Property name="text" type="java.lang.String" resourceKey="GUIVersion.text"/> - <Property name="name" type="java.lang.String" value="GUIVersion" noResource="true"/> - </Properties> - </Component> - </SubComponents> -</Form> diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/Version.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/Version.java deleted file mode 100644 index 25a38d6b8ffa7785db79aee870680e9ed9fcd818..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/gui/Version.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Version.java - * - * Created on 13 april 2009, 13:48 - */ - -package net.i2p.desktopgui.gui; - -import javax.swing.JFrame; -import net.i2p.desktopgui.router.RouterHelper; - -/** - * - * @author mathias - */ -public class Version extends javax.swing.JDialog { - - public Version() { - this(new JFrame(), true); - } - - - private Version(java.awt.Frame parent, boolean modal) { - super(parent, modal); - initComponents(); - String i2pVersion = RouterHelper.getVersion(); - String guiVersion = net.i2p.desktopgui.desktopgui.GUIVersion.VERSION; - this.I2PVersion.setText("<html><h1>" + i2pVersion + "</h1></html>"); - this.GUIVersion.setText("<html><h1>" + guiVersion + "</h1></html>"); - this.setVisible(true); - } - - /** This method is called from within the constructor to - * initialize the form. - * WARNING: Do NOT modify this code. The content of this method is - * always regenerated by the Form Editor. - */ - @SuppressWarnings("unchecked") - // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents - private void initComponents() { - - okButton = new javax.swing.JButton(); - I2Plabel = new javax.swing.JLabel(); - GUILabel = new javax.swing.JLabel(); - I2PVersion = new javax.swing.JLabel(); - GUIVersion = new javax.swing.JLabel(); - - setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); - org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(net.i2p.desktopgui.desktopgui.Main.class).getContext().getResourceMap(Version.class); - setTitle(resourceMap.getString("Form.title")); // NOI18N - setName("Form"); // NOI18N - - okButton.setText(resourceMap.getString("okButton.text")); // NOI18N - okButton.setName("okButton"); // NOI18N - okButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - okButtonActionPerformed(evt); - } - }); - - I2Plabel.setText(resourceMap.getString("I2Plabel.text")); // NOI18N - I2Plabel.setName("I2Plabel"); // NOI18N - - GUILabel.setText(resourceMap.getString("GUILabel.text")); // NOI18N - GUILabel.setName("GUILabel"); // NOI18N - - I2PVersion.setText(resourceMap.getString("I2PVersion.text")); // NOI18N - I2PVersion.setName("I2PVersion"); // NOI18N - - GUIVersion.setText(resourceMap.getString("GUIVersion.text")); // NOI18N - GUIVersion.setName("GUIVersion"); // NOI18N - - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); - getContentPane().setLayout(layout); - layout.setHorizontalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) - .addComponent(I2Plabel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(GUILabel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) - .addGap(18, 18, 18) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(I2PVersion, javax.swing.GroupLayout.DEFAULT_SIZE, 126, Short.MAX_VALUE) - .addComponent(GUIVersion, javax.swing.GroupLayout.DEFAULT_SIZE, 126, Short.MAX_VALUE))) - .addComponent(okButton, javax.swing.GroupLayout.Alignment.TRAILING)) - .addContainerGap()) - ); - layout.setVerticalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(I2Plabel) - .addComponent(I2PVersion)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(GUILabel) - .addComponent(GUIVersion)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(okButton) - .addContainerGap()) - ); - - pack(); - }// </editor-fold>//GEN-END:initComponents - -private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed - this.dispose(); -}//GEN-LAST:event_okButtonActionPerformed - - - // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JLabel GUILabel; - private javax.swing.JLabel GUIVersion; - private javax.swing.JLabel I2PVersion; - private javax.swing.JLabel I2Plabel; - private javax.swing.JButton okButton; - // End of variables declaration//GEN-END:variables - -} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/ClientTunnelWindow.properties b/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/ClientTunnelWindow.properties deleted file mode 100644 index ca036e197e1752d288ae5f38e2c12e0b7ab84718..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/ClientTunnelWindow.properties +++ /dev/null @@ -1,26 +0,0 @@ -# To change this template, choose Tools | Templates -# and open the template in the editor. - -Form.title=Client Tunnel Configuration -tunnelNameLabel.text=Name: -tunnelTypeLabel.text=Type: -tunnelType.text=jLabel10 -tunnelName.text=jTextField1 -tunnelPortLabel.text=Port: -tunnelPort.text=jTextField2 -tunnelDestination.text=jTextField3 -tunnelDestinationLabel.text=Destination: -tunnelProfileLabel.text=Profile: -delayConnect.text=Delay connect -sharedClient.text=Shared client -autoStart.text=Auto start -tunnelDepthLabel.text=Tunnel depth: -depthVarianceLabel.text=Depth variance: -tunnelCountLabel.text=Tunnel count: -backupTunnelCountLabel.text=Backup tunnel count: -reduceIdle.text=Reduce tunnel count when idle -closeIdle.text=Close tunnels when idle -delayIdle.text=Delay opening of tunnels when idle -save.text=Save -cancel.text=Cancel -changeTunnelState.text=Start Tunnel diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/GeneralConfiguration.properties b/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/GeneralConfiguration.properties deleted file mode 100644 index d53ac80d03922b090f0c3b028547339d3d982367..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/GeneralConfiguration.properties +++ /dev/null @@ -1,37 +0,0 @@ -cancel.text=Cancel -ok.text=OK -Form.title=General Configuration -speedPanel.TabConstraints.tabTitle=Speed -updatesPanel.TabConstraints.tabTitle=Updates -tunnelPanel.TabConstraints.tabTitle=Tunnels/Services -networkPanel.TabConstraints.tabTitle=Network -advancedPanel.TabConstraints.tabTitle=Advanced -uploadSpeedLabel.text=Upload speed: -downloadSpeedLabel.text=Download speed: -uploadspeed.text=jTextField1 -downloadspeed.text=jTextField2 -uploadgb.text=jTextField3 -downloadgb.text=jTextField4 -updateMethod.text=What is your preferred automatic update setting? -updateInform.text=Only inform about updates (not advised) -updateDownload.text=Download and verify update file, do not restart -updateDownloadRestart.text=Download, verify and restart -checkUpdates.text=Check for updates now -updateNow.text=Update available: update now -advancedUpdateConfig.text=Advanced update configuration -clientTunnelLabel.text=Client tunnels: -serverTunnelLabel.text=Server tunnels: -tunnelsExplanation.text=Click on a tunnel to view and change its configuration. + Tunnel explanation -uploadUsageLabel.text=Monthly usage: -downloadUsageLabel.text=Monthly usage: -gbUploadLabel.text=GB -gbDownloadLabel.text=GB -uploadDownloadExplanation.text=Explanation ... -clientTable.columnModel.title3=Status -clientTable.columnModel.title2=Address -clientTable.columnModel.title1=Type -clientTable.columnModel.title0=Name -serverTable.columnModel.title0=Name -serverTable.columnModel.title3=Title 4 -serverTable.columnModel.title2=Status -serverTable.columnModel.title1=Address diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/LogViewer.properties b/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/LogViewer.properties deleted file mode 100644 index d4ef5bf0e0c6c495848c2cd8f8988133c684121e..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/LogViewer.properties +++ /dev/null @@ -1,4 +0,0 @@ -refreshButton.text=Refresh -clearButton.text=Clear -explanationText.text=Explanation ... -Form.title=View Logs diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/ServerTunnelWindow.properties b/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/ServerTunnelWindow.properties deleted file mode 100644 index 683f3caa7fe17a5d055e58ce56d0c6887975e50e..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/ServerTunnelWindow.properties +++ /dev/null @@ -1 +0,0 @@ -jLabel1.text=Name: diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/SpeedSelector.properties b/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/SpeedSelector.properties deleted file mode 100644 index 00eb6c973db4796bd1dc942a21e542398244d456..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/SpeedSelector.properties +++ /dev/null @@ -1,6 +0,0 @@ - -Form.title=I2P Speed Configuration -nextButton.text=Next -uploadLabel.text=What is your maximum upload speed? -downloadLabel.text=What is your maximum download speed? -speedExplanation.text=<html>The maximum speed is set by your provider. It can be given in <b>kilobit (kbps)</b> or <b>kilobyte (kBps)</b>.<br />One kilobyte equals eight kilobit.</html> diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/SpeedSelector2.properties b/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/SpeedSelector2.properties deleted file mode 100644 index 909518ada2f2c92286a3ad909f4971148a8ad494..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/SpeedSelector2.properties +++ /dev/null @@ -1,9 +0,0 @@ -returnButton.text=Previous -Form.title=I2P Speed Configuration -questionLabel.text=Which of these descriptions fits you best? -browseButton.text=Browsing: I want to use I2P to browse websites anonymously, no heavy usage. -downloadButton.text=Downloading: I want to use I2P for downloads and filesharing, heavy usage. -nextButton.text=Next -browseButton.actionCommand=Browsing -downloadButton.actionCommand=Downloading -jLabel1.text=<html>I2P can be used for many different purposes. Here, we present two possible descriptions. If you use a lot of bandwidth in I2P (for example using downloading), please check the <b>downloading</b> option. If your bandwidth usage is limited, please check the <b>browsing</b> option.</html> diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/SpeedSelector3.properties b/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/SpeedSelector3.properties deleted file mode 100644 index 6dca3ca51603dd9a6667aea2588bda0812aecd5f..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/SpeedSelector3.properties +++ /dev/null @@ -1,17 +0,0 @@ -Form.title=I2P Configuration -previousButton.text=Previous -finishButton.text=Finish -uploadLabel.text=Upload Speed: -uploadBurstLabel.text=Burst Upload Speed: -downloadLabel.text=Download Speed: -downloadBurstLabel.text=Burst Download Speed: -uploadUsageLabel.text=GB -downloadUsageLabel.text=GB -uploadField.text=jTextField1 -uploadBurstField.text=jTextField2 -downloadField.text=jTextField4 -downloadBurstField.text=jTextField5 -uploadMonth.text=jTextField1 -downloadMonth.text=jTextField2 -settingsInfo.text=The profile information your entered, indicates that these are your optimal settings: -explanation.text=<html>We give a suggested upload and download speed. If your provider imposes a monthly bandwidth limit (usually given in <b>gigabyte (GB)</b>), please enter a value lower than that limit. If you run I2P only 50% of the time, you can double the bandwidth limit to use the same amount as when you are online 100% of the time.</html> diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/Version.properties b/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/Version.properties deleted file mode 100644 index c2030bb2d838b6859ded31c3fee5ef30beeba8f0..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/Version.properties +++ /dev/null @@ -1,6 +0,0 @@ -okButton.text=OK -I2Plabel.text=<html><h1>I2P Version:</h1></html> -GUILabel.text=<html><h1>GUI Version:</h1></html> -I2PVersion.text=jLabel3 -GUIVersion.text=jLabel4 -Form.title=Version diff --git a/apps/desktopgui/src/net/i2p/desktopgui/i18n/DesktopguiTranslator.java b/apps/desktopgui/src/net/i2p/desktopgui/i18n/DesktopguiTranslator.java new file mode 100644 index 0000000000000000000000000000000000000000..e95cbc01f28d438b290cd89e8a33a6867d9881d7 --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/i18n/DesktopguiTranslator.java @@ -0,0 +1,26 @@ +package net.i2p.desktopgui.i18n; + +import net.i2p.I2PAppContext; +import net.i2p.util.Translate; + +public class DesktopguiTranslator { + + private static final String BUNDLE_NAME = "net.i2p.desktopgui.messages"; + + private static I2PAppContext ctx; + + private static I2PAppContext getRouterContext() { + if(ctx == null) { + ctx = I2PAppContext.getCurrentContext(); + } + return ctx; + } + + public static String _(String s) { + return Translate.getString(s, getRouterContext(), BUNDLE_NAME); + } + + public static String _(String s, Object o) { + return Translate.getString(s, o, getRouterContext(), BUNDLE_NAME); + } +} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/package.html b/apps/desktopgui/src/net/i2p/desktopgui/package.html new file mode 100644 index 0000000000000000000000000000000000000000..ac1c91503b610f29092e04b1a82715dc7b71fba4 --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/package.html @@ -0,0 +1,5 @@ +<html> + <body> + <p>Desktopgui is a graphical interface to I2P that allows managing the lifecycle of I2P from the system tray.</p> + </body> +</html> diff --git a/apps/desktopgui/src/net/i2p/desktopgui/persistence/PropertyManager.java b/apps/desktopgui/src/net/i2p/desktopgui/persistence/PropertyManager.java deleted file mode 100644 index 770bd09570f16b90522e0042c183f792ccd58737..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/persistence/PropertyManager.java +++ /dev/null @@ -1,72 +0,0 @@ -package net.i2p.desktopgui.persistence; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.Properties; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * - * @author mathias - */ -public class PropertyManager { - - public static void setProps(Properties props) { - PropertyManager.props = props; - } - - public static Properties getProps() { - return props; - } - - public static Properties loadProps() { - Properties defaultProps = new Properties(); - defaultProps.setProperty("firstLoad", "true"); - - // create application properties with default - Properties applicationProps = new Properties(defaultProps); - - // now load properties from last invocation - FileInputStream in; - try { - in = new FileInputStream(PROPSLOCATION); - applicationProps.load(in); - in.close(); - } catch (FileNotFoundException ex) { - //Nothing serious, just means it's being loaded for the first time. - } catch(IOException ex) { - Logger.getLogger(PropertyManager.class.getName()).log(Level.INFO, null, ex); - } - props = applicationProps; - return applicationProps; - } - - public static void saveProps(Properties props) { - FileOutputStream out; - try { - File d = new File(PROPSDIRECTORY); - if(!d.exists()) - d.mkdir(); - File f = new File(PROPSLOCATION); - if(!f.exists()) - f.createNewFile(); - out = new FileOutputStream(f); - props.store(out, PROPSLOCATION); - } catch (FileNotFoundException ex) { - Logger.getLogger(PropertyManager.class.getName()).log(Level.SEVERE, null, ex); - } catch(IOException ex) { - Logger.getLogger(PropertyManager.class.getName()).log(Level.SEVERE, null, ex); - } - } - - private static Properties props; - - ///Location where we store the Application Properties - public static final String PROPSDIRECTORY = "desktopgui"; - public static final String PROPSFILENAME = "appProperties"; - public static final String PROPSLOCATION = PROPSDIRECTORY + File.separator + PROPSFILENAME; -} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/router/RouterHandler.java b/apps/desktopgui/src/net/i2p/desktopgui/router/RouterHandler.java deleted file mode 100644 index 022c5c8149659087f48433ee05b7ced2a9dfa7ef..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/router/RouterHandler.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ - -package net.i2p.desktopgui.router; - -import java.util.logging.Level; -import java.util.logging.Logger; -import net.i2p.router.RouterContext; - -/** - * - * @author mathias - */ -public class RouterHandler { - public static final int SHUTDOWN_GRACEFULLY = 0; - public static void setStatus(int status) { - if(status == SHUTDOWN_GRACEFULLY) { - Thread t = new Thread(new Runnable() { - - public void run() { - RouterContext context = RouterHelper.getContext(); - context.router().shutdownGracefully(); - while(context.router().getShutdownTimeRemaining()>0) - try { - Thread.sleep(context.router().getShutdownTimeRemaining()); - } catch (InterruptedException ex) { - Logger.getLogger(RouterHandler.class.getName()).log(Level.SEVERE, null, ex); - } - System.exit(0); - } - - }); - t.start(); - } - } -} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/router/RouterHelper.java b/apps/desktopgui/src/net/i2p/desktopgui/router/RouterHelper.java deleted file mode 100644 index 2da95f0c6a86d41f4e975532d689fc438922fa0a..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/router/RouterHelper.java +++ /dev/null @@ -1,22 +0,0 @@ -package net.i2p.desktopgui.router; - -import net.i2p.router.RouterContext; -import net.i2p.router.RouterVersion; - -/** - * - * @author mathias - */ -public class RouterHelper { - public static RouterContext getContext() { - return (RouterContext) RouterContext.listContexts().get(0); - } - - public static long getGracefulShutdownTimeRemaining() { - return RouterHelper.getContext().router().getShutdownTimeRemaining(); - } - - public static String getVersion() { - return (RouterVersion.VERSION + "-" + RouterVersion.BUILD); - } -} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/router/RouterManager.java b/apps/desktopgui/src/net/i2p/desktopgui/router/RouterManager.java new file mode 100644 index 0000000000000000000000000000000000000000..63f6ad588aaf02b4aa8dfee167a70165ffd7f820 --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/router/RouterManager.java @@ -0,0 +1,98 @@ +package net.i2p.desktopgui.router; + +import java.io.IOException; + +import org.tanukisoftware.wrapper.WrapperManager; + +import net.i2p.I2PAppContext; +import net.i2p.desktopgui.i18n.DesktopguiTranslator; +import net.i2p.desktopgui.util.ConfigurationManager; +import net.i2p.router.Router; +import net.i2p.router.RouterContext; +import net.i2p.util.Log; + +/** + * Handle communications with the router instance. + * @author mathias + * + */ +public class RouterManager { + + private final static Log log = new Log(RouterManager.class); + private static I2PAppContext context = I2PAppContext.getCurrentContext(); + + public static I2PAppContext getAppContext() { + return context; + } + + public static RouterContext getRouterContext() throws Exception { + if(context.isRouterContext()) { + return (RouterContext) context; + } + else { + throw new Exception("No RouterContext available!"); + } + } + + private static Router getRouter() { + try { + return getRouterContext().router(); + } catch (Exception e) { + log.error("Failed to get router. Why did we request it if no RouterContext is available?", e); + return null; + } + } + + /** + * Start an I2P router instance. + * This method has limited knowledge + * (there is no I2P instance running to collect information from). + * + * It determines the I2P location using the I2PAppContext. + */ + public static void start() { + try { + //TODO: set/get PID + String separator = System.getProperty("file.separator"); + String location = getAppContext().getBaseDir().getAbsolutePath(); + + Runtime.getRuntime().exec(location + separator + "i2psvc " + location + separator + "wrapper.config"); + } catch (IOException e) { + log.log(Log.WARN, "Failed to start I2P", e); + } + } + + /** + * Restart the running I2P instance. + */ + public static void restart() { + if(inI2P()) { + getRouter().restart(); + } + } + + /** + * Stop the running I2P instance. + */ + public static void shutDown() { + if(inI2P()) { + Thread t = new Thread(new Runnable() { + + @Override + public void run() { + WrapperManager.signalStopped(Router.EXIT_HARD); + } + + }); + t.start(); + getRouter().shutdown(Router.EXIT_HARD); + } + } + + /** + * Check if we are running inside I2P. + */ + public static boolean inI2P() { + return context.isRouterContext(); + } +} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/PeerHelper.java b/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/PeerHelper.java deleted file mode 100644 index 74df2b3d99ec0186ebda188743feb25bdbafa195..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/PeerHelper.java +++ /dev/null @@ -1,165 +0,0 @@ -package net.i2p.desktopgui.router.configuration; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.ArrayList; -import java.util.List; -import java.util.Timer; -import java.util.TimerTask; -import net.i2p.data.RouterAddress; -import net.i2p.router.CommSystemFacade; -import net.i2p.router.RouterContext; -import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade; -import net.i2p.router.transport.ntcp.NTCPAddress; -import net.i2p.desktopgui.router.RouterHelper; - -/** - * Part of the code imported and adapted from the I2P Router Console (which is licensed as public domain) - */ -public class PeerHelper { - public static String getReachability() { - RouterContext context = RouterHelper.getContext(); - if (context.router().getUptime() > 60*1000 - && (!context.router().gracefulShutdownInProgress()) - && !context.clientManager().isAlive()) - return "ERROR: Client Manager I2CP Error - check logs"; // not a router problem but the user should know - if (!context.clock().getUpdatedSuccessfully()) - return "ERROR: ClockSkew"; - if (context.router().isHidden()) - return "Hidden"; - - int status = context.commSystem().getReachabilityStatus(); - switch (status) { - case CommSystemFacade.STATUS_OK: - RouterAddress ra = context.router().getRouterInfo().getTargetAddress("NTCP"); - if (ra == null || (new NTCPAddress(ra)).isPubliclyRoutable()) - return "OK"; - return "ERROR: Private TCP Address"; - case CommSystemFacade.STATUS_DIFFERENT: - return "ERROR: You are behind a symmetric NAT."; - case CommSystemFacade.STATUS_REJECT_UNSOLICITED: - if (context.router().getRouterInfo().getTargetAddress("NTCP") != null) - return "WARNING: You are behind a firewall and have Inbound TCP Enabled"; - if (((FloodfillNetworkDatabaseFacade)context.netDb()).floodfillEnabled()) - return "WARNING: You are behind a firewall and are a floodfill router"; - if (context.router().getRouterInfo().getCapabilities().indexOf('O') >= 0) - return "WARNING: You are behind a firewall and are a fast router"; - return "Firewalled"; - case CommSystemFacade.STATUS_HOSED: - return "ERROR: The UDP port is already in use. Set i2np.udp.internalPort=xxxx to a different value in the advanced config and restart"; - case CommSystemFacade.STATUS_UNKNOWN: // fallthrough - default: - ra = context.router().getRouterInfo().getTargetAddress("SSU"); - if (ra == null && context.router().getUptime() > 5*60*1000) { - if (context.getProperty(PROP_I2NP_NTCP_HOSTNAME) == null || - context.getProperty(PROP_I2NP_NTCP_PORT) == null) - return "ERROR: UDP is disabled and the inbound TCP host/port combination is not set"; - else - return "WARNING: You are behind a firewall and have UDP Disabled"; - } - return "Testing"; - } - } - - /** - * How many peers we are talking to now - * - */ - public static int getActivePeers() { - RouterContext context = RouterHelper.getContext(); - if (context == null) - return 0; - else - return context.commSystem().countActivePeers(); - } - - public static void addActivePeerListener(ActionListener listener) { - synchronized(activePeerListeners) { - activePeerListeners.add(listener); - if(activePeerTimer == null) { - activePeerTimer = new Timer(); - TimerTask t = new TimerTask() { - private int activePeers = 0; - - @Override - public void run() { - int newActivePeers = getActivePeers(); - if(!(activePeers == newActivePeers)) { - synchronized(activePeerListeners) { - for(int i=0; i<activePeerListeners.size(); i++) { - activePeerListeners.get(i).actionPerformed(new ActionEvent(this, 0, "")); - } - } - activePeers = newActivePeers; - } - } - }; - activePeerTimer.schedule(t, 0, 60*1000); - } - } - } - - public static void removeActivePeerListener(ActionListener listener) { - synchronized(activePeerListeners) { - activePeerListeners.remove(listener); - if(activePeerListeners.size() == 0) { - activePeerTimer.cancel(); - activePeerTimer = null; - } - } - } - - - - public static void addReachabilityListener(ActionListener listener) { - synchronized(reachabilityListeners) { - reachabilityListeners.add(listener); - if(reachabilityTimer == null) { - reachabilityTimer = new Timer(); - TimerTask t = new TimerTask() { - - private String reachability = ""; - - @Override - public void run() { - String newReachability = getReachability(); - if(!reachability.equals(newReachability)) { - synchronized(reachabilityListeners) { - for(int i=0; i<reachabilityListeners.size(); i++) { - reachabilityListeners.get(i).actionPerformed(new ActionEvent(this, 0, "")); - } - } - reachability = newReachability; - } - } - - }; - reachabilityTimer.schedule(t, 0, 60*1000); - } - } - } - - public static void removeReachabilityListener(ActionListener listener) { - synchronized(reachabilityListeners) { - reachabilityListeners.remove(listener); - if(reachabilityListeners.size() == 0) { - reachabilityTimer.cancel(); - reachabilityTimer = null; - } - } - } - - private static List<ActionListener> reachabilityListeners = new ArrayList<ActionListener>(); - private static Timer reachabilityTimer = null; - - private static List<ActionListener> activePeerListeners = new ArrayList<ActionListener>(); - private static Timer activePeerTimer = null; - - /** copied from various private components */ - public final static String PROP_I2NP_UDP_PORT = "i2np.udp.port"; - public final static String PROP_I2NP_INTERNAL_UDP_PORT = "i2np.udp.internalPort"; - public final static String PROP_I2NP_NTCP_HOSTNAME = "i2np.ntcp.hostname"; - public final static String PROP_I2NP_NTCP_PORT = "i2np.ntcp.port"; - public final static String PROP_I2NP_NTCP_AUTO_PORT = "i2np.ntcp.autoport"; - public final static String PROP_I2NP_NTCP_AUTO_IP = "i2np.ntcp.autoip"; -} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/SpeedHandler.java b/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/SpeedHandler.java deleted file mode 100644 index 8fd67565787d35322c96c2eb82207ff0e1769118..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/SpeedHandler.java +++ /dev/null @@ -1,34 +0,0 @@ -package net.i2p.desktopgui.router.configuration; - -import net.i2p.router.RouterContext; -import net.i2p.router.transport.FIFOBandwidthRefiller; -import net.i2p.desktopgui.router.RouterHelper; - -/** - * - * @author mathias - */ -public class SpeedHandler { - - public static void setInboundBandwidth(int kbytes) { - context.router().setConfigSetting(FIFOBandwidthRefiller.PROP_INBOUND_BANDWIDTH, "" + kbytes); - context.router().saveConfig(); - } - - public static void setOutboundBandwidth(int kbytes) { - context.router().setConfigSetting(FIFOBandwidthRefiller.PROP_OUTBOUND_BANDWIDTH, "" + kbytes); - context.router().saveConfig(); - } - - public static void setInboundBurstBandwidth(int kbytes) { - context.router().setConfigSetting(FIFOBandwidthRefiller.PROP_INBOUND_BURST_BANDWIDTH, "" + kbytes); - context.router().saveConfig(); - } - - public static void setOutboundBurstBandwidth(int kbytes) { - context.router().setConfigSetting(FIFOBandwidthRefiller.PROP_OUTBOUND_BURST_BANDWIDTH, "" + kbytes); - context.router().saveConfig(); - } - - private static final RouterContext context = RouterHelper.getContext(); -} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/SpeedHelper.java b/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/SpeedHelper.java deleted file mode 100644 index 51b8b5a6f6e45455a7c8d8f2c22cb2148208eda1..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/SpeedHelper.java +++ /dev/null @@ -1,43 +0,0 @@ -package net.i2p.desktopgui.router.configuration; - -import net.i2p.router.transport.FIFOBandwidthRefiller; -import net.i2p.desktopgui.router.RouterHelper; - -/** - * - * @author mathias - */ -public class SpeedHelper { - public static final String USERTYPE_BROWSING = "Browsing"; - public static final String USERTYPE_DOWNLOADING = "Downloading"; - - public static int calculateSpeed(String capable, String profile) { - int capableSpeed = Integer.parseInt(capable); - int advisedSpeed = capableSpeed; - if(capableSpeed > 1000) { - if(profile.equals(USERTYPE_BROWSING)) //Don't overdo usage for people just wanting to browse (we don't want to drive them away due to resource hogging) - advisedSpeed *= 0.6; - else if(profile.equals(USERTYPE_DOWNLOADING)) - advisedSpeed *= 0.8; - } - else - advisedSpeed *= 0.6; //Lower available bandwidth: don't hog all the bandwidth - return advisedSpeed; - } - - public static int calculateMonthlyUsage(int kbytes) { - return (int) ((((long)kbytes)*3600*24*31)/1000000); - } - - public static int calculateSpeed(int gigabytes) { - return (int) (((long)gigabytes)*1000000/31/24/3600); - } - - public static String getInboundBandwidth() { - return RouterHelper.getContext().router().getConfigSetting(FIFOBandwidthRefiller.PROP_INBOUND_BANDWIDTH); - } - - public static String getOutboundBandwidth() { - return RouterHelper.getContext().router().getConfigSetting(FIFOBandwidthRefiller.PROP_OUTBOUND_BANDWIDTH); - } -} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/UpdateHandler.java b/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/UpdateHandler.java deleted file mode 100644 index e913f5e518a82420a4b3dc8e43ea5a748733a364..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/UpdateHandler.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ - -package net.i2p.desktopgui.router.configuration; - -import net.i2p.desktopgui.router.RouterHelper; - -/** - * - * @author mathias - */ -public class UpdateHandler { - public static void setUpdatePolicy(String policy) { - RouterHelper.getContext().router().setConfigSetting(UpdateHelper.PROP_UPDATE_POLICY, policy); - RouterHelper.getContext().router().saveConfig(); - } -} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/UpdateHelper.java b/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/UpdateHelper.java deleted file mode 100644 index 6e28db108cd52dab592862d417a857934783c542..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/UpdateHelper.java +++ /dev/null @@ -1,65 +0,0 @@ -package net.i2p.desktopgui.router.configuration; - -import net.i2p.desktopgui.router.RouterHelper; - -/** - * - * @author mathias - */ -public class UpdateHelper { - - public static final String PROP_NEWS_URL = "router.newsURL"; - public static final String DEFAULT_NEWS_URL = "http://echelon.i2p/i2p/news.xml"; - - public static final String PROP_REFRESH_FREQUENCY = "router.newsRefreshFrequency"; - public static final String DEFAULT_REFRESH_FREQUENCY = 24*60*60*1000 + ""; - - public static final String PROP_UPDATE_POLICY = "router.updatePolicy"; - public static final String NOTIFY_UPDATE_POLICY = "notify"; - public static final String DOWNLOAD_UPDATE_POLICY = "download"; - public static final String INSTALL_UPDATE_POLICY = "install"; - public static final String DEFAULT_UPDATE_POLICY = DOWNLOAD_UPDATE_POLICY; - - public static final String PROP_SHOULD_PROXY = "router.updateThroughProxy"; - public static final String DEFAULT_SHOULD_PROXY = Boolean.TRUE.toString(); - public static final String PROP_PROXY_HOST = "router.updateProxyHost"; - public static final String DEFAULT_PROXY_HOST = "127.0.0.1"; - public static final String PROP_PROXY_PORT = "router.updateProxyPort"; - public static final String DEFAULT_PROXY_PORT = "4444"; - - public static final String PROP_UPDATE_URL = "router.updateURL"; - public static final String DEFAULT_UPDATE_URL = - "http://echelon.i2p/i2p/i2pupdate.sud\r\n" + - "http://stats.i2p/i2p/i2pupdate.sud\r\n" + - "http://www.i2p2.i2p/_static/i2pupdate.sud\r\n" + - "http://update.postman.i2p/i2pupdate.sud" ; - - public static final String PROP_TRUSTED_KEYS = "router.trustedUpdateKeys"; - - public static String getNewsURL() { - String url = RouterHelper.getContext().getProperty(PROP_NEWS_URL); - if(url == null) { - return DEFAULT_NEWS_URL; - } - else { - return url; - } - } - - public static String getUpdatePolicy() { - String policy = null; - try { - policy = RouterHelper.getContext().getProperty(PROP_UPDATE_POLICY); - } - catch(Exception e) { - e.printStackTrace(); - } - System.out.println("Policy: " + policy); - if(policy == null) { - return DEFAULT_UPDATE_POLICY; - } - else { - return policy; - } - } -} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/util/BrowseException.java b/apps/desktopgui/src/net/i2p/desktopgui/util/BrowseException.java new file mode 100644 index 0000000000000000000000000000000000000000..a5e4f4350c7f5af98d643219323fdc8ce108c80e --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/util/BrowseException.java @@ -0,0 +1,23 @@ +package net.i2p.desktopgui.util; + +public class BrowseException extends Exception { + + private static final long serialVersionUID = 1L; + + public BrowseException() { + super(); + } + + public BrowseException(String s) { + super(s); + } + + public BrowseException(String s, Throwable t) { + super(s, t); + } + + public BrowseException(Throwable t) { + super(t); + } + +} \ No newline at end of file diff --git a/apps/desktopgui/src/net/i2p/desktopgui/util/ConfigurationManager.java b/apps/desktopgui/src/net/i2p/desktopgui/util/ConfigurationManager.java new file mode 100644 index 0000000000000000000000000000000000000000..d514f314a150470c4fb7bc3e0dc74a71a3f3028c --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/util/ConfigurationManager.java @@ -0,0 +1,103 @@ +package net.i2p.desktopgui.util; + +import java.util.HashMap; +import java.util.Map; + +/** + * Manage the configuration of desktopgui. + * @author mathias + * + */ +public class ConfigurationManager { + + private static ConfigurationManager instance; + ///Configurations with a String as value + private Map<String, String> stringConfigurations = new HashMap<String, String>(); + ///Configurations with a Boolean as value + private Map<String, Boolean> booleanConfigurations = new HashMap<String, Boolean>(); + + private ConfigurationManager() {} + + public static ConfigurationManager getInstance() { + if(instance == null) { + instance = new ConfigurationManager(); + } + return instance; + } + + /** + * Collects arguments of the form --word, --word=otherword and -blah + * to determine user parameters. + * @param args Command line arguments to the application + */ + public void loadArguments(String[] args) { + for(int i=0; i<args.length; i++) { + String arg = args[i]; + if(arg.startsWith("--")) { + arg = arg.substring(2); + if(arg.length() < 1) { + continue; + } + int equals = arg.indexOf('='); + if(equals != -1 && equals < arg.length() - 1) { //String configuration + loadStringConfiguration(arg, equals); + } + else { //Boolean configuration + loadBooleanConfiguration(arg); + } + } + else if(arg.startsWith("-")) { //Boolean configuration + loadBooleanConfiguration(arg); + } + } + } + + /** + * Add a boolean configuration. + * @param arg The key we wish to add as a configuration. + */ + public void loadBooleanConfiguration(String arg) { + booleanConfigurations.put(arg, Boolean.TRUE); + } + + /** + * Add a String configuration which consists a key and a value. + * @param arg String of the form substring1=substring2. + * @param equalsPosition Position of the '=' element. + */ + public void loadStringConfiguration(String arg, int equalsPosition) { + String key = arg.substring(0, equalsPosition); + String value = arg.substring(equalsPosition+1); + stringConfigurations.put(key, value); + } + + /** + * Check if a specific boolean configuration exists. + * @param arg The key for the configuration. + * @param defaultValue If the configuration is not found, we use a default value. + * @return The value of a configuration: true if found, defaultValue if not found. + */ + public boolean getBooleanConfiguration(String arg, boolean defaultValue) { + Boolean value = ((Boolean) booleanConfigurations.get("startWithI2P")); + System.out.println(value); + if(value != null) { + return value; + } + return defaultValue; + } + + /** + * Get a specific String configuration. + * @param arg The key for the configuration. + * @param defaultValue If the configuration is not found, we use a default value. + * @return The value of the configuration, or the defaultValue. + */ + public String getStringConfiguration(String arg, String defaultValue) { + String value = stringConfigurations.get(arg); + System.out.println(value); + if(value != null) { + return value; + } + return defaultValue; + } +} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/util/I2PDesktop.java b/apps/desktopgui/src/net/i2p/desktopgui/util/I2PDesktop.java new file mode 100644 index 0000000000000000000000000000000000000000..ad6e14cb315d8265f873a4ebe9cd04a87825eb7e --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/util/I2PDesktop.java @@ -0,0 +1,35 @@ +package net.i2p.desktopgui.util; + +import java.awt.Desktop; +import java.awt.TrayIcon; +import java.awt.Desktop.Action; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; + +import net.i2p.desktopgui.router.RouterManager; +import net.i2p.util.Log; + +public class I2PDesktop { + + private final static Log log = new Log(I2PDesktop.class); + + public static void browse(String url) throws BrowseException { + if(Desktop.isDesktopSupported()) { + Desktop desktop = Desktop.getDesktop(); + if(desktop.isSupported(Action.BROWSE)) { + try { + desktop.browse(new URI(url)); + } catch (Exception e) { + throw new BrowseException(); + } + } + else { + throw new BrowseException(); + } + } + else { + throw new BrowseException(); + } + } +} \ No newline at end of file diff --git a/apps/desktopgui/src/net/i2p/desktopgui/util/IntegerVerifier.java b/apps/desktopgui/src/net/i2p/desktopgui/util/IntegerVerifier.java deleted file mode 100644 index 7cc0fb46ae5ccd8b676a5f33137909e3d5c36dd9..0000000000000000000000000000000000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/util/IntegerVerifier.java +++ /dev/null @@ -1,32 +0,0 @@ -package net.i2p.desktopgui.util; - -import javax.swing.InputVerifier; -import javax.swing.JComponent; -import javax.swing.JTextField; - -/** - * - * @author mathias - */ - -public class IntegerVerifier extends InputVerifier { - - @Override - public boolean verify(JComponent arg0) { - JTextField jtf = (JTextField) arg0; - return verify(jtf.getText()); - } - - @Override - public boolean shouldYieldFocus(JComponent input) { - return verify(input); - } - - public static boolean verify(String s) { - for(int i=0;i<s.length();i++) - if(s.charAt(i) > '9' || s.charAt(i) < '0') - return false; - return true; - } - -} \ No newline at end of file diff --git a/apps/i2psnark/_icons/magnet.png b/apps/i2psnark/_icons/magnet.png new file mode 100644 index 0000000000000000000000000000000000000000..3430f2e5a9c08050cb90248f42315876fd04cb6a Binary files /dev/null and b/apps/i2psnark/_icons/magnet.png differ diff --git a/apps/i2psnark/java/bmsg.sh b/apps/i2psnark/java/bmsg.sh deleted file mode 100644 index b9d294b32336537241eb2f9953fb65673c93b524..0000000000000000000000000000000000000000 --- a/apps/i2psnark/java/bmsg.sh +++ /dev/null @@ -1,17 +0,0 @@ -# -# Update messages_xx.po and messages_xx.class files, -# from both java and jsp sources. -# Requires installed programs xgettext, msgfmt, msgmerge, and find. -# zzz - public domain -# - -## launching sh.exe with -login parameter will open a shell with the current path always pointing to \bin\ -## need to cd into our orignal path - where we call sh.exe from. - -cd $CALLFROM -## echo $PWD - -## except this everything is the same with bundle-message.sh -## walking - public domain :-D - -source bundle-messages.sh $PARAS \ No newline at end of file diff --git a/apps/i2psnark/java/build.xml b/apps/i2psnark/java/build.xml index 90f5cd6fe8f3c5c8b6ec2649f17016d1f7abad9b..e500dcc614fbbc4626266a302acb9b2d5e7ce136 100644 --- a/apps/i2psnark/java/build.xml +++ b/apps/i2psnark/java/build.xml @@ -30,18 +30,41 @@ srcdir="./src" debug="true" deprecation="on" source="1.5" target="1.5" destdir="./build/obj" + includeAntRuntime="false" classpath="../../../core/java/build/i2p.jar:../../jetty/jettylib/org.mortbay.jetty.jar:../../jetty/jettylib/javax.servlet.jar:../../ministreaming/java/build/mstreaming.jar" > <compilerarg line="${javac.compilerargs}" /> </javac> </target> - <target name="jar" depends="builddep, compile"> + + <target name="jar" depends="builddep, compile, jarUpToDate" unless="jar.uptodate" > + <exec executable="mtn" outputproperty="workspace.changes" errorproperty="mtn.error2" failifexecutionfails="false" > + <arg value="list" /> + <arg value="changed" /> + <arg value=".." /> + </exec> + <!-- \n in an attribute value generates an invalid manifest --> + <exec executable="tr" inputstring="${workspace.changes}" outputproperty="workspace.changes.tr" errorproperty="mtn.error2" failifexecutionfails="false" > + <arg value="-s" /> + <arg value="[:space:]" /> + <arg value="," /> + </exec> <jar destfile="./build/i2psnark.jar" basedir="./build/obj" includes="**/*.class" excludes="**/I2PSnarkServlet*.class **/messages_*.class"> <manifest> <attribute name="Main-Class" value="org.klomp.snark.Snark" /> <attribute name="Class-Path" value="i2p.jar mstreaming.jar streaming.jar" /> + <attribute name="Build-Date" value="${build.timestamp}" /> + <attribute name="Base-Revision" value="${workspace.version}" /> + <attribute name="Workspace-Changes" value="${workspace.changes.tr}" /> </manifest> </jar> </target> + + <target name="jarUpToDate"> + <uptodate property="jar.uptodate" targetfile="build/i2psnark.jar" > + <srcfiles dir= "build/obj" includes="**/*.class" excludes="**/I2PSnarkServlet*.class **/messages_*.class" /> + </uptodate> + </target> + <!-- Ideally we would include - only include the servlet, everything else is in the jar. - However, the wrapper.config classpath in existing installs @@ -49,25 +72,36 @@ - So we must continue to duplicate everything in the war. <classes dir="./build/obj" includes="**/I2PSnarkServlet*.class" /> --> - <target name="war" depends="jar, bundle"> + <target name="war" depends="jar, bundle, warUpToDate" unless="war.uptodate" > <war destfile="../i2psnark.war" webxml="../web.xml" basedir="../" includes="_icons/*" > <!-- include only the web stuff, as of 0.7.12 the router will add i2psnark.jar to the classpath for the war --> <classes dir="./build/obj" includes="**/web/*.class" /> + <manifest> + <attribute name="Build-Date" value="${build.timestamp}" /> + <attribute name="Base-Revision" value="${workspace.version}" /> + <attribute name="Workspace-Changes" value="${workspace.changes.tr}" /> + </manifest> </war> </target> + <target name="warUpToDate"> + <uptodate property="war.uptodate" targetfile="../i2psnark.war" > + <srcfiles dir= "." includes="build/obj/org/klomp/snark/web/*.class ../_icons/* ../web.xml" /> + </uptodate> + </target> + <target name="bundle" depends="compile"> <!-- Update the messages_*.po files. We need to supply the bat file for windows, and then change the fail property to true --> - <exec executable="sh" osfamily="unix" failifexecutionfails="false" > + <exec executable="sh" osfamily="unix" failifexecutionfails="true" > <arg value="./bundle-messages.sh" /> </exec> - <exec executable="sh" osfamily="mac" failifexecutionfails="false" > + <exec executable="sh" osfamily="mac" failifexecutionfails="true" > <arg value="./bundle-messages.sh" /> </exec> - <exec executable="cmd" osfamily="windows" failifexecutionfails="false" > - <arg value="/c" /> - <arg value="bundle-messages.bat" /> + <!-- multi-lang is optional --> + <exec executable="sh" osfamily="windows" failifexecutionfails="false" > + <arg value="./bundle-messages.sh" /> </exec> </target> @@ -81,9 +115,8 @@ <arg value="./bundle-messages.sh" /> <arg value="-p" /> </exec> - <exec executable="cmd" osfamily="windows" failifexecutionfails="true" > - <arg value="/c" /> - <arg value="bundle-messages.bat" /> + <exec executable="sh" osfamily="windows" failifexecutionfails="true" > + <arg value="./bundle-messages.sh" /> <arg value="-p" /> </exec> </target> diff --git a/apps/i2psnark/java/bundle-messages.bat b/apps/i2psnark/java/bundle-messages.bat deleted file mode 100644 index 90feca972a6457eebf97f9bdbea6028ac88d7789..0000000000000000000000000000000000000000 --- a/apps/i2psnark/java/bundle-messages.bat +++ /dev/null @@ -1,26 +0,0 @@ -@echo off -set Callfrom=%cd% -set Paras=%1 - -rem before calling make sure you have msys and mingw 's "bin" path -rem in your current searching path -rem type "set path" to check -if not exist ..\locale\*.only goto updateALL - -rem put a messages_xx.only(eg messages_zh.only) into locale folder -rem this script will only touch the po file(eg zh) you specified, leaving other po files untact. - -for %%i in (..\locale\*.only) do set PO=%%~ni -echo [Notice] Yu choose to Ony update the choosen file: %PO%.po -for %%i in (..\locale\*.po) do if not %%~ni==%PO% ren %%i %%~ni.po- - -call sh --login %cd%\bmsg.sh - -for %%i in (..\locale\*.po-) do if not %%~ni==%PO% ren %%i %%~ni.po -goto end - -:updateALL -call sh --login %cd%\bmsg.sh - -:end -echo End of Message Bundling \ No newline at end of file diff --git a/apps/i2psnark/java/bundle-messages.sh b/apps/i2psnark/java/bundle-messages.sh index c09aa811f94817e645cbc5b37c37870b058c2d31..64fc69f838a0765df2ac7e5e30a49d125a6e462d 100755 --- a/apps/i2psnark/java/bundle-messages.sh +++ b/apps/i2psnark/java/bundle-messages.sh @@ -18,6 +18,14 @@ then POUPDATE=1 fi +# on windows, one must specify the path of commnad find +# since windows has its own retarded version of find. +if which find|grep -q -i windows ; then + export PATH=.:/bin:/usr/local/bin:$PATH +fi +# Fast mode - update ondemond +# set LG2 to the language you need in envrionment varibales to enable this + # add ../java/ so the refs will work in the po file JPATHS="../java/src" for i in ../locale/messages_*.po @@ -26,6 +34,11 @@ do LG=${i#../locale/messages_} LG=${LG%.po} + # skip, if specified + if [ $LG2 ]; then + [ $LG != $LG2 ] && continue || echo INFO: Language update is set to [$LG2] only. + fi + if [ "$POUPDATE" = "1" ] then # make list of java files newer than the .po file @@ -70,15 +83,19 @@ do touch $i fi - echo "Generating ${CLASS}_$LG ResourceBundle..." + if [ "$LG" != "en" ] + then + # only generate for non-source language + echo "Generating ${CLASS}_$LG ResourceBundle..." - # convert to class files in build/obj - msgfmt --java --statistics -r $CLASS -l $LG -d build/obj $i - if [ $? -ne 0 ] - then - echo 'Warning - msgfmt failed, not updating translations' - break - fi + # convert to class files in build/obj + msgfmt --java --statistics -r $CLASS -l $LG -d build/obj $i + if [ $? -ne 0 ] + then + echo 'Warning - msgfmt failed, not updating translations' + break + fi + fi done rm -f $TMPFILE # todo: return failure diff --git a/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java b/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java index 52099d1d2e67bc5e657260ccb598a55369bf35a0..b4ba0f2996acd956d728a8e2d792d7a47dd16024 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java +++ b/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java @@ -137,6 +137,11 @@ public class ConnectionAcceptor implements Runnable } } } else { + if (socket.getPeerDestination().equals(_util.getMyDestination())) { + _util.debug("Incoming connection from myself", Snark.ERROR); + try { socket.close(); } catch (IOException ioe) {} + continue; + } Thread t = new I2PAppThread(new Handler(socket), "I2PSnark incoming connection"); t.start(); } @@ -174,11 +179,8 @@ public class ConnectionAcceptor implements Runnable try { InputStream in = _socket.getInputStream(); OutputStream out = _socket.getOutputStream(); - - if (true) { - in = new BufferedInputStream(in); - //out = new BufferedOutputStream(out); - } + // this is for the readahead in PeerAcceptor.connection() + in = new BufferedInputStream(in); if (_log.shouldLog(Log.DEBUG)) _log.debug("Handling socket from " + _socket.getPeerDestination().calculateHash().toBase64()); peeracceptor.connection(_socket, in, out); diff --git a/apps/i2psnark/java/src/org/klomp/snark/CoordinatorListener.java b/apps/i2psnark/java/src/org/klomp/snark/CoordinatorListener.java index a86afa781b6c32d7cd64bbd4d1d6920153c8aaa0..478c17bb507832aa2bdcd12a799513e870714380 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/CoordinatorListener.java +++ b/apps/i2psnark/java/src/org/klomp/snark/CoordinatorListener.java @@ -31,6 +31,12 @@ public interface CoordinatorListener */ void peerChange(PeerCoordinator coordinator, Peer peer); + /** + * Called when the PeerCoordinator got the MetaInfo via magnet. + * @since 0.8.4 + */ + void gotMetaInfo(PeerCoordinator coordinator, MetaInfo metainfo); + public boolean overUploadLimit(int uploaders); public boolean overUpBWLimit(); public boolean overUpBWLimit(long total); diff --git a/apps/i2psnark/java/src/org/klomp/snark/ExtensionHandler.java b/apps/i2psnark/java/src/org/klomp/snark/ExtensionHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..b3770070f4e99436f747a1ca8aee559b64bc51f5 --- /dev/null +++ b/apps/i2psnark/java/src/org/klomp/snark/ExtensionHandler.java @@ -0,0 +1,361 @@ +package org.klomp.snark; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import net.i2p.I2PAppContext; +import net.i2p.data.DataHelper; +import net.i2p.util.Log; + +import org.klomp.snark.bencode.BDecoder; +import org.klomp.snark.bencode.BEncoder; +import org.klomp.snark.bencode.BEValue; +import org.klomp.snark.bencode.InvalidBEncodingException; + +/** + * REF: BEP 10 Extension Protocol + * @since 0.8.2 + * @author zzz + */ +abstract class ExtensionHandler { + + private static final Log _log = I2PAppContext.getGlobalContext().logManager().getLog(ExtensionHandler.class); + + public static final int ID_HANDSHAKE = 0; + public static final int ID_METADATA = 1; + public static final String TYPE_METADATA = "ut_metadata"; + public static final int ID_PEX = 2; + /** not ut_pex since the compact format is different */ + public static final String TYPE_PEX = "i2p_pex"; + /** Pieces * SHA1 Hash length, + 25% extra for file names, benconding overhead, etc */ + private static final int MAX_METADATA_SIZE = Storage.MAX_PIECES * 20 * 5 / 4; + private static final int PARALLEL_REQUESTS = 3; + + + /** + * @param metasize -1 if unknown + * @return bencoded outgoing handshake message + */ + public static byte[] getHandshake(int metasize) { + Map<String, Object> handshake = new HashMap(); + Map<String, Integer> m = new HashMap(); + m.put(TYPE_METADATA, Integer.valueOf(ID_METADATA)); + m.put(TYPE_PEX, Integer.valueOf(ID_PEX)); + if (metasize >= 0) + handshake.put("metadata_size", Integer.valueOf(metasize)); + handshake.put("m", m); + handshake.put("p", Integer.valueOf(6881)); + handshake.put("v", "I2PSnark"); + handshake.put("reqq", Integer.valueOf(5)); + return BEncoder.bencode(handshake); + } + + public static void handleMessage(Peer peer, PeerListener listener, int id, byte[] bs) { + if (_log.shouldLog(Log.INFO)) + _log.info("Got extension msg " + id + " length " + bs.length + " from " + peer); + if (id == ID_HANDSHAKE) + handleHandshake(peer, listener, bs); + else if (id == ID_METADATA) + handleMetadata(peer, listener, bs); + else if (id == ID_PEX) + handlePEX(peer, listener, bs); + else if (_log.shouldLog(Log.INFO)) + _log.info("Unknown extension msg " + id + " from " + peer); + } + + private static void handleHandshake(Peer peer, PeerListener listener, byte[] bs) { + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Got handshake msg from " + peer); + try { + // this throws NPE on missing keys + InputStream is = new ByteArrayInputStream(bs); + BDecoder dec = new BDecoder(is); + BEValue bev = dec.bdecodeMap(); + Map<String, BEValue> map = bev.getMap(); + peer.setHandshakeMap(map); + Map<String, BEValue> msgmap = map.get("m").getMap(); + + if (msgmap.get(TYPE_PEX) != null) { + if (_log.shouldLog(Log.WARN)) + _log.debug("Peer supports PEX extension: " + peer); + // peer state calls peer listener calls sendPEX() + } + + MagnetState state = peer.getMagnetState(); + + if (msgmap.get(TYPE_METADATA) == null) { + if (_log.shouldLog(Log.WARN)) + _log.debug("Peer does not support metadata extension: " + peer); + // drop if we need metainfo and we haven't found anybody yet + synchronized(state) { + if (!state.isInitialized()) { + _log.debug("Dropping peer, we need metadata! " + peer); + peer.disconnect(); + } + } + return; + } + + BEValue msize = map.get("metadata_size"); + if (msize == null) { + if (_log.shouldLog(Log.WARN)) + _log.debug("Peer does not have the metainfo size yet: " + peer); + // drop if we need metainfo and we haven't found anybody yet + synchronized(state) { + if (!state.isInitialized()) { + _log.debug("Dropping peer, we need metadata! " + peer); + peer.disconnect(); + } + } + return; + } + int metaSize = msize.getInt(); + if (_log.shouldLog(Log.WARN)) + _log.debug("Got the metainfo size: " + metaSize); + + int remaining; + synchronized(state) { + if (state.isComplete()) + return; + + if (state.isInitialized()) { + if (state.getSize() != metaSize) { + if (_log.shouldLog(Log.WARN)) + _log.debug("Wrong metainfo size " + metaSize + " from: " + peer); + peer.disconnect(); + return; + } + } else { + // initialize it + if (metaSize > MAX_METADATA_SIZE) { + if (_log.shouldLog(Log.WARN)) + _log.debug("Huge metainfo size " + metaSize + " from: " + peer); + peer.disconnect(false); + return; + } + if (_log.shouldLog(Log.INFO)) + _log.info("Initialized state, metadata size = " + metaSize + " from " + peer); + state.initialize(metaSize); + } + remaining = state.chunksRemaining(); + } + + // send requests for chunks + int count = Math.min(remaining, PARALLEL_REQUESTS); + for (int i = 0; i < count; i++) { + int chk; + synchronized(state) { + chk = state.getNextRequest(); + } + if (_log.shouldLog(Log.INFO)) + _log.info("Request chunk " + chk + " from " + peer); + sendRequest(peer, chk); + } + } catch (Exception e) { + if (_log.shouldLog(Log.WARN)) + _log.warn("Handshake exception from " + peer, e); + } + } + + private static final int TYPE_REQUEST = 0; + private static final int TYPE_DATA = 1; + private static final int TYPE_REJECT = 2; + + private static final int CHUNK_SIZE = 16*1024; + + /** + * REF: BEP 9 + * @since 0.8.4 + */ + private static void handleMetadata(Peer peer, PeerListener listener, byte[] bs) { + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Got metadata msg from " + peer); + try { + InputStream is = new ByteArrayInputStream(bs); + BDecoder dec = new BDecoder(is); + BEValue bev = dec.bdecodeMap(); + Map<String, BEValue> map = bev.getMap(); + int type = map.get("msg_type").getInt(); + int piece = map.get("piece").getInt(); + + MagnetState state = peer.getMagnetState(); + if (type == TYPE_REQUEST) { + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Got request for " + piece + " from: " + peer); + byte[] pc; + synchronized(state) { + pc = state.getChunk(piece); + } + sendPiece(peer, piece, pc); + // Do this here because PeerConnectionOut only reports for PIECE messages + peer.uploaded(pc.length); + listener.uploaded(peer, pc.length); + } else if (type == TYPE_DATA) { + int size = map.get("total_size").getInt(); + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Got data for " + piece + " length " + size + " from: " + peer); + boolean done; + int chk = -1; + synchronized(state) { + if (state.isComplete()) + return; + int len = is.available(); + if (len != size) { + // probably fatal + if (_log.shouldLog(Log.WARN)) + _log.warn("total_size " + size + " but avail data " + len); + } + peer.downloaded(len); + listener.downloaded(peer, len); + done = state.saveChunk(piece, bs, bs.length - len, len); + if (_log.shouldLog(Log.INFO)) + _log.info("Got chunk " + piece + " from " + peer); + if (!done) + chk = state.getNextRequest(); + } + // out of the lock + if (done) { + // Done! + // PeerState will call the listener (peer coord), who will + // check to see if the MagnetState has it + if (_log.shouldLog(Log.WARN)) + _log.warn("Got last chunk from " + peer); + } else { + // get the next chunk + if (_log.shouldLog(Log.INFO)) + _log.info("Request chunk " + chk + " from " + peer); + sendRequest(peer, chk); + } + } else if (type == TYPE_REJECT) { + if (_log.shouldLog(Log.WARN)) + _log.warn("Got reject msg from " + peer); + peer.disconnect(false); + } else { + if (_log.shouldLog(Log.WARN)) + _log.warn("Got unknown metadata msg from " + peer); + peer.disconnect(false); + } + } catch (Exception e) { + if (_log.shouldLog(Log.WARN)) + _log.info("Metadata ext. msg. exception from " + peer, e); + // fatal ? + peer.disconnect(false); + } + } + + private static void sendRequest(Peer peer, int piece) { + sendMessage(peer, TYPE_REQUEST, piece); + } + + private static void sendReject(Peer peer, int piece) { + sendMessage(peer, TYPE_REJECT, piece); + } + + /** REQUEST and REJECT are the same except for message type */ + private static void sendMessage(Peer peer, int type, int piece) { + Map<String, Object> map = new HashMap(); + map.put("msg_type", Integer.valueOf(type)); + map.put("piece", Integer.valueOf(piece)); + byte[] payload = BEncoder.bencode(map); + try { + int hisMsgCode = peer.getHandshakeMap().get("m").getMap().get(TYPE_METADATA).getInt(); + peer.sendExtension(hisMsgCode, payload); + } catch (Exception e) { + // NPE, no metadata capability + if (_log.shouldLog(Log.WARN)) + _log.info("Metadata send req msg exception to " + peer, e); + } + } + + private static void sendPiece(Peer peer, int piece, byte[] data) { + Map<String, Object> map = new HashMap(); + map.put("msg_type", Integer.valueOf(TYPE_DATA)); + map.put("piece", Integer.valueOf(piece)); + map.put("total_size", Integer.valueOf(data.length)); + byte[] dict = BEncoder.bencode(map); + byte[] payload = new byte[dict.length + data.length]; + System.arraycopy(dict, 0, payload, 0, dict.length); + System.arraycopy(data, 0, payload, dict.length, data.length); + try { + int hisMsgCode = peer.getHandshakeMap().get("m").getMap().get(TYPE_METADATA).getInt(); + peer.sendExtension(hisMsgCode, payload); + } catch (Exception e) { + // NPE, no metadata caps + if (_log.shouldLog(Log.WARN)) + _log.info("Metadata send piece msg exception to " + peer, e); + } + } + + private static final int HASH_LENGTH = 32; + + /** + * Can't find a published standard for this anywhere. + * See the libtorrent code. + * Here we use the "added" key as a single string of concatenated + * 32-byte peer hashes. + * added.f and dropped unsupported + * @since 0.8.4 + */ + private static void handlePEX(Peer peer, PeerListener listener, byte[] bs) { + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Got PEX msg from " + peer); + try { + InputStream is = new ByteArrayInputStream(bs); + BDecoder dec = new BDecoder(is); + BEValue bev = dec.bdecodeMap(); + Map<String, BEValue> map = bev.getMap(); + byte[] ids = map.get("added").getBytes(); + if (ids.length < HASH_LENGTH) + return; + int len = Math.min(ids.length, (I2PSnarkUtil.MAX_CONNECTIONS - 1) * HASH_LENGTH); + List<PeerID> peers = new ArrayList(len / HASH_LENGTH); + for (int off = 0; off < len; off += HASH_LENGTH) { + byte[] hash = new byte[HASH_LENGTH]; + System.arraycopy(ids, off, hash, 0, HASH_LENGTH); + if (DataHelper.eq(hash, peer.getPeerID().getDestHash())) + continue; + PeerID pID = new PeerID(hash); + peers.add(pID); + } + // could include ourselves, listener must remove + listener.gotPeers(peer, peers); + } catch (Exception e) { + if (_log.shouldLog(Log.WARN)) + _log.info("PEX msg exception from " + peer, e); + //peer.disconnect(false); + } + } + + /** + * added.f and dropped unsupported + * @param pList non-null + * @since 0.8.4 + */ + public static void sendPEX(Peer peer, List<Peer> pList) { + if (pList.isEmpty()) + return; + Map<String, Object> map = new HashMap(); + byte[] peers = new byte[HASH_LENGTH * pList.size()]; + int off = 0; + for (Peer p : pList) { + System.arraycopy(p.getPeerID().getDestHash(), 0, peers, off, HASH_LENGTH); + off += HASH_LENGTH; + } + map.put("added", peers); + byte[] payload = BEncoder.bencode(map); + try { + int hisMsgCode = peer.getHandshakeMap().get("m").getMap().get(TYPE_PEX).getInt(); + peer.sendExtension(hisMsgCode, payload); + } catch (Exception e) { + // NPE, no PEX caps + if (_log.shouldLog(Log.WARN)) + _log.info("PEX msg exception to " + peer, e); + } + } + +} diff --git a/apps/i2psnark/java/src/org/klomp/snark/ExtensionHandshake.java b/apps/i2psnark/java/src/org/klomp/snark/ExtensionHandshake.java deleted file mode 100644 index fb69b044d284a7414f74b3e58a0b5773fd1c8419..0000000000000000000000000000000000000000 --- a/apps/i2psnark/java/src/org/klomp/snark/ExtensionHandshake.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.klomp.snark; - -import java.util.HashMap; -import java.util.Map; - -import org.klomp.snark.bencode.BEncoder; -import org.klomp.snark.bencode.BEValue; - -/** - * REF: BEP 10 Extension Protocol - * @since 0.8.2 - */ -class ExtensionHandshake { - - private static final byte[] _payload = buildPayload(); - - /** - * @return bencoded data - */ - static byte[] getPayload() { - return _payload; - } - - /** just a test for now */ - private static byte[] buildPayload() { - Map<String, Object> handshake = new HashMap(); - Map<String, Integer> m = new HashMap(); - m.put("foo", Integer.valueOf(99)); - m.put("bar", Integer.valueOf(101)); - handshake.put("m", m); - handshake.put("p", Integer.valueOf(6881)); - handshake.put("v", "I2PSnark"); - handshake.put("reqq", Integer.valueOf(5)); - return BEncoder.bencode(handshake); - } -} diff --git a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java index b36c0fdcbf493cb682fb3bc28d5d56f7b744027f..6f35f66bdfba4d7a50b4e81f7ed314c1098b8b00 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java +++ b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java @@ -34,6 +34,9 @@ import net.i2p.util.SimpleScheduler; import net.i2p.util.SimpleTimer; import net.i2p.util.Translate; +import org.klomp.snark.dht.DHT; +//import org.klomp.snark.dht.KRPC; + /** * I2P specific helpers for I2PSnark * We use this class as a sort of context for i2psnark @@ -58,6 +61,8 @@ public class I2PSnarkUtil { private int _maxConnections; private File _tmpDir; private int _startupDelay; + private boolean _shouldUseOT; + private DHT _dht; public static final int DEFAULT_STARTUP_DELAY = 3; public static final String PROP_USE_OPENTRACKERS = "i2psnark.useOpentrackers"; @@ -66,6 +71,9 @@ public class I2PSnarkUtil { public static final String DEFAULT_OPENTRACKERS = "http://tracker.welterde.i2p/a"; public static final int DEFAULT_MAX_UP_BW = 8; //KBps public static final int MAX_CONNECTIONS = 16; // per torrent + private static final String PROP_MAX_BW = "i2cp.outboundBytesPerSecond"; + //private static final boolean ENABLE_DHT = true; + public I2PSnarkUtil(I2PAppContext ctx) { _context = ctx; _log = _context.logManager().getLog(Snark.class); @@ -78,6 +86,7 @@ public class I2PSnarkUtil { _maxUpBW = DEFAULT_MAX_UP_BW; _maxConnections = MAX_CONNECTIONS; _startupDelay = DEFAULT_STARTUP_DELAY; + _shouldUseOT = DEFAULT_USE_OPENTRACKERS; // This is used for both announce replies and .torrent file downloads, // so it must be available even if not connected to I2CP. // so much for multiple instances @@ -124,9 +133,21 @@ public class I2PSnarkUtil { _configured = true; } + /** + * @param limit KBps + */ public void setMaxUpBW(int limit) { _maxUpBW = limit; + _opts.put(PROP_MAX_BW, Integer.toString(limit * (1024 * 6 / 5))); // add a little for overhead _configured = true; + if (_manager != null) { + I2PSession sess = _manager.getSession(); + if (sess != null) { + Properties newProps = new Properties(); + newProps.putAll(_opts); + sess.updateOptions(newProps); + } + } } public void setMaxConnections(int limit) { @@ -146,6 +167,10 @@ public class I2PSnarkUtil { public int getEepProxyPort() { return _proxyPort; } public boolean getEepProxySet() { return _shouldProxy; } public int getMaxUploaders() { return _maxUploaders; } + + /** + * @return KBps + */ public int getMaxUpBW() { return _maxUpBW; } public int getMaxConnections() { return _maxConnections; } public int getStartupDelay() { return _startupDelay; } @@ -158,7 +183,7 @@ public class I2PSnarkUtil { // try to find why reconnecting after stop if (_log.shouldLog(Log.DEBUG)) _log.debug("Connecting to I2P", new Exception("I did it")); - Properties opts = new Properties(); + Properties opts = _context.getProperties(); if (_opts != null) { for (Iterator iter = _opts.keySet().iterator(); iter.hasNext(); ) { String key = (String)iter.next(); @@ -187,10 +212,20 @@ public class I2PSnarkUtil { // opts.setProperty("i2p.streaming.readTimeout", "120000"); _manager = I2PSocketManagerFactory.createManager(_i2cpHost, _i2cpPort, opts); } + // FIXME this only instantiates krpc once, left stuck with old manager + //if (ENABLE_DHT && _manager != null && _dht == null) + // _dht = new KRPC(_context, _manager.getSession()); return (_manager != null); } + /** + * @return null if disabled or not started + * @since 0.8.4 + */ + public DHT getDHT() { return _dht; } + public boolean connected() { return _manager != null; } + /** * Destroy the destination itself */ @@ -214,6 +249,8 @@ public class I2PSnarkUtil { Destination addr = peer.getAddress(); if (addr == null) throw new IOException("Null address"); + if (addr.equals(getMyDestination())) + throw new IOException("Attempt to connect to myself"); Hash dest = addr.calculateHash(); if (_shitlist.contains(dest)) throw new IOException("Not trying to contact " + dest.toBase64() + ", as they are shitlisted"); @@ -287,15 +324,23 @@ public class I2PSnarkUtil { } String getOurIPString() { + Destination dest = getMyDestination(); + if (dest != null) + return dest.toBase64(); + return "unknown"; + } + + /** + * @return dest or null + * @since 0.8.4 + */ + Destination getMyDestination() { if (_manager == null) - return "unknown"; + return null; I2PSession sess = _manager.getSession(); - if (sess != null) { - Destination dest = sess.getMyDestination(); - if (dest != null) - return dest.toBase64(); - } - return "unknown"; + if (sess != null) + return sess.getMyDestination(); + return null; } /** Base64 only - static (no naming service) */ @@ -400,10 +445,10 @@ public class I2PSnarkUtil { /** comma delimited list open trackers to use as backups */ /** sorted map of name to announceURL=baseURL */ - public List getOpenTrackers() { + public List<String> getOpenTrackers() { if (!shouldUseOpenTrackers()) return null; - List rv = new ArrayList(1); + List<String> rv = new ArrayList(1); String trackers = getOpenTrackerString(); StringTokenizer tok = new StringTokenizer(trackers, ", "); while (tok.hasMoreTokens()) @@ -414,11 +459,27 @@ public class I2PSnarkUtil { return rv; } + public void setUseOpenTrackers(boolean yes) { + _shouldUseOT = yes; + } + public boolean shouldUseOpenTrackers() { - String rv = (String) _opts.get(PROP_USE_OPENTRACKERS); - if (rv == null) - return DEFAULT_USE_OPENTRACKERS; - return Boolean.valueOf(rv).booleanValue(); + return _shouldUseOT; + } + + /** + * Like DataHelper.toHexString but ensures no loss of leading zero bytes + * @since 0.8.4 + */ + public static String toHex(byte[] b) { + StringBuilder buf = new StringBuilder(40); + for (int i = 0; i < b.length; i++) { + int bi = b[i] & 0xff; + if (bi < 16) + buf.append('0'); + buf.append(Integer.toHexString(bi)); + } + return buf.toString(); } /** hook between snark's logger and an i2p log */ diff --git a/apps/i2psnark/java/src/org/klomp/snark/MagnetState.java b/apps/i2psnark/java/src/org/klomp/snark/MagnetState.java new file mode 100644 index 0000000000000000000000000000000000000000..da89f5577a643b4bf5a3e6f5e5453972e083825a --- /dev/null +++ b/apps/i2psnark/java/src/org/klomp/snark/MagnetState.java @@ -0,0 +1,211 @@ +package org.klomp.snark; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; +import java.util.Random; + +import net.i2p.I2PAppContext; +import net.i2p.data.DataHelper; + +import org.klomp.snark.bencode.BDecoder; +import org.klomp.snark.bencode.BEValue; + +/** + * Simple state for the download of the metainfo, shared between + * Peer and ExtensionHandler. + * + * Nothing is synchronized here! + * Caller must synchronize on this for everything! + * + * Reference: BEP 9 + * + * @since 0.8.4 + * author zzz + */ +class MagnetState { + public static final int CHUNK_SIZE = 16*1024; + private static final Random random = I2PAppContext.getGlobalContext().random(); + + private final byte[] infohash; + private boolean complete; + /** if false, nothing below is valid */ + private boolean isInitialized; + + private int metaSize; + private int totalChunks; + /** bitfield for the metainfo chunks - will remain null if we start out complete */ + private BitField requested; + private BitField have; + /** bitfield for the metainfo */ + private byte[] metainfoBytes; + /** only valid when finished */ + private MetaInfo metainfo; + + /** + * @param meta null for new magnet + */ + public MagnetState(byte[] iHash, MetaInfo meta) { + infohash = iHash; + if (meta != null) { + metainfo = meta; + initialize(meta.getInfoBytes().length); + complete = true; + } + } + + /** + * Call this for a new magnet when you have the size + * @throws IllegalArgumentException + */ + public void initialize(int size) { + if (isInitialized) + throw new IllegalArgumentException("already set"); + isInitialized = true; + metaSize = size; + totalChunks = (size + (CHUNK_SIZE - 1)) / CHUNK_SIZE; + if (metainfo != null) { + metainfoBytes = metainfo.getInfoBytes(); + } else { + // we don't need these if complete + have = new BitField(totalChunks); + requested = new BitField(totalChunks); + metainfoBytes = new byte[metaSize]; + } + } + + /** + * Call this for a new magnet when the download is complete. + * @throws IllegalArgumentException + */ + public void setMetaInfo(MetaInfo meta) { + metainfo = meta; + } + + /** + * @throws IllegalArgumentException + */ + public MetaInfo getMetaInfo() { + if (!complete) + throw new IllegalArgumentException("not complete"); + return metainfo; + } + + /** + * @throws IllegalArgumentException + */ + public int getSize() { + if (!isInitialized) + throw new IllegalArgumentException("not initialized"); + return metaSize; + } + + public boolean isInitialized() { + return isInitialized; + } + + public boolean isComplete() { + return complete; + } + + public int chunkSize(int chunk) { + return Math.min(CHUNK_SIZE, metaSize - (chunk * CHUNK_SIZE)); + } + + /** @return chunk count */ + public int chunksRemaining() { + if (!isInitialized) + throw new IllegalArgumentException("not initialized"); + if (complete) + return 0; + return totalChunks - have.count(); + } + + /** @return chunk number */ + public int getNextRequest() { + if (!isInitialized) + throw new IllegalArgumentException("not initialized"); + if (complete) + throw new IllegalArgumentException("complete"); + int rand = random.nextInt(totalChunks); + for (int i = 0; i < totalChunks; i++) { + int chk = (i + rand) % totalChunks; + if (!(have.get(chk) || requested.get(chk))) { + requested.set(chk); + return chk; + } + } + // all requested - end game + for (int i = 0; i < totalChunks; i++) { + int chk = (i + rand) % totalChunks; + if (!have.get(chk)) + return chk; + } + throw new IllegalArgumentException("complete"); + } + + /** + * @throws IllegalArgumentException + */ + public byte[] getChunk(int chunk) { + if (!complete) + throw new IllegalArgumentException("not complete"); + if (chunk < 0 || chunk >= totalChunks) + throw new IllegalArgumentException("bad chunk number"); + int size = chunkSize(chunk); + byte[] rv = new byte[size]; + System.arraycopy(metainfoBytes, chunk * CHUNK_SIZE, rv, 0, size); + // use meta.getInfoBytes() so we don't save it in memory + return rv; + } + + /** + * @return true if this was the last piece + * @throws NPE, IllegalArgumentException, IOException, ... + */ + public boolean saveChunk(int chunk, byte[] data, int off, int length) throws Exception { + if (!isInitialized) + throw new IllegalArgumentException("not initialized"); + if (chunk < 0 || chunk >= totalChunks) + throw new IllegalArgumentException("bad chunk number"); + if (have.get(chunk)) + return false; // shouldn't happen if synced + int size = chunkSize(chunk); + if (size != length) + throw new IllegalArgumentException("bad chunk length"); + System.arraycopy(data, off, metainfoBytes, chunk * CHUNK_SIZE, size); + have.set(chunk); + boolean done = have.complete(); + if (done) { + metainfo = buildMetaInfo(); + complete = true; + } + return done; + } + + /** + * @return true if this was the last piece + * @throws NPE, IllegalArgumentException, IOException, ... + */ + public MetaInfo buildMetaInfo() throws Exception { + // top map has nothing in it but the info map (no announce) + Map<String, BEValue> map = new HashMap(); + InputStream is = new ByteArrayInputStream(metainfoBytes); + BDecoder dec = new BDecoder(is); + BEValue bev = dec.bdecodeMap(); + map.put("info", bev); + MetaInfo newmeta = new MetaInfo(map); + if (!DataHelper.eq(newmeta.getInfoHash(), infohash)) { + // Disaster. Start over. ExtensionHandler will catch + // the IOE and disconnect the peer, hopefully we will + // find a new peer. + // TODO: Count fails and give up eventually + have = new BitField(totalChunks); + requested = new BitField(totalChunks); + throw new IOException("info hash mismatch"); + } + return newmeta; + } +} diff --git a/apps/i2psnark/java/src/org/klomp/snark/Message.java b/apps/i2psnark/java/src/org/klomp/snark/Message.java index a9d1e23f2532508d0f5a904d14f45253328e4497..b4344f3ba588a68049fd08aa52bda99da4d3e3b6 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Message.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Message.java @@ -53,6 +53,7 @@ class Message // Used for HAVE, REQUEST, PIECE and CANCEL messages. // low byte used for EXTENSION message + // low two bytes used for PORT message int piece; // Used for REQUEST, PIECE and CANCEL messages. @@ -67,7 +68,8 @@ class Message // Used to do deferred fetch of data DataLoader dataLoader; - SimpleTimer.TimedEvent expireEvent; + // now unused + //SimpleTimer.TimedEvent expireEvent; /** Utility method for sending a message through a DataStream. */ void sendMessage(DataOutputStream dos) throws IOException @@ -103,10 +105,13 @@ class Message if (type == REQUEST || type == CANCEL) datalen += 4; - // length is 1 byte + // msg type is 1 byte if (type == EXTENSION) datalen += 1; + if (type == PORT) + datalen += 2; + // add length of data for piece or bitfield array. if (type == BITFIELD || type == PIECE || type == EXTENSION) datalen += len; @@ -130,6 +135,9 @@ class Message if (type == EXTENSION) dos.writeByte((byte) piece & 0xff); + if (type == PORT) + dos.writeShort(piece & 0xffff); + // Send actual data if (type == BITFIELD || type == PIECE || type == EXTENSION) dos.write(data, off, len); @@ -160,6 +168,8 @@ class Message return "PIECE(" + piece + "," + begin + "," + length + ")"; case CANCEL: return "CANCEL(" + piece + "," + begin + "," + length + ")"; + case PORT: + return "PORT(" + piece + ")"; case EXTENSION: return "EXTENSION(" + piece + ',' + data.length + ')'; default: diff --git a/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java b/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java index ad2680045f19256d440de1db1860d482c925892c..5889db89ec3a91f03dd54edc173e164fd07c907d 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java +++ b/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java @@ -20,11 +20,13 @@ package org.klomp.snark; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -33,6 +35,7 @@ import java.util.Map; import net.i2p.I2PAppContext; import net.i2p.crypto.SHA1; import net.i2p.data.Base64; +import net.i2p.data.DataHelper; import net.i2p.util.Log; import org.klomp.snark.bencode.BDecoder; @@ -53,37 +56,49 @@ public class MetaInfo private final byte[] info_hash; private final String name; private final String name_utf8; - private final List files; - private final List files_utf8; - private final List lengths; + private final List<List<String>> files; + private final List<List<String>> files_utf8; + private final List<Long> lengths; private final int piece_length; private final byte[] piece_hashes; private final long length; - private final Map infoMap; + private Map<String, BEValue> infoMap; - private byte[] torrentdata; - - MetaInfo(String announce, String name, String name_utf8, List files, List lengths, + /** + * Called by Storage when creating a new torrent from local data + * + * @param announce may be null + * @param files null for single-file torrent + * @param lengths null for single-file torrent + */ + MetaInfo(String announce, String name, String name_utf8, List<List<String>> files, List<Long> lengths, int piece_length, byte[] piece_hashes, long length) { this.announce = announce; this.name = name; this.name_utf8 = name_utf8; - this.files = files; + this.files = files == null ? null : Collections.unmodifiableList(files); this.files_utf8 = null; - this.lengths = lengths; + this.lengths = lengths == null ? null : Collections.unmodifiableList(lengths); this.piece_length = piece_length; this.piece_hashes = piece_hashes; this.length = length; + // TODO if we add a parameter for other keys + //if (other != null) { + // otherInfo = new HashMap(2); + // otherInfo.putAll(other); + //} + this.info_hash = calculateInfoHash(); - infoMap = null; + //infoMap = null; } /** * Creates a new MetaInfo from the given InputStream. The * InputStream must start with a correctly bencoded dictonary * describing the torrent. + * Caller must close the stream. */ public MetaInfo(InputStream in) throws IOException { @@ -94,56 +109,69 @@ public class MetaInfo * Creates a new MetaInfo from the given BDecoder. The BDecoder * must have a complete dictionary describing the torrent. */ - public MetaInfo(BDecoder be) throws IOException + private MetaInfo(BDecoder be) throws IOException { // Note that evaluation order matters here... this(be.bdecodeMap().getMap()); + byte[] origInfohash = be.get_special_map_digest(); + // shouldn't ever happen + if (!DataHelper.eq(origInfohash, info_hash)) + throw new InvalidBEncodingException("Infohash mismatch, please report"); } /** * Creates a new MetaInfo from a Map of BEValues and the SHA1 over * the original bencoded info dictonary (this is a hack, we could * reconstruct the bencoded stream and recalculate the hash). Will - * throw a InvalidBEncodingException if the given map does not - * contain a valid announce string or info dictonary. + * NOT throw a InvalidBEncodingException if the given map does not + * contain a valid announce string. + * WILL throw a InvalidBEncodingException if the given map does not + * contain a valid info dictionary. */ - public MetaInfo(Map m) throws InvalidBEncodingException + public MetaInfo(Map<String, BEValue> m) throws InvalidBEncodingException { if (_log.shouldLog(Log.DEBUG)) _log.debug("Creating a metaInfo: " + m, new Exception("source")); - BEValue val = (BEValue)m.get("announce"); - if (val == null) - throw new InvalidBEncodingException("Missing announce string"); - this.announce = val.getString(); + BEValue val = m.get("announce"); + // Disabled check, we can get info from a magnet now + if (val == null) { + //throw new InvalidBEncodingException("Missing announce string"); + this.announce = null; + } else { + this.announce = val.getString(); + } - val = (BEValue)m.get("info"); + val = m.get("info"); if (val == null) throw new InvalidBEncodingException("Missing info map"); - Map info = val.getMap(); - infoMap = info; + Map<String, BEValue> info = val.getMap(); + infoMap = Collections.unmodifiableMap(info); - val = (BEValue)info.get("name"); + val = info.get("name"); if (val == null) throw new InvalidBEncodingException("Missing name string"); name = val.getString(); + // We could silently replace the '/', but that messes up the info hash, so just throw instead. + if (name.indexOf('/') >= 0) + throw new InvalidBEncodingException("Invalid name containing '/' " + name); - val = (BEValue)info.get("name.utf-8"); + val = info.get("name.utf-8"); if (val != null) name_utf8 = val.getString(); else name_utf8 = null; - val = (BEValue)info.get("piece length"); + val = info.get("piece length"); if (val == null) throw new InvalidBEncodingException("Missing piece length number"); piece_length = val.getInt(); - val = (BEValue)info.get("pieces"); + val = info.get("pieces"); if (val == null) throw new InvalidBEncodingException("Missing piece bytes"); piece_hashes = val.getBytes(); - val = (BEValue)info.get("length"); + val = info.get("length"); if (val != null) { // Single file case. @@ -155,44 +183,61 @@ public class MetaInfo else { // Multi file case. - val = (BEValue)info.get("files"); + val = info.get("files"); if (val == null) throw new InvalidBEncodingException ("Missing length number and/or files list"); - List list = val.getList(); + List<BEValue> list = val.getList(); int size = list.size(); if (size == 0) throw new InvalidBEncodingException("zero size files list"); - files = new ArrayList(size); - files_utf8 = new ArrayList(size); - lengths = new ArrayList(size); + List<List<String>> m_files = new ArrayList(size); + List<List<String>> m_files_utf8 = new ArrayList(size); + List<Long> m_lengths = new ArrayList(size); long l = 0; for (int i = 0; i < list.size(); i++) { - Map desc = ((BEValue)list.get(i)).getMap(); - val = (BEValue)desc.get("length"); + Map<String, BEValue> desc = list.get(i).getMap(); + val = desc.get("length"); if (val == null) throw new InvalidBEncodingException("Missing length number"); long len = val.getLong(); - lengths.add(new Long(len)); + if (len < 0) + throw new InvalidBEncodingException("Negative file length"); + m_lengths.add(Long.valueOf(len)); + // check for overflowing the long + long oldTotal = l; l += len; + if (l < oldTotal) + throw new InvalidBEncodingException("Huge total length"); val = (BEValue)desc.get("path"); if (val == null) throw new InvalidBEncodingException("Missing path list"); - List path_list = val.getList(); + List<BEValue> path_list = val.getList(); int path_length = path_list.size(); if (path_length == 0) throw new InvalidBEncodingException("zero size file path list"); - List file = new ArrayList(path_length); - Iterator it = path_list.iterator(); - while (it.hasNext()) - file.add(((BEValue)it.next()).getString()); + List<String> file = new ArrayList(path_length); + Iterator<BEValue> it = path_list.iterator(); + while (it.hasNext()) { + String s = it.next().getString(); + // We could throw an IBEE, but just silently replace instead. + if (s.indexOf('/') >= 0) + s = s.replace("/", "_"); + file.add(s); + } + + // quick dup check - case sensitive, etc. - Storage does a better job + for (int j = 0; j < i; j++) { + if (file.equals(m_files.get(j))) + throw new InvalidBEncodingException("Duplicate file path " + DataHelper.toString(file)); + } - files.add(file); + m_files.add(Collections.unmodifiableList(file)); val = (BEValue)desc.get("path.utf-8"); if (val != null) { @@ -202,19 +247,45 @@ public class MetaInfo file = new ArrayList(path_length); it = path_list.iterator(); while (it.hasNext()) - file.add(((BEValue)it.next()).getString()); - files_utf8.add(file); + file.add(it.next().getString()); + m_files_utf8.add(Collections.unmodifiableList(file)); } } } + files = Collections.unmodifiableList(m_files); + files_utf8 = Collections.unmodifiableList(m_files_utf8); + lengths = Collections.unmodifiableList(m_lengths); length = l; } info_hash = calculateInfoHash(); } + /** + * Efficiently returns the name and the 20 byte SHA1 hash of the info dictionary in a torrent file + * Caller must close stream. + * + * @param infoHashOut 20-byte out parameter + * @since 0.8.5 + */ + public static String getNameAndInfoHash(InputStream in, byte[] infoHashOut) throws IOException { + BDecoder bd = new BDecoder(in); + Map<String, BEValue> m = bd.bdecodeMap().getMap(); + BEValue ibev = m.get("info"); + if (ibev == null) + throw new InvalidBEncodingException("Missing info map"); + Map<String, BEValue> i = ibev.getMap(); + BEValue rvbev = i.get("name"); + if (rvbev == null) + throw new InvalidBEncodingException("Missing name"); + byte[] h = bd.get_special_map_digest(); + System.arraycopy(h, 0, infoHashOut, 0, 20); + return rvbev.getString(); + } + /** * Returns the string representing the URL of the tracker for this torrent. + * @return may be null! */ public String getAnnounce() { @@ -253,9 +324,8 @@ public class MetaInfo * a single name. It has the same size as the list returned by * getLengths(). */ - public List getFiles() + public List<List<String>> getFiles() { - // XXX - Immutable? return files; } @@ -264,9 +334,8 @@ public class MetaInfo * files, or null if it is a single file. It has the same size as * the list returned by getFiles(). */ - public List getLengths() + public List<Long> getLengths() { - // XXX - Immutable? return lengths; } @@ -303,11 +372,13 @@ public class MetaInfo */ public boolean checkPiece(int piece, byte[] bs, int off, int length) { - if (true) + //if (true) return fast_checkPiece(piece, bs, off, length); - else - return orig_checkPiece(piece, bs, off, length); + //else + // return orig_checkPiece(piece, bs, off, length); } + +/**** private boolean orig_checkPiece(int piece, byte[] bs, int off, int length) { // Check digest MessageDigest sha1; @@ -327,6 +398,7 @@ public class MetaInfo return false; return true; } +****/ private boolean fast_checkPiece(int piece, byte[] bs, int off, int length) { SHA1 sha1 = new SHA1(); @@ -350,7 +422,7 @@ public class MetaInfo @Override public String toString() { - return "MetaInfo[info_hash='" + hexencode(info_hash) + return "MetaInfo[info_hash='" + I2PSnarkUtil.toHex(info_hash) + "', announce='" + announce + "', name='" + name + "', files=" + files @@ -360,23 +432,6 @@ public class MetaInfo + "']"; } - /** - * Encode a byte array as a hex encoded string. - */ - private static String hexencode(byte[] bs) - { - StringBuilder sb = new StringBuilder(bs.length*2); - for (int i = 0; i < bs.length; i++) - { - int c = bs[i] & 0xFF; - if (c < 16) - sb.append('0'); - sb.append(Integer.toHexString(c)); - } - - return sb.toString(); - } - /** * Creates a copy of this MetaInfo that shares everything except the * announce URL. @@ -388,33 +443,43 @@ public class MetaInfo piece_hashes, length); } - public byte[] getTorrentData() + /** + * Called by servlet to save a new torrent file generated from local data + */ + public synchronized byte[] getTorrentData() { - if (torrentdata == null) - { Map m = new HashMap(); - m.put("announce", announce); + if (announce != null) + m.put("announce", announce); Map info = createInfoMap(); m.put("info", info); - torrentdata = BEncoder.bencode(m); - } - return torrentdata; + // don't save this locally, we should only do this once + return BEncoder.bencode(m); } - private Map createInfoMap() + /** @since 0.8.4 */ + public synchronized byte[] getInfoBytes() { + if (infoMap == null) + createInfoMap(); + return BEncoder.bencode(infoMap); + } + + /** @return an unmodifiable view of the Map */ + private Map<String, BEValue> createInfoMap() { + // If we loaded this metainfo from a file, we have the map, and we must use it + // or else we will lose any non-standard keys and corrupt the infohash. + if (infoMap != null) + return Collections.unmodifiableMap(infoMap); + // otherwise we must create it Map info = new HashMap(); - if (infoMap != null) { - info.putAll(infoMap); - return info; - } info.put("name", name); if (name_utf8 != null) info.put("name.utf-8", name_utf8); info.put("piece length", Integer.valueOf(piece_length)); info.put("pieces", piece_hashes); if (files == null) - info.put("length", new Long(length)); + info.put("length", Long.valueOf(length)); else { List l = new ArrayList(); @@ -429,26 +494,29 @@ public class MetaInfo } info.put("files", l); } - return info; + + // TODO if we add the ability for other keys in the first constructor + //if (otherInfo != null) + // info.putAll(otherInfo); + + infoMap = info; + return Collections.unmodifiableMap(infoMap); } private byte[] calculateInfoHash() { - Map info = createInfoMap(); - StringBuilder buf = new StringBuilder(128); - buf.append("info: "); - for (Iterator iter = info.entrySet().iterator(); iter.hasNext(); ) { - Map.Entry entry = (Map.Entry)iter.next(); - String key = (String)entry.getKey(); - Object val = entry.getValue(); - buf.append(key).append('='); - if (val instanceof byte[]) - buf.append(Base64.encode((byte[])val, true)); - else + Map<String, BEValue> info = createInfoMap(); + if (_log.shouldLog(Log.DEBUG)) { + StringBuilder buf = new StringBuilder(128); + buf.append("info: "); + for (Map.Entry<String, BEValue> entry : info.entrySet()) { + String key = entry.getKey(); + Object val = entry.getValue(); + buf.append(key).append('='); buf.append(val.toString()); - } - if (_log.shouldLog(Log.DEBUG)) + } _log.debug(buf.toString()); + } byte[] infoBytes = BEncoder.bencode(info); //_log.debug("info bencoded: [" + Base64.encode(infoBytes, true) + "]"); try @@ -456,7 +524,7 @@ public class MetaInfo MessageDigest digest = MessageDigest.getInstance("SHA"); byte hash[] = digest.digest(infoBytes); if (_log.shouldLog(Log.DEBUG)) - _log.debug("info hash: [" + net.i2p.data.Base64.encode(hash) + "]"); + _log.debug("info hash: " + I2PSnarkUtil.toHex(hash)); return hash; } catch(NoSuchAlgorithmException nsa) @@ -465,5 +533,23 @@ public class MetaInfo } } - + /** @since 0.8.5 */ + public static void main(String[] args) { + if (args.length <= 0) { + System.err.println("Usage: MetaInfo files..."); + return; + } + for (int i = 0; i < args.length; i++) { + InputStream in = null; + try { + in = new FileInputStream(args[i]); + MetaInfo meta = new MetaInfo(in); + System.out.println(args[i] + " InfoHash: " + I2PSnarkUtil.toHex(meta.getInfoHash())); + } catch (IOException ioe) { + System.err.println("Error in file " + args[i] + ": " + ioe); + } finally { + try { if (in != null) in.close(); } catch (IOException ioe) {} + } + } + } } diff --git a/apps/i2psnark/java/src/org/klomp/snark/Peer.java b/apps/i2psnark/java/src/org/klomp/snark/Peer.java index cd46bbf8b6a4b26da32515e6335700bf6fdaeef7..5489148121228bab903e2c4ac79ef7c1c03b979b 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Peer.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Peer.java @@ -20,7 +20,6 @@ package org.klomp.snark; -import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; @@ -28,28 +27,44 @@ import java.io.InputStream; import java.io.OutputStream; import java.util.Arrays; import java.util.List; +import java.util.Map; +import net.i2p.I2PAppContext; import net.i2p.client.streaming.I2PSocket; +import net.i2p.data.DataHelper; +import net.i2p.data.Destination; import net.i2p.util.Log; +import org.klomp.snark.bencode.BEValue; + public class Peer implements Comparable { - private Log _log = new Log(Peer.class); + private final Log _log = I2PAppContext.getGlobalContext().logManager().getLog(Peer.class); // Identifying property, the peer id of the other side. private final PeerID peerID; private final byte[] my_id; - final MetaInfo metainfo; + private final byte[] infohash; + /** will start out null in magnet mode */ + private MetaInfo metainfo; + private Map<String, BEValue> handshakeMap; // The data in/output streams set during the handshake and used by // the actual connections. private DataInputStream din; private DataOutputStream dout; + /** running counters */ + private long downloaded; + private long uploaded; + // Keeps state for in/out connections. Non-null when the handshake // was successful, the connection setup and runs PeerState state; + /** shared across all peers on this torrent */ + MagnetState magnetState; + private I2PSocket sock; private boolean deregister = true; @@ -64,18 +79,22 @@ public class Peer implements Comparable static final long OPTION_EXTENSION = 0x0000000000100000l; static final long OPTION_FAST = 0x0000000000000004l; static final long OPTION_DHT = 0x0000000000000001l; + /** we use a different bit since the compact format is different */ + static final long OPTION_I2P_DHT = 0x0000000040000000l; + static final long OPTION_AZMP = 0x1000000000000000l; private long options; /** * Outgoing connection. * Creates a disconnected peer given a PeerID, your own id and the * relevant MetaInfo. + * @param metainfo null if in magnet mode */ - public Peer(PeerID peerID, byte[] my_id, MetaInfo metainfo) - throws IOException + public Peer(PeerID peerID, byte[] my_id, byte[] infohash, MetaInfo metainfo) { this.peerID = peerID; this.my_id = my_id; + this.infohash = infohash; this.metainfo = metainfo; _id = ++__id; //_log.debug("Creating a new peer with " + peerID.toString(), new Exception("creating")); @@ -89,12 +108,14 @@ public class Peer implements Comparable * get the remote peer id. To completely start the connection call * the connect() method. * + * @param metainfo null if in magnet mode * @exception IOException when an error occurred during the handshake. */ - public Peer(final I2PSocket sock, InputStream in, OutputStream out, byte[] my_id, MetaInfo metainfo) + public Peer(final I2PSocket sock, InputStream in, OutputStream out, byte[] my_id, byte[] infohash, MetaInfo metainfo) throws IOException { this.my_id = my_id; + this.infohash = infohash; this.metainfo = metainfo; this.sock = sock; @@ -102,7 +123,7 @@ public class Peer implements Comparable this.peerID = new PeerID(id, sock.getPeerDestination()); _id = ++__id; if (_log.shouldLog(Log.DEBUG)) - _log.debug("Creating a new peer with " + peerID.toString(), new Exception("creating " + _id)); + _log.debug("Creating a new peer " + peerID.toString(), new Exception("creating " + _id)); } /** @@ -192,7 +213,7 @@ public class Peer implements Comparable * If the given BitField is non-null it is send to the peer as first * message. */ - public void runConnection(I2PSnarkUtil util, PeerListener listener, BitField bitfield) + public void runConnection(I2PSnarkUtil util, PeerListener listener, BitField bitfield, MagnetState mState) { if (state != null) throw new IllegalStateException("Peer already started"); @@ -212,19 +233,8 @@ public class Peer implements Comparable throw new IOException("Unable to reach " + peerID); } InputStream in = sock.getInputStream(); - OutputStream out = sock.getOutputStream(); //new BufferedOutputStream(sock.getOutputStream()); - if (true) { - // buffered output streams are internally synchronized, so we can't get through to the underlying - // I2PSocket's MessageOutputStream to close() it if we are blocking on a write(...). Oh, and the - // buffer is unnecessary anyway, as unbuffered access lets the streaming lib do the 'right thing'. - //out = new BufferedOutputStream(out); - in = new BufferedInputStream(sock.getInputStream()); - } - //BufferedInputStream bis - // = new BufferedInputStream(sock.getInputStream()); - //BufferedOutputStream bos - // = new BufferedOutputStream(sock.getOutputStream()); - byte [] id = handshake(in, out); //handshake(bis, bos); + OutputStream out = sock.getOutputStream(); + byte [] id = handshake(in, out); byte [] expected_id = peerID.getID(); if (expected_id == null) { peerID.setID(id); @@ -243,14 +253,29 @@ public class Peer implements Comparable _log.debug("Already have din [" + sock + "] with " + toString()); } + // bad idea? + if (metainfo == null && (options & OPTION_EXTENSION) == 0) { + if (_log.shouldLog(Log.INFO)) + _log.info("Peer does not support extensions and we need metainfo, dropping"); + throw new IOException("Peer does not support extensions and we need metainfo, dropping"); + } + PeerConnectionIn in = new PeerConnectionIn(this, din); PeerConnectionOut out = new PeerConnectionOut(this, dout); PeerState s = new PeerState(this, listener, metainfo, in, out); if ((options & OPTION_EXTENSION) != 0) { if (_log.shouldLog(Log.DEBUG)) - _log.debug("Peer supports extensions, sending test message"); - out.sendExtension(0, ExtensionHandshake.getPayload()); + _log.debug("Peer supports extensions, sending reply message"); + int metasize = metainfo != null ? metainfo.getInfoBytes().length : -1; + out.sendExtension(0, ExtensionHandler.getHandshake(metasize)); + } + + if ((options & OPTION_I2P_DHT) != 0 && util.getDHT() != null) { + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Peer supports DHT, sending PORT message"); + int port = util.getDHT().getPort(); + out.sendPort(port); } // Send our bitmap @@ -259,6 +284,7 @@ public class Peer implements Comparable // We are up and running! state = s; + magnetState = mState; listener.connected(this); if (_log.shouldLog(Log.DEBUG)) @@ -293,7 +319,7 @@ public class Peer implements Comparable * Sets DataIn/OutputStreams, does the handshake and returns the id * reported by the other side. */ - private byte[] handshake(InputStream in, OutputStream out) //BufferedInputStream bis, BufferedOutputStream bos) + private byte[] handshake(InputStream in, OutputStream out) throws IOException { din = new DataInputStream(in); @@ -303,10 +329,13 @@ public class Peer implements Comparable dout.write(19); dout.write("BitTorrent protocol".getBytes("UTF-8")); // Handshake write - options - dout.writeLong(OPTION_EXTENSION); + long myOptions = OPTION_EXTENSION; + // FIXME get util here somehow + //if (util.getDHT() != null) + // myOptions |= OPTION_I2P_DHT; + dout.writeLong(myOptions); // Handshake write - metainfo hash - byte[] shared_hash = metainfo.getInfoHash(); - dout.write(shared_hash); + dout.write(infohash); // Handshake write - peer id dout.write(my_id); dout.flush(); @@ -334,7 +363,7 @@ public class Peer implements Comparable // Handshake read - metainfo hash bs = new byte[20]; din.readFully(bs); - if (!Arrays.equals(shared_hash, bs)) + if (!Arrays.equals(infohash, bs)) throw new IOException("Unexpected MetaInfo hash"); // Handshake read - peer id @@ -342,8 +371,11 @@ public class Peer implements Comparable if (_log.shouldLog(Log.DEBUG)) _log.debug("Read the remote side's hash and peerID fully from " + toString()); + if (DataHelper.eq(my_id, bs)) + throw new IOException("Connected to myself"); + if (options != 0) { - // send them something + // send them something in runConnection() above if (_log.shouldLog(Log.DEBUG)) _log.debug("Peer supports options 0x" + Long.toString(options, 16) + ": " + toString()); } @@ -351,6 +383,55 @@ public class Peer implements Comparable return bs; } + /** @since 0.8.4 */ + public long getOptions() { + return options; + } + + /** @since 0.8.4 */ + public Destination getDestination() { + if (sock == null) + return null; + return sock.getPeerDestination(); + } + + /** + * Shared state across all peers, callers must sync on returned object + * @return non-null + * @since 0.8.4 + */ + public MagnetState getMagnetState() { + return magnetState; + } + + /** @return could be null @since 0.8.4 */ + public Map<String, BEValue> getHandshakeMap() { + return handshakeMap; + } + + /** @since 0.8.4 */ + public void setHandshakeMap(Map<String, BEValue> map) { + handshakeMap = map; + } + + /** @since 0.8.4 */ + public void sendExtension(int type, byte[] payload) { + PeerState s = state; + if (s != null) + s.out.sendExtension(type, payload); + } + + /** + * Switch from magnet mode to normal mode + * @since 0.8.4 + */ + public void setMetaInfo(MetaInfo meta) { + metainfo = meta; + PeerState s = state; + if (s != null) + s.setMetaInfo(meta); + } + public boolean isConnected() { return state != null; @@ -513,14 +594,29 @@ public class Peer implements Comparable return (s == null) || s.choked; } + /** + * Increment the counter. + * @since 0.8.4 + */ + public void downloaded(int size) { + downloaded += size; + } + + /** + * Increment the counter. + * @since 0.8.4 + */ + public void uploaded(int size) { + uploaded += size; + } + /** * Returns the number of bytes that have been downloaded. * Can be reset to zero with <code>resetCounters()</code>/ */ public long getDownloaded() { - PeerState s = state; - return (s != null) ? s.downloaded : 0; + return downloaded; } /** @@ -529,8 +625,7 @@ public class Peer implements Comparable */ public long getUploaded() { - PeerState s = state; - return (s != null) ? s.uploaded : 0; + return uploaded; } /** @@ -538,12 +633,8 @@ public class Peer implements Comparable */ public void resetCounters() { - PeerState s = state; - if (s != null) - { - s.downloaded = 0; - s.uploaded = 0; - } + downloaded = 0; + uploaded = 0; } public long getInactiveTime() { diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerAcceptor.java b/apps/i2psnark/java/src/org/klomp/snark/PeerAcceptor.java index 58ef3ae2db01c25582f858fcc26a74a095a46e41..0adb13d9b78f41a7735de614f8333fa0374f14c1 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerAcceptor.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerAcceptor.java @@ -88,12 +88,11 @@ public class PeerAcceptor } if (coordinator != null) { // single torrent capability - MetaInfo meta = coordinator.getMetaInfo(); - if (DataHelper.eq(meta.getInfoHash(), peerInfoHash)) { + if (DataHelper.eq(coordinator.getInfoHash(), peerInfoHash)) { if (coordinator.needPeers()) { Peer peer = new Peer(socket, in, out, coordinator.getID(), - coordinator.getMetaInfo()); + coordinator.getInfoHash(), coordinator.getMetaInfo()); coordinator.addPeer(peer); } else @@ -101,26 +100,25 @@ public class PeerAcceptor } else { // its for another infohash, but we are only single torrent capable. b0rk. throw new IOException("Peer wants another torrent (" + Base64.encode(peerInfoHash) - + ") while we only support (" + Base64.encode(meta.getInfoHash()) + ")"); + + ") while we only support (" + Base64.encode(coordinator.getInfoHash()) + ")"); } } else { // multitorrent capable, so lets see what we can handle for (Iterator iter = coordinators.iterator(); iter.hasNext(); ) { PeerCoordinator cur = (PeerCoordinator)iter.next(); - MetaInfo meta = cur.getMetaInfo(); - - if (DataHelper.eq(meta.getInfoHash(), peerInfoHash)) { + + if (DataHelper.eq(cur.getInfoHash(), peerInfoHash)) { if (cur.needPeers()) { Peer peer = new Peer(socket, in, out, cur.getID(), - cur.getMetaInfo()); + cur.getInfoHash(), cur.getMetaInfo()); cur.addPeer(peer); return; } else { if (_log.shouldLog(Log.DEBUG)) - _log.debug("Rejecting new peer for " + cur.snark.torrent); + _log.debug("Rejecting new peer for " + cur.getName()); socket.close(); return; } diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerCheckerTask.java b/apps/i2psnark/java/src/org/klomp/snark/PeerCheckerTask.java index aa9cf2187db0d855dd306199125d939f710ef64d..5d7b6d66db947808fde63b67e859c85dbec3191d 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerCheckerTask.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerCheckerTask.java @@ -37,7 +37,8 @@ class PeerCheckerTask extends TimerTask private static final long KILOPERSECOND = 1024*(PeerCoordinator.CHECK_PERIOD/1000); private final PeerCoordinator coordinator; - public I2PSnarkUtil _util; + private final I2PSnarkUtil _util; + private int _runCount; PeerCheckerTask(I2PSnarkUtil util, PeerCoordinator coordinator) { @@ -49,12 +50,10 @@ class PeerCheckerTask extends TimerTask public void run() { + _runCount++; List<Peer> peerList = coordinator.peerList(); if (peerList.isEmpty() || coordinator.halted()) { - coordinator.peerCount = 0; - coordinator.interestedAndChoking = 0; coordinator.setRateHistory(0, 0); - coordinator.uploaders = 0; if (coordinator.halted()) cancel(); return; @@ -206,7 +205,14 @@ class PeerCheckerTask extends TimerTask } } peer.retransmitRequests(); + // send PEX + if ((_runCount % 17) == 0 && !peer.isCompleted()) + coordinator.sendPeers(peer); peer.keepAlive(); + // announce them to local tracker (TrackerClient does this too) + if (_util.getDHT() != null && (_runCount % 5) == 0) { + _util.getDHT().announce(coordinator.getInfoHash(), peer.getPeerID().getDestHash()); + } } // Resync actual uploaders value @@ -247,8 +253,14 @@ class PeerCheckerTask extends TimerTask coordinator.setRateHistory(uploaded, downloaded); // close out unused files, but we don't need to do it every time - if (random.nextInt(4) == 0) - coordinator.getStorage().cleanRAFs(); + Storage storage = coordinator.getStorage(); + if (storage != null && (_runCount % 4) == 0) { + storage.cleanRAFs(); + } + // announce ourselves to local tracker (TrackerClient does this too) + if (_util.getDHT() != null && (_runCount % 16) == 0) { + _util.getDHT().announce(coordinator.getInfoHash()); + } } } diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionIn.java b/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionIn.java index 43bb9a7122ea121615b0646a2c096e1a20931e43..33da75263e9f20e69e3c9f2d3f932e9b9354b6c1 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionIn.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionIn.java @@ -32,6 +32,13 @@ class PeerConnectionIn implements Runnable private final Peer peer; private final DataInputStream din; + // The max length of a complete message in bytes. + // The biggest is the piece message, for which the length is the + // request size (32K) plus 9. (we could also check if Storage.MAX_PIECES / 8 + // in the bitfield message is bigger but it's currently 5000/8 = 625 so don't bother) + private static final int MAX_MSG_SIZE = Math.max(PeerState.PARTSIZE + 9, + MagnetState.CHUNK_SIZE + 100); // 100 for the ext msg dictionary + private Thread thread; private volatile boolean quit; @@ -77,20 +84,16 @@ class PeerConnectionIn implements Runnable int len; // Wait till we hear something... - // The length of a complete message in bytes. - // The biggest is the piece message, for which the length is the - // request size (32K) plus 9. (we could also check if Storage.MAX_PIECES / 8 - // in the bitfield message is bigger but it's currently 5000/8 = 625 so don't bother) int i = din.readInt(); lastRcvd = System.currentTimeMillis(); - if (i < 0 || i > PeerState.PARTSIZE + 9) + if (i < 0 || i > MAX_MSG_SIZE) throw new IOException("Unexpected length prefix: " + i); if (i == 0) { ps.keepAliveMessage(); if (_log.shouldLog(Log.DEBUG)) - _log.debug("Received keepalive from " + peer + " on " + peer.metainfo.getName()); + _log.debug("Received keepalive from " + peer); continue; } @@ -102,35 +105,35 @@ class PeerConnectionIn implements Runnable case 0: ps.chokeMessage(true); if (_log.shouldLog(Log.DEBUG)) - _log.debug("Received choke from " + peer + " on " + peer.metainfo.getName()); + _log.debug("Received choke from " + peer); break; case 1: ps.chokeMessage(false); if (_log.shouldLog(Log.DEBUG)) - _log.debug("Received unchoke from " + peer + " on " + peer.metainfo.getName()); + _log.debug("Received unchoke from " + peer); break; case 2: ps.interestedMessage(true); if (_log.shouldLog(Log.DEBUG)) - _log.debug("Received interested from " + peer + " on " + peer.metainfo.getName()); + _log.debug("Received interested from " + peer); break; case 3: ps.interestedMessage(false); if (_log.shouldLog(Log.DEBUG)) - _log.debug("Received not interested from " + peer + " on " + peer.metainfo.getName()); + _log.debug("Received not interested from " + peer); break; case 4: piece = din.readInt(); ps.haveMessage(piece); if (_log.shouldLog(Log.DEBUG)) - _log.debug("Received havePiece(" + piece + ") from " + peer + " on " + peer.metainfo.getName()); + _log.debug("Received havePiece(" + piece + ") from " + peer); break; case 5: byte[] bitmap = new byte[i-1]; din.readFully(bitmap); ps.bitfieldMessage(bitmap); if (_log.shouldLog(Log.DEBUG)) - _log.debug("Received bitmap from " + peer + " on " + peer.metainfo.getName() + ": size=" + (i-1) /* + ": " + ps.bitfield */ ); + _log.debug("Received bitmap from " + peer + ": size=" + (i-1) /* + ": " + ps.bitfield */ ); break; case 6: piece = din.readInt(); @@ -138,7 +141,7 @@ class PeerConnectionIn implements Runnable len = din.readInt(); ps.requestMessage(piece, begin, len); if (_log.shouldLog(Log.DEBUG)) - _log.debug("Received request(" + piece + "," + begin + ") from " + peer + " on " + peer.metainfo.getName()); + _log.debug("Received request(" + piece + "," + begin + ") from " + peer); break; case 7: piece = din.readInt(); @@ -152,7 +155,7 @@ class PeerConnectionIn implements Runnable din.readFully(piece_bytes, begin, len); ps.pieceMessage(req); if (_log.shouldLog(Log.DEBUG)) - _log.debug("Received data(" + piece + "," + begin + ") from " + peer + " on " + peer.metainfo.getName()); + _log.debug("Received data(" + piece + "," + begin + ") from " + peer); } else { @@ -160,7 +163,7 @@ class PeerConnectionIn implements Runnable piece_bytes = new byte[len]; din.readFully(piece_bytes); if (_log.shouldLog(Log.DEBUG)) - _log.debug("Received UNWANTED data(" + piece + "," + begin + ") from " + peer + " on " + peer.metainfo.getName()); + _log.debug("Received UNWANTED data(" + piece + "," + begin + ") from " + peer); } break; case 8: @@ -169,22 +172,28 @@ class PeerConnectionIn implements Runnable len = din.readInt(); ps.cancelMessage(piece, begin, len); if (_log.shouldLog(Log.DEBUG)) - _log.debug("Received cancel(" + piece + "," + begin + ") from " + peer + " on " + peer.metainfo.getName()); + _log.debug("Received cancel(" + piece + "," + begin + ") from " + peer); + break; + case 9: // PORT message + int port = din.readUnsignedShort(); + ps.portMessage(port); + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Received port message from " + peer); break; case 20: // Extension message int id = din.readUnsignedByte(); byte[] payload = new byte[i-2]; din.readFully(payload); - ps.extensionMessage(id, payload); if (_log.shouldLog(Log.DEBUG)) - _log.debug("Received extension message from " + peer + " on " + peer.metainfo.getName()); + _log.debug("Received extension message from " + peer); + ps.extensionMessage(id, payload); break; default: byte[] bs = new byte[i-1]; din.readFully(bs); ps.unknownMessage(b, bs); if (_log.shouldLog(Log.DEBUG)) - _log.debug("Received unknown message from " + peer + " on " + peer.metainfo.getName()); + _log.debug("Received unknown message from " + peer); } } } diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionOut.java b/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionOut.java index 38cb29e3b445dcae98e8589a59690af494b02c88..225edd4923a3c73fcd83633edfc9e3bda06cfe8d 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionOut.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionOut.java @@ -29,8 +29,8 @@ import java.util.List; import net.i2p.I2PAppContext; import net.i2p.util.I2PAppThread; import net.i2p.util.Log; -import net.i2p.util.SimpleScheduler; -import net.i2p.util.SimpleTimer; +//import net.i2p.util.SimpleScheduler; +//import net.i2p.util.SimpleTimer; class PeerConnectionOut implements Runnable { @@ -124,34 +124,34 @@ class PeerConnectionOut implements Runnable { if (state.choking) { it.remove(); - SimpleTimer.getInstance().removeEvent(nm.expireEvent); + //SimpleTimer.getInstance().removeEvent(nm.expireEvent); } nm = null; } else if (nm.type == Message.REQUEST && state.choked) { it.remove(); - SimpleTimer.getInstance().removeEvent(nm.expireEvent); + //SimpleTimer.getInstance().removeEvent(nm.expireEvent); nm = null; } if (m == null && nm != null) { m = nm; - SimpleTimer.getInstance().removeEvent(nm.expireEvent); + //SimpleTimer.getInstance().removeEvent(nm.expireEvent); it.remove(); } } if (m == null && !sendQueue.isEmpty()) { m = (Message)sendQueue.remove(0); - SimpleTimer.getInstance().removeEvent(m.expireEvent); + //SimpleTimer.getInstance().removeEvent(m.expireEvent); } } } if (m != null) { if (_log.shouldLog(Log.DEBUG)) - _log.debug("Send " + peer + ": " + m + " on " + peer.metainfo.getName()); + _log.debug("Send " + peer + ": " + m); // This can block for quite a while. // To help get slow peers going, and track the bandwidth better, @@ -241,6 +241,8 @@ class PeerConnectionOut implements Runnable /** remove messages not sent in 3m */ private static final int SEND_TIMEOUT = 3*60*1000; + +/***** private class RemoveTooSlow implements SimpleTimer.TimedEvent { private Message _m; public RemoveTooSlow(Message m) { @@ -258,6 +260,7 @@ class PeerConnectionOut implements Runnable _log.info("Took too long to send " + _m + " to " + peer); } } +*****/ /** * Removes a particular message type from the queue. @@ -474,7 +477,8 @@ class PeerConnectionOut implements Runnable m.off = 0; m.len = length; // since we have the data already loaded, queue a timeout to remove it - SimpleScheduler.getInstance().addEvent(new RemoveTooSlow(m), SEND_TIMEOUT); + // no longer prefetched + //SimpleScheduler.getInstance().addEvent(new RemoveTooSlow(m), SEND_TIMEOUT); addMessage(m); } @@ -547,4 +551,12 @@ class PeerConnectionOut implements Runnable m.len = bytes.length; addMessage(m); } + + /** @since 0.8.4 */ + void sendPort(int port) { + Message m = new Message(); + m.type = Message.PORT; + m.piece = port; + addMessage(m); + } } diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java index 8026f34f6826b51c7e703465642e847f54655fe8..11f0fff86f0e44b3591b9c8b62061877a62da121 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java @@ -27,33 +27,59 @@ import java.util.Collections; import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import java.util.Map; import java.util.Queue; import java.util.Random; +import java.util.Set; import java.util.concurrent.LinkedBlockingQueue; import net.i2p.I2PAppContext; +import net.i2p.data.DataHelper; +import net.i2p.data.Destination; +import net.i2p.util.ConcurrentHashSet; import net.i2p.util.I2PAppThread; import net.i2p.util.Log; import net.i2p.util.SimpleTimer2; +import org.klomp.snark.bencode.BEValue; +import org.klomp.snark.bencode.InvalidBEncodingException; +import org.klomp.snark.dht.DHT; + /** * Coordinates what peer does what. */ public class PeerCoordinator implements PeerListener { private final Log _log = I2PAppContext.getGlobalContext().logManager().getLog(PeerCoordinator.class); - final MetaInfo metainfo; - final Storage storage; - final Snark snark; + + /** + * External use by PeerMonitorTask only. + * Will be null when in magnet mode. + */ + MetaInfo metainfo; + + /** + * External use by PeerMonitorTask only. + * Will be null when in magnet mode. + */ + Storage storage; + private final Snark snark; // package local for access by CheckDownLoadersTask final static long CHECK_PERIOD = 40*1000; // 40 seconds final static int MAX_UPLOADERS = 6; - // Approximation of the number of current uploaders. - // Resynced by PeerChecker once in a while. - int uploaders = 0; - int interestedAndChoking = 0; + /** + * Approximation of the number of current uploaders. + * Resynced by PeerChecker once in a while. + * External use by PeerCheckerTask only. + */ + int uploaders; + + /** + * External use by PeerCheckerTask only. + */ + int interestedAndChoking; // final static int MAX_DOWNLOADERS = MAX_CONNECTIONS; // int downloaders = 0; @@ -61,19 +87,29 @@ public class PeerCoordinator implements PeerListener private long uploaded; private long downloaded; final static int RATE_DEPTH = 3; // make following arrays RATE_DEPTH long - private long uploaded_old[] = {-1,-1,-1}; - private long downloaded_old[] = {-1,-1,-1}; + private final long uploaded_old[] = {-1,-1,-1}; + private final long downloaded_old[] = {-1,-1,-1}; - // synchronize on this when changing peers or downloaders - // This is a Queue, not a Set, because PeerCheckerTask keeps things in order for choking/unchoking + /** + * synchronize on this when changing peers or downloaders. + * This is a Queue, not a Set, because PeerCheckerTask keeps things in order for choking/unchoking. + * External use by PeerMonitorTask only. + */ final Queue<Peer> peers; + + /** + * Peers we heard about via PEX + */ + private final Set<PeerID> pexPeers; + /** estimate of the peers, without requiring any synchronization */ - volatile int peerCount; + private volatile int peerCount; /** Timer to handle all periodical tasks. */ private final CheckEvent timer; private final byte[] id; + private final byte[] infohash; /** The wanted pieces. We could use a TreeSet but we'd have to clear and re-add everything * when priorities change. @@ -85,18 +121,21 @@ public class PeerCoordinator implements PeerListener private boolean halted = false; + private final MagnetState magnetState; private final CoordinatorListener listener; - public I2PSnarkUtil _util; + private final I2PSnarkUtil _util; private static final Random _random = I2PAppContext.getGlobalContext().random(); - public String trackerProblems = null; - public int trackerSeenPeers = 0; - - public PeerCoordinator(I2PSnarkUtil util, byte[] id, MetaInfo metainfo, Storage storage, + /** + * @param metainfo null if in magnet mode + * @param storage null if in magnet mode + */ + public PeerCoordinator(I2PSnarkUtil util, byte[] id, byte[] infohash, MetaInfo metainfo, Storage storage, CoordinatorListener listener, Snark torrent) { _util = util; this.id = id; + this.infohash = infohash; this.metainfo = metainfo; this.storage = storage; this.listener = listener; @@ -106,6 +145,8 @@ public class PeerCoordinator implements PeerListener setWantedPieces(); partialPieces = new ArrayList(getMaxConnections() + 1); peers = new LinkedBlockingQueue(); + magnetState = new MagnetState(infohash, metainfo); + pexPeers = new ConcurrentHashSet(); // Install a timer to check the uploaders. // Randomize the first start time so multiple tasks are spread out, @@ -133,6 +174,8 @@ public class PeerCoordinator implements PeerListener // only called externally from Storage after the double-check fails public void setWantedPieces() { + if (metainfo == null || storage == null) + return; // Make a list of pieces synchronized(wantedPieces) { wantedPieces.clear(); @@ -153,7 +196,6 @@ public class PeerCoordinator implements PeerListener } public Storage getStorage() { return storage; } - public CoordinatorListener getListener() { return listener; } // for web page detailed stats public List<Peer> peerList() @@ -166,8 +208,16 @@ public class PeerCoordinator implements PeerListener return id; } + public String getName() + { + return snark.getName(); + } + public boolean completed() { + // FIXME return metainfo complete status + if (storage == null) + return false; return storage.complete(); } @@ -184,9 +234,12 @@ public class PeerCoordinator implements PeerListener /** * Returns how many bytes are still needed to get the complete file. + * @return -1 if in magnet mode */ public long getLeft() { + if (metainfo == null | storage == null) + return -1; // XXX - Only an approximation. return ((long) storage.needed()) * metainfo.getPieceLength(0); } @@ -271,6 +324,12 @@ public class PeerCoordinator implements PeerListener return metainfo; } + /** @since 0.8.4 */ + public byte[] getInfoHash() + { + return infohash; + } + public boolean needPeers() { return !halted && peers.size() < getMaxConnections(); @@ -281,6 +340,8 @@ public class PeerCoordinator implements PeerListener * @return 512K: 16; 1M: 11; 2M: 6 */ private int getMaxConnections() { + if (metainfo == null) + return 6; int size = metainfo.getPieceLength(0); int max = _util.getMaxConnections(); if (size <= 512*1024 || completed()) @@ -355,8 +416,19 @@ public class PeerCoordinator implements PeerListener } else { - if (_log.shouldLog(Log.INFO)) - _log.info("New connection to peer: " + peer + " for " + metainfo.getName()); + if (_log.shouldLog(Log.INFO)) { + // just for logging + String name; + if (metainfo == null) + name = "Magnet"; + else + name = metainfo.getName(); + _log.info("New connection to peer: " + peer + " for " + name); + } + + // We may have gotten the metainfo after the peer was created. + if (metainfo != null) + peer.setMetaInfo(metainfo); // Add it to the beginning of the list. // And try to optimistically make it a uploader. @@ -415,17 +487,27 @@ public class PeerCoordinator implements PeerListener if (need_more) { - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Adding a peer " + peer.getPeerID().toString() + " for " + metainfo.getName(), new Exception("add/run")); - + if (_log.shouldLog(Log.DEBUG)) { + // just for logging + String name; + if (metainfo == null) + name = "Magnet"; + else + name = metainfo.getName(); + _log.debug("Adding a peer " + peer.getPeerID().toString() + " for " + name, new Exception("add/run")); + } // Run the peer with us as listener and the current bitfield. final PeerListener listener = this; - final BitField bitfield = storage.getBitField(); + final BitField bitfield; + if (storage != null) + bitfield = storage.getBitField(); + else + bitfield = null; Runnable r = new Runnable() { public void run() { - peer.runConnection(_util, listener, bitfield); + peer.runConnection(_util, listener, bitfield, magnetState); } }; String threadName = "Snark peer " + peer.toString(); @@ -486,11 +568,6 @@ public class PeerCoordinator implements PeerListener interestedAndChoking = count; } - public byte[] getBitMap() - { - return storage.getBitField().getFieldBytes(); - } - /** * @return true if we still want the given piece */ @@ -647,6 +724,8 @@ public class PeerCoordinator implements PeerListener * @since 0.8.1 */ public void updatePiecePriorities() { + if (storage == null) + return; int[] pri = storage.getPiecePriorities(); if (pri == null) { _log.debug("Updated piece priorities called but no priorities to set?"); @@ -708,11 +787,15 @@ public class PeerCoordinator implements PeerListener /** * Returns a byte array containing the requested piece or null of * the piece is unknown. + * + * @throws RuntimeException on IOE getting the data */ public byte[] gotRequest(Peer peer, int piece, int off, int len) { if (halted) return null; + if (metainfo == null || storage == null) + return null; try { @@ -721,8 +804,11 @@ public class PeerCoordinator implements PeerListener catch (IOException ioe) { snark.stopTorrent(); - _log.error("Error reading the storage for " + metainfo.getName(), ioe); - throw new RuntimeException("B0rked"); + String msg = "Error reading the storage (piece " + piece + ") for " + metainfo.getName() + ": " + ioe; + _log.error(msg, ioe); + SnarkManager.instance().addMessage(msg); + SnarkManager.instance().addMessage("Fatal storage error: Stopping torrent " + metainfo.getName()); + throw new RuntimeException(msg, ioe); } } @@ -752,9 +838,13 @@ public class PeerCoordinator implements PeerListener * Returns false if the piece is no good (according to the hash). * In that case the peer that supplied the piece should probably be * blacklisted. + * + * @throws RuntimeException on IOE saving the piece */ public boolean gotPiece(Peer peer, int piece, byte[] bs) { + if (metainfo == null || storage == null) + return true; if (halted) { _log.info("Got while-halted piece " + piece + "/" + metainfo.getPieces() +" from " + peer + " for " + metainfo.getName()); return true; // We don't actually care anymore. @@ -793,8 +883,11 @@ public class PeerCoordinator implements PeerListener catch (IOException ioe) { snark.stopTorrent(); - _log.error("Error writing storage for " + metainfo.getName(), ioe); - throw new RuntimeException("B0rked"); + String msg = "Error writing storage (piece " + piece + ") for " + metainfo.getName() + ": " + ioe; + _log.error(msg, ioe); + SnarkManager.instance().addMessage(msg); + SnarkManager.instance().addMessage("Fatal storage error: Stopping torrent " + metainfo.getName()); + throw new RuntimeException(msg, ioe); } wantedPieces.remove(p); } @@ -951,6 +1044,8 @@ public class PeerCoordinator implements PeerListener * @since 0.8.2 */ public PartialPiece getPartialPiece(Peer peer, BitField havePieces) { + if (metainfo == null) + return null; synchronized(wantedPieces) { // sorts by remaining bytes, least first Collections.sort(partialPieces); @@ -1057,6 +1152,107 @@ public class PeerCoordinator implements PeerListener } } + /** + * PeerListener callback + * @since 0.8.4 + */ + public void gotExtension(Peer peer, int id, byte[] bs) { + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Got extension message " + id + " from " + peer); + // basic handling done in PeerState... here we just check if we are done + if (metainfo == null && id == ExtensionHandler.ID_METADATA) { + synchronized (magnetState) { + if (magnetState.isComplete()) { + if (_log.shouldLog(Log.WARN)) + _log.warn("Got completed metainfo via extension"); + metainfo = magnetState.getMetaInfo(); + listener.gotMetaInfo(this, metainfo); + } + } + } else if (id == ExtensionHandler.ID_HANDSHAKE) { + sendPeers(peer); + } + } + + /** + * Send a PEX message to the peer, if he supports PEX. + * This just sends everybody we are connected to, we don't + * track new vs. old peers yet. + * @since 0.8.4 + */ + void sendPeers(Peer peer) { + Map<String, BEValue> handshake = peer.getHandshakeMap(); + if (handshake == null) + return; + BEValue bev = handshake.get("m"); + if (bev == null) + return; + try { + if (bev.getMap().get(ExtensionHandler.TYPE_PEX) != null) { + List<Peer> pList = peerList(); + pList.remove(peer); + if (!pList.isEmpty()) + ExtensionHandler.sendPEX(peer, pList); + } + } catch (InvalidBEncodingException ibee) {} + } + + /** + * Sets the storage after transition out of magnet mode + * Snark calls this after we call gotMetaInfo() + * @since 0.8.4 + */ + public void setStorage(Storage stg) { + storage = stg; + setWantedPieces(); + // ok we should be in business + for (Peer p : peers) { + p.setMetaInfo(metainfo); + } + } + + /** + * PeerListener callback + * Tell the DHT to ping it, this will get back the node info + * @since 0.8.4 + */ + public void gotPort(Peer peer, int port) { + DHT dht = _util.getDHT(); + if (dht != null) + dht.ping(peer.getDestination(), port); + } + + /** + * PeerListener callback + * @since 0.8.4 + */ + public void gotPeers(Peer peer, List<PeerID> peers) { + if (completed() || !needPeers()) + return; + Destination myDest = _util.getMyDestination(); + if (myDest == null) + return; + byte[] myHash = myDest.calculateHash().getData(); + List<Peer> pList = peerList(); + for (PeerID id : peers) { + if (peerIDInList(id, pList) != null) + continue; + if (DataHelper.eq(myHash, id.getDestHash())) + continue; + pexPeers.add(id); + } + // TrackerClient will poll for pexPeers and do the add in its thread, + // rather than running another thread here. + } + + /** + * Called by TrackerClient + * @since 0.8.4 + */ + Set<PeerID> getPEXPeers() { + return pexPeers; + } + /** Return number of allowed uploaders for this torrent. ** Check with Snark to see if we are over the total upload limit. */ @@ -1072,6 +1268,14 @@ public class PeerCoordinator implements PeerListener return MAX_UPLOADERS; } + /** + * @return current + * @since 0.8.4 + */ + public int getUploaders() { + return uploaders; + } + public boolean overUpBWLimit() { if (listener != null) diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerListener.java b/apps/i2psnark/java/src/org/klomp/snark/PeerListener.java index 975c12c1062c7096c51d5da5e0c2b4290838a74e..c7650a55249d4cf485598a97ccc968080fede24a 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerListener.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerListener.java @@ -179,4 +179,32 @@ interface PeerListener * @since 0.8.2 */ PartialPiece getPartialPiece(Peer peer, BitField havePieces); + + /** + * Called when an extension message is received. + * + * @param peer the Peer that got the message. + * @param id the message ID + * @param bs the message payload + * @since 0.8.4 + */ + void gotExtension(Peer peer, int id, byte[] bs); + + /** + * Called when a port message is received. + * + * @param peer the Peer that got the message. + * @param port the port + * @since 0.8.4 + */ + void gotPort(Peer peer, int port); + + /** + * Called when peers are received via PEX + * + * @param peer the Peer that got the message. + * @param pIDList the peer IDs (dest hashes) + * @since 0.8.4 + */ + void gotPeers(Peer peer, List<PeerID> pIDList); } diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerState.java b/apps/i2psnark/java/src/org/klomp/snark/PeerState.java index 5551bc90eb3284ccbf3c84c629d391bb15860d7c..111ddbbe61095716afb728fe84eea237e3cc685e 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerState.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerState.java @@ -32,15 +32,13 @@ import java.util.Set; import net.i2p.I2PAppContext; import net.i2p.util.Log; -import org.klomp.snark.bencode.BDecoder; -import org.klomp.snark.bencode.BEValue; - class PeerState implements DataLoader { private final Log _log = I2PAppContext.getGlobalContext().logManager().getLog(PeerState.class); private final Peer peer; + /** Fixme, used by Peer.disconnect() to get to the coordinator */ final PeerListener listener; - private final MetaInfo metainfo; + private MetaInfo metainfo; // Interesting and choking describes whether we are interested in or // are choking the other side. @@ -52,10 +50,6 @@ class PeerState implements DataLoader boolean interested = false; boolean choked = true; - // Package local for use by Peer. - long downloaded; - long uploaded; - /** the pieces the peer has */ BitField bitfield; @@ -74,6 +68,9 @@ class PeerState implements DataLoader public final static int PARTSIZE = 16*1024; // outbound request private final static int MAX_PARTSIZE = 64*1024; // Don't let anybody request more than this + /** + * @param metainfo null if in magnet mode + */ PeerState(Peer peer, PeerListener listener, MetaInfo metainfo, PeerConnectionIn in, PeerConnectionOut out) { @@ -135,6 +132,9 @@ class PeerState implements DataLoader { if (_log.shouldLog(Log.DEBUG)) _log.debug(peer + " rcv have(" + piece + ")"); + // FIXME we will lose these until we get the metainfo + if (metainfo == null) + return; // Sanity check if (piece < 0 || piece >= metainfo.getPieces()) { @@ -172,8 +172,15 @@ class PeerState implements DataLoader } // XXX - Check for weird bitfield and disconnect? - bitfield = new BitField(bitmap, metainfo.getPieces()); + // FIXME will have to regenerate the bitfield after we know exactly + // how many pieces there are, as we don't know how many spare bits there are. + if (metainfo == null) + bitfield = new BitField(bitmap, bitmap.length * 8); + else + bitfield = new BitField(bitmap, metainfo.getPieces()); } + if (metainfo == null) + return; boolean interest = listener.gotBitField(peer, bitfield); setInteresting(interest); if (bitfield.complete() && !interest) { @@ -191,6 +198,8 @@ class PeerState implements DataLoader if (_log.shouldLog(Log.DEBUG)) _log.debug(peer + " rcv request(" + piece + ", " + begin + ", " + length + ") "); + if (metainfo == null) + return; if (choking) { if (_log.shouldLog(Log.INFO)) @@ -273,7 +282,7 @@ class PeerState implements DataLoader */ void uploaded(int size) { - uploaded += size; + peer.uploaded(size); listener.uploaded(peer, size); } @@ -293,7 +302,7 @@ class PeerState implements DataLoader void pieceMessage(Request req) { int size = req.len; - downloaded += size; + peer.downloaded(size); listener.downloaded(peer, size); if (_log.shouldLog(Log.DEBUG)) @@ -314,9 +323,6 @@ class PeerState implements DataLoader { if (_log.shouldLog(Log.WARN)) _log.warn("Got BAD " + req.piece + " from " + peer); - // XXX ARGH What now !?! - // FIXME Why would we set downloaded to 0? - downloaded = 0; } } @@ -360,7 +366,6 @@ class PeerState implements DataLoader _log.info("Unrequested 'piece: " + piece + ", " + begin + ", " + length + "' received from " + peer); - downloaded = 0; // XXX - punishment? return null; } @@ -385,7 +390,6 @@ class PeerState implements DataLoader + begin + ", " + length + "' received from " + peer); - downloaded = 0; // XXX - punishment? return null; } @@ -485,22 +489,40 @@ class PeerState implements DataLoader /** @since 0.8.2 */ void extensionMessage(int id, byte[] bs) { - if (id == 0) { - InputStream is = new ByteArrayInputStream(bs); - try { - BDecoder dec = new BDecoder(is); - BEValue bev = dec.bdecodeMap(); - Map map = bev.getMap(); - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Got extension handshake message " + bev.toString()); - } catch (Exception e) { - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Failed extension decode", e); - } + ExtensionHandler.handleMessage(peer, listener, id, bs); + // Peer coord will get metadata from MagnetState, + // verify, and then call gotMetaInfo() + listener.gotExtension(peer, id, bs); + } + + /** + * Switch from magnet mode to normal mode. + * If we already have the metainfo, this does nothing. + * @param meta non-null + * @since 0.8.4 + */ + public void setMetaInfo(MetaInfo meta) { + if (metainfo != null) + return; + BitField oldBF = bitfield; + if (oldBF != null) { + if (oldBF.size() != meta.getPieces()) + // fix bitfield, it was too big by 1-7 bits + bitfield = new BitField(oldBF.getFieldBytes(), meta.getPieces()); + // else no extra } else { - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Got extended message type: " + id + " length: " + bs.length); + // it will be initialized later + //bitfield = new BitField(meta.getPieces()); } + metainfo = meta; + if (bitfield != null && bitfield.count() > 0) + setInteresting(true); + } + + /** @since 0.8.4 */ + void portMessage(int port) + { + listener.gotPort(peer, port); } void unknownMessage(int type, byte[] bs) @@ -619,6 +641,8 @@ class PeerState implements DataLoader // no bitfield yet? nothing to request then. if (bitfield == null) return; + if (metainfo == null) + return; boolean more_pieces = true; while (more_pieces) { diff --git a/apps/i2psnark/java/src/org/klomp/snark/Piece.java b/apps/i2psnark/java/src/org/klomp/snark/Piece.java index 6855d36a0ed293069ec7d3cdd1d5b4141e45a20c..dd48508a9a3ba761e22fb122c5c8d0d4197e23f9 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Piece.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Piece.java @@ -35,8 +35,8 @@ class Piece implements Comparable { @Override public boolean equals(Object o) { + if (o == null) return false; if (o instanceof Piece) { - if (o == null) return false; return this.id == ((Piece)o).id; } return false; diff --git a/apps/i2psnark/java/src/org/klomp/snark/Snark.java b/apps/i2psnark/java/src/org/klomp/snark/Snark.java index 31105a2693a6906d84114b8bc8a6af5bd2126115..c43679ed398e13a38ea4fe30a0c79a76ad73933e 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Snark.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Snark.java @@ -26,6 +26,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Properties; @@ -39,8 +40,6 @@ import net.i2p.client.streaming.I2PServerSocket; import net.i2p.data.Destination; import net.i2p.util.I2PThread; -import org.klomp.snark.bencode.BDecoder; - /** * Main Snark program startup class. * @@ -107,11 +106,13 @@ public class Snark } catch (Throwable t) { System.out.println("OOM in the OOM"); } - System.exit(0); + //System.exit(0); } } +/******** No, not maintaining a command-line client + public static void main(String[] args) { System.out.println(copyright); @@ -235,19 +236,28 @@ public class Snark } } +***********/ + public static final String PROP_MAX_CONNECTIONS = "i2psnark.maxConnections"; - public String torrent; - public MetaInfo meta; - public Storage storage; - public PeerCoordinator coordinator; - public ConnectionAcceptor acceptor; - public TrackerClient trackerclient; - public String rootDataDir = "."; - public CompleteListener completeListener; - public boolean stopped; - byte[] id; - public I2PSnarkUtil _util; - private PeerCoordinatorSet _peerCoordinatorSet; + + /** most of these used to be public, use accessors below instead */ + private String torrent; + private MetaInfo meta; + private Storage storage; + private PeerCoordinator coordinator; + private ConnectionAcceptor acceptor; + private TrackerClient trackerclient; + private String rootDataDir = "."; + private final CompleteListener completeListener; + private boolean stopped; + private byte[] id; + private byte[] infoHash; + private String additionalTrackerURL; + private final I2PSnarkUtil _util; + private final PeerCoordinatorSet _peerCoordinatorSet; + private String trackerProblems; + private int trackerSeenPeers; + /** from main() via parseArguments() single torrent */ Snark(I2PSnarkUtil util, String torrent, String ip, int user_port, @@ -306,31 +316,7 @@ public class Snark stopped = true; activity = "Network setup"; - // "Taking Three as the subject to reason about-- - // A convenient number to state-- - // We add Seven, and Ten, and then multiply out - // By One Thousand diminished by Eight. - // - // "The result we proceed to divide, as you see, - // By Nine Hundred and Ninety Two: - // Then subtract Seventeen, and the answer must be - // Exactly and perfectly true. - - // Create a new ID and fill it with something random. First nine - // zeros bytes, then three bytes filled with snark and then - // sixteen random bytes. - byte snark = (((3 + 7 + 10) * (1000 - 8)) / 992) - 17; - id = new byte[20]; - Random random = I2PAppContext.getGlobalContext().random(); - int i; - for (i = 0; i < 9; i++) - id[i] = 0; - id[i++] = snark; - id[i++] = snark; - id[i++] = snark; - while (i < 20) - id[i++] = (byte)random.nextInt(256); - + id = generateID(); debug("My peer id: " + PeerID.idencode(id), Snark.INFO); int port; @@ -372,7 +358,8 @@ public class Snark in = new FileInputStream(torrentFile); } } - meta = new MetaInfo(new BDecoder(in)); + meta = new MetaInfo(in); + infoHash = meta.getInfoHash(); } catch(IOException ioe) { @@ -406,6 +393,8 @@ public class Snark */ else fatal("Cannot open '" + torrent + "'", ioe); + } catch (OutOfMemoryError oom) { + fatal("ERROR - Out of memory, cannot create torrent " + torrent + ": " + oom.getMessage()); } finally { if (in != null) try { in.close(); } catch (IOException ioe) {} @@ -457,6 +446,66 @@ public class Snark if (start) startTorrent(); } + + /** + * multitorrent, magnet + * + * @param torrent a fake name for now (not a file name) + * @param ih 20-byte info hash + * @param trackerURL may be null + * @since 0.8.4 + */ + public Snark(I2PSnarkUtil util, String torrent, byte[] ih, String trackerURL, + CompleteListener complistener, PeerCoordinatorSet peerCoordinatorSet, + ConnectionAcceptor connectionAcceptor, boolean start, String rootDir) + { + completeListener = complistener; + _util = util; + _peerCoordinatorSet = peerCoordinatorSet; + acceptor = connectionAcceptor; + this.torrent = torrent; + this.infoHash = ih; + this.additionalTrackerURL = trackerURL; + this.rootDataDir = rootDir; + stopped = true; + id = generateID(); + + // All we have is an infoHash + // meta remains null + // storage remains null + + if (start) + startTorrent(); + } + + private static byte[] generateID() { + // "Taking Three as the subject to reason about-- + // A convenient number to state-- + // We add Seven, and Ten, and then multiply out + // By One Thousand diminished by Eight. + // + // "The result we proceed to divide, as you see, + // By Nine Hundred and Ninety Two: + // Then subtract Seventeen, and the answer must be + // Exactly and perfectly true. + + // Create a new ID and fill it with something random. First nine + // zeros bytes, then three bytes filled with snark and then + // sixteen random bytes. + byte snark = (((3 + 7 + 10) * (1000 - 8)) / 992) - 17; + byte[] rv = new byte[20]; + Random random = I2PAppContext.getGlobalContext().random(); + int i; + for (i = 0; i < 9; i++) + rv[i] = 0; + rv[i++] = snark; + rv[i++] = snark; + rv[i++] = snark; + while (i < 20) + rv[i++] = (byte)random.nextInt(256); + return rv; + } + /** * Start up contacting peers and querying the tracker */ @@ -473,7 +522,7 @@ public class Snark } debug("Starting PeerCoordinator, ConnectionAcceptor, and TrackerClient", NOTICE); activity = "Collecting pieces"; - coordinator = new PeerCoordinator(_util, id, meta, storage, this, this); + coordinator = new PeerCoordinator(_util, id, infoHash, meta, storage, this, this); if (_peerCoordinatorSet != null) { // multitorrent _peerCoordinatorSet.add(coordinator); @@ -486,7 +535,8 @@ public class Snark // single torrent acceptor = new ConnectionAcceptor(_util, serversocket, new PeerAcceptor(coordinator)); } - trackerclient = new TrackerClient(_util, meta, coordinator); + // TODO pass saved closest DHT nodes to the tracker? or direct to the coordinator? + trackerclient = new TrackerClient(_util, meta, additionalTrackerURL, coordinator, this); } stopped = false; @@ -496,8 +546,7 @@ public class Snark // restart safely, so lets build a new one to replace the old if (_peerCoordinatorSet != null) _peerCoordinatorSet.remove(coordinator); - PeerCoordinator newCoord = new PeerCoordinator(_util, coordinator.getID(), coordinator.getMetaInfo(), - coordinator.getStorage(), coordinator.getListener(), this); + PeerCoordinator newCoord = new PeerCoordinator(_util, id, infoHash, meta, storage, this, this); if (_peerCoordinatorSet != null) _peerCoordinatorSet.add(newCoord); coordinator = newCoord; @@ -506,22 +555,23 @@ public class Snark if (!trackerclient.started() && !coordinatorChanged) { trackerclient.start(); } else if (trackerclient.halted() || coordinatorChanged) { - try - { - storage.reopen(rootDataDir); - } - catch (IOException ioe) - { - try { storage.close(); } catch (IOException ioee) { - ioee.printStackTrace(); - } - fatal("Could not reopen storage", ioe); - } - TrackerClient newClient = new TrackerClient(_util, coordinator.getMetaInfo(), coordinator); + if (storage != null) { + try { + storage.reopen(rootDataDir); + } catch (IOException ioe) { + try { storage.close(); } catch (IOException ioee) { + ioee.printStackTrace(); + } + fatal("Could not reopen storage", ioe); + } + } + TrackerClient newClient = new TrackerClient(_util, meta, additionalTrackerURL, coordinator, this); if (!trackerclient.halted()) trackerclient.halt(); trackerclient = newClient; trackerclient.start(); + } else { + debug("NOT starting TrackerClient???", NOTICE); } } /** @@ -537,7 +587,7 @@ public class Snark pc.halt(); Storage st = storage; if (st != null) { - boolean changed = storage.changed; + boolean changed = storage.isChanged(); try { storage.close(); } catch (IOException ioe) { @@ -553,18 +603,246 @@ public class Snark _util.disconnect(); } - static Snark parseArguments(String[] args) + private static Snark parseArguments(String[] args) { return parseArguments(args, null, null); } + // Accessors + + /** + * @return file name of .torrent file (should be full absolute path), or a fake name if in magnet mode. + * @since 0.8.4 + */ + public String getName() { + return torrent; + } + + /** + * @return base name of torrent [filtered version of getMetaInfo.getName()], or a fake name if in magnet mode + * @since 0.8.4 + */ + public String getBaseName() { + if (storage != null) + return storage.getBaseName(); + return torrent; + } + + /** + * @return always will be valid even in magnet mode + * @since 0.8.4 + */ + public byte[] getID() { + return id; + } + + /** + * @return always will be valid even in magnet mode + * @since 0.8.4 + */ + public byte[] getInfoHash() { + // should always be the same + if (meta != null) + return meta.getInfoHash(); + return infoHash; + } + + /** + * @return may be null if in magnet mode + * @since 0.8.4 + */ + public MetaInfo getMetaInfo() { + return meta; + } + + /** + * @return may be null if in magnet mode + * @since 0.8.4 + */ + public Storage getStorage() { + return storage; + } + + /** + * @since 0.8.4 + */ + public boolean isStopped() { + return stopped; + } + + /** + * @since 0.8.4 + */ + public long getDownloadRate() { + PeerCoordinator coord = coordinator; + if (coord != null) + return coord.getDownloadRate(); + return 0; + } + + /** + * @since 0.8.4 + */ + public long getUploadRate() { + PeerCoordinator coord = coordinator; + if (coord != null) + return coord.getUploadRate(); + return 0; + } + + /** + * @since 0.8.4 + */ + public long getDownloaded() { + PeerCoordinator coord = coordinator; + if (coord != null) + return coord.getDownloaded(); + return 0; + } + + /** + * @since 0.8.4 + */ + public long getUploaded() { + PeerCoordinator coord = coordinator; + if (coord != null) + return coord.getUploaded(); + return 0; + } + + /** + * @since 0.8.4 + */ + public int getPeerCount() { + PeerCoordinator coord = coordinator; + if (coord != null) + return coord.getPeerCount(); + return 0; + } + + /** + * @since 0.8.4 + */ + public List<Peer> getPeerList() { + PeerCoordinator coord = coordinator; + if (coord != null) + return coord.peerList(); + return Collections.EMPTY_LIST; + } + + /** + * @return String returned from tracker, or null if no error + * @since 0.8.4 + */ + public String getTrackerProblems() { + return trackerProblems; + } + + /** + * @param p tracker error string or null + * @since 0.8.4 + */ + public void setTrackerProblems(String p) { + trackerProblems = p; + } + + /** + * @return count returned from tracker + * @since 0.8.4 + */ + public int getTrackerSeenPeers() { + return trackerSeenPeers; + } + + /** + * @since 0.8.4 + */ + public void setTrackerSeenPeers(int p) { + trackerSeenPeers = p; + } + + /** + * @since 0.8.4 + */ + public void updatePiecePriorities() { + PeerCoordinator coord = coordinator; + if (coord != null) + coord.updatePiecePriorities(); + } + + /** + * @return total of all torrent files, or total of metainfo file if fetching magnet, or -1 + * @since 0.8.4 + */ + public long getTotalLength() { + if (meta != null) + return meta.getTotalLength(); + // FIXME else return metainfo length if available + return -1; + } + + /** + * @return number of pieces still needed (magnet mode or not), or -1 if unknown + * @since 0.8.4 + */ + public long getNeeded() { + if (storage != null) + return storage.needed(); + if (meta != null) + // FIXME subtract chunks we have + return meta.getTotalLength(); + // FIXME fake + return -1; + } + + /** + * @param p the piece number + * @return metainfo piece length or 16K if fetching magnet + * @since 0.8.4 + */ + public int getPieceLength(int p) { + if (meta != null) + return meta.getPieceLength(p); + return 16*1024; + } + + /** + * @return number of pieces + * @since 0.8.4 + */ + public int getPieces() { + if (meta != null) + return meta.getPieces(); + // FIXME else return metainfo pieces if available + return -1; + } + + /** + * @return true if restarted + * @since 0.8.4 + */ + public boolean restartAcceptor() { + if (acceptor == null) + return false; + acceptor.restart(); + return true; + } + + /** + * @return trackerURL string from magnet-mode constructor, may be null + * @since 0.8.4 + */ + public String getTrackerURL() { + return additionalTrackerURL; + } + /** * Sets debug, ip and torrent variables then creates a Snark * instance. Calls usage(), which terminates the program, if * non-valid argument list. The given listeners will be * passed to all components that take one. */ - static Snark parseArguments(String[] args, + private static Snark parseArguments(String[] args, StorageListener slistener, CoordinatorListener clistener) { @@ -713,13 +991,12 @@ public class Snark (" <file> \tEither a local .torrent metainfo file to download"); System.out.println (" \tor (with --share) a file to share."); - System.exit(-1); } /** * Aborts program abnormally. */ - public void fatal(String s) + private void fatal(String s) { fatal(s, null); } @@ -727,14 +1004,14 @@ public class Snark /** * Aborts program abnormally. */ - public void fatal(String s, Throwable t) + private void fatal(String s, Throwable t) { _util.debug(s, ERROR, t); //System.err.println("snark: " + s + ((t == null) ? "" : (": " + t))); //if (debug >= INFO && t != null) // t.printStackTrace(); stopTorrent(); - throw new RuntimeException(s + (t == null ? "" : ": " + t)); + throw new RuntimeException(s, t); } /** @@ -751,7 +1028,36 @@ public class Snark // System.out.println(peer.toString()); } - boolean allocating = false; + /** + * Called when the PeerCoordinator got the MetaInfo via magnet. + * CoordinatorListener. + * Create the storage, tell SnarkManager, and give the storage + * back to the coordinator. + * + * @throws RuntimeException via fatal() + * @since 0.8.4 + */ + public void gotMetaInfo(PeerCoordinator coordinator, MetaInfo metainfo) { + meta = metainfo; + try { + storage = new Storage(_util, meta, this); + storage.check(rootDataDir); + if (completeListener != null) { + String newName = completeListener.gotMetaInfo(this); + if (newName != null) + torrent = newName; + // else some horrible problem + } + coordinator.setStorage(storage); + } catch (IOException ioe) { + if (storage != null) { + try { storage.close(); } catch (IOException ioee) {} + } + fatal("Could not check or create storage", ioe); + } + } + + private boolean allocating = false; public void storageCreateFile(Storage storage, String name, long length) { //if (allocating) @@ -774,9 +1080,9 @@ public class Snark // System.out.println(); // We have all the disk space we need. } - boolean allChecked = false; - boolean checking = false; - boolean prechecking = true; + private boolean allChecked = false; + private boolean checking = false; + private boolean prechecking = true; public void storageChecked(Storage storage, int num, boolean checked) { allocating = false; @@ -803,7 +1109,7 @@ public class Snark allChecked = true; checking = false; - if (storage.changed && completeListener != null) + if (storage.isChanged() && completeListener != null) completeListener.updateStatus(this); } @@ -821,16 +1127,28 @@ public class Snark coordinator.setWantedPieces(); } + /** SnarkSnutdown callback unused */ public void shutdown() { // Should not be necessary since all non-deamon threads should // have died. But in reality this does not always happen. - System.exit(0); + //System.exit(0); } public interface CompleteListener { public void torrentComplete(Snark snark); public void updateStatus(Snark snark); + + /** + * We transitioned from magnet mode, we have now initialized our + * metainfo and storage. The listener should now call getMetaInfo() + * and save the data to disk. + * + * @return the new name for the torrent or null on error + * @since 0.8.4 + */ + public String gotMetaInfo(Snark snark); + // not really listeners but the easiest way to get back to an optional SnarkManager public long getSavedTorrentTime(Snark snark); public BitField getSavedTorrentBitField(Snark snark); diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java index 82d1d80f4f53789bb8a06c21e709fd57ad261a44..695cd7b7a313597cd322c213e57e959094f21b73 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java +++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java @@ -5,6 +5,7 @@ import java.io.FileFilter; import java.io.FileInputStream; import java.io.FilenameFilter; import java.io.IOException; +import java.io.OutputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -16,14 +17,18 @@ import java.util.Set; import java.util.StringTokenizer; import java.util.TreeMap; import java.util.Collection; +import java.util.concurrent.ConcurrentHashMap; import net.i2p.I2PAppContext; import net.i2p.data.Base64; import net.i2p.data.DataHelper; +import net.i2p.util.ConcurrentHashSet; +import net.i2p.util.FileUtil; import net.i2p.util.I2PAppThread; import net.i2p.util.Log; import net.i2p.util.OrderedProperties; import net.i2p.util.SecureDirectory; +import net.i2p.util.SecureFileOutputStream; /** * Manage multiple snarks @@ -32,8 +37,14 @@ public class SnarkManager implements Snark.CompleteListener { private static SnarkManager _instance = new SnarkManager(); public static SnarkManager instance() { return _instance; } - /** map of (canonical) filename of the .torrent file to Snark instance (unsynchronized) */ + /** + * Map of (canonical) filename of the .torrent file to Snark instance. + * This is a CHM so listTorrentFiles() need not be synced, but + * all adds, deletes, and the DirMonitor should sync on it. + */ private final Map<String, Snark> _snarks; + /** used to prevent DirMonitor from deleting torrents that don't have a torrent file yet */ + private final Set<String> _magnets; private final Object _addSnarkLock; private /* FIXME final FIXME */ File _configFile; private Properties _config; @@ -57,6 +68,7 @@ public class SnarkManager implements Snark.CompleteListener { public static final String PROP_META_PREFIX = "i2psnark.zmeta."; public static final String PROP_META_BITFIELD_SUFFIX = ".bitfield"; public static final String PROP_META_PRIORITY_SUFFIX = ".priority"; + public static final String PROP_META_MAGNET_PREFIX = "i2psnark.magnet."; private static final String CONFIG_FILE = "i2psnark.config"; public static final String PROP_AUTO_START = "i2snark.autoStart"; // oops @@ -71,7 +83,8 @@ public class SnarkManager implements Snark.CompleteListener { public static final int DEFAULT_MAX_UP_BW = 10; public static final int DEFAULT_STARTUP_DELAY = 3; private SnarkManager() { - _snarks = new HashMap(); + _snarks = new ConcurrentHashMap(); + _magnets = new ConcurrentHashSet(); _addSnarkLock = new Object(); _context = I2PAppContext.getGlobalContext(); _log = _context.logManager().getLog(SnarkManager.class); @@ -90,8 +103,6 @@ public class SnarkManager implements Snark.CompleteListener { _running = true; _peerCoordinatorSet = new PeerCoordinatorSet(); _connectionAcceptor = new ConnectionAcceptor(_util); - int minutes = getStartupDelayMinutes(); - _messages.add(_("Adding torrents in {0} minutes", minutes)); _monitor = new I2PAppThread(new DirMonitor(), "Snark DirMonitor", true); _monitor.start(); _context.addShutdownTask(new SnarkManagerShutdown()); @@ -236,11 +247,9 @@ public class SnarkManager implements Snark.CompleteListener { i2cpOpts.put(pair.substring(0, split), pair.substring(split+1)); } } - if (i2cpHost != null) { - _util.setI2CPConfig(i2cpHost, i2cpPort, i2cpOpts); - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Configuring with I2CP options " + i2cpOpts); - } + _util.setI2CPConfig(i2cpHost, i2cpPort, i2cpOpts); + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Configuring with I2CP options " + i2cpOpts); //I2PSnarkUtil.instance().setI2CPConfig("66.111.51.110", 7654, new Properties()); //String eepHost = _config.getProperty(PROP_EEP_HOST); //int eepPort = getInt(PROP_EEP_PORT, 4444); @@ -252,7 +261,9 @@ public class SnarkManager implements Snark.CompleteListener { String ot = _config.getProperty(I2PSnarkUtil.PROP_OPENTRACKERS); if (ot != null) _util.setOpenTrackerString(ot); - // FIXME set util use open trackers property somehow + String useOT = _config.getProperty(I2PSnarkUtil.PROP_USE_OPENTRACKERS); + boolean bOT = useOT == null || Boolean.valueOf(useOT).booleanValue(); + _util.setUseOpenTrackers(bOT); getDataDir().mkdirs(); } @@ -321,15 +332,18 @@ public class SnarkManager implements Snark.CompleteListener { _util.setStartupDelay(minutes); changed = true; _config.setProperty(PROP_STARTUP_DELAY, "" + minutes); - addMessage(_("Startup delay limit changed to {0} minutes", minutes)); + addMessage(_("Startup delay changed to {0}", DataHelper.formatDuration2(minutes * 60 * 1000))); } } + // FIXME do this even if == null if (i2cpHost != null) { int oldI2CPPort = _util.getI2CPPort(); String oldI2CPHost = _util.getI2CPHost(); int port = oldI2CPPort; - try { port = Integer.parseInt(i2cpPort); } catch (NumberFormatException nfe) {} + if (i2cpPort != null) { + try { port = Integer.parseInt(i2cpPort); } catch (NumberFormatException nfe) {} + } String host = oldI2CPHost; Map opts = new HashMap(); if (i2cpOpts == null) i2cpOpts = ""; @@ -359,7 +373,7 @@ public class SnarkManager implements Snark.CompleteListener { Set names = listTorrentFiles(); for (Iterator iter = names.iterator(); iter.hasNext(); ) { Snark snark = getTorrent((String)iter.next()); - if ( (snark != null) && (!snark.stopped) ) { + if ( (snark != null) && (!snark.isStopped()) ) { snarksActive = true; break; } @@ -368,6 +382,7 @@ public class SnarkManager implements Snark.CompleteListener { Properties p = new Properties(); p.putAll(opts); _util.setI2CPConfig(i2cpHost, port, p); + _util.setMaxUpBW(getInt(PROP_UPBW_MAX, DEFAULT_MAX_UP_BW)); addMessage(_("I2CP and tunnel changes will take effect after stopping all torrents")); if (_log.shouldLog(Log.DEBUG)) _log.debug("i2cp host [" + i2cpHost + "] i2cp port " + port + " opts [" + opts @@ -381,6 +396,7 @@ public class SnarkManager implements Snark.CompleteListener { p.putAll(opts); addMessage(_("I2CP settings changed to {0}", i2cpHost + ":" + port + " (" + i2cpOpts.trim() + ")")); _util.setI2CPConfig(i2cpHost, port, p); + _util.setMaxUpBW(getInt(PROP_UPBW_MAX, DEFAULT_MAX_UP_BW)); boolean ok = _util.connect(); if (!ok) { addMessage(_("Unable to connect with the new settings, reverting to the old I2CP settings")); @@ -398,9 +414,8 @@ public class SnarkManager implements Snark.CompleteListener { for (Iterator iter = names.iterator(); iter.hasNext(); ) { String name = (String)iter.next(); Snark snark = getTorrent(name); - if ( (snark != null) && (snark.acceptor != null) ) { - snark.acceptor.restart(); - addMessage(_("I2CP listener restarted for \"{0}\"", snark.meta.getName())); + if (snark != null && snark.restartAcceptor()) { + addMessage(_("I2CP listener restarted for \"{0}\"", snark.getBaseName())); } } } @@ -422,6 +437,7 @@ public class SnarkManager implements Snark.CompleteListener { addMessage(_("Enabled open trackers - torrent restart required to take effect.")); else addMessage(_("Disabled open trackers - torrent restart required to take effect.")); + _util.setUseOpenTrackers(useOpenTrackers); changed = true; } if (openTrackers != null) { @@ -461,8 +477,13 @@ public class SnarkManager implements Snark.CompleteListener { /** hardcoded for sanity. perhaps this should be customizable, for people who increase their ulimit, etc. */ private static final int MAX_FILES_PER_TORRENT = 512; - /** set of canonical .torrent filenames that we are dealing with */ - public Set<String> listTorrentFiles() { synchronized (_snarks) { return new HashSet(_snarks.keySet()); } } + /** + * Set of canonical .torrent filenames that we are dealing with. + * An unsynchronized copy. + */ + public Set<String> listTorrentFiles() { + return new HashSet(_snarks.keySet()); + } /** * Grab the torrent given the (canonical) filename of the .torrent file @@ -478,18 +499,39 @@ public class SnarkManager implements Snark.CompleteListener { public Snark getTorrentByBaseName(String filename) { synchronized (_snarks) { for (Snark s : _snarks.values()) { - if (s.storage.getBaseName().equals(filename)) + if (s.getBaseName().equals(filename)) return s; } } return null; } - /** @throws RuntimeException via Snark.fatal() */ - public void addTorrent(String filename) { addTorrent(filename, false); } + /** + * Grab the torrent given the info hash + * @return Snark or null + * @since 0.8.4 + */ + public Snark getTorrentByInfoHash(byte[] infohash) { + synchronized (_snarks) { + for (Snark s : _snarks.values()) { + if (DataHelper.eq(infohash, s.getInfoHash())) + return s; + } + } + return null; + } - /** @throws RuntimeException via Snark.fatal() */ - public void addTorrent(String filename, boolean dontAutoStart) { + /** + * Caller must verify this torrent is not already added. + * @throws RuntimeException via Snark.fatal() + */ + private void addTorrent(String filename) { addTorrent(filename, false); } + + /** + * Caller must verify this torrent is not already added. + * @throws RuntimeException via Snark.fatal() + */ + private void addTorrent(String filename, boolean dontAutoStart) { if ((!dontAutoStart) && !_util.connected()) { addMessage(_("Connecting to I2P")); boolean ok = _util.connect(); @@ -530,31 +572,48 @@ public class SnarkManager implements Snark.CompleteListener { } try { + // This is somewhat wasteful as this metainfo is thrown away, + // the real one is created in the Snark constructor. + // TODO: Make a Snark constructor where we pass the MetaInfo in as a parameter. MetaInfo info = new MetaInfo(fis); try { fis.close(); fis = null; } catch (IOException e) {} + // This test may be a duplicate, but not if we were called + // from the DirMonitor, which only checks for dup torrent file names. + Snark snark = getTorrentByInfoHash(info.getInfoHash()); + if (snark != null) { + // TODO - if the existing one is a magnet, delete it and add the metainfo instead? + addMessage(_("Torrent with this info hash is already running: {0}", snark.getBaseName())); + return; + } + if (!TrackerClient.isValidAnnounce(info.getAnnounce())) { if (_util.shouldUseOpenTrackers() && _util.getOpenTrackers() != null) { - addMessage(_("Warning - Ignoring non-i2p tracker in \"{0}\", will announce to i2p open trackers only", info.getName())); + //addMessage(_("Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and DHT only.", info.getName())); + addMessage(_("Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers only.", info.getName())); + //} else if (_util.getDHT() != null) { + // addMessage(_("Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will announce to DHT only.", info.getName())); } else { - addMessage(_("Warning - Ignoring non-i2p tracker in \"{0}\", and open trackers are disabled, you must enable open trackers before starting the torrent!", info.getName())); + //addMessage(_("Warning - No I2P trackers in \"{0}\", and DHT and open trackers are disabled, you should enable open trackers or DHT before starting the torrent.", info.getName())); + addMessage(_("Warning - No I2P Trackers found in \"{0}\". Make sure Open Tracker is enabled before starting this torrent.", info.getName())); dontAutoStart = true; } } - String rejectMessage = locked_validateTorrent(info); + String rejectMessage = validateTorrent(info); if (rejectMessage != null) { sfile.delete(); addMessage(rejectMessage); return; } else { + // TODO load saved closest DHT nodes and pass to the Snark ? + // This may take a LONG time torrent = new Snark(_util, filename, null, -1, null, null, this, _peerCoordinatorSet, _connectionAcceptor, false, dataDir.getPath()); loadSavedFilePriorities(torrent); - torrent.completeListener = this; synchronized (_snarks) { _snarks.put(filename, torrent); } @@ -564,6 +623,9 @@ public class SnarkManager implements Snark.CompleteListener { if (sfile.exists()) sfile.delete(); return; + } catch (OutOfMemoryError oom) { + addMessage(_("ERROR - Out of memory, cannot create torrent from {0}", sfile.getName()) + ": " + oom.getMessage()); + return; } finally { if (fis != null) try { fis.close(); } catch (IOException ioe) {} } @@ -572,21 +634,167 @@ public class SnarkManager implements Snark.CompleteListener { return; } // ok, snark created, now lets start it up or configure it further - File f = new File(filename); if (!dontAutoStart && shouldAutoStart()) { torrent.startTorrent(); - addMessage(_("Torrent added and started: \"{0}\"", torrent.storage.getBaseName())); + addMessage(_("Torrent added and started: \"{0}\"", torrent.getBaseName())); } else { - addMessage(_("Torrent added: \"{0}\"", torrent.storage.getBaseName())); + addMessage(_("Torrent added: \"{0}\"", torrent.getBaseName())); } } /** - * Get the timestamp for a torrent from the config file + * Add a torrent with the info hash alone (magnet / maggot) + * + * @param name hex or b32 name from the magnet link + * @param ih 20 byte info hash + * @param trackerURL may be null + * @param updateStatus should we add this magnet to the config file, + * to save it across restarts, in case we don't get + * the metadata before shutdown? + * @throws RuntimeException via Snark.fatal() + * @since 0.8.4 + */ + public void addMagnet(String name, byte[] ih, String trackerURL, boolean updateStatus) { + Snark torrent = new Snark(_util, name, ih, trackerURL, this, + _peerCoordinatorSet, _connectionAcceptor, + false, getDataDir().getPath()); + + synchronized (_snarks) { + Snark snark = getTorrentByInfoHash(ih); + if (snark != null) { + addMessage(_("Torrent with this info hash is already running: {0}", snark.getBaseName())); + return; + } + // Tell the dir monitor not to delete us + _magnets.add(name); + if (updateStatus) + saveMagnetStatus(ih); + _snarks.put(name, torrent); + } + if (shouldAutoStart()) { + torrent.startTorrent(); + addMessage(_("Fetching {0}", name)); + boolean haveSavedPeers = false; + if ((!util().connected()) && !haveSavedPeers) { + addMessage(_("We have no saved peers and no other torrents are running. " + + "Fetch of {0} will not succeed until you start another torrent.", name)); + } + } else { + addMessage(_("Adding {0}", name)); + } + } + + /** + * Stop and delete a torrent running in magnet mode + * + * @param snark a torrent with a fake file name ("Magnet xxxx") + * @since 0.8.4 + */ + public void deleteMagnet(Snark snark) { + synchronized (_snarks) { + _snarks.remove(snark.getName()); + } + snark.stopTorrent(); + _magnets.remove(snark.getName()); + removeMagnetStatus(snark.getInfoHash()); + } + + /** + * Add a torrent from a MetaInfo. Save the MetaInfo data to filename. + * Holds the snarks lock to prevent interference from the DirMonitor. + * This verifies that a torrent with this infohash is not already added. + * This may take a LONG time to create or check the storage. + * + * @param metainfo the metainfo for the torrent + * @param bitfield the current completion status of the torrent + * @param filename the absolute path to save the metainfo to, generally ending in ".torrent", which is also the name of the torrent + * Must be a filesystem-safe name. + * @throws RuntimeException via Snark.fatal() + * @since 0.8.4 + */ + public void addTorrent(MetaInfo metainfo, BitField bitfield, String filename, boolean dontAutoStart) throws IOException { + // prevent interference by DirMonitor + synchronized (_snarks) { + Snark snark = getTorrentByInfoHash(metainfo.getInfoHash()); + if (snark != null) { + addMessage(_("Torrent with this info hash is already running: {0}", snark.getBaseName())); + return; + } + // so addTorrent won't recheck + saveTorrentStatus(metainfo, bitfield, null); // no file priorities + try { + locked_writeMetaInfo(metainfo, filename); + // hold the lock for a long time + addTorrent(filename, dontAutoStart); + } catch (IOException ioe) { + addMessage(_("Failed to copy torrent file to {0}", filename)); + _log.error("Failed to write torrent file", ioe); + } + } + } + + /** + * Add a torrent from a file not in the torrent directory. Copy the file to filename. + * Holds the snarks lock to prevent interference from the DirMonitor. + * Caller must verify this torrent is not already added. + * This may take a LONG time to create or check the storage. + * + * @param fromfile where the file is now, presumably in a temp directory somewhere + * @param filename the absolute path to save the metainfo to, generally ending in ".torrent", which is also the name of the torrent + * Must be a filesystem-safe name. + * @throws RuntimeException via Snark.fatal() + * @since 0.8.4 + */ + public void copyAndAddTorrent(File fromfile, String filename) throws IOException { + // prevent interference by DirMonitor + synchronized (_snarks) { + boolean success = FileUtil.copy(fromfile.getAbsolutePath(), filename, false); + if (!success) { + addMessage(_("Failed to copy torrent file to {0}", filename)); + _log.error("Failed to write torrent file to " + filename); + return; + } + SecureFileOutputStream.setPerms(new File(filename)); + // hold the lock for a long time + addTorrent(filename); + } + } + + /** + * Write the metainfo to the file, caller must hold the snarks lock + * to prevent interference from the DirMonitor. + * + * @param metainfo The metainfo for the torrent + * @param filename The absolute path to save the metainfo to, generally ending in ".torrent". + * Must be a filesystem-safe name. + * @since 0.8.4 + */ + private static void locked_writeMetaInfo(MetaInfo metainfo, String filename) throws IOException { + File file = new File(filename); + if (file.exists()) + throw new IOException("Cannot overwrite an existing .torrent file: " + file.getPath()); + OutputStream out = null; + try { + out = new SecureFileOutputStream(filename); + out.write(metainfo.getTorrentData()); + } catch (IOException ioe) { + // remove any partial + file.delete(); + throw ioe; + } finally { + try { + if (out == null) + out.close(); + } catch (IOException ioe) {} + } + } + + /** + * Get the timestamp for a torrent from the config file. + * A Snark.CompleteListener method. */ public long getSavedTorrentTime(Snark snark) { - MetaInfo metainfo = snark.meta; - byte[] ih = metainfo.getInfoHash(); + byte[] ih = snark.getInfoHash(); String infohash = Base64.encode(ih); infohash = infohash.replace('=', '$'); String time = _config.getProperty(PROP_META_PREFIX + infohash + PROP_META_BITFIELD_SUFFIX); @@ -603,10 +811,13 @@ public class SnarkManager implements Snark.CompleteListener { /** * Get the saved bitfield for a torrent from the config file. * Convert "." to a full bitfield. + * A Snark.CompleteListener method. */ public BitField getSavedTorrentBitField(Snark snark) { - MetaInfo metainfo = snark.meta; - byte[] ih = metainfo.getInfoHash(); + MetaInfo metainfo = snark.getMetaInfo(); + if (metainfo == null) + return null; + byte[] ih = snark.getInfoHash(); String infohash = Base64.encode(ih); infohash = infohash.replace('=', '$'); String bf = _config.getProperty(PROP_META_PREFIX + infohash + PROP_META_BITFIELD_SUFFIX); @@ -636,10 +847,13 @@ public class SnarkManager implements Snark.CompleteListener { * @since 0.8.1 */ public void loadSavedFilePriorities(Snark snark) { - MetaInfo metainfo = snark.meta; + MetaInfo metainfo = snark.getMetaInfo(); + Storage storage = snark.getStorage(); + if (metainfo == null || storage == null) + return; if (metainfo.getFiles() == null) return; - byte[] ih = metainfo.getInfoHash(); + byte[] ih = snark.getInfoHash(); String infohash = Base64.encode(ih); infohash = infohash.replace('=', '$'); String pri = _config.getProperty(PROP_META_PREFIX + infohash + PROP_META_PRIORITY_SUFFIX); @@ -655,7 +869,7 @@ public class SnarkManager implements Snark.CompleteListener { } catch (Throwable t) {} } } - snark.storage.setFilePriorities(rv); + storage.setFilePriorities(rv); } /** @@ -666,6 +880,8 @@ public class SnarkManager implements Snark.CompleteListener { * The time is a standard long converted to string. * The status is either a bitfield converted to Base64 or "." for a completed * torrent to save space in the config file and in memory. + * + * @param bitfield non-null * @param priorities may be null */ public void saveTorrentStatus(MetaInfo metainfo, BitField bitfield, int[] priorities) { @@ -709,6 +925,8 @@ public class SnarkManager implements Snark.CompleteListener { _config.remove(prop); } + // TODO save closest DHT nodes too + saveConfig(); } @@ -726,9 +944,33 @@ public class SnarkManager implements Snark.CompleteListener { } /** + * Just remember we have it + * @since 0.8.4 + */ + public void saveMagnetStatus(byte[] ih) { + String infohash = Base64.encode(ih); + infohash = infohash.replace('=', '$'); + _config.setProperty(PROP_META_MAGNET_PREFIX + infohash, "."); + saveConfig(); + } + + /** + * Remove the magnet marker from the config file. + * @since 0.8.4 + */ + public void removeMagnetStatus(byte[] ih) { + String infohash = Base64.encode(ih); + infohash = infohash.replace('=', '$'); + _config.remove(PROP_META_MAGNET_PREFIX + infohash); + saveConfig(); + } + + /** + * Does not really delete on failure, that's the caller's responsibility. * Warning - does not validate announce URL - use TrackerClient.isValidAnnounce() + * @return failure message or null on success */ - private String locked_validateTorrent(MetaInfo info) throws IOException { + private String validateTorrent(MetaInfo info) { List files = info.getFiles(); if ( (files != null) && (files.size() > MAX_FILES_PER_TORRENT) ) { return _("Too many files in \"{0}\" ({1}), deleting it!", info.getName(), files.size()); @@ -741,6 +983,8 @@ public class SnarkManager implements Snark.CompleteListener { } else if (info.getPieceLength(0) > Storage.MAX_PIECE_SIZE) { return _("Pieces are too large in \"{0}\" ({1}B), deleting it.", info.getName(), DataHelper.formatSize2(info.getPieceLength(0))) + ' ' + _("Limit is {0}B", DataHelper.formatSize2(Storage.MAX_PIECE_SIZE)); + } else if (info.getTotalLength() <= 0) { + return _("Torrent \"{0}\" has no data, deleting it!", info.getName()); } else if (info.getTotalLength() > Storage.MAX_TOTAL_SIZE) { System.out.println("torrent info: " + info.toString()); List lengths = info.getLengths(); @@ -777,86 +1021,193 @@ public class SnarkManager implements Snark.CompleteListener { remaining = _snarks.size(); } if (torrent != null) { - boolean wasStopped = torrent.stopped; + boolean wasStopped = torrent.isStopped(); torrent.stopTorrent(); if (remaining == 0) { // should we disconnect/reconnect here (taking care to deal with the other thread's // I2PServerSocket.accept() call properly?) ////_util. } - String name; - if (torrent.storage != null) { - name = torrent.storage.getBaseName(); - } else { - name = sfile.getName(); - } if (!wasStopped) - addMessage(_("Torrent stopped: \"{0}\"", name)); + addMessage(_("Torrent stopped: \"{0}\"", torrent.getBaseName())); } return torrent; } + + /** + * Stop the torrent, leaving it on the list of torrents unless told to remove it + * @since 0.8.4 + */ + public void stopTorrent(Snark torrent, boolean shouldRemove) { + if (shouldRemove) { + synchronized (_snarks) { + _snarks.remove(torrent.getName()); + } + } + boolean wasStopped = torrent.isStopped(); + torrent.stopTorrent(); + if (!wasStopped) + addMessage(_("Torrent stopped: \"{0}\"", torrent.getBaseName())); + } + /** * Stop the torrent and delete the torrent file itself, but leaving the data * behind. + * Holds the snarks lock to prevent interference from the DirMonitor. */ public void removeTorrent(String filename) { - Snark torrent = stopTorrent(filename, true); - if (torrent != null) { + Snark torrent; + // prevent interference by DirMonitor + synchronized (_snarks) { + torrent = stopTorrent(filename, true); + if (torrent == null) + return; File torrentFile = new File(filename); torrentFile.delete(); - String name; - if (torrent.storage != null) { - removeTorrentStatus(torrent.storage.getMetaInfo()); - name = torrent.storage.getBaseName(); - } else { - name = torrentFile.getName(); - } - addMessage(_("Torrent removed: \"{0}\"", name)); } + Storage storage = torrent.getStorage(); + if (storage != null) + removeTorrentStatus(storage.getMetaInfo()); + addMessage(_("Torrent removed: \"{0}\"", torrent.getBaseName())); } private class DirMonitor implements Runnable { public void run() { - try { Thread.sleep(60*1000*getStartupDelayMinutes()); } catch (InterruptedException ie) {} - // the first message was a "We are starting up in 1m" - synchronized (_messages) { - if (_messages.size() == 1) - _messages.remove(0); + // don't bother delaying if auto start is false + long delay = 60 * 1000 * getStartupDelayMinutes(); + if (delay > 0 && shouldAutoStart()) { + _messages.add(_("Adding torrents in {0}", DataHelper.formatDuration2(delay))); + try { Thread.sleep(delay); } catch (InterruptedException ie) {} + // the first message was a "We are starting up in 1m" + synchronized (_messages) { + if (_messages.size() == 1) + _messages.remove(0); + } } // here because we need to delay until I2CP is up // although the user will see the default until then getBWLimit(); + boolean doMagnets = true; while (true) { File dir = getDataDir(); if (_log.shouldLog(Log.DEBUG)) _log.debug("Directory Monitor loop over " + dir.getAbsolutePath()); try { - monitorTorrents(dir); + // Don't let this interfere with .torrent files being added or deleted + synchronized (_snarks) { + monitorTorrents(dir); + } } catch (Exception e) { _log.error("Error in the DirectoryMonitor", e); } + if (doMagnets) { + addMagnets(); + doMagnets = false; + } try { Thread.sleep(60*1000); } catch (InterruptedException ie) {} } } } - /** two listeners */ + // Begin Snark.CompleteListeners + + /** + * A Snark.CompleteListener method. + */ public void torrentComplete(Snark snark) { + MetaInfo meta = snark.getMetaInfo(); + Storage storage = snark.getStorage(); + if (meta == null || storage == null) + return; StringBuilder buf = new StringBuilder(256); - buf.append("<a href=\"/i2psnark/").append(snark.storage.getBaseName()); - if (snark.meta.getFiles() != null) + buf.append("<a href=\"/i2psnark/").append(storage.getBaseName()); + if (meta.getFiles() != null) buf.append('/'); - buf.append("\">").append(snark.storage.getBaseName()).append("</a>"); - long len = snark.meta.getTotalLength(); + buf.append("\">").append(storage.getBaseName()).append("</a>"); addMessage(_("Download finished: {0}", buf.toString())); // + " (" + _("size: {0}B", DataHelper.formatSize2(len)) + ')'); updateStatus(snark); } + /** + * A Snark.CompleteListener method. + */ public void updateStatus(Snark snark) { - saveTorrentStatus(snark.meta, snark.storage.getBitField(), snark.storage.getFilePriorities()); + MetaInfo meta = snark.getMetaInfo(); + Storage storage = snark.getStorage(); + if (meta != null && storage != null) + saveTorrentStatus(meta, storage.getBitField(), storage.getFilePriorities()); } + /** + * We transitioned from magnet mode, we have now initialized our + * metainfo and storage. The listener should now call getMetaInfo() + * and save the data to disk. + * A Snark.CompleteListener method. + * + * @return the new name for the torrent or null on error + * @since 0.8.4 + */ + public String gotMetaInfo(Snark snark) { + MetaInfo meta = snark.getMetaInfo(); + Storage storage = snark.getStorage(); + if (meta != null && storage != null) { + String rejectMessage = validateTorrent(meta); + if (rejectMessage != null) { + addMessage(rejectMessage); + snark.stopTorrent(); + return null; + } + saveTorrentStatus(meta, storage.getBitField(), null); // no file priorities + String name = (new File(getDataDir(), storage.getBaseName() + ".torrent")).getAbsolutePath(); + try { + // put the announce URL in the file + String announce = snark.getTrackerURL(); + if (announce != null) + meta = meta.reannounce(announce); + synchronized (_snarks) { + locked_writeMetaInfo(meta, name); + // put it in the list under the new name + _snarks.remove(snark.getName()); + _snarks.put(name, snark); + } + _magnets.remove(snark.getName()); + removeMagnetStatus(snark.getInfoHash()); + addMessage(_("Metainfo received for {0}", snark.getName())); + addMessage(_("Starting up torrent {0}", storage.getBaseName())); + return name; + } catch (IOException ioe) { + addMessage(_("Failed to copy torrent file to {0}", name)); + _log.error("Failed to write torrent file", ioe); + } + } + return null; + } + + // End Snark.CompleteListeners + + /** + * Add all magnets from the config file + * @since 0.8.4 + */ + private void addMagnets() { + for (Object o : _config.keySet()) { + String k = (String) o; + if (k.startsWith(PROP_META_MAGNET_PREFIX)) { + String b64 = k.substring(PROP_META_MAGNET_PREFIX.length()); + b64 = b64.replace('$', '='); + byte[] ih = Base64.decode(b64); + // ignore value - TODO put tracker URL in value + if (ih != null && ih.length == 20) + addMagnet("Magnet: " + I2PSnarkUtil.toHex(ih), ih, null, false); + // else remove from config? + } + } + } + + /** + * caller must synchronize on _snarks + */ private void monitorTorrents(File dir) { String fileNames[] = dir.list(TorrentFilenameFilter.instance()); List<String> foundNames = new ArrayList(0); @@ -887,6 +1238,8 @@ public class SnarkManager implements Snark.CompleteListener { } } } + // Don't remove magnet torrents that don't have a torrent file yet + existingNames.removeAll(_magnets); // now lets see which ones have been removed... for (Iterator iter = existingNames.iterator(); iter.hasNext(); ) { String name = (String)iter.next(); @@ -936,16 +1289,17 @@ public class SnarkManager implements Snark.CompleteListener { "Postman", "http://tracker2.postman.i2p/announce.php=http://tracker2.postman.i2p/" ,"Welterde", "http://tracker.welterde.i2p/a=http://tracker.welterde.i2p/stats?mode=top5" // , "CRSTRACK", "http://b4G9sCdtfvccMAXh~SaZrPqVQNyGQbhbYMbw6supq2XGzbjU4NcOmjFI0vxQ8w1L05twmkOvg5QERcX6Mi8NQrWnR0stLExu2LucUXg1aYjnggxIR8TIOGygZVIMV3STKH4UQXD--wz0BUrqaLxPhrm2Eh9Hwc8TdB6Na4ShQUq5Xm8D4elzNUVdpM~RtChEyJWuQvoGAHY3ppX-EJJLkiSr1t77neS4Lc-KofMVmgI9a2tSSpNAagBiNI6Ak9L1T0F9uxeDfEG9bBSQPNMOSUbAoEcNxtt7xOW~cNOAyMyGydwPMnrQ5kIYPY8Pd3XudEko970vE0D6gO19yoBMJpKx6Dh50DGgybLQ9CpRaynh2zPULTHxm8rneOGRcQo8D3mE7FQ92m54~SvfjXjD2TwAVGI~ae~n9HDxt8uxOecAAvjjJ3TD4XM63Q9TmB38RmGNzNLDBQMEmJFpqQU8YeuhnS54IVdUoVQFqui5SfDeLXlSkh4vYoMU66pvBfWbAAAA.i2p/tracker/announce.php=http://crstrack.i2p/tracker/" + ,"Exotrack", "http://blbgywsjubw3d2zih2giokakhe3o2cko7jtte4risb3hohbcoyva.b32.i2p/announce.php=http://exotrack.i2p/" }; /** comma delimited list of name=announceURL=baseURL for the trackers to be displayed */ public static final String PROP_TRACKERS = "i2psnark.trackers"; - private static Map trackerMap = null; + private static Map<String, String> trackerMap = null; /** sorted map of name to announceURL=baseURL */ - public Map getTrackers() { + public Map<String, String> getTrackers() { if (trackerMap != null) // only do this once, can't be updated while running return trackerMap; - Map rv = new TreeMap(); + Map<String, String> rv = new TreeMap(); String trackers = _config.getProperty(PROP_TRACKERS); if ( (trackers == null) || (trackers.trim().length() <= 0) ) trackers = _context.getProperty(PROP_TRACKERS); @@ -984,7 +1338,7 @@ public class SnarkManager implements Snark.CompleteListener { Set names = listTorrentFiles(); for (Iterator iter = names.iterator(); iter.hasNext(); ) { Snark snark = getTorrent((String)iter.next()); - if ( (snark != null) && (!snark.stopped) ) + if ( (snark != null) && (!snark.isStopped()) ) snark.stopTorrent(); } } diff --git a/apps/i2psnark/java/src/org/klomp/snark/StaticSnark.java b/apps/i2psnark/java/src/org/klomp/snark/StaticSnark.java index 38b470a7c9cf61b07ac1eee30df59a4872721a76..52bef12b4719d7b3d05e1785cfb5bed00f2b5665 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/StaticSnark.java +++ b/apps/i2psnark/java/src/org/klomp/snark/StaticSnark.java @@ -38,6 +38,7 @@ public class StaticSnark //Security.addProvider(gnu); // And finally call the normal starting point. - Snark.main(args); + //Snark.main(args); + System.err.println("unsupported"); } } diff --git a/apps/i2psnark/java/src/org/klomp/snark/Storage.java b/apps/i2psnark/java/src/org/klomp/snark/Storage.java index 17fae523525630ec0abcc345796893791028fcda..1183e9bf352aa19ccee9652b9ab3bde398da4f5a 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Storage.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Storage.java @@ -53,10 +53,10 @@ public class Storage private int needed; // Number of pieces needed private boolean _probablyComplete; // use this to decide whether to open files RO - // XXX - Not always set correctly - int piece_size; - int pieces; - boolean changed; + private final int piece_size; + private final int pieces; + private final long total_length; + private boolean changed; /** The default piece size. */ private static final int MIN_PIECE_SIZE = 256*1024; @@ -81,12 +81,18 @@ public class Storage needed = metainfo.getPieces(); _probablyComplete = false; bitfield = new BitField(needed); + piece_size = metainfo.getPieceLength(0); + pieces = needed; + total_length = metainfo.getTotalLength(); } /** * Creates a storage from the existing file or directory together * with an appropriate MetaInfo file as can be announced on the * given announce String location. + * + * @param announce may be null + * @param listener may be null */ public Storage(I2PSnarkUtil util, File baseFile, String announce, StorageListener listener) throws IOException @@ -97,32 +103,35 @@ public class Storage getFiles(baseFile); long total = 0; - ArrayList lengthsList = new ArrayList(); + ArrayList<Long> lengthsList = new ArrayList(); for (int i = 0; i < lengths.length; i++) { long length = lengths[i]; total += length; - lengthsList.add(new Long(length)); + lengthsList.add(Long.valueOf(length)); } - piece_size = MIN_PIECE_SIZE; - pieces = (int) ((total - 1)/piece_size) + 1; - while (pieces > MAX_PIECES && piece_size < MAX_PIECE_SIZE) + if (total <= 0) + throw new IOException("Torrent contains no data"); + + int pc_size = MIN_PIECE_SIZE; + int pcs = (int) ((total - 1)/pc_size) + 1; + while (pcs > MAX_PIECES && pc_size < MAX_PIECE_SIZE) { - piece_size = piece_size*2; - pieces = (int) ((total - 1)/piece_size) +1; + pc_size *= 2; + pcs = (int) ((total - 1)/pc_size) +1; } + piece_size = pc_size; + pieces = pcs; + total_length = total; - // Note that piece_hashes and the bitfield will be filled after - // the MetaInfo is created. - byte[] piece_hashes = new byte[20*pieces]; bitfield = new BitField(pieces); needed = 0; - List files = new ArrayList(); + List<List<String>> files = new ArrayList(); for (int i = 0; i < names.length; i++) { - List file = new ArrayList(); + List<String> file = new ArrayList(); StringTokenizer st = new StringTokenizer(names[i], File.separator); while (st.hasMoreTokens()) { @@ -139,69 +148,26 @@ public class Storage lengthsList = null; } - // Note that the piece_hashes are not correctly setup yet. + byte[] piece_hashes = fast_digestCreate(); metainfo = new MetaInfo(announce, baseFile.getName(), null, files, lengthsList, piece_size, piece_hashes, total); } - // Creates piece hashes for a new storage. - // This does NOT create the files, just the hashes - public void create() throws IOException - { -// if (true) { - fast_digestCreate(); -// } else { -// orig_digestCreate(); -// } - } - -/* - private void orig_digestCreate() throws IOException { - // Calculate piece_hashes - MessageDigest digest = null; - try - { - digest = MessageDigest.getInstance("SHA"); - } - catch(NoSuchAlgorithmException nsa) - { - throw new InternalError(nsa.toString()); - } - - byte[] piece_hashes = metainfo.getPieceHashes(); - - byte[] piece = new byte[piece_size]; - for (int i = 0; i < pieces; i++) - { - int length = getUncheckedPiece(i, piece); - digest.update(piece, 0, length); - byte[] hash = digest.digest(); - for (int j = 0; j < 20; j++) - piece_hashes[20 * i + j] = hash[j]; - - bitfield.set(i); - - if (listener != null) - listener.storageChecked(this, i, true); - } - - if (listener != null) - listener.storageAllChecked(this); - - // Reannounce to force recalculating the info_hash. - metainfo = metainfo.reannounce(metainfo.getAnnounce()); - } -*/ - - /** FIXME we can run out of fd's doing this, + /** + * Creates piece hashes for a new storage. + * This does NOT create the files, just the hashes. + * Also sets all the bitfield bits. + * + * FIXME we can run out of fd's doing this, * maybe some sort of global close-RAF-right-away flag - * would do the trick */ - private void fast_digestCreate() throws IOException { + * would do the trick + */ + private byte[] fast_digestCreate() throws IOException { // Calculate piece_hashes SHA1 digest = new SHA1(); - byte[] piece_hashes = metainfo.getPieceHashes(); + byte[] piece_hashes = new byte[20 * pieces]; byte[] piece = new byte[piece_size]; for (int i = 0; i < pieces; i++) @@ -209,14 +175,10 @@ public class Storage int length = getUncheckedPiece(i, piece); digest.update(piece, 0, length); byte[] hash = digest.digest(); - for (int j = 0; j < 20; j++) - piece_hashes[20 * i + j] = hash[j]; - + System.arraycopy(hash, 0, piece_hashes, 20 * i, 20); bitfield.set(i); } - - // Reannounce to force recalculating the info_hash. - metainfo = metainfo.reannounce(metainfo.getAnnounce()); + return piece_hashes; } private void getFiles(File base) throws IOException @@ -291,6 +253,14 @@ public class Storage return needed == 0; } + /** + * Has the storage changed since instantiation? + * @since 0.8.5 + */ + public boolean isChanged() { + return changed; + } + /** * @param file canonical path (non-directory) * @return number of bytes remaining; -1 if unknown file @@ -312,14 +282,13 @@ public class Storage if (f != null && canonical.equals(file)) { if (complete()) return 0; - int psz = metainfo.getPieceLength(0); + int psz = piece_size; long start = bytes; long end = start + lengths[i]; int pc = (int) (bytes / psz); long rv = 0; if (!bitfield.get(pc)) rv = Math.min(psz - (start % psz), lengths[i]); - int pieces = metainfo.getPieces(); for (int j = pc + 1; (((long)j) * psz) < end && j < pieces; j++) { if (!bitfield.get(j)) { if (((long)(j+1))*psz < end) @@ -415,7 +384,7 @@ public class Storage int file = 0; long pcEnd = -1; long fileEnd = lengths[0] - 1; - int psz = metainfo.getPieceLength(0); + int psz = piece_size; for (int i = 0; i < rv.length; i++) { pcEnd += psz; int pri = priorities[file]; @@ -466,7 +435,7 @@ public class Storage File base = new SecureFile(rootDir, filterName(metainfo.getName())); boolean useSavedBitField = savedTime > 0 && savedBitField != null; - List files = metainfo.getFiles(); + List<List<String>> files = metainfo.getFiles(); if (files == null) { // Create base as file. @@ -497,7 +466,7 @@ public class Storage if (!base.mkdir() && !base.isDirectory()) throw new IOException("Could not create directory " + base); - List ls = metainfo.getLengths(); + List<Long> ls = metainfo.getLengths(); int size = files.size(); long total = 0; lengths = new long[size]; @@ -508,8 +477,28 @@ public class Storage RAFfile = new File[size]; for (int i = 0; i < size; i++) { - File f = createFileFromNames(base, (List)files.get(i)); - lengths[i] = ((Long)ls.get(i)).longValue(); + List<String> path = files.get(i); + File f = createFileFromNames(base, path); + // dup file name check after filtering + for (int j = 0; j < i; j++) { + if (f.equals(RAFfile[j])) { + // Rename and start the check over again + // Copy path since metainfo list is unmodifiable + path = new ArrayList(path); + int last = path.size() - 1; + String lastPath = path.get(last); + int dot = lastPath.lastIndexOf('.'); + // foo.mp3 -> foo_.mp3; foo -> _foo + if (dot >= 0) + lastPath = lastPath.substring(0, dot) + '_' + lastPath.substring(dot); + else + lastPath = '_' + lastPath; + path.set(last, lastPath); + f = createFileFromNames(base, path); + j = 0; + } + } + lengths[i] = ls.get(i).longValue(); RAFlock[i] = new Object(); RAFfile[i] = f; total += lengths[i]; @@ -535,7 +524,7 @@ public class Storage } else { // the following sets the needed variable changed = true; - checkCreateFiles(); + checkCreateFiles(false); } if (complete()) { _util.debug("Torrent is complete", Snark.NOTICE); @@ -548,36 +537,19 @@ public class Storage } /** - * Reopen the file descriptors for a restart - * Do existence check but no length check or data reverification + * Doesn't really reopen the file descriptors for a restart. + * Just does an existence check but no length check or data reverification + * + * @param rootDir ignored + * @throws IOE on fail */ public void reopen(String rootDir) throws IOException { - File base = new File(rootDir, filterName(metainfo.getName())); - - List files = metainfo.getFiles(); - if (files == null) - { - // Reopen base as file. - _util.debug("Reopening file: " + base, Snark.NOTICE); - if (!base.exists()) - throw new IOException("Could not reopen file " + base); - } - else - { - // Reopen base as dir. - _util.debug("Reopening directory: " + base, Snark.NOTICE); - if (!base.isDirectory()) - throw new IOException("Could not reopen directory " + base); - - int size = files.size(); - for (int i = 0; i < size; i++) - { - File f = getFileFromNames(base, (List)files.get(i)); - if (!f.exists()) - throw new IOException("Could not reopen file " + f); - } - + if (RAFfile == null) + throw new IOException("Storage not checked yet"); + for (int i = 0; i < RAFfile.length; i++) { + if (!RAFfile[i].exists()) + throw new IOException("File does not exist: " + RAFfile[i]); } } @@ -590,7 +562,7 @@ public class Storage * Removes 'suspicious' characters from the given file name. * http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx */ - private static String filterName(String name) + public static String filterName(String name) { if (name.equals(".") || name.equals(" ")) return "_"; @@ -606,13 +578,18 @@ public class Storage return rv; } - private File createFileFromNames(File base, List names) throws IOException + /** + * Note that filtering each path element individually may lead to + * things going in the wrong place if there are duplicates + * in intermediate path elements after filtering. + */ + private static File createFileFromNames(File base, List<String> names) throws IOException { File f = null; - Iterator it = names.iterator(); + Iterator<String> it = names.iterator(); while (it.hasNext()) { - String name = filterName((String)it.next()); + String name = filterName(it.next()); if (it.hasNext()) { // Another dir in the hierarchy. @@ -632,12 +609,12 @@ public class Storage return f; } - public static File getFileFromNames(File base, List names) + public static File getFileFromNames(File base, List<String> names) { - Iterator it = names.iterator(); + Iterator<String> it = names.iterator(); while (it.hasNext()) { - String name = filterName((String)it.next()); + String name = filterName(it.next()); base = new File(base, name); } return base; @@ -646,15 +623,26 @@ public class Storage /** * This is called at the beginning, and at presumed completion, * so we have to be careful about locking. + * + * @param recheck if true, this is a check after we downloaded the + * last piece, and we don't modify the global bitfield unless + * the check fails. */ - private void checkCreateFiles() throws IOException + private void checkCreateFiles(boolean recheck) throws IOException { // Whether we are resuming or not, // if any of the files already exists we assume we are resuming. boolean resume = false; _probablyComplete = true; - needed = metainfo.getPieces(); + // use local variables during the check + int need = metainfo.getPieces(); + BitField bfield; + if (recheck) { + bfield = new BitField(need); + } else { + bfield = bitfield; + } // Make sure all files are available and of correct length for (int i = 0; i < rafs.length; i++) @@ -676,7 +664,10 @@ public class Storage } catch (IOException ioe) {} } } else { - _util.debug("File '" + names[i] + "' exists, but has wrong length - repairing corruption", Snark.ERROR); + String msg = "File '" + names[i] + "' exists, but has wrong length (expected " + + lengths[i] + " but found " + length + ") - repairing corruption"; + SnarkManager.instance().addMessage(msg); + _util.debug(msg, Snark.ERROR); changed = true; _probablyComplete = false; // to force RW synchronized(RAFlock[i]) { @@ -692,8 +683,7 @@ public class Storage // Check which pieces match and which don't if (resume) { - pieces = metainfo.getPieces(); - byte[] piece = new byte[metainfo.getPieceLength(0)]; + byte[] piece = new byte[piece_size]; int file = 0; long fileEnd = lengths[0]; long pieceEnd = 0; @@ -715,8 +705,8 @@ public class Storage } if (correctHash) { - bitfield.set(i); - needed--; + bfield.set(i); + need--; } if (listener != null) @@ -736,6 +726,15 @@ public class Storage // } //} + // do this here so we don't confuse the user during checking + needed = need; + if (recheck && need > 0) { + // whoops, recheck failed + synchronized(bitfield) { + bitfield = bfield; + } + } + if (listener != null) { listener.storageAllChecked(this); if (needed <= 0) @@ -750,8 +749,9 @@ public class Storage openRAF(nr, false); // RW // XXX - Is this the best way to make sure we have enough space for // the whole file? - listener.storageCreateFile(this, names[nr], lengths[nr]); - final int ZEROBLOCKSIZE = metainfo.getPieceLength(0); + if (listener != null) + listener.storageCreateFile(this, names[nr], lengths[nr]); + final int ZEROBLOCKSIZE = piece_size; byte[] zeros; try { zeros = new byte[ZEROBLOCKSIZE]; @@ -844,7 +844,7 @@ public class Storage } // Early typecast, avoid possibly overflowing a temp integer - long start = (long) piece * (long) metainfo.getPieceLength(0); + long start = (long) piece * (long) piece_size; int i = 0; long raflen = lengths[i]; while (start > raflen) @@ -899,11 +899,7 @@ public class Storage // checkCreateFiles() which will set 'needed' and 'bitfield' // and also call listener.storageCompleted() if the double-check // was successful. - // Todo: set a listener variable so the web shows "checking" and don't - // have the user panic when completed amount goes to zero temporarily? - needed = metainfo.getPieces(); - bitfield = new BitField(needed); - checkCreateFiles(); + checkCreateFiles(true); if (needed > 0) { if (listener != null) listener.setWantedPieces(this); @@ -915,10 +911,24 @@ public class Storage return true; } + /** + * This is a dup of MetaInfo.getPieceLength() but we need it + * before the MetaInfo is created in our second constructor. + * @since 0.8.5 + */ + private int getPieceLength(int piece) { + if (piece >= 0 && piece < pieces -1) + return piece_size; + else if (piece == pieces -1) + return (int)(total_length - ((long)piece * piece_size)); + else + throw new IndexOutOfBoundsException("no piece: " + piece); + } + private int getUncheckedPiece(int piece, byte[] bs) throws IOException { - return getUncheckedPiece(piece, bs, 0, metainfo.getPieceLength(piece)); + return getUncheckedPiece(piece, bs, 0, getPieceLength(piece)); } private int getUncheckedPiece(int piece, byte[] bs, int off, int length) @@ -927,7 +937,7 @@ public class Storage // XXX - copy/paste code from putPiece(). // Early typecast, avoid possibly overflowing a temp integer - long start = ((long) piece * (long) metainfo.getPieceLength(0)) + off; + long start = ((long) piece * (long) piece_size) + off; int i = 0; long raflen = lengths[i]; diff --git a/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java b/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java index 89815035b4e6d1a4fa15cd9f7e8098d6877c93d2..85a39f748d8657d2f3313af3ac8b305f914fb8a1 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java +++ b/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java @@ -34,9 +34,12 @@ import java.util.Random; import java.util.Set; import net.i2p.I2PAppContext; +import net.i2p.data.Hash; import net.i2p.util.I2PAppThread; import net.i2p.util.Log; +import org.klomp.snark.dht.DHT; + /** * Informs metainfo tracker of events and gets new peers for peer * coordinator. @@ -62,7 +65,9 @@ public class TrackerClient extends I2PAppThread private I2PSnarkUtil _util; private final MetaInfo meta; + private final String additionalTrackerURL; private final PeerCoordinator coordinator; + private final Snark snark; private final int port; private boolean stop; @@ -70,20 +75,24 @@ public class TrackerClient extends I2PAppThread private List trackers; - public TrackerClient(I2PSnarkUtil util, MetaInfo meta, PeerCoordinator coordinator) + /** + * @param meta null if in magnet mode + * @param additionalTrackerURL may be null, from the ?tr= param in magnet mode, otherwise ignored + */ + public TrackerClient(I2PSnarkUtil util, MetaInfo meta, String additionalTrackerURL, + PeerCoordinator coordinator, Snark snark) { super(); // Set unique name. - String id = urlencode(coordinator.getID()); + String id = urlencode(snark.getID()); setName("TrackerClient " + id.substring(id.length() - 12)); _util = util; this.meta = meta; + this.additionalTrackerURL = additionalTrackerURL; this.coordinator = coordinator; + this.snark = snark; this.port = 6881; //(port == -1) ? 9 : port; - - stop = false; - started = false; } @Override @@ -118,11 +127,10 @@ public class TrackerClient extends I2PAppThread @Override public void run() { - String infoHash = urlencode(meta.getInfoHash()); - String peerID = urlencode(coordinator.getID()); + String infoHash = urlencode(snark.getInfoHash()); + String peerID = urlencode(snark.getID()); + - _log.debug("Announce: [" + meta.getAnnounce() + "] infoHash: " + infoHash); - // Construct the list of trackers for this torrent, // starting with the primary one listed in the metainfo, // followed by the secondary open trackers @@ -130,11 +138,21 @@ public class TrackerClient extends I2PAppThread // the primary tracker, that we don't add it twice. // todo: check for b32 matches as well trackers = new ArrayList(2); - String primary = meta.getAnnounce(); - if (isValidAnnounce(primary)) { - trackers.add(new Tracker(meta.getAnnounce(), true)); + String primary = null; + if (meta != null) + primary = meta.getAnnounce(); + else if (additionalTrackerURL != null) + primary = additionalTrackerURL; + if (primary != null) { + if (isValidAnnounce(primary)) { + trackers.add(new Tracker(primary, true)); + _log.debug("Announce: [" + primary + "] infoHash: " + infoHash); + } else { + _log.warn("Skipping invalid or non-i2p announce: " + primary); + } } else { - _log.warn("Skipping invalid or non-i2p announce: " + primary); + _log.warn("No primary announce"); + primary = ""; } List tlist = _util.getOpenTrackers(); if (tlist != null) { @@ -160,15 +178,19 @@ public class TrackerClient extends I2PAppThread continue; if (primary.startsWith("http://i2p/" + dest)) continue; - trackers.add(new Tracker(url, false)); + // opentrackers are primary if we don't have primary + trackers.add(new Tracker(url, primary.equals(""))); _log.debug("Additional announce: [" + url + "] for infoHash: " + infoHash); } } - if (tlist.isEmpty()) { - // FIXME really need to get this message to the gui + if (trackers.isEmpty()) { stop = true; - _log.error("No valid trackers for infoHash: " + infoHash); + // FIXME translate + SnarkManager.instance().addMessage("No valid trackers for " + this.snark.getBaseName() + " - enable opentrackers?"); + _log.error("No valid trackers for " + this.snark.getBaseName()); + // FIXME keep going if DHT enabled + this.snark.stopTorrent(); return; } @@ -188,6 +210,9 @@ public class TrackerClient extends I2PAppThread Random r = I2PAppContext.getGlobalContext().random(); while(!stop) { + // Local DHT tracker announce + if (_util.getDHT() != null) + _util.getDHT().announce(snark.getInfoHash()); try { // Sleep some minutes... @@ -200,7 +225,7 @@ public class TrackerClient extends I2PAppThread firstTime = false; } else if (completed && runStarted) delay = 3*SLEEP*60*1000 + random; - else if (coordinator.trackerProblems != null && ++consecutiveFails < MAX_CONSEC_FAILS) + else if (snark.getTrackerProblems() != null && ++consecutiveFails < MAX_CONSEC_FAILS) delay = INITIAL_SLEEP; else // sleep a while, when we wake up we will contact only the trackers whose intervals have passed @@ -221,7 +246,7 @@ public class TrackerClient extends I2PAppThread uploaded = coordinator.getUploaded(); downloaded = coordinator.getDownloaded(); - left = coordinator.getLeft(); + left = coordinator.getLeft(); // -1 in magnet mode // First time we got a complete download? String event; @@ -251,7 +276,7 @@ public class TrackerClient extends I2PAppThread uploaded, downloaded, left, event); - coordinator.trackerProblems = null; + snark.setTrackerProblems(null); tr.trackerProblems = null; tr.registerFails = 0; tr.consecutiveFails = 0; @@ -260,24 +285,30 @@ public class TrackerClient extends I2PAppThread runStarted = true; tr.started = true; - Set peers = info.getPeers(); + Set<Peer> peers = info.getPeers(); tr.seenPeers = info.getPeerCount(); - if (coordinator.trackerSeenPeers < tr.seenPeers) // update rising number quickly - coordinator.trackerSeenPeers = tr.seenPeers; - if ( (left > 0) && (!completed) ) { + if (snark.getTrackerSeenPeers() < tr.seenPeers) // update rising number quickly + snark.setTrackerSeenPeers(tr.seenPeers); + + // pass everybody over to our tracker + if (_util.getDHT() != null) { + for (Peer peer : peers) { + _util.getDHT().announce(snark.getInfoHash(), peer.getPeerID().getDestHash()); + } + } + + if ( (left != 0) && (!completed) ) { // we only want to talk to new people if we need things // from them (duh) - List ordered = new ArrayList(peers); + List<Peer> ordered = new ArrayList(peers); Collections.shuffle(ordered, r); - Iterator it = ordered.iterator(); + Iterator<Peer> it = ordered.iterator(); while ((!stop) && it.hasNext()) { - Peer cur = (Peer)it.next(); + Peer cur = it.next(); // FIXME if id == us || dest == us continue; // only delay if we actually make an attempt to add peer - if(coordinator.addPeer(cur)) { - int delay = DELAY_MUL; - delay *= r.nextInt(10); - delay += DELAY_MIN; + if(coordinator.addPeer(cur) && it.hasNext()) { + int delay = (DELAY_MUL * r.nextInt(10)) + DELAY_MIN; sleptTime += delay; try { Thread.sleep(delay); } catch (InterruptedException ie) {} } @@ -293,12 +324,12 @@ public class TrackerClient extends I2PAppThread tr.trackerProblems = ioe.getMessage(); // don't show secondary tracker problems to the user if (tr.isPrimary) - coordinator.trackerProblems = tr.trackerProblems; + snark.setTrackerProblems(tr.trackerProblems); if (tr.trackerProblems.toLowerCase().startsWith(NOT_REGISTERED)) { // Give a guy some time to register it if using opentrackers too if (trackers.size() == 1) { stop = true; - coordinator.snark.stopTorrent(); + snark.stopTorrent(); } else { // hopefully each on the opentrackers list is really open if (tr.registerFails++ > MAX_REGISTER_FAILS) tr.stop = true; @@ -315,8 +346,66 @@ public class TrackerClient extends I2PAppThread maxSeenPeers = tr.seenPeers; } // *** end of trackers loop here + // Get peers from PEX + if (left > 0 && coordinator.needPeers() && !stop) { + Set<PeerID> pids = coordinator.getPEXPeers(); + if (!pids.isEmpty()) { + _util.debug("Got " + pids.size() + " from PEX", Snark.INFO); + List<Peer> peers = new ArrayList(pids.size()); + for (PeerID pID : pids) { + peers.add(new Peer(pID, snark.getID(), snark.getInfoHash(), snark.getMetaInfo())); + } + Collections.shuffle(peers, r); + Iterator<Peer> it = peers.iterator(); + while ((!stop) && it.hasNext()) { + Peer cur = it.next(); + if (coordinator.addPeer(cur) && it.hasNext()) { + int delay = (DELAY_MUL * r.nextInt(10)) + DELAY_MIN; + try { Thread.sleep(delay); } catch (InterruptedException ie) {} + } + } + } + } + + // Get peers from DHT + // FIXME this needs to be in its own thread + if (_util.getDHT() != null && !stop) { + int numwant; + if (left == 0 || event.equals(STOPPED_EVENT) || !coordinator.needPeers()) + numwant = 1; + else + numwant = _util.getMaxConnections(); + List<Hash> hashes = _util.getDHT().getPeers(snark.getInfoHash(), numwant, 2*60*1000); + _util.debug("Got " + hashes + " from DHT", Snark.INFO); + // announce ourselves while the token is still good + // FIXME this needs to be in its own thread + if (!stop) { + int good = _util.getDHT().announce(snark.getInfoHash(), 8, 5*60*1000); + _util.debug("Sent " + good + " good announces to DHT", Snark.INFO); + } + + // now try these peers + if ((!stop) && !hashes.isEmpty()) { + List<Peer> peers = new ArrayList(hashes.size()); + for (Hash h : hashes) { + PeerID pID = new PeerID(h.getData()); + peers.add(new Peer(pID, snark.getID(), snark.getInfoHash(), snark.getMetaInfo())); + } + Collections.shuffle(peers, r); + Iterator<Peer> it = peers.iterator(); + while ((!stop) && it.hasNext()) { + Peer cur = it.next(); + if (coordinator.addPeer(cur) && it.hasNext()) { + int delay = (DELAY_MUL * r.nextInt(10)) + DELAY_MIN; + try { Thread.sleep(delay); } catch (InterruptedException ie) {} + } + } + } + } + + // we could try and total the unique peers but that's too hard for now - coordinator.trackerSeenPeers = maxSeenPeers; + snark.setTrackerSeenPeers(maxSeenPeers); if (!runStarted) _util.debug(" Retrying in one minute...", Snark.DEBUG); } // *** end of while loop @@ -329,6 +418,9 @@ public class TrackerClient extends I2PAppThread } finally { + // Local DHT tracker unannounce + if (_util.getDHT() != null) + _util.getDHT().unannounce(snark.getInfoHash()); try { // try to contact everybody we can @@ -351,6 +443,8 @@ public class TrackerClient extends I2PAppThread long downloaded, long left, String event) throws IOException { + // What do we send for left in magnet mode? Can we omit it? + long tleft = left >= 0 ? left : 1; String s = tr.announce + "?info_hash=" + infoHash + "&peer_id=" + peerID @@ -358,10 +452,10 @@ public class TrackerClient extends I2PAppThread + "&ip=" + _util.getOurIPString() + ".i2p" + "&uploaded=" + uploaded + "&downloaded=" + downloaded - + "&left=" + left + + "&left=" + tleft + "&compact=1" // NOTE: opentracker will return 400 for &compact alone + ((! event.equals(NO_EVENT)) ? ("&event=" + event) : ""); - if (left <= 0 || event.equals(STOPPED_EVENT) || !coordinator.needPeers()) + if (left == 0 || event.equals(STOPPED_EVENT) || !coordinator.needPeers()) s += "&numwant=0"; else s += "&numwant=" + _util.getMaxConnections(); @@ -377,8 +471,8 @@ public class TrackerClient extends I2PAppThread try { in = new FileInputStream(fetched); - TrackerInfo info = new TrackerInfo(in, coordinator.getID(), - coordinator.getMetaInfo()); + TrackerInfo info = new TrackerInfo(in, snark.getID(), + snark.getInfoHash(), snark.getMetaInfo()); _util.debug("TrackerClient response: " + info, Snark.INFO); String failure = info.getFailureReason(); diff --git a/apps/i2psnark/java/src/org/klomp/snark/TrackerInfo.java b/apps/i2psnark/java/src/org/klomp/snark/TrackerInfo.java index 360a4f47e416c3ed728523cfcfbd4e5a09ca9b55..1b829d0eef00d674fdbbf5225381014c931beb8d 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/TrackerInfo.java +++ b/apps/i2psnark/java/src/org/klomp/snark/TrackerInfo.java @@ -46,19 +46,20 @@ public class TrackerInfo private int complete; private int incomplete; - public TrackerInfo(InputStream in, byte[] my_id, MetaInfo metainfo) + /** @param metainfo may be null */ + public TrackerInfo(InputStream in, byte[] my_id, byte[] infohash, MetaInfo metainfo) throws IOException { - this(new BDecoder(in), my_id, metainfo); + this(new BDecoder(in), my_id, infohash, metainfo); } - public TrackerInfo(BDecoder be, byte[] my_id, MetaInfo metainfo) + private TrackerInfo(BDecoder be, byte[] my_id, byte[] infohash, MetaInfo metainfo) throws IOException { - this(be.bdecodeMap().getMap(), my_id, metainfo); + this(be.bdecodeMap().getMap(), my_id, infohash, metainfo); } - public TrackerInfo(Map m, byte[] my_id, MetaInfo metainfo) + private TrackerInfo(Map m, byte[] my_id, byte[] infohash, MetaInfo metainfo) throws IOException { BEValue reason = (BEValue)m.get("failure reason"); @@ -84,10 +85,10 @@ public class TrackerInfo Set<Peer> p; try { // One big string (the official compact format) - p = getPeers(bePeers.getBytes(), my_id, metainfo); + p = getPeers(bePeers.getBytes(), my_id, infohash, metainfo); } catch (InvalidBEncodingException ibe) { // List of Dictionaries or List of Strings - p = getPeers(bePeers.getList(), my_id, metainfo); + p = getPeers(bePeers.getList(), my_id, infohash, metainfo); } peers = p; } @@ -123,7 +124,7 @@ public class TrackerInfo ******/ /** List of Dictionaries or List of Strings */ - private static Set<Peer> getPeers(List<BEValue> l, byte[] my_id, MetaInfo metainfo) + private static Set<Peer> getPeers(List<BEValue> l, byte[] my_id, byte[] infohash, MetaInfo metainfo) throws IOException { Set<Peer> peers = new HashSet(l.size()); @@ -144,7 +145,7 @@ public class TrackerInfo continue; } } - peers.add(new Peer(peerID, my_id, metainfo)); + peers.add(new Peer(peerID, my_id, infohash, metainfo)); } return peers; @@ -156,7 +157,7 @@ public class TrackerInfo * One big string of concatenated 32-byte hashes * @since 0.8.1 */ - private static Set<Peer> getPeers(byte[] l, byte[] my_id, MetaInfo metainfo) + private static Set<Peer> getPeers(byte[] l, byte[] my_id, byte[] infohash, MetaInfo metainfo) throws IOException { int count = l.length / HASH_LENGTH; @@ -172,7 +173,7 @@ public class TrackerInfo // won't happen continue; } - peers.add(new Peer(peerID, my_id, metainfo)); + peers.add(new Peer(peerID, my_id, infohash, metainfo)); } return peers; diff --git a/apps/i2psnark/java/src/org/klomp/snark/bencode/BDecoder.java b/apps/i2psnark/java/src/org/klomp/snark/bencode/BDecoder.java index 4c59bcb93b2270f1f2dc6e130d3b238d8b01f7ef..4f394d01e565073eeee0c229921419cef1884199 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/bencode/BDecoder.java +++ b/apps/i2psnark/java/src/org/klomp/snark/bencode/BDecoder.java @@ -60,22 +60,30 @@ public class BDecoder private int indicator = 0; // Used for ugly hack to get SHA hash over the metainfo info map - private String special_map = "info"; + private final String special_map = "info"; private boolean in_special_map = false; - private final MessageDigest sha_digest; + /** creation deferred until we encounter the special map, to make processing of announce replies more efficient */ + private MessageDigest sha_digest; - // Ugly hack. Return the SHA has over bytes that make up the special map. + /** + * Ugly hack. Return the SHA has over bytes that make up the special map. + * @return null if there was no special map + */ public byte[] get_special_map_digest() { + if (sha_digest == null) + return null; byte[] result = sha_digest.digest(); return result; } +/**** // Ugly hack. Name defaults to "info". public void set_special_map_name(String name) { special_map = name; } +****/ /** * Initalizes a new BDecoder. Nothing is read from the given @@ -84,15 +92,6 @@ public class BDecoder public BDecoder(InputStream in) { this.in = in; - // XXX - Used for ugly hack. - try - { - sha_digest = MessageDigest.getInstance("SHA"); - } - catch(NoSuchAlgorithmException nsa) - { - throw new InternalError(nsa.toString()); - } } /** @@ -112,6 +111,24 @@ public class BDecoder return new BDecoder(in).bdecode(); } + /** + * Used for SHA1 hack + * @since 0.8.5 + */ + private void createDigest() { + if (sha_digest == null) { + try { + sha_digest = MessageDigest.getInstance("SHA"); + } catch(NoSuchAlgorithmException nsa) { + throw new InternalError(nsa.toString()); + } + } else { + // there are two info maps, but not one inside the other, + // the resulting hash will be incorrect + // throw something? - no, the check in the MetaInfo constructor will catch it. + } + } + /** * Returns what the next bencoded object will be on the stream or -1 * when the end of stream has been reached. Can return something @@ -294,9 +311,13 @@ public class BDecoder String key = bdecode().getString(); // XXX ugly hack - boolean special = special_map.equals(key); - if (special) + // This will not screw up if an info map contains an info map, + // but it will if there are two info maps (not one inside the other) + boolean special = (!in_special_map) && special_map.equals(key); + if (special) { + createDigest(); in_special_map = true; + } BEValue value = bdecode(); result.put(key, value); diff --git a/apps/i2psnark/java/src/org/klomp/snark/bencode/BEValue.java b/apps/i2psnark/java/src/org/klomp/snark/bencode/BEValue.java index 986e456437a7e57770e442d207f12b3377019c13..4cae2881ae6c7d70a5e809c7187348b2d6484cd8 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/bencode/BEValue.java +++ b/apps/i2psnark/java/src/org/klomp/snark/bencode/BEValue.java @@ -24,6 +24,8 @@ import java.io.UnsupportedEncodingException; import java.util.List; import java.util.Map; +import net.i2p.data.Base64; + /** * Holds different types that a bencoded byte array can represent. * You need to call the correct get method to get the correct java @@ -178,12 +180,37 @@ public class BEValue String valueString; if (value instanceof byte[]) { + // try to do a nice job for debugging byte[] bs = (byte[])value; - // XXX - Stupid heuristic... and not UTF-8 - if (bs.length <= 12) - valueString = new String(bs); - else - valueString = "bytes:" + bs.length; + if (bs.length == 0) + valueString = "0 bytes"; + else if (bs.length <= 32) { + StringBuilder buf = new StringBuilder(32); + boolean bin = false; + for (int i = 0; i < bs.length; i++) { + int b = bs[i] & 0xff; + // no UTF-8 + if (b < ' ' || b > 0x7e) { + bin = true; + break; + } + } + if (bin && bs.length <= 8) { + buf.append(bs.length).append(" bytes: 0x"); + for (int i = 0; i < bs.length; i++) { + int b = bs[i] & 0xff; + if (b < 16) + buf.append('0'); + buf.append(Integer.toHexString(b)); + } + } else if (bin) { + buf.append(bs.length).append(" bytes: ").append(Base64.encode(bs)); + } else { + buf.append('"').append(new String(bs)).append('"'); + } + valueString = buf.toString(); + } else + valueString = bs.length + " bytes"; } else valueString = value.toString(); diff --git a/apps/i2psnark/java/src/org/klomp/snark/bencode/BEncoder.java b/apps/i2psnark/java/src/org/klomp/snark/bencode/BEncoder.java index b8129f47722de6595fd470b162a4ad155af726a2..9584b0d9db322e8fa1276be415cc190e46bee4a3 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/bencode/BEncoder.java +++ b/apps/i2psnark/java/src/org/klomp/snark/bencode/BEncoder.java @@ -50,6 +50,8 @@ public class BEncoder public static void bencode(Object o, OutputStream out) throws IOException, IllegalArgumentException { + if (o == null) + throw new NullPointerException("Cannot bencode null"); if (o instanceof String) bencode((String)o, out); else if (o instanceof byte[]) @@ -59,7 +61,7 @@ public class BEncoder else if (o instanceof List) bencode((List)o, out); else if (o instanceof Map) - bencode((Map)o, out); + bencode((Map<String, Object>)o, out); else if (o instanceof BEValue) bencode(((BEValue)o).getValue(), out); else @@ -153,7 +155,7 @@ public class BEncoder out.write(bs); } - public static byte[] bencode(Map m) + public static byte[] bencode(Map<String, Object> m) { try { @@ -167,20 +169,20 @@ public class BEncoder } } - public static void bencode(Map m, OutputStream out) throws IOException + public static void bencode(Map<String, Object> m, OutputStream out) throws IOException { out.write('d'); // Keys must be sorted. XXX - But is this the correct order? - Set s = m.keySet(); - List l = new ArrayList(s); + Set<String> s = m.keySet(); + List<String> l = new ArrayList(s); Collections.sort(l); - Iterator it = l.iterator(); + Iterator<String> it = l.iterator(); while(it.hasNext()) { // Keys must be Strings. - String key = (String)it.next(); + String key = it.next(); Object value = m.get(key); bencode(key, out); bencode(value, out); diff --git a/apps/i2psnark/java/src/org/klomp/snark/dht/DHT.java b/apps/i2psnark/java/src/org/klomp/snark/dht/DHT.java new file mode 100644 index 0000000000000000000000000000000000000000..6a16e4e605d255d9946068e8d994d64f6b924104 --- /dev/null +++ b/apps/i2psnark/java/src/org/klomp/snark/dht/DHT.java @@ -0,0 +1,82 @@ +package org.klomp.snark.dht; + +/* + * GPLv2 + */ + +import java.util.List; + +import net.i2p.data.Destination; +import net.i2p.data.Hash; + + +/** + * Stub for KRPC + */ +public interface DHT { + + + /** + * @return The UDP port that should be included in a PORT message. + */ + public int getPort(); + + /** + * Ping. We don't have a NID yet so the node is presumed + * to be absent from our DHT. + * Non-blocking, does not wait for pong. + * If and when the pong is received the node will be inserted in our DHT. + */ + public void ping(Destination dest, int port); + + /** + * Get peers for a torrent. + * Blocking! + * Caller should run in a thread. + * + * @param ih the Info Hash (torrent) + * @param max maximum number of peers to return + * @param maxWait the maximum time to wait (ms) must be > 0 + * @return list or empty list (never null) + */ + public List<Hash> getPeers(byte[] ih, int max, long maxWait); + + /** + * Announce to ourselves. + * Non-blocking. + * + * @param ih the Info Hash (torrent) + */ + public void announce(byte[] ih); + + /** + * Announce somebody else we know about. + * Non-blocking. + * + * @param ih the Info Hash (torrent) + * @param peerHash the peer's Hash + */ + public void announce(byte[] ih, byte[] peerHash); + + /** + * Remove reference to ourselves in the local tracker. + * Use when shutting down the torrent locally. + * Non-blocking. + * + * @param ih the Info Hash (torrent) + */ + public void unannounce(byte[] ih); + + /** + * Announce to the closest DHT peers. + * Blocking unless maxWait <= 0 + * Caller should run in a thread. + * This also automatically announces ourself to our local tracker. + * For best results do a getPeers() first so we have tokens. + * + * @param ih the Info Hash (torrent) + * @param maxWait the maximum total time to wait (ms) or 0 to do all in parallel and return immediately. + * @return the number of successful announces, not counting ourselves. + */ + public int announce(byte[] ih, int max, long maxWait); +} diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java index cfe95df13b7e91b1fb457414a63eab796e31812e..369fd3d2bab5313000d9d0fe8951e542e9e287ed 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java @@ -6,6 +6,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.text.Collator; +import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -26,6 +27,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import net.i2p.I2PAppContext; +import net.i2p.data.Base32; import net.i2p.data.Base64; import net.i2p.data.DataHelper; import net.i2p.util.FileUtil; @@ -33,6 +35,7 @@ import net.i2p.util.I2PAppThread; import net.i2p.util.Log; import net.i2p.util.SecureFileOutputStream; +import org.klomp.snark.I2PSnarkUtil; import org.klomp.snark.MetaInfo; import org.klomp.snark.Peer; import org.klomp.snark.Snark; @@ -58,8 +61,14 @@ public class I2PSnarkServlet extends Default { private Resource _resourceBase; private String _themePath; private String _imgPath; + private String _lastAnnounceURL = ""; public static final String PROP_CONFIG_FILE = "i2psnark.configFile"; + /** BEP 9 */ + private static final String MAGNET = "magnet:"; + private static final String MAGNET_FULL = MAGNET + "?xt=urn:btih:"; + /** http://sponge.i2p/files/maggotspec.txt */ + private static final String MAGGOT = "maggot://"; @Override public void init(ServletConfig cfg) throws ServletException { @@ -153,7 +162,7 @@ public class I2PSnarkServlet extends Default { resp.setCharacterEncoding("UTF-8"); resp.setContentType("text/html; charset=UTF-8"); Resource resource = getResource(pathInContext); - if (resource == null || (!resource.exists()) || !resource.isDirectory()) { + if (resource == null || (!resource.exists())) { resp.sendError(HttpResponse.__404_Not_Found); } else { String base = URI.addPaths(req.getRequestURI(), "/"); @@ -339,11 +348,13 @@ public class I2PSnarkServlet extends Default { out.write("</th>\n<th align=\"center\">"); // Opera and text-mode browsers: no   and no input type=image values submitted + // Using a unique name fixes Opera, except for the buttons with js confirms, see below String ua = req.getHeader("User-Agent"); - boolean isDegraded = ua != null && (ua.startsWith("Lynx") || - ua.startsWith("ELinks") || ua.startsWith("Dillo")); + boolean isDegraded = ua != null && (ua.startsWith("Lynx") || ua.startsWith("w3m") || + ua.startsWith("ELinks") || ua.startsWith("Links") || + ua.startsWith("Dillo")); - boolean noThinsp = isDegraded || ua.startsWith("Opera"); + boolean noThinsp = isDegraded || (ua != null && ua.startsWith("Opera")); if (_manager.util().connected()) { if (isDegraded) out.write("<a href=\"/i2psnark/?action=StopAll&nonce=" + _nonce + "\"><img title=\""); @@ -376,7 +387,7 @@ public class I2PSnarkServlet extends Default { for (int i = 0; i < snarks.size(); i++) { Snark snark = (Snark)snarks.get(i); boolean showDebug = "2".equals(peerParam); - boolean showPeers = showDebug || "1".equals(peerParam) || Base64.encode(snark.meta.getInfoHash()).equals(peerParam); + boolean showPeers = showDebug || "1".equals(peerParam) || Base64.encode(snark.getInfoHash()).equals(peerParam); displaySnark(out, snark, uri, i, stats, showPeers, isDegraded, noThinsp, showDebug); } @@ -478,10 +489,12 @@ public class I2PSnarkServlet extends Default { if (newURL != null) { if (newURL.startsWith("http://")) { _manager.addMessage(_("Fetching {0}", urlify(newURL))); - I2PAppThread fetch = new I2PAppThread(new FetchAndAdd(_manager, newURL), "Fetch and add"); + I2PAppThread fetch = new I2PAppThread(new FetchAndAdd(_manager, newURL), "Fetch and add", true); fetch.start(); + } else if (newURL.startsWith(MAGNET) || newURL.startsWith(MAGGOT)) { + addMagnet(newURL); } else { - _manager.addMessage(_("Invalid URL - must start with http://")); + _manager.addMessage(_("Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"", MAGNET, MAGGOT)); } } else { // no file or URL specified @@ -494,8 +507,8 @@ public class I2PSnarkServlet extends Default { for (Iterator iter = _manager.listTorrentFiles().iterator(); iter.hasNext(); ) { String name = (String)iter.next(); Snark snark = _manager.getTorrent(name); - if ( (snark != null) && (DataHelper.eq(infoHash, snark.meta.getInfoHash())) ) { - _manager.stopTorrent(name, false); + if ( (snark != null) && (DataHelper.eq(infoHash, snark.getInfoHash())) ) { + _manager.stopTorrent(snark, false); break; } } @@ -508,11 +521,9 @@ public class I2PSnarkServlet extends Default { if ( (infoHash != null) && (infoHash.length == 20) ) { // valid sha1 for (String name : _manager.listTorrentFiles()) { Snark snark = _manager.getTorrent(name); - if ( (snark != null) && (DataHelper.eq(infoHash, snark.meta.getInfoHash())) ) { + if ( (snark != null) && (DataHelper.eq(infoHash, snark.getInfoHash())) ) { snark.startTorrent(); - if (snark.storage != null) - name = snark.storage.getBaseName(); - _manager.addMessage(_("Starting up torrent {0}", name)); + _manager.addMessage(_("Starting up torrent {0}", snark.getBaseName())); break; } } @@ -526,8 +537,15 @@ public class I2PSnarkServlet extends Default { for (Iterator iter = _manager.listTorrentFiles().iterator(); iter.hasNext(); ) { String name = (String)iter.next(); Snark snark = _manager.getTorrent(name); - if ( (snark != null) && (DataHelper.eq(infoHash, snark.meta.getInfoHash())) ) { - _manager.stopTorrent(name, true); + if ( (snark != null) && (DataHelper.eq(infoHash, snark.getInfoHash())) ) { + MetaInfo meta = snark.getMetaInfo(); + if (meta == null) { + // magnet - remove and delete are the same thing + _manager.deleteMagnet(snark); + _manager.addMessage(_("Magnet deleted: {0}", name)); + return; + } + _manager.stopTorrent(snark, true); // should we delete the torrent file? // yeah, need to, otherwise it'll get autoadded again (at the moment File f = new File(name); @@ -546,13 +564,20 @@ public class I2PSnarkServlet extends Default { for (Iterator iter = _manager.listTorrentFiles().iterator(); iter.hasNext(); ) { String name = (String)iter.next(); Snark snark = _manager.getTorrent(name); - if ( (snark != null) && (DataHelper.eq(infoHash, snark.meta.getInfoHash())) ) { - _manager.stopTorrent(name, true); + if ( (snark != null) && (DataHelper.eq(infoHash, snark.getInfoHash())) ) { + MetaInfo meta = snark.getMetaInfo(); + if (meta == null) { + // magnet - remove and delete are the same thing + _manager.deleteMagnet(snark); + _manager.addMessage(_("Magnet deleted: {0}", name)); + return; + } + _manager.stopTorrent(snark, true); File f = new File(name); f.delete(); _manager.addMessage(_("Torrent file deleted: {0}", f.getAbsolutePath())); - List files = snark.meta.getFiles(); - String dataFile = snark.meta.getName(); + List files = meta.getFiles(); + String dataFile = snark.getBaseName(); f = new File(_manager.getDataDir(), dataFile); if (files == null) { // single file torrent if (f.delete()) @@ -612,23 +637,22 @@ public class I2PSnarkServlet extends Default { if (announceURL == null || announceURL.length() <= 0) _manager.addMessage(_("Error creating torrent - you must select a tracker")); else if (baseFile.exists()) { + _lastAnnounceURL = announceURL; + if (announceURL.equals("none")) + announceURL = null; try { + // This may take a long time to check the storage, but since it already exists, + // it shouldn't be THAT bad, so keep it in this thread. Storage s = new Storage(_manager.util(), baseFile, announceURL, null); - s.create(); s.close(); // close the files... maybe need a way to pass this Storage to addTorrent rather than starting over MetaInfo info = s.getMetaInfo(); - File torrentFile = new File(baseFile.getParent(), baseFile.getName() + ".torrent"); - if (torrentFile.exists()) - throw new IOException("Cannot overwrite an existing .torrent file: " + torrentFile.getPath()); - _manager.saveTorrentStatus(info, s.getBitField(), null); // so addTorrent won't recheck - // DirMonitor could grab this first, maybe hold _snarks lock? - FileOutputStream out = new FileOutputStream(torrentFile); - out.write(info.getTorrentData()); - out.close(); + File torrentFile = new File(_manager.getDataDir(), s.getBaseName() + ".torrent"); + // FIXME is the storage going to stay around thanks to the info reference? + // now add it, but don't automatically start it + _manager.addTorrent(info, s.getBitField(), torrentFile.getAbsolutePath(), true); _manager.addMessage(_("Torrent created for \"{0}\"", baseFile.getName()) + ": " + torrentFile.getAbsolutePath()); - // now fire it up, but don't automatically seed it - _manager.addTorrent(torrentFile.getCanonicalPath(), true); - _manager.addMessage(_("Many I2P trackers require you to register new torrents before seeding - please do so before starting \"{0}\"", baseFile.getName())); + if (announceURL != null) + _manager.addMessage(_("Many I2P trackers require you to register new torrents before seeding - please do so before starting \"{0}\"", baseFile.getName())); } catch (IOException ioe) { _manager.addMessage(_("Error creating a torrent for \"{0}\"", baseFile.getAbsolutePath()) + ": " + ioe.getMessage()); } @@ -643,8 +667,8 @@ public class I2PSnarkServlet extends Default { List snarks = getSortedSnarks(req); for (int i = 0; i < snarks.size(); i++) { Snark snark = (Snark)snarks.get(i); - if (!snark.stopped) - _manager.stopTorrent(snark.torrent, false); + if (!snark.isStopped()) + _manager.stopTorrent(snark, false); } if (_manager.util().connected()) { // Give the stopped announces time to get out @@ -657,7 +681,7 @@ public class I2PSnarkServlet extends Default { List snarks = getSortedSnarks(req); for (int i = 0; i < snarks.size(); i++) { Snark snark = (Snark)snarks.get(i); - if (snark.stopped) + if (snark.isStopped()) snark.startTorrent(); } } else { @@ -725,7 +749,7 @@ public class I2PSnarkServlet extends Default { private static final int MAX_DISPLAYED_ERROR_LENGTH = 43; private void displaySnark(PrintWriter out, Snark snark, String uri, int row, long stats[], boolean showPeers, boolean isDegraded, boolean noThinsp, boolean showDebug) throws IOException { - String filename = snark.torrent; + String filename = snark.getName(); File f = new File(filename); filename = f.getName(); // the torrent may be the canonical name, so lets just grab the local name int i = filename.lastIndexOf(".torrent"); @@ -733,31 +757,28 @@ public class I2PSnarkServlet extends Default { filename = filename.substring(0, i); String fullFilename = filename; if (filename.length() > MAX_DISPLAYED_FILENAME_LENGTH) { - fullFilename = new String(filename); - filename = filename.substring(0, MAX_DISPLAYED_FILENAME_LENGTH) + "…"; + String start = filename.substring(0, MAX_DISPLAYED_FILENAME_LENGTH); + if (start.indexOf(" ") < 0 && start.indexOf("-") < 0) { + // browser has nowhere to break it + fullFilename = filename; + filename = start + "…"; + } } - long total = snark.meta.getTotalLength(); + long total = snark.getTotalLength(); // Early typecast, avoid possibly overflowing a temp integer - long remaining = (long) snark.storage.needed() * (long) snark.meta.getPieceLength(0); + long remaining = (long) snark.getNeeded() * (long) snark.getPieceLength(0); if (remaining > total) remaining = total; - long downBps = 0; - long upBps = 0; - if (snark.coordinator != null) { - downBps = snark.coordinator.getDownloadRate(); - upBps = snark.coordinator.getUploadRate(); - } + long downBps = snark.getDownloadRate(); + long upBps = snark.getUploadRate(); long remainingSeconds; if (downBps > 0) remainingSeconds = remaining / downBps; else remainingSeconds = -1; - boolean isRunning = !snark.stopped; - long uploaded = 0; - if (snark.coordinator != null) { - uploaded = snark.coordinator.getUploaded(); - stats[0] += snark.coordinator.getDownloaded(); - } + boolean isRunning = !snark.isStopped(); + long uploaded = snark.getUploaded(); + stats[0] += snark.getDownloaded(); stats[1] += uploaded; if (isRunning) { stats[2] += downBps; @@ -765,25 +786,22 @@ public class I2PSnarkServlet extends Default { } stats[5] += total; - boolean isValid = snark.meta != null; - boolean singleFile = snark.meta.getFiles() == null; + MetaInfo meta = snark.getMetaInfo(); + // isValid means isNotMagnet + boolean isValid = meta != null; + boolean isMultiFile = isValid && meta.getFiles() != null; - String err = null; - int curPeers = 0; - int knownPeers = 0; - if (snark.coordinator != null) { - err = snark.coordinator.trackerProblems; - curPeers = snark.coordinator.getPeerCount(); - stats[4] += curPeers; - knownPeers = Math.max(curPeers, snark.coordinator.trackerSeenPeers); - } + String err = snark.getTrackerProblems(); + int curPeers = snark.getPeerCount(); + stats[4] += curPeers; + int knownPeers = Math.max(curPeers, snark.getTrackerSeenPeers()); String rowClass = (row % 2 == 0 ? "snarkTorrentEven" : "snarkTorrentOdd"); String statusString; if (err != null) { if (isRunning && curPeers > 0 && !showPeers) statusString = "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "trackererror.png\" title=\"" + err + "\"></td><td class=\"snarkTorrentStatus " + rowClass + "\">" + _("Tracker Error") + - ": <a href=\"" + uri + "?p=" + Base64.encode(snark.meta.getInfoHash()) + "\">" + + ": <a href=\"" + uri + "?p=" + Base64.encode(snark.getInfoHash()) + "\">" + curPeers + thinsp(noThinsp) + ngettext("1 peer", "{0} peers", knownPeers) + "</a>"; else if (isRunning) @@ -796,10 +814,10 @@ public class I2PSnarkServlet extends Default { statusString = "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "trackererror.png\" title=\"" + err + "\"></td><td class=\"snarkTorrentStatus " + rowClass + "\">" + _("Tracker Error") + "<br>" + err; } - } else if (remaining <= 0) { + } else if (remaining == 0) { // < 0 means no meta size yet if (isRunning && curPeers > 0 && !showPeers) statusString = "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "seeding.png\" ></td><td class=\"snarkTorrentStatus " + rowClass + "\">" + _("Seeding") + - ": <a href=\"" + uri + "?p=" + Base64.encode(snark.meta.getInfoHash()) + "\">" + + ": <a href=\"" + uri + "?p=" + Base64.encode(snark.getInfoHash()) + "\">" + curPeers + thinsp(noThinsp) + ngettext("1 peer", "{0} peers", knownPeers) + "</a>"; else if (isRunning) @@ -811,7 +829,7 @@ public class I2PSnarkServlet extends Default { } else { if (isRunning && curPeers > 0 && downBps > 0 && !showPeers) statusString = "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "downloading.png\" ></td><td class=\"snarkTorrentStatus " + rowClass + "\">" + _("OK") + - ": <a href=\"" + uri + "?p=" + Base64.encode(snark.meta.getInfoHash()) + "\">" + + ": <a href=\"" + uri + "?p=" + Base64.encode(snark.getInfoHash()) + "\">" + curPeers + thinsp(noThinsp) + ngettext("1 peer", "{0} peers", knownPeers) + "</a>"; else if (isRunning && curPeers > 0 && downBps > 0) @@ -820,7 +838,7 @@ public class I2PSnarkServlet extends Default { ngettext("1 peer", "{0} peers", knownPeers); else if (isRunning && curPeers > 0 && !showPeers) statusString = "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "stalled.png\" ></td><td class=\"snarkTorrentStatus " + rowClass + "\">" + _("Stalled") + - ": <a href=\"" + uri + "?p=" + Base64.encode(snark.meta.getInfoHash()) + "\">" + + ": <a href=\"" + uri + "?p=" + Base64.encode(snark.getInfoHash()) + "\">" + curPeers + thinsp(noThinsp) + ngettext("1 peer", "{0} peers", knownPeers) + "</a>"; else if (isRunning && curPeers > 0) @@ -840,64 +858,66 @@ public class I2PSnarkServlet extends Default { out.write("<td class=\"center " + rowClass + "\">"); out.write(statusString + "</td>\n\t"); + // (i) icon column out.write("<td class=\"" + rowClass + "\">"); - // temporarily hardcoded for postman* and anonymity, requires bytemonsoon patch for lookup by info_hash - String announce = snark.meta.getAnnounce(); - if (announce.startsWith("http://YRgrgTLG") || announce.startsWith("http://8EoJZIKr") || - announce.startsWith("http://lnQ6yoBT") || announce.startsWith("http://tracker2.postman.i2p/") || announce.startsWith("http://ahsplxkbhemefwvvml7qovzl5a2b5xo5i7lyai7ntdunvcyfdtna.b32.i2p/")) { - Map trackers = _manager.getTrackers(); - for (Iterator iter = trackers.entrySet().iterator(); iter.hasNext(); ) { - Map.Entry entry = (Map.Entry)iter.next(); - String name = (String)entry.getKey(); - String baseURL = (String)entry.getValue(); - if (!(baseURL.startsWith(announce) || // vvv hack for non-b64 announce in list vvv - (announce.startsWith("http://lnQ6yoBT") && baseURL.startsWith("http://tracker2.postman.i2p/")) || - (announce.startsWith("http://ahsplxkbhemefwvvml7qovzl5a2b5xo5i7lyai7ntdunvcyfdtna.b32.i2p/") && baseURL.startsWith("http://tracker2.postman.i2p/")))) - continue; - int e = baseURL.indexOf('='); - if (e < 0) - continue; - baseURL = baseURL.substring(e + 1); - out.write("<a href=\"" + baseURL + "details.php?dllist=1&filelist=1&info_hash="); - out.write(TrackerClient.urlencode(snark.meta.getInfoHash())); - out.write("\" title=\"" + _("Details at {0} tracker", name) + "\" target=\"_blank\">"); - out.write("<img alt=\"" + _("Info") + "\" border=\"0\" src=\"" + _imgPath + "details.png\">"); - out.write("</a>"); - break; - } + if (isValid && meta.getAnnounce() != null) { + // Link to local details page - note that trailing slash on a single-file torrent + // gets us to the details page instead of the file. + //StringBuilder buf = new StringBuilder(128); + //buf.append("<a href=\"").append(snark.getBaseName()) + // .append("/\" title=\"").append(_("Torrent details")) + // .append("\"><img alt=\"").append(_("Info")).append("\" border=\"0\" src=\"") + // .append(_imgPath).append("details.png\"></a>"); + //out.write(buf.toString()); + + // Link to tracker details page + String trackerLink = getTrackerLink(meta.getAnnounce(), snark.getInfoHash()); + if (trackerLink != null) + out.write(trackerLink); } + // File type icon column out.write("</td>\n<td class=\"" + rowClass + "\">"); - StringBuilder buf = null; - if (remaining == 0 || snark.meta.getFiles() != null) { - buf = new StringBuilder(128); - buf.append("<a href=\"").append(snark.storage.getBaseName()); - if (snark.meta.getFiles() != null) - buf.append('/'); - buf.append("\" title=\""); - if (snark.meta.getFiles() != null) - buf.append(_("View files")); - else - buf.append(_("Open file")); - buf.append("\">"); + if (isValid) { + // Link to local details page - note that trailing slash on a single-file torrent + // gets us to the details page instead of the file. + StringBuilder buf = new StringBuilder(128); + buf.append("<a href=\"").append(snark.getBaseName()) + .append("/\" title=\"").append(_("Torrent details")) + .append("\">"); out.write(buf.toString()); } String icon; - if (snark.meta.getFiles() != null) + if (isMultiFile) icon = "folder"; + else if (isValid) + icon = toIcon(meta.getName()); else - icon = toIcon(snark.meta.getName()); - if (remaining == 0 || snark.meta.getFiles() != null) { - out.write(toImg(icon, _("Open"))); + icon = "magnet"; + if (isValid) { + out.write(toImg(icon, _("Info"))); out.write("</a>"); } else { out.write(toImg(icon)); } + + // Torrent name column out.write("</td><td class=\"snarkTorrentName " + rowClass + "\">"); - if (remaining == 0 || snark.meta.getFiles() != null) + if (remaining == 0 || isMultiFile) { + StringBuilder buf = new StringBuilder(128); + buf.append("<a href=\"").append(snark.getBaseName()); + if (isMultiFile) + buf.append('/'); + buf.append("\" title=\""); + if (isMultiFile) + buf.append(_("View files")); + else + buf.append(_("Open file")); + buf.append("\">"); out.write(buf.toString()); + } out.write(filename); - if (remaining == 0 || snark.meta.getFiles() != null) + if (remaining == 0 || isMultiFile) out.write("</a>"); out.write("<td align=\"right\" class=\"snarkTorrentETA " + rowClass + "\">"); @@ -907,24 +927,26 @@ public class I2PSnarkServlet extends Default { out.write("<td align=\"right\" class=\"snarkTorrentDownloaded " + rowClass + "\">"); if (remaining > 0) out.write(formatSize(total-remaining) + thinsp(noThinsp) + formatSize(total)); - else + else if (remaining == 0) out.write(formatSize(total)); // 3GB + //else + // out.write("??"); // no meta size yet out.write("</td>\n\t"); out.write("<td align=\"right\" class=\"snarkTorrentUploaded " + rowClass + "\">"); - if(isRunning) + if(isRunning && isValid) out.write(formatSize(uploaded)); out.write("</td>\n\t"); out.write("<td align=\"right\" class=\"snarkTorrentRateDown\">"); - if(isRunning && remaining > 0) + if(isRunning && remaining != 0) out.write(formatSize(downBps) + "ps"); out.write("</td>\n\t"); out.write("<td align=\"right\" class=\"snarkTorrentRateUp\">"); - if(isRunning) + if(isRunning && isValid) out.write(formatSize(upBps) + "ps"); out.write("</td>\n\t"); out.write("<td align=\"center\" class=\"snarkTorrentAction " + rowClass + "\">"); - String parameters = "&nonce=" + _nonce + "&torrent=" + Base64.encode(snark.meta.getInfoHash()); - String b64 = Base64.encode(snark.meta.getInfoHash()); + String parameters = "&nonce=" + _nonce + "&torrent=" + Base64.encode(snark.getInfoHash()); + String b64 = Base64.encode(snark.getInfoHash()); if (showPeers) parameters = parameters + "&p=1"; if (isRunning) { @@ -939,8 +961,8 @@ public class I2PSnarkServlet extends Default { if (isDegraded) out.write("</a>"); } else { - if (isValid) { - if (isDegraded) + // This works in Opera but it's displayed a little differently, so use noThinsp here too so all 3 icons are consistent + if (noThinsp) out.write("<a href=\"/i2psnark/?action=Start_" + b64 + "&nonce=" + _nonce + "\"><img title=\""); else out.write("<input type=\"image\" name=\"action_Start_" + b64 + "\" value=\"foo\" title=\""); @@ -950,26 +972,29 @@ public class I2PSnarkServlet extends Default { out.write("\">"); if (isDegraded) out.write("</a>"); - } - if (isDegraded) - out.write("<a href=\"/i2psnark/?action=Remove_" + b64 + "&nonce=" + _nonce + "\"><img title=\""); - else - out.write("<input type=\"image\" name=\"action_Remove_" + b64 + "\" value=\"foo\" title=\""); - out.write(_("Remove the torrent from the active list, deleting the .torrent file")); - out.write("\" onclick=\"if (!confirm('"); - // Can't figure out how to escape double quotes inside the onclick string. - // Single quotes in translate strings with parameters must be doubled. - // Then the remaining single quite must be escaped - out.write(_("Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded data will not be deleted) ?", fullFilename)); - out.write("')) { return false; }\""); - out.write(" src=\"" + _imgPath + "remove.png\" alt=\""); - out.write(_("Remove")); - out.write("\">"); - if (isDegraded) - out.write("</a>"); + if (isValid) { + // Doesnt work with Opera so use noThinsp instead of isDegraded + if (noThinsp) + out.write("<a href=\"/i2psnark/?action=Remove_" + b64 + "&nonce=" + _nonce + "\"><img title=\""); + else + out.write("<input type=\"image\" name=\"action\" value=\"Remove_" + b64 + "\" title=\""); + out.write(_("Remove the torrent from the active list, deleting the .torrent file")); + out.write("\" onclick=\"if (!confirm('"); + // Can't figure out how to escape double quotes inside the onclick string. + // Single quotes in translate strings with parameters must be doubled. + // Then the remaining single quite must be escaped + out.write(_("Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded data will not be deleted) ?", fullFilename)); + out.write("')) { return false; }\""); + out.write(" src=\"" + _imgPath + "remove.png\" alt=\""); + out.write(_("Remove")); + out.write("\">"); + if (isDegraded) + out.write("</a>"); + } - if (isDegraded) + // Doesnt work with Opera so use noThinsp instead of isDegraded + if (noThinsp) out.write("<a href=\"/i2psnark/?action=Delete_" + b64 + "&nonce=" + _nonce + "\"><img title=\""); else out.write("<input type=\"image\" name=\"action_Delete_" + b64 + "\" value=\"foo\" title=\""); @@ -989,7 +1014,7 @@ public class I2PSnarkServlet extends Default { out.write("</td>\n</tr>\n"); if(showPeers && isRunning && curPeers > 0) { - List<Peer> peers = snark.coordinator.peerList(); + List<Peer> peers = snark.getPeerList(); if (!showDebug) Collections.sort(peers, new PeerComparator()); for (Peer peer : peers) { @@ -1022,14 +1047,21 @@ public class I2PSnarkServlet extends Default { out.write("<td class=\"snarkTorrentStatus " + rowClass + "\">"); out.write("</td>\n\t"); out.write("<td align=\"right\" class=\"snarkTorrentStatus " + rowClass + "\">"); - float pct = (float) (100.0 * (float) peer.completed() / snark.meta.getPieces()); - if (pct == 100.0) - out.write(_("Seed")); - else { - String ps = String.valueOf(pct); - if (ps.length() > 5) - ps = ps.substring(0, 5); - out.write(ps + "%"); + float pct; + if (isValid) { + pct = (float) (100.0 * (float) peer.completed() / meta.getPieces()); + if (pct == 100.0) + out.write(_("Seed")); + else { + String ps = String.valueOf(pct); + if (ps.length() > 5) + ps = ps.substring(0, 5); + out.write(ps + "%"); + } + } else { + pct = (float) 101.0; + // until we get the metainfo we don't know how many pieces there are + //out.write("??"); } out.write("</td>\n\t"); out.write("<td class=\"snarkTorrentStatus " + rowClass + "\">"); @@ -1048,10 +1080,16 @@ public class I2PSnarkServlet extends Default { out.write("\">"); out.write(formatSize(peer.getDownloadRate()) + "ps</a></span>"); } + } else if (!isValid) { + //if (peer supports metadata extension) { + out.write("<span class=\"unchoked\">"); + out.write(formatSize(peer.getDownloadRate()) + "ps</span>"); + //} else { + //} } out.write("</td>\n\t"); out.write("<td align=\"right\" class=\"snarkTorrentStatus " + rowClass + "\">"); - if (pct != 100.0) { + if (isValid && pct < 100.0) { if (peer.isInterested() && !peer.isChoking()) { out.write("<span class=\"unchoked\">"); out.write(formatSize(peer.getUploadRate()) + "ps</span>"); @@ -1094,8 +1132,40 @@ public class I2PSnarkServlet extends Default { } } + /** + * @return string or null + * @since 0.8.4 + */ + private String getTrackerLink(String announce, byte[] infohash) { + // temporarily hardcoded for postman* and anonymity, requires bytemonsoon patch for lookup by info_hash + if (announce != null && (announce.startsWith("http://YRgrgTLG") || announce.startsWith("http://8EoJZIKr") || + announce.startsWith("http://lnQ6yoBT") || announce.startsWith("http://tracker2.postman.i2p/") || + announce.startsWith("http://ahsplxkbhemefwvvml7qovzl5a2b5xo5i7lyai7ntdunvcyfdtna.b32.i2p/"))) { + Map<String, String> trackers = _manager.getTrackers(); + for (Map.Entry<String, String> entry : trackers.entrySet()) { + String baseURL = entry.getValue(); + if (!(baseURL.startsWith(announce) || // vvv hack for non-b64 announce in list vvv + (announce.startsWith("http://lnQ6yoBT") && baseURL.startsWith("http://tracker2.postman.i2p/")) || + (announce.startsWith("http://ahsplxkbhemefwvvml7qovzl5a2b5xo5i7lyai7ntdunvcyfdtna.b32.i2p/") && baseURL.startsWith("http://tracker2.postman.i2p/")))) + continue; + int e = baseURL.indexOf('='); + if (e < 0) + continue; + baseURL = baseURL.substring(e + 1); + String name = entry.getKey(); + StringBuilder buf = new StringBuilder(128); + buf.append("<a href=\"").append(baseURL).append("details.php?dllist=1&filelist=1&info_hash=") + .append(TrackerClient.urlencode(infohash)) + .append("\" title=\"").append(_("Details at {0} tracker", name)).append("\" target=\"_blank\">" + + "<img alt=\"").append(_("Info")).append("\" border=\"0\" src=\"") + .append(_imgPath).append("details.png\"></a>"); + return buf.toString(); + } + } + return null; + } + private void writeAddForm(PrintWriter out, HttpServletRequest req) throws IOException { - String uri = req.getRequestURI(); String newURL = req.getParameter("newURL"); if ( (newURL == null) || (newURL.trim().length() <= 0) ) newURL = ""; @@ -1120,7 +1190,7 @@ public class I2PSnarkServlet extends Default { out.write(_("From URL")); out.write(":<td><input type=\"text\" name=\"newURL\" size=\"85\" value=\"" + newURL + "\""); out.write("title=\""); - out.write(_("Torrent file must originate from an I2P-based tracker")); + out.write(_("Enter the torrent file download URL (I2P only), magnet link, or maggot link")); out.write("\"> \n"); // not supporting from file at the moment, since the file name passed isn't always absolute (so it may not resolve) //out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br>"); @@ -1136,7 +1206,6 @@ public class I2PSnarkServlet extends Default { } private void writeSeedForm(PrintWriter out, HttpServletRequest req) throws IOException { - String uri = req.getRequestURI(); String baseFile = req.getParameter("baseFile"); if (baseFile == null || baseFile.trim().length() <= 0) baseFile = ""; @@ -1167,6 +1236,11 @@ public class I2PSnarkServlet extends Default { out.write(":<td><select name=\"announceURL\"><option value=\"\">"); out.write(_("Select a tracker")); out.write("</option>\n"); + // todo remember this one with _lastAnnounceURL also + out.write("<option value=\"none\">"); + //out.write(_("Open trackers and DHT only")); + out.write(_("Open trackers only")); + out.write("</option>\n"); Map trackers = _manager.getTrackers(); for (Iterator iter = trackers.entrySet().iterator(); iter.hasNext(); ) { Map.Entry entry = (Map.Entry)iter.next(); @@ -1175,6 +1249,8 @@ public class I2PSnarkServlet extends Default { int e = announceURL.indexOf('='); if (e > 0) announceURL = announceURL.substring(0, e); + if (announceURL.equals(_lastAnnounceURL)) + announceURL += "\" selected=\"selected"; out.write("\t<option value=\"" + announceURL + "\">" + name + "</option>\n"); } out.write("</select>\n"); @@ -1190,7 +1266,6 @@ public class I2PSnarkServlet extends Default { } private void writeConfigForm(PrintWriter out, HttpServletRequest req) throws IOException { - String uri = req.getRequestURI(); String dataDir = _manager.getDataDir().getAbsolutePath(); boolean autoStart = _manager.shouldAutoStart(); boolean useOpenTrackers = _manager.util().shouldUseOpenTrackers(); @@ -1308,15 +1383,17 @@ public class I2PSnarkServlet extends Default { out.write(" "); out.write(renderOptions(0, 4, options.remove("outbound.length"), "outbound.length", HOP)); - out.write("<tr><td>"); - out.write(_("I2CP host")); - out.write(": <td><input type=\"text\" name=\"i2cpHost\" value=\"" - + _manager.util().getI2CPHost() + "\" size=\"15\" > "); + if (!_context.isRouterContext()) { + out.write("<tr><td>"); + out.write(_("I2CP host")); + out.write(": <td><input type=\"text\" name=\"i2cpHost\" value=\"" + + _manager.util().getI2CPHost() + "\" size=\"15\" > "); - out.write("<tr><td>"); - out.write(_("I2CP port")); - out.write(": <td><input type=\"text\" name=\"i2cpPort\" class=\"r\" value=\"" + - + _manager.util().getI2CPPort() + "\" size=\"5\" maxlength=\"5\" > <br>\n"); + out.write("<tr><td>"); + out.write(_("I2CP port")); + out.write(": <td><input type=\"text\" name=\"i2cpPort\" class=\"r\" value=\"" + + + _manager.util().getI2CPPort() + "\" size=\"5\" maxlength=\"5\" > <br>\n"); + } StringBuilder opts = new StringBuilder(64); for (Iterator iter = options.entrySet().iterator(); iter.hasNext(); ) { @@ -1327,7 +1404,7 @@ public class I2PSnarkServlet extends Default { } out.write("<tr><td>"); out.write(_("I2CP options")); - out.write(": <td><textarea name=\"i2cpOpts\" cols=\"60\" rows=\"1\" wrap=\"off\" >" + out.write(": <td><textarea name=\"i2cpOpts\" cols=\"60\" rows=\"1\" wrap=\"off\" spellcheck=\"false\" >" + opts.toString() + "</textarea><br>\n"); out.write("<tr><td> <td><input type=\"submit\" value=\""); @@ -1344,6 +1421,78 @@ public class I2PSnarkServlet extends Default { out.write("</a></span></span></div>\n"); } + /** + * @param url in base32 or hex, xt must be first magnet param + * @since 0.8.4 + */ + private void addMagnet(String url) { + String ihash; + String name; + String trackerURL = null; + if (url.startsWith(MAGNET)) { + // magnet:?xt=urn:btih:0691e40aae02e552cfcb57af1dca56214680c0c5&tr=http://tracker2.postman.i2p/announce.php + String xt = getParam("xt", url); + if (xt == null || !xt.startsWith("urn:btih:")) { + _manager.addMessage(_("Invalid magnet URL {0}", url)); + return; + } + ihash = xt.substring("urn:btih:".length()); + trackerURL = getParam("tr", url); + name = "Magnet " + ihash; + String dn = getParam("dn", url); + if (dn != null) + name += " (" + Storage.filterName(dn) + ')'; + } else if (url.startsWith(MAGGOT)) { + // maggot://0691e40aae02e552cfcb57af1dca56214680c0c5:0b557bbdf8718e95d352fbe994dec3a383e2ede7 + ihash = url.substring(MAGGOT.length()).trim(); + int col = ihash.indexOf(':'); + if (col >= 0) + ihash = ihash.substring(0, col); + name = "Maggot " + ihash; + } else { + return; + } + byte[] ih = null; + if (ihash.length() == 32) { + ih = Base32.decode(ihash); + } else if (ihash.length() == 40) { + // Like DataHelper.fromHexString() but ensures no loss of leading zero bytes + ih = new byte[20]; + try { + for (int i = 0; i < 20; i++) { + ih[i] = (byte) (Integer.parseInt(ihash.substring(i*2, (i*2) + 2), 16) & 0xff); + } + } catch (NumberFormatException nfe) { + ih = null; + } + } + if (ih == null || ih.length != 20) { + _manager.addMessage(_("Invalid info hash in magnet URL {0}", url)); + return; + } + _manager.addMagnet(name, ih, trackerURL, true); + } + + private static String getParam(String key, String uri) { + int idx = uri.indexOf('?' + key + '='); + if (idx >= 0) { + idx += key.length() + 2; + } else { + idx = uri.indexOf('&' + key + '='); + if (idx >= 0) + idx += key.length() + 2; + } + if (idx < 0 || idx > uri.length()) + return null; + String rv = uri.substring(idx); + idx = rv.indexOf('&'); + if (idx >= 0) + rv = rv.substring(0, idx); + else + rv = rv.trim(); + return rv; + } + /** copied from ConfigTunnelsHelper */ private static final String HOP = "hop"; private static final String TUNNEL = "tunnel"; @@ -1384,6 +1533,11 @@ public class I2PSnarkServlet extends Default { return _manager.util().getString(s, o); } + /** translate */ + private String _(String s, Object o, Object o2) { + return _manager.util().getString(s, o, o2); + } + /** translate (ngettext) @since 0.7.14 */ private String ngettext(String s, String p, int n) { return _manager.util().getString(n, s, p); @@ -1459,13 +1613,11 @@ public class I2PSnarkServlet extends Default { private String getListHTML(Resource r, String base, boolean parent, Map postParams) throws IOException { - if (!r.isDirectory()) - return null; - - String[] ls = r.list(); - if (ls==null) - return null; - Arrays.sort(ls, Collator.getInstance()); + String[] ls = null; + if (r.isDirectory()) { + ls = r.list(); + Arrays.sort(ls, Collator.getInstance()); + } // if r is not a directory, we are only showing torrent info section StringBuilder buf=new StringBuilder(4096); buf.append(DOCTYPE + "<HTML><HEAD><TITLE>"); @@ -1487,6 +1639,7 @@ public class I2PSnarkServlet extends Default { if (title.endsWith("/")) title = title.substring(0, title.length() - 1); + String directory = title; title = _("Torrent") + ": " + title; buf.append(title); buf.append("</TITLE>").append(HEADER_A).append(_themePath).append(HEADER_B).append("<link rel=\"shortcut icon\" href=\"" + _themePath + "favicon.ico\">" + @@ -1495,13 +1648,70 @@ public class I2PSnarkServlet extends Default { if (parent) // always true buf.append("<div class=\"page\"><div class=\"mainsection\">"); - boolean showPriority = snark != null && !snark.storage.complete(); + boolean showPriority = ls != null && snark != null && snark.getStorage() != null && !snark.getStorage().complete(); if (showPriority) buf.append("<form action=\"").append(base).append("\" method=\"POST\">\n"); - buf.append("<TABLE BORDER=0 class=\"snarkTorrents\" >" + - "<thead><tr><th>") + buf.append("<TABLE BORDER=0 class=\"snarkTorrents\" ><thead>"); + if (snark != null) { + // first row - torrent info + // FIXME center + buf.append("<tr><th colspan=\"" + (showPriority ? '4' : '3') + "\"><div>") + .append(_("Torrent")).append(": ").append(snark.getBaseName()); + int pieces = snark.getPieces(); + double completion = (pieces - snark.getNeeded()) / (double) pieces; + if (completion < 1.0) + buf.append("<br>").append(_("Completion")).append(": ").append((new DecimalFormat("0.00%")).format(completion)); + else + buf.append("<br>").append(_("Complete")); + // else unknown + buf.append("<br>").append(_("Size")).append(": ").append(formatSize(snark.getTotalLength())); + MetaInfo meta = snark.getMetaInfo(); + if (meta != null) { + List files = meta.getFiles(); + int fileCount = files != null ? files.size() : 1; + buf.append("<br>").append(_("Files")).append(": ").append(fileCount); + } + buf.append("<br>").append(_("Pieces")).append(": ").append(pieces); + buf.append("<br>").append(_("Piece size")).append(": ").append(formatSize(snark.getPieceLength(0))); + + if (meta != null) { + String announce = meta.getAnnounce(); + if (announce != null) { + buf.append("<br>"); + String trackerLink = getTrackerLink(announce, snark.getInfoHash()); + if (trackerLink != null) + buf.append(trackerLink).append(' '); + buf.append(_("Tracker")).append(": "); + if (announce.startsWith("http://")) + announce = announce.substring(7); + int slsh = announce.indexOf('/'); + if (slsh > 0) + announce = announce.substring(0, slsh); + if (announce.length() > 67) + announce = announce.substring(0, 40) + "…" + announce.substring(announce.length() - 8); + buf.append(announce); + } + } + + String hex = I2PSnarkUtil.toHex(snark.getInfoHash()); + buf.append("<br>").append(toImg("magnet", _("Magnet link"))).append(" <a href=\"") + .append(MAGNET_FULL).append(hex).append("\">") + .append(MAGNET_FULL).append(hex).append("</a>"); + // We don't have the hash of the torrent file + //buf.append("<br>").append(_("Maggot link")).append(": <a href=\"").append(MAGGOT).append(hex).append(':').append(hex).append("\">") + // .append(MAGGOT).append(hex).append(':').append(hex).append("</a>"); + buf.append("</div></th></tr>"); + } + if (ls == null) { + // We are only showing the torrent info section + buf.append("</thead></table></div></div></BODY></HTML>"); + return buf.toString(); + } + + // second row - dir info + buf.append("<tr><th>") .append("<img alt=\"\" border=\"0\" src=\"" + _imgPath + "file.png\" > ") - .append(title).append("</th><th align=\"right\">") + .append(_("Directory")).append(": ").append(directory).append("</th><th align=\"right\">") .append("<img alt=\"\" border=\"0\" src=\"" + _imgPath + "size.png\" > ") .append(_("Size")); buf.append("</th><th class=\"headerstatus\">") @@ -1542,15 +1752,16 @@ public class I2PSnarkServlet extends Default { complete = true; status = toImg("tick") + ' ' + _("Directory"); } else { - if (snark == null) { + if (snark == null || snark.getStorage() == null) { // Assume complete, perhaps he removed a completed torrent but kept a bookmark complete = true; status = toImg("cancel") + ' ' + _("Torrent not found?"); } else { + Storage storage = snark.getStorage(); try { File f = item.getFile(); if (f != null) { - long remaining = snark.storage.remaining(f.getCanonicalPath()); + long remaining = storage.remaining(f.getCanonicalPath()); if (remaining < 0) { complete = true; status = toImg("cancel") + ' ' + _("File not found in torrent?"); @@ -1558,7 +1769,7 @@ public class I2PSnarkServlet extends Default { complete = true; status = toImg("tick") + ' ' + _("Complete"); } else { - int priority = snark.storage.getPriority(f.getCanonicalPath()); + int priority = storage.getPriority(f.getCanonicalPath()); if (priority < 0) status = toImg("cancel"); else if (priority == 0) @@ -1614,7 +1825,7 @@ public class I2PSnarkServlet extends Default { buf.append("<td class=\"priority\">"); File f = item.getFile(); if ((!complete) && (!item.isDirectory()) && f != null) { - int pri = snark.storage.getPriority(f.getCanonicalPath()); + int pri = snark.getStorage().getPriority(f.getCanonicalPath()); buf.append("<input type=\"radio\" value=\"5\" name=\"pri.").append(f.getCanonicalPath()).append("\" "); if (pri > 0) buf.append("checked=\"true\""); @@ -1672,9 +1883,11 @@ public class I2PSnarkServlet extends Default { mime = ""; if (mime.equals("text/html")) icon = "html"; - else if (mime.equals("text/plain") || plc.endsWith(".nfo")) + else if (mime.equals("text/plain") || plc.endsWith(".nfo") || + mime.equals("application/rtf")) icon = "page"; - else if (mime.equals("application/java-archive") || plc.endsWith(".war")) + else if (mime.equals("application/java-archive") || plc.endsWith(".war") || + plc.endsWith(".deb")) icon = "package"; else if (plc.endsWith(".xpi2p")) icon = "plugin"; @@ -1716,6 +1929,9 @@ public class I2PSnarkServlet extends Default { /** @since 0.8.1 */ private void savePriorities(Snark snark, Map postParams) { + Storage storage = snark.getStorage(); + if (storage == null) + return; Set<Map.Entry> entries = postParams.entrySet(); for (Map.Entry entry : entries) { String key = (String)entry.getKey(); @@ -1724,14 +1940,13 @@ public class I2PSnarkServlet extends Default { String file = key.substring(4); String val = ((String[])entry.getValue())[0]; // jetty arrays int pri = Integer.parseInt(val); - snark.storage.setPriority(file, pri); + storage.setPriority(file, pri); //System.err.println("Priority now " + pri + " for " + file); } catch (Throwable t) { t.printStackTrace(); } } } - if (snark.coordinator != null) - snark.coordinator.updatePiecePriorities(); - _manager.saveTorrentStatus(snark.storage.getMetaInfo(), snark.storage.getBitField(), snark.storage.getFilePriorities()); + snark.updatePiecePriorities(); + _manager.saveTorrentStatus(snark.getMetaInfo(), storage.getBitField(), storage.getFilePriorities()); } @@ -1753,15 +1968,16 @@ private static class FetchAndAdd implements Runnable { FileInputStream in = null; try { 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('&', '+'); - name = name.replace('\'', '_'); - name = name.replace('"', '_'); - name = name.replace('`', '_'); + byte[] fileInfoHash = new byte[20]; + String name = MetaInfo.getNameAndInfoHash(in, fileInfoHash); + try { in.close(); } catch (IOException ioe) {} + Snark snark = _manager.getTorrentByInfoHash(fileInfoHash); + if (snark != null) { + _manager.addMessage(_("Torrent with this info hash is already running: {0}", snark.getBaseName())); + return; + } + + name = Storage.filterName(name); name = name + ".torrent"; File torrentFile = new File(_manager.getDataDir(), name); @@ -1773,18 +1989,15 @@ private static class FetchAndAdd implements Runnable { else _manager.addMessage(_("Torrent already in the queue: {0}", name)); } else { - boolean success = FileUtil.copy(file.getAbsolutePath(), canonical, false); - if (success) { - SecureFileOutputStream.setPerms(torrentFile); - _manager.addTorrent(canonical); - } else { - _manager.addMessage(_("Failed to copy torrent file to {0}", canonical)); - } + // This may take a LONG time to create the storage. + _manager.copyAndAddTorrent(file, canonical); } } catch (IOException ioe) { _manager.addMessage(_("Torrent at {0} was not valid", urlify(_url)) + ": " + ioe.getMessage()); + } catch (OutOfMemoryError oom) { + _manager.addMessage(_("ERROR - Out of memory, cannot create torrent from {0}", urlify(_url)) + ": " + oom.getMessage()); } finally { - try { in.close(); } catch (IOException ioe) {} + try { if (in != null) in.close(); } catch (IOException ioe) {} } } else { _manager.addMessage(_("Torrent was not retrieved from {0}", urlify(_url))); diff --git a/apps/i2psnark/locale/messages_ar.po b/apps/i2psnark/locale/messages_ar.po new file mode 100644 index 0000000000000000000000000000000000000000..f0be3b9745036b8a7249084f97dd868ba51c68e8 --- /dev/null +++ b/apps/i2psnark/locale/messages_ar.po @@ -0,0 +1,912 @@ +# 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: 2011-03-03 18:28+0000\n" +"PO-Revision-Date: 2011-03-03 17:18-0000\n" +"Last-Translator: hamada <hamada@mail.i2p>\n" +"Language-Team: duck <duck@mail.i2p>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: ../java/src/org/klomp/snark/SnarkManager.java:307 +#, java-format +msgid "Total uploaders limit changed to {0}" +msgstr "تم تغببر مجموع Øد الرÙع الى {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:309 +#, java-format +msgid "Minimum total uploaders limit is {0}" +msgstr "اقل Øد الرÙع الى {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:321 +#, java-format +msgid "Up BW limit changed to {0}KBps" +msgstr "Øولت سرعة الرÙع الى {0}KBps" + +#: ../java/src/org/klomp/snark/SnarkManager.java:323 +#, java-format +msgid "Minimum up bandwidth limit is {0}KBps" +msgstr "اقل سرعة رÙع هي{0}KBps" + +#: ../java/src/org/klomp/snark/SnarkManager.java:335 +#, java-format +msgid "Startup delay changed to {0}" +msgstr "تغير تأخير البداية الى {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:386 +msgid "I2CP and tunnel changes will take effect after stopping all torrents" +msgstr "سيتم تÙعيل التغيير بعد اعادة التشغيل" + +#: ../java/src/org/klomp/snark/SnarkManager.java:393 +msgid "Disconnecting old I2CP destination" +msgstr "ÙÙƒ الاتصال" + +#: ../java/src/org/klomp/snark/SnarkManager.java:397 +#, java-format +msgid "I2CP settings changed to {0}" +msgstr " تغيرت الاعدادات الى {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:402 +msgid "" +"Unable to connect with the new settings, reverting to the old I2CP settings" +msgstr "Ùشل ÙÙŠ الاتصال بالاعدادات الجديدة، سيتم الرجوع الى الاعدادات القديمة" + +#: ../java/src/org/klomp/snark/SnarkManager.java:406 +msgid "Unable to reconnect with the old settings!" +msgstr "Ùشل ÙÙŠ اعادة الاتصال بالاعدادات القديمة!" + +#: ../java/src/org/klomp/snark/SnarkManager.java:408 +msgid "Reconnected on the new I2CP destination" +msgstr "اتصال بوجهة جديدة" + +#: ../java/src/org/klomp/snark/SnarkManager.java:418 +#, java-format +msgid "I2CP listener restarted for \"{0}\"" +msgstr "اعادة التشغيل \"{0}\"" + +#: ../java/src/org/klomp/snark/SnarkManager.java:429 +msgid "Enabled autostart" +msgstr "تشغيل عند البداية" + +#: ../java/src/org/klomp/snark/SnarkManager.java:431 +msgid "Disabled autostart" +msgstr "الغاء التشغيل عند البداية" + +#: ../java/src/org/klomp/snark/SnarkManager.java:437 +msgid "Enabled open trackers - torrent restart required to take effect." +msgstr "تÙعيل open trackers - يجب اعادة تشغيل التورنت لتÙعيل التغيير." + +#: ../java/src/org/klomp/snark/SnarkManager.java:439 +msgid "Disabled open trackers - torrent restart required to take effect." +msgstr "الغاء تÙعيل open trackers - يجب اعادة تشغيل التورنت لتÙعيل التغيير." + +#: ../java/src/org/klomp/snark/SnarkManager.java:447 +msgid "Open Tracker list changed - torrent restart required to take effect." +msgstr "تغيير open trackers - يجب اعادة تشغيل التورنت لتÙعيل التغيير." + +#: ../java/src/org/klomp/snark/SnarkManager.java:454 +#, java-format +msgid "{0} theme loaded, return to main i2psnark page to view." +msgstr "{0} تم تØميل التيمة ارجع الى صÙØØ© للمشاهدة i2psnark." + +#: ../java/src/org/klomp/snark/SnarkManager.java:461 +msgid "Configuration unchanged." +msgstr "لم تتغير الاعدادات" + +#: ../java/src/org/klomp/snark/SnarkManager.java:471 +#, java-format +msgid "Unable to save the config to {0}" +msgstr "Ùشل ÙÙŠ ØÙظ الاعدادات {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:536 +msgid "Connecting to I2P" +msgstr "جاري الاتصال بشبكة I2P" + +#: ../java/src/org/klomp/snark/SnarkManager.java:539 +msgid "Error connecting to I2P - check your I2CP settings!" +msgstr "Ùشل ÙÙŠ الاتصال ب I2P - تخقق من اعدادات I2CP !" + +#: ../java/src/org/klomp/snark/SnarkManager.java:548 +#, java-format +msgid "Error: Could not add the torrent {0}" +msgstr "خطأ: Ùشل ÙÙŠ اضاÙØ© التورنت {0}" + +#. catch this here so we don't try do delete it below +#: ../java/src/org/klomp/snark/SnarkManager.java:570 +#, java-format +msgid "Cannot open \"{0}\"" +msgstr "Ùشل ÙÙŠ ÙØªØ \"{0}\"" + +#. TODO - if the existing one is a magnet, delete it and add the metainfo instead? +#: ../java/src/org/klomp/snark/SnarkManager.java:586 +#: ../java/src/org/klomp/snark/SnarkManager.java:661 +#: ../java/src/org/klomp/snark/SnarkManager.java:716 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1976 +#, java-format +msgid "Torrent with this info hash is already running: {0}" +msgstr "تورنت بهذه المعلومات مشغل: {0}" + +#. addMessage(_("Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and DHT only.", info.getName())); +#: ../java/src/org/klomp/snark/SnarkManager.java:593 +#, java-format +msgid "" +"Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers " +"only." +msgstr "" + +#. addMessage(_("Warning - No I2P trackers in \"{0}\", and DHT and open trackers are disabled, you should enable open trackers or DHT before starting the torrent.", info.getName())); +#: ../java/src/org/klomp/snark/SnarkManager.java:598 +#, java-format +msgid "" +"Warning - No I2P Trackers found in \"{0}\". Make sure Open Tracker is " +"enabled before starting this torrent." +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:619 +#, java-format +msgid "Torrent in \"{0}\" is invalid" +msgstr "تورنت ÙÙŠ \"{0}\"غير صØÙŠØ" + +#: ../java/src/org/klomp/snark/SnarkManager.java:624 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1999 +#, java-format +msgid "ERROR - Out of memory, cannot create torrent from {0}" +msgstr "خطأ - لا توجد ذاكرة كاÙية، لا يمكن انشاء تورنت {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:635 +#, java-format +msgid "Torrent added and started: \"{0}\"" +msgstr "تم اضاÙØ© وتشغيل التورنت: \"{0}\"" + +#: ../java/src/org/klomp/snark/SnarkManager.java:637 +#, java-format +msgid "Torrent added: \"{0}\"" +msgstr "تمت اضاÙØ©: \"{0}\"" + +#: ../java/src/org/klomp/snark/SnarkManager.java:672 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:490 +#, java-format +msgid "Fetching {0}" +msgstr "ÙŠØمل {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:675 +#, java-format +msgid "" +"We have no saved peers and no other torrents are running. Fetch of {0} will " +"not succeed until you start another torrent." +msgstr "لا يوجد تورنت مشغل . تØميل {0} لن يتم Øتى تشغيل تورنت جديد." + +#: ../java/src/org/klomp/snark/SnarkManager.java:679 +#, java-format +msgid "Adding {0}" +msgstr "اضاÙØ© {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:726 +#: ../java/src/org/klomp/snark/SnarkManager.java:749 +#: ../java/src/org/klomp/snark/SnarkManager.java:1174 +#, java-format +msgid "Failed to copy torrent file to {0}" +msgstr "Ùشل ÙÙŠ نسخ التورنت الى {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:972 +#, java-format +msgid "Too many files in \"{0}\" ({1}), deleting it!" +msgstr "ملÙات كثيرة ÙÙŠ \"{0}\" ({1}) تم ØØ°Ù" + +#: ../java/src/org/klomp/snark/SnarkManager.java:974 +#, java-format +msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!" +msgstr "مل٠التورنت \"{0}\" لا يمكنه الانتهاء ب \".torrent\", سيتم ØØ°ÙÙ‡!" + +#: ../java/src/org/klomp/snark/SnarkManager.java:976 +#, java-format +msgid "No pieces in \"{0}\", deleting it!" +msgstr "ï»» أجزاء ÙÙŠ \"{0}\", ØØ°Ù!" + +#: ../java/src/org/klomp/snark/SnarkManager.java:978 +#, java-format +msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:980 +#, java-format +msgid "Pieces are too large in \"{0}\" ({1}B), deleting it." +msgstr "الأجزاء كبيرة ÙÙŠ \"{0}\" ({1}B), ØØ°Ù." + +#: ../java/src/org/klomp/snark/SnarkManager.java:981 +#, java-format +msgid "Limit is {0}B" +msgstr "Øدود {0}B" + +#: ../java/src/org/klomp/snark/SnarkManager.java:989 +#, 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:1005 +#, java-format +msgid "Error: Could not remove the torrent {0}" +msgstr "خطأ: ﻻيمكن Øذ٠التورنت {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1026 +#: ../java/src/org/klomp/snark/SnarkManager.java:1044 +#, java-format +msgid "Torrent stopped: \"{0}\"" +msgstr "تورنت متوقÙ: \"{0}\"" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1065 +#, java-format +msgid "Torrent removed: \"{0}\"" +msgstr "تورنت Ù…ØذوÙ: \"{0}\"" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1073 +#, java-format +msgid "Adding torrents in {0}" +msgstr "اض٠تورنت ÙÙŠ {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1122 +#, java-format +msgid "Download finished: {0}" +msgstr "انتهى التØميل: {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1170 +#, java-format +msgid "Metainfo received for {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1171 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:525 +#, java-format +msgid "Starting up torrent {0}" +msgstr "بداية التورنت {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1225 +msgid "Unable to connect to I2P!" +msgstr "Ùشل ÙÙŠ اضاÙØ© I2P!" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1231 +#, java-format +msgid "Unable to add {0}" +msgstr "Ùشل ÙÙŠ اضاÙØ© {0}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:205 +msgid "I2PSnark - Anonymous BitTorrent Client" +msgstr "I2PSnark - برنامج مشاركة ملÙات التورنت المجهول" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:218 +msgid "Torrents" +msgstr "تورنت" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:221 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:228 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1028 +msgid "I2PSnark" +msgstr "I2PSnark برنامج تورنت" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:225 +msgid "Refresh page" +msgstr "أنعش الصÙØØ©" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:230 +msgid "Forum" +msgstr "منتدى" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:284 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1719 +msgid "Status" +msgstr "الØالة" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:290 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:292 +msgid "Hide Peers" +msgstr "اخÙاء النظائر" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:297 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:299 +msgid "Show Peers" +msgstr "أظهر النظائر" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1659 +msgid "Torrent" +msgstr "تورنت" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:310 +msgid "Estimated time remaining" +msgstr "تقدير للوقت الباقي" + +#. Translators: Please keep short or translate as " " +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313 +msgid "ETA" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317 +msgid "Downloaded" +msgstr "Ù…Øمل" + +#. Translators: Please keep short or translate as " " +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:320 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:334 +msgid "RX" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324 +msgid "Uploaded" +msgstr "رÙع" + +#. Translators: Please keep short or translate as " " +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:327 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:344 +msgid "TX" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:332 +msgid "Down Rate" +msgstr "معدل التØميل" + +#. Translators: Please keep short or translate as " " +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:337 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:346 +msgid "Rate" +msgstr "معدل" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:342 +msgid "Up Rate" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:365 +msgid "Stop all torrents and the I2P tunnel" +msgstr "توقي٠جمبع التورنت Ùˆ النÙÙ‚ I2P" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:367 +msgid "Stop All" +msgstr "توقي٠الجمبع" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:376 +msgid "Start all torrents and the I2P tunnel" +msgstr "شغل جمبع التورنت Ùˆ النÙÙ‚ I2P" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:378 +msgid "Start All" +msgstr "شغل الجمبع" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:397 +msgid "No torrents loaded." +msgstr "لم ÙŠØمل تورنت" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:402 +msgid "Totals" +msgstr "مجموع" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:404 +#, java-format +msgid "1 torrent" +msgid_plural "{0} torrents" +msgstr[0] "1 تورنت" +msgstr[1] "{0} تورنت" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:407 +#, java-format +msgid "1 connected peer" +msgid_plural "{0} connected peers" +msgstr[0] "{0} مستخدم متصل" +msgstr[1] "{0} مستخدمون متصلون" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:496 +#, java-format +msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:544 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571 +#, java-format +msgid "Magnet deleted: {0}" +msgstr "تم Øذ٠مل٠مغناطيس: {0}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:552 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:577 +#, java-format +msgid "Torrent file deleted: {0}" +msgstr "تم خذ٠مل٠التورنت: {0}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:593 +#, java-format +msgid "Data file deleted: {0}" +msgstr "خذ٠مل٠البيانات: {0}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:595 +#, java-format +msgid "Data file could not be deleted: {0}" +msgstr "Ùشل ÙÙŠ Øذ٠الملÙ: {0}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:604 +#, java-format +msgid "Data dir deleted: {0}" +msgstr "Øذ٠مجلد المعطيات: {0}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:637 +msgid "Error creating torrent - you must select a tracker" +msgstr "Ùشل ÙÙŠ انشاء تورنت - عليك اختيار tracker" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:653 +#, java-format +msgid "Torrent created for \"{0}\"" +msgstr "تم انشاء تورنت لـ \"{0}\"" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:655 +#, java-format +msgid "" +"Many I2P trackers require you to register new torrents before seeding - " +"please do so before starting \"{0}\"" +msgstr "" +"العديد من trackers يطلبون تسجيل التورنت قبل مشاركتها، قم بذلك قبل البداية {0}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:657 +#, java-format +msgid "Error creating a torrent for \"{0}\"" +msgstr "Ùشل ÙÙŠ انشاء تورنت لـ \"{0}\"" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:660 +#, java-format +msgid "Cannot create a torrent for the nonexistent data: {0}" +msgstr "لا يمكن انشاء تورنت لبيانات غير موجودة: {0}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:663 +msgid "Error creating torrent - you must enter a file or directory" +msgstr "Ùشل ÙÙŠ انشاء تورنت - عليك اختيار مل٠أو مجلد" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:666 +msgid "Stopping all torrents and closing the I2P tunnel." +msgstr "توقي٠جميع التورنت Ùˆ Ù‚ÙÙ„ النÙÙ‚ I2P" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:677 +msgid "I2P tunnel closed." +msgstr "تم Ù‚ÙÙ„ النÙÙ‚" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680 +msgid "Opening the I2P tunnel and starting all torrents." +msgstr "ÙØªØ Ø§Ù„Ù†ÙÙ‚ واطلاق جميع التورنت" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:803 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:808 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:814 +msgid "Tracker Error" +msgstr "Tracker خطأ" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:806 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:810 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:822 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:826 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:834 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:838 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:843 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:847 +#, java-format +msgid "1 peer" +msgid_plural "{0} peers" +msgstr[0] "{0} نظير" +msgstr[1] "{0} نظير" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:819 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:824 +msgid "Seeding" +msgstr "بشارك" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:828 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1665 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1770 +msgid "Complete" +msgstr "اكتمل" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:831 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:836 +msgid "OK" +msgstr "مواÙÙ‚" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:840 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:845 +msgid "Stalled" +msgstr "متوقÙ" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:849 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:852 +msgid "No Peers" +msgstr "لا بوجد نظائر" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 +msgid "Stopped" +msgstr "متوقÙ" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:886 +msgid "Torrent details" +msgstr "تÙاصيل التورنت" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:898 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1160 +msgid "Info" +msgstr "معلومات" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:913 +msgid "View files" +msgstr "أظهر الملÙات" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:915 +msgid "Open file" +msgstr "ÙØªØ Ù…Ù„Ù" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:957 +msgid "Stop the torrent" +msgstr "ق٠التورنت" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:959 +msgid "Stop" +msgstr "Ù‚Ù" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:969 +msgid "Start the torrent" +msgstr "ابدأ التورنت" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:971 +msgid "Start" +msgstr "ابدأ" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:982 +msgid "Remove the torrent from the active list, deleting the .torrent file" +msgstr "Øذ٠التورنت من القائمة، Øذ٠مل٠.torrent" + +#. Can't figure out how to escape double quotes inside the onclick string. +#. Single quotes in translate strings with parameters must be doubled. +#. Then the remaining single quite must be escaped +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:987 +#, java-format +msgid "" +"Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded " +"data will not be deleted) ?" +msgstr "" +"هل أنت متأكد من Øذ٠المل٠\\''{0}.تورنت\\'' (سيتم خذ٠ايضا الملÙات التي تم " +"تØميلها) ?" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:990 +msgid "Remove" +msgstr "ØØ°Ù" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1001 +msgid "Delete the .torrent file and the associated data file(s)" +msgstr "خذ٠مل٠التورنت Ùˆ الملÙات المرتبطة به" + +#. Can't figure out how to escape double quotes inside the onclick string. +#. Single quotes in translate strings with parameters must be doubled. +#. Then the remaining single quite must be escaped +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1006 +#, java-format +msgid "" +"Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded " +"data?" +msgstr "هل أنت متأكد من Øذ٠التورنت \\''{0}\\'' وجمبع البيانات المØملة؟" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1009 +msgid "Delete" +msgstr "ØØ°Ù" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042 +msgid "Unknown" +msgstr "غير معروÙ" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1054 +msgid "Seed" +msgstr "شارك" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1077 +msgid "Uninteresting (The peer has no pieces we need)" +msgstr "غير مهم (النظير لا ÙŠØتوي على اجزاء Ù†Øتاجها)" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1079 +msgid "Choked (The peer is not allowing us to request pieces)" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1099 +msgid "Uninterested (We have no pieces the peer needs)" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1101 +msgid "Choking (We are not allowing the peer to request pieces)" +msgstr "مشكلة (لا يمكن الØصول على اجزاء المل٠من النظائر)" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1159 +#, java-format +msgid "Details at {0} tracker" +msgstr "تÙاصيل Øول {0} tracker" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1188 +msgid "Add Torrent" +msgstr "أض٠تورنت" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190 +msgid "From URL" +msgstr "من عنوان" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1193 +msgid "" +"Enter the torrent file download URL (I2P only), magnet link, or maggot link" +msgstr "ادخل عنوان التورنت لتØميله (Ùقط على شبكة i2p)" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1198 +msgid "Add torrent" +msgstr "أض٠تورنت" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1201 +#, java-format +msgid "You can also copy .torrent files to: {0}." +msgstr "يمكن ايضا .نقل ملÙات تورنت الى: {0}." + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1203 +msgid "Removing a .torrent will cause it to stop." +msgstr "سيتم القا٠التورنت عند Øذ٠المل٠torrent." + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1226 +msgid "Create Torrent" +msgstr "أنشئ تورنت" + +#. out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br>\n"); +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 +msgid "Data to seed" +msgstr "البيانات المشاركة" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233 +msgid "File or directory to seed (must be within the specified path)" +msgstr "المل٠او المجلد الذي ترغب ÙÙŠ مشاركته " + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1235 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684 +msgid "Tracker" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237 +msgid "Select a tracker" +msgstr "اختر tracker" + +#. out.write(_("Open trackers and DHT only")); +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1242 +msgid "Open trackers only" +msgstr "trackers المÙتوØØ© Ùقط" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1257 +msgid "or" +msgstr "أو" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1260 +msgid "Specify custom tracker announce URL" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1263 +msgid "Create torrent" +msgstr "أنشئ تورنت" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1281 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1420 +msgid "Configuration" +msgstr "اعدادات" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1285 +msgid "Data directory" +msgstr "مجلد البيانات" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1287 +msgid "Edit i2psnark.config and restart to change" +msgstr "Øرر i2psnark.config وأعد التشغيل" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291 +msgid "Auto start" +msgstr "ابدأ عند البداية" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1295 +msgid "If checked, automatically start torrents that are added" +msgstr "اذا تم تÙعيل، يقوم بتشغيل التورنت تلقائيا عند اضاÙته" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1299 +msgid "Theme" +msgstr "تيمة" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1312 +msgid "Startup delay" +msgstr "تأخر البداية" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1314 +msgid "minutes" +msgstr "دقائق" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1338 +msgid "Total uploader limit" +msgstr "اقصى Øد للرÙع" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1341 +msgid "peers" +msgstr "النظائر" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1345 +msgid "Up bandwidth limit" +msgstr "اقصى Øد لسرعة الاتصال" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1348 +msgid "Half available bandwidth recommended." +msgstr "ÙŠÙ†ØµØ Ø¨Ø§Ø³ØªØ¹Ù…Ø§Ù„ نص٠سرعة الشبكة" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1350 +msgid "View or change router bandwidth" +msgstr "أظهر أو غير سرعة الموجه" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1354 +msgid "Use open trackers also" +msgstr "استعمال open trackers ايضا" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1358 +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:1362 +msgid "Open tracker announce URLs" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1374 +msgid "Inbound Settings" +msgstr "اعدادت الاتصال الداخلي" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1380 +msgid "Outbound Settings" +msgstr "اعدادت الاتصال الخارجي" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1388 +msgid "I2CP host" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1393 +msgid "I2CP port" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1406 +msgid "I2CP options" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1411 +msgid "Save configuration" +msgstr "ØÙظ الاعدادات" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1436 +#, java-format +msgid "Invalid magnet URL {0}" +msgstr "غنوان مغناطيس غير صØÙŠØ {0}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1470 +#, java-format +msgid "Invalid info hash in magnet URL {0}" +msgstr "" + +#. * dummies for translation +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1500 +#, java-format +msgid "1 hop" +msgid_plural "{0} hops" +msgstr[0] "1 Ù‚Ùزة" +msgstr[1] "{0} Ù‚Ùزات" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1501 +#, java-format +msgid "1 tunnel" +msgid_plural "{0} tunnels" +msgstr[0] "1 Ù†ÙÙ‚" +msgstr[1] "{0} أنÙاق" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1663 +msgid "Completion" +msgstr "انتهاء" + +#. else unknown +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1716 +msgid "Size" +msgstr "الØجم" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1672 +msgid "Files" +msgstr "الملÙات" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1674 +msgid "Pieces" +msgstr "القطع" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1675 +msgid "Piece size" +msgstr "Øجم القطعة" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697 +msgid "Magnet link" +msgstr "وصلة مغناطيس" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1753 +msgid "Directory" +msgstr "المجلد" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1723 +msgid "Priority" +msgstr "الأولوية" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1728 +msgid "Up to higher level directory" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758 +msgid "Torrent not found?" +msgstr "تورنت غير موجود؟" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1767 +msgid "File not found in torrent?" +msgstr "المل٠غير موجود ÙÙŠ التورنت؟" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1780 +msgid "complete" +msgstr "اكتمل" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1781 +msgid "bytes remaining" +msgstr "البايت المتبقية" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806 +msgid "Open" +msgstr "ÙتØ" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1832 +msgid "High" +msgstr "عالي" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1837 +msgid "Normal" +msgstr "عادي" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1842 +msgid "Skip" +msgstr "تجاوز" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851 +msgid "Save priorities" +msgstr "ØÙظ الأولويات" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1967 +#, java-format +msgid "Torrent fetched from {0}" +msgstr "تم تØميل المل٠من {0}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1989 +#, java-format +msgid "Torrent already running: {0}" +msgstr "تورنت Ù…Ùعل: {0}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1991 +#, java-format +msgid "Torrent already in the queue: {0}" +msgstr "تورنت ÙÙŠ قائمة الانتظار: {0}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1997 +#, java-format +msgid "Torrent at {0} was not valid" +msgstr "تورنت غير صØÙŠØ {0} " + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2004 +#, java-format +msgid "Torrent was not retrieved from {0}" +msgstr "لم يتم تØميل التورنت من {0}" diff --git a/apps/i2psnark/locale/messages_de.po b/apps/i2psnark/locale/messages_de.po index ed5934f52a65c0fe513e8ff7d38daf7de16639b5..8cb0ab1bf7ef6f9fe120f2d739410ec9e7420251 100644 --- a/apps/i2psnark/locale/messages_de.po +++ b/apps/i2psnark/locale/messages_de.po @@ -8,851 +8,1014 @@ msgid "" msgstr "" "Project-Id-Version: I2P i2psnark\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-12-12 23:30+0000\n" -"PO-Revision-Date: 2010-12-19 04:37+0100\n" -"Last-Translator: mixxy <m1xxy@mail.i2p>\n" +"POT-Creation-Date: 2011-03-03 18:28+0000\n" +"PO-Revision-Date: 2011-02-27 17:33+0100\n" +"Last-Translator: \n" "Language-Team: foo <foo@bar>\n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Poedit-Language: German\n" -#: ../java/src/org/klomp/snark/SnarkManager.java:94 -#, java-format -msgid "Adding torrents in {0} minutes" -msgstr "Füge Torrents in {0} Minuten hinzu ..." - -#: ../java/src/org/klomp/snark/SnarkManager.java:296 +#: ../java/src/org/klomp/snark/SnarkManager.java:307 #, java-format msgid "Total uploaders limit changed to {0}" msgstr "Gesamtanzahl an Uploadslots geändert auf {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:298 +#: ../java/src/org/klomp/snark/SnarkManager.java:309 #, java-format msgid "Minimum total uploaders limit is {0}" msgstr "Minimale Anzahl an Uploadslots ist {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:310 +#: ../java/src/org/klomp/snark/SnarkManager.java:321 #, java-format msgid "Up BW limit changed to {0}KBps" msgstr "Upload Bandbreite wurde auf {0}kbyte/s geändert." -#: ../java/src/org/klomp/snark/SnarkManager.java:312 +#: ../java/src/org/klomp/snark/SnarkManager.java:323 #, java-format msgid "Minimum up bandwidth limit is {0}KBps" msgstr "Minimales Limit der Upload-Bandbreite ist {0} kbyte/s." -#: ../java/src/org/klomp/snark/SnarkManager.java:324 +#: ../java/src/org/klomp/snark/SnarkManager.java:335 #, java-format -msgid "Startup delay limit changed to {0} minutes" -msgstr "Startverzögerung auf {0} Minuten gesetzt" +msgid "Startup delay changed to {0}" +msgstr "Startverzögerung auf {0} gesetzt" -#: ../java/src/org/klomp/snark/SnarkManager.java:371 +#: ../java/src/org/klomp/snark/SnarkManager.java:386 msgid "I2CP and tunnel changes will take effect after stopping all torrents" -msgstr "Änderungen an I2CP und am Tunnel werden nach dem Stoppen aller Torrents wirksam" +msgstr "" +"Änderungen an I2CP und am Tunnel werden nach dem Stoppen aller Torrents " +"wirksam" -#: ../java/src/org/klomp/snark/SnarkManager.java:378 +#: ../java/src/org/klomp/snark/SnarkManager.java:393 msgid "Disconnecting old I2CP destination" msgstr "Trenne das alte I2CP Ziel" -#: ../java/src/org/klomp/snark/SnarkManager.java:382 +#: ../java/src/org/klomp/snark/SnarkManager.java:397 #, java-format msgid "I2CP settings changed to {0}" msgstr "I2CP Einstellungen geändert auf {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:386 -msgid "Unable to connect with the new settings, reverting to the old I2CP settings" -msgstr "Verbinden mit den neuen Einstellungen nicht möglich, benutze wieder die alten I2CP-Einstellungen" +#: ../java/src/org/klomp/snark/SnarkManager.java:402 +msgid "" +"Unable to connect with the new settings, reverting to the old I2CP settings" +msgstr "" +"Verbinden mit den neuen Einstellungen nicht möglich, benutze wieder die " +"alten I2CP-Einstellungen" -#: ../java/src/org/klomp/snark/SnarkManager.java:390 +#: ../java/src/org/klomp/snark/SnarkManager.java:406 msgid "Unable to reconnect with the old settings!" msgstr "Verbinden mit den alten Einstellungen nicht möglich!" -#: ../java/src/org/klomp/snark/SnarkManager.java:392 +#: ../java/src/org/klomp/snark/SnarkManager.java:408 msgid "Reconnected on the new I2CP destination" msgstr "Verbunden auf dem neuem I2CP-Ziel" -#: ../java/src/org/klomp/snark/SnarkManager.java:403 +#: ../java/src/org/klomp/snark/SnarkManager.java:418 #, java-format msgid "I2CP listener restarted for \"{0}\"" msgstr "I2CP-Verbindung neu gestartet für \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:414 +#: ../java/src/org/klomp/snark/SnarkManager.java:429 msgid "Enabled autostart" msgstr "Aktiviere Autostart" -#: ../java/src/org/klomp/snark/SnarkManager.java:416 +#: ../java/src/org/klomp/snark/SnarkManager.java:431 msgid "Disabled autostart" msgstr "Deaktiviere Autostart" -#: ../java/src/org/klomp/snark/SnarkManager.java:422 +#: ../java/src/org/klomp/snark/SnarkManager.java:437 msgid "Enabled open trackers - torrent restart required to take effect." -msgstr "OpenTracker aktiviert - Um dies anzuwenden, müssen die Torrents neu gestartet werden." +msgstr "" +"OpenTracker aktiviert - Um dies anzuwenden, müssen die Torrents neu " +"gestartet werden." -#: ../java/src/org/klomp/snark/SnarkManager.java:424 +#: ../java/src/org/klomp/snark/SnarkManager.java:439 msgid "Disabled open trackers - torrent restart required to take effect." -msgstr "OpenTracker deaktiviert - Um dies anzuwenden, müssen die Torrents neu gestartet werden." +msgstr "" +"OpenTracker deaktiviert - Um dies anzuwenden, müssen die Torrents neu " +"gestartet werden." -#: ../java/src/org/klomp/snark/SnarkManager.java:431 +#: ../java/src/org/klomp/snark/SnarkManager.java:447 msgid "Open Tracker list changed - torrent restart required to take effect." -msgstr "OpenTracker-Liste geändert - Um dies anzuwenden, müssen die Torrents neu gestartet werden" +msgstr "" +"OpenTracker-Liste geändert - Um dies anzuwenden, müssen die Torrents neu " +"gestartet werden" -#: ../java/src/org/klomp/snark/SnarkManager.java:438 +#: ../java/src/org/klomp/snark/SnarkManager.java:454 #, java-format msgid "{0} theme loaded, return to main i2psnark page to view." -msgstr "Thema {0} geladen. Gehen Sie zurück zur Hauptseite von i2psnark, um die Änderungen zu sehen!" +msgstr "" +"Thema {0} geladen. Gehen Sie zurück zur Hauptseite von i2psnark, um die " +"Änderungen zu sehen!" -#: ../java/src/org/klomp/snark/SnarkManager.java:445 +#: ../java/src/org/klomp/snark/SnarkManager.java:461 msgid "Configuration unchanged." msgstr "Konfiguration nicht geändert." -#: ../java/src/org/klomp/snark/SnarkManager.java:455 +#: ../java/src/org/klomp/snark/SnarkManager.java:471 #, java-format msgid "Unable to save the config to {0}" msgstr "Konnte Konfiguration nicht in {0} speichern" -#: ../java/src/org/klomp/snark/SnarkManager.java:494 +#: ../java/src/org/klomp/snark/SnarkManager.java:536 msgid "Connecting to I2P" msgstr "Verbinde mit I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:497 +#: ../java/src/org/klomp/snark/SnarkManager.java:539 msgid "Error connecting to I2P - check your I2CP settings!" -msgstr "Fehler beim Verbinden mit I2P - Kontrollieren Sie die I2CP-Einstellungen!" +msgstr "" +"Fehler beim Verbinden mit I2P - Kontrollieren Sie die I2CP-Einstellungen!" -#: ../java/src/org/klomp/snark/SnarkManager.java:506 +#: ../java/src/org/klomp/snark/SnarkManager.java:548 #, java-format msgid "Error: Could not add the torrent {0}" msgstr "Fehler: Konnte den Torrent \"{0}\" nicht hinzufügen" #. catch this here so we don't try do delete it below -#: ../java/src/org/klomp/snark/SnarkManager.java:528 +#: ../java/src/org/klomp/snark/SnarkManager.java:570 #, java-format msgid "Cannot open \"{0}\"" msgstr "Kann dies nicht öffnen: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:541 +#. TODO - if the existing one is a magnet, delete it and add the metainfo instead? +#: ../java/src/org/klomp/snark/SnarkManager.java:586 +#: ../java/src/org/klomp/snark/SnarkManager.java:661 +#: ../java/src/org/klomp/snark/SnarkManager.java:716 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1976 #, java-format -msgid "Warning - Ignoring non-i2p tracker in \"{0}\", will announce to i2p open trackers only" -msgstr "Warnung - Ignoriere nicht-I2P Tracker in \"{0}\", werde nur bei I2P-OpenTrackern bekanntgeben" +msgid "Torrent with this info hash is already running: {0}" +msgstr "Torrent mit diesem Infohash läuft schon: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:543 +#. addMessage(_("Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and DHT only.", info.getName())); +#: ../java/src/org/klomp/snark/SnarkManager.java:593 #, java-format -msgid "Warning - Ignoring non-i2p tracker in \"{0}\", and open trackers are disabled, you must enable open trackers before starting the torrent!" -msgstr "Warnung - Ignoriere nicht-I2P Tracker in \"{0}\" und OpenTracker sind deaktiviert. Sie müssen OpenTracker aktivieren, bevor Sie den Torrent starten!" +msgid "" +"Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers " +"only." +msgstr "" +"Warnung - keine I2P Tracker in \"{0}\", werde nur bei I2P-OpenTrackern " +"bekanntgeben" + +#. addMessage(_("Warning - No I2P trackers in \"{0}\", and DHT and open trackers are disabled, you should enable open trackers or DHT before starting the torrent.", info.getName())); +#: ../java/src/org/klomp/snark/SnarkManager.java:598 +#, java-format +msgid "" +"Warning - No I2P Trackers found in \"{0}\". Make sure Open Tracker is " +"enabled before starting this torrent." +msgstr "" +"Warnung - keine I2P-Tracker in \"{0}\" gefunden. Stell sicher, dass " +"OpenTracker aktiviert sind, bevor du diesen Torrent startest!" -#: ../java/src/org/klomp/snark/SnarkManager.java:563 +#: ../java/src/org/klomp/snark/SnarkManager.java:619 #, java-format msgid "Torrent in \"{0}\" is invalid" msgstr "Torrent in \"{0}\" ist nicht gültig" -#: ../java/src/org/klomp/snark/SnarkManager.java:578 +#: ../java/src/org/klomp/snark/SnarkManager.java:624 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1999 +#, java-format +msgid "ERROR - Out of memory, cannot create torrent from {0}" +msgstr "" +"Fehler - unzureichender Arbeitsspeicher, kann keinen Torrent von {0} " +"erstellen." + +#: ../java/src/org/klomp/snark/SnarkManager.java:635 #, java-format msgid "Torrent added and started: \"{0}\"" msgstr "Torrent hinzugefügt und gestartet: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:580 +#: ../java/src/org/klomp/snark/SnarkManager.java:637 #, java-format msgid "Torrent added: \"{0}\"" msgstr "Torrent hinzugefügt: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:734 +#: ../java/src/org/klomp/snark/SnarkManager.java:672 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:490 +#, java-format +msgid "Fetching {0}" +msgstr "Hole {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:675 +#, java-format +msgid "" +"We have no saved peers and no other torrents are running. Fetch of {0} will " +"not succeed until you start another torrent." +msgstr "" +"Wir haben keine Gespeicherten Teilnehmer und keine anderen aktiven Torrents. " +"Das Herunterladen von {0} kann nicht erfolgen, solange du keinen anderen " +"Torrent startest." + +#: ../java/src/org/klomp/snark/SnarkManager.java:679 +#, java-format +msgid "Adding {0}" +msgstr "Hinzufügen {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:726 +#: ../java/src/org/klomp/snark/SnarkManager.java:749 +#: ../java/src/org/klomp/snark/SnarkManager.java:1174 +#, java-format +msgid "Failed to copy torrent file to {0}" +msgstr "Konnte Torrent-Datei nicht nach {0} kopieren" + +#: ../java/src/org/klomp/snark/SnarkManager.java:972 #, java-format msgid "Too many files in \"{0}\" ({1}), deleting it!" msgstr "Zu viele Dateien in \"{0}\" ({1}), wird gelöscht! " -#: ../java/src/org/klomp/snark/SnarkManager.java:736 +#: ../java/src/org/klomp/snark/SnarkManager.java:974 #, java-format msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!" msgstr "Torrentdatei \"{0}\" darf nicht auf '.torrent' enden, wird gelöscht!" -#: ../java/src/org/klomp/snark/SnarkManager.java:738 +#: ../java/src/org/klomp/snark/SnarkManager.java:976 #, java-format msgid "No pieces in \"{0}\", deleting it!" msgstr "Keine Teile in \"{0}\", wird entfernt!" -#: ../java/src/org/klomp/snark/SnarkManager.java:740 +#: ../java/src/org/klomp/snark/SnarkManager.java:978 #, java-format msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!" msgstr "Zu viele Teile in \"{0}\", das Limit sind {1}, werden gelöscht!" -#: ../java/src/org/klomp/snark/SnarkManager.java:742 +#: ../java/src/org/klomp/snark/SnarkManager.java:980 #, java-format msgid "Pieces are too large in \"{0}\" ({1}B), deleting it." msgstr "Teile in \"{0}\" sind zu groß ({1}B), lösche es." -#: ../java/src/org/klomp/snark/SnarkManager.java:743 +#: ../java/src/org/klomp/snark/SnarkManager.java:981 #, java-format msgid "Limit is {0}B" msgstr "Limit ist \"{0}\"Bytes" -#: ../java/src/org/klomp/snark/SnarkManager.java:751 +#: ../java/src/org/klomp/snark/SnarkManager.java:989 #, java-format msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\"" -msgstr "Torrents größer als \"{0}\"Bytes werden nicht unterstützt, lösche \"{1}\"." +msgstr "" +"Torrents größer als \"{0}\"Bytes werden nicht unterstützt, lösche \"{1}\"." -#: ../java/src/org/klomp/snark/SnarkManager.java:767 +#: ../java/src/org/klomp/snark/SnarkManager.java:1005 #, java-format msgid "Error: Could not remove the torrent {0}" msgstr "Fehler: Konnte den Torrent \"{0}\" nicht entfernen" -#: ../java/src/org/klomp/snark/SnarkManager.java:794 +#: ../java/src/org/klomp/snark/SnarkManager.java:1026 +#: ../java/src/org/klomp/snark/SnarkManager.java:1044 #, java-format msgid "Torrent stopped: \"{0}\"" msgstr "Torrent angehalten: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:814 +#: ../java/src/org/klomp/snark/SnarkManager.java:1065 #, java-format msgid "Torrent removed: \"{0}\"" msgstr "Torrent entfernt: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:852 +#: ../java/src/org/klomp/snark/SnarkManager.java:1073 +#, java-format +msgid "Adding torrents in {0}" +msgstr "Füge Torrents in {0} hinzu ..." + +#: ../java/src/org/klomp/snark/SnarkManager.java:1122 #, java-format msgid "Download finished: {0}" msgstr "vollständig heruntergeladen:\"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:880 +#: ../java/src/org/klomp/snark/SnarkManager.java:1170 +#, java-format +msgid "Metainfo received for {0}" +msgstr "Metainfo für {0} erhalten" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1171 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:525 +#, java-format +msgid "Starting up torrent {0}" +msgstr "Starte Torrent {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1225 msgid "Unable to connect to I2P!" msgstr "Konnte mich nicht mit I2P verbinden!" -#: ../java/src/org/klomp/snark/SnarkManager.java:886 +#: ../java/src/org/klomp/snark/SnarkManager.java:1231 #, java-format msgid "Unable to add {0}" msgstr "Konnte {0} nicht hinzufügen." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:185 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:205 msgid "I2PSnark - Anonymous BitTorrent Client" msgstr "I2PSnark - Anonymer BitTorrent-Klient" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:198 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:218 msgid "Torrents" msgstr "Torrents" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:201 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:208 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:977 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:221 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:228 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1028 msgid "I2PSnark" msgstr "I2PSnark" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:205 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:225 msgid "Refresh page" msgstr "Aktualisiere Seite" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:210 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:230 msgid "Forum" msgstr "Forum" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:264 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1483 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:284 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1719 msgid "Status" msgstr "Zustand" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:270 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:272 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:290 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:292 msgid "Hide Peers" msgstr "Teilnehmer ausblenden" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:277 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:279 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:297 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:299 msgid "Show Peers" msgstr "Teilnehmer einblenden" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:286 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1464 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1659 msgid "Torrent" msgstr "Torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:290 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:310 msgid "Estimated time remaining" msgstr "geschätzte verbleibende Zeit" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313 msgid "ETA" msgstr "Dauer" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:297 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317 msgid "Downloaded" msgstr "heruntergeladen" # NOTE: purposely left blank to leave more room in the table header # msgstr "heruntergeladen" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:300 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:314 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:320 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:334 msgid "RX" msgstr " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:304 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324 msgid "Uploaded" msgstr "hochgeladen" # NOTE: purposely left blank to leave more room in the table header # msgstr "hochgeladen" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:307 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:327 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:344 msgid "TX" msgstr " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:312 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:332 msgid "Down Rate" msgstr "eingehend" # NOTE: purposely left blank to leave more room in the table header # msgstr "Ãœbertragung" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:337 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:346 msgid "Rate" msgstr " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:322 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:342 msgid "Up Rate" msgstr "ausgehend" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:340 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:365 msgid "Stop all torrents and the I2P tunnel" msgstr "Stoppe alle Torrents und den I2P-Tunnel" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:342 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:367 msgid "Stop All" msgstr "Stoppe alle" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:351 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:376 msgid "Start all torrents and the I2P tunnel" msgstr "Starte alle Torrents und den I2P-Tunnel" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:353 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:378 msgid "Start All" msgstr "Starte alle" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:372 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:397 msgid "No torrents loaded." msgstr "keine Torrents geladen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:377 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:402 msgid "Totals" msgstr "Gesamt" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:379 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:404 #, java-format msgid "1 torrent" msgid_plural "{0} torrents" msgstr[0] "1 Torrent" msgstr[1] "{0} Torrents" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:382 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:407 #, java-format msgid "1 connected peer" msgid_plural "{0} connected peers" msgstr[0] "1 verbundener Teilnehmer" msgstr[1] "{0} verbundene Teilnehmer" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:454 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:496 #, java-format -msgid "Fetching {0}" -msgstr "Hole {0}" +msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"" +msgstr "ungültige URL - muss mit \"http://\", \"{0}\", oder \"{1}\" anfangen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:458 -msgid "Invalid URL - must start with http://" -msgstr "Ungültige URL - muss mit http:// anfangen" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:489 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:544 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571 #, java-format -msgid "Starting up torrent {0}" -msgstr "Starte Torrent {0}" +msgid "Magnet deleted: {0}" +msgstr "Magnetlink wurde gelöscht: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:509 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:527 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:552 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:577 #, java-format msgid "Torrent file deleted: {0}" msgstr "Torrentdatei gelöscht: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:533 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:543 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:593 #, java-format msgid "Data file deleted: {0}" msgstr "Daten gelöscht: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:535 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:545 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:595 #, java-format msgid "Data file could not be deleted: {0}" msgstr "Daten konnten nicht gelöscht werden: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:554 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:604 #, java-format msgid "Data dir deleted: {0}" msgstr "Datenverzeichnis wurde gelöscht: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:587 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:637 msgid "Error creating torrent - you must select a tracker" -msgstr "Fehler beim Erstellen des Torrents - Sie müssen einen Tracker auswählen!" +msgstr "" +"Fehler beim Erstellen des Torrents - Sie müssen einen Tracker auswählen!" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:602 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:653 #, java-format msgid "Torrent created for \"{0}\"" msgstr "Torrent erstellt für \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:605 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:655 #, java-format -msgid "Many I2P trackers require you to register new torrents before seeding - please do so before starting \"{0}\"" -msgstr "Viele I2P-Tracker erfordern eine Registrierung, bevor der Torrent verteilt wird. Bitte tun Sie dies vor dem Start von \"{0}\"!" +msgid "" +"Many I2P trackers require you to register new torrents before seeding - " +"please do so before starting \"{0}\"" +msgstr "" +"Viele I2P-Tracker erfordern eine Registrierung, bevor der Torrent verteilt " +"wird. Bitte tun Sie dies vor dem Start von \"{0}\"!" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:607 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:657 #, java-format msgid "Error creating a torrent for \"{0}\"" msgstr "Fehler beim Erstellen eines Torrents für \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:610 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:660 #, java-format msgid "Cannot create a torrent for the nonexistent data: {0}" msgstr "Kann keinen Torrent für nicht existente Daten erstellen: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:613 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:663 msgid "Error creating torrent - you must enter a file or directory" -msgstr "Fehler beim Erstellen des Torrents - Sie müssen eine Datei oder ein Verzeichnis angeben." +msgstr "" +"Fehler beim Erstellen des Torrents - Sie müssen eine Datei oder ein " +"Verzeichnis angeben." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:616 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:666 msgid "Stopping all torrents and closing the I2P tunnel." msgstr "Stoppe alle Torrents und beende den I2P-Tunnel." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:627 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:677 msgid "I2P tunnel closed." msgstr "I2P-Tunnel geschlossen." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:630 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680 msgid "Opening the I2P tunnel and starting all torrents." msgstr "Öffne den I2P-Tunnel und starte alle Torrents." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:759 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:764 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:770 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:803 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:808 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:814 msgid "Tracker Error" msgstr "Trackerfehler" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:762 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:766 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:778 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:782 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:790 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:794 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:799 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:803 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:806 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:810 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:822 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:826 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:834 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:838 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:843 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:847 #, java-format msgid "1 peer" msgid_plural "{0} peers" msgstr[0] "1 Teilnehmer" msgstr[1] "{0} Teilnehmern" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:775 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:780 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:819 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:824 msgid "Seeding" msgstr "Verteile" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:784 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1533 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:828 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1665 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1770 msgid "Complete" msgstr "vollständig" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:787 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:792 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:831 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:836 msgid "OK" msgstr "OK" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:796 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:801 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:840 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:845 msgid "Stalled" msgstr "Stillstand" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:805 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:808 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:849 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:852 msgid "No Peers" msgstr "keine Teilnehmer" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:810 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 msgid "Stopped" msgstr "angehalten" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:837 -#, java-format -msgid "Details at {0} tracker" -msgstr "Details beim Tracker {0}" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:886 +msgid "Torrent details" +msgstr "Details" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:838 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:898 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1160 msgid "Info" msgstr "Info" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:853 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:913 msgid "View files" msgstr "Zeige Dateien" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:855 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:915 msgid "Open file" msgstr "Öffne Datei" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:865 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1569 -msgid "Open" -msgstr "Öffnen" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:909 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:957 msgid "Stop the torrent" msgstr "Torrent stoppen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:911 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:959 msgid "Stop" msgstr "Stopp" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:921 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:969 msgid "Start the torrent" msgstr "Torrent starten" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:923 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:971 msgid "Start" msgstr "Start" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:933 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:982 msgid "Remove the torrent from the active list, deleting the .torrent file" -msgstr "entfernt den Torrent von der aktiven Liste und löscht die .torrent-Datei" +msgstr "" +"entfernt den Torrent von der aktiven Liste und löscht die .torrent-Datei" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quite must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:938 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:987 #, java-format -msgid "Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded data will not be deleted) ?" -msgstr "Sind Sie sicher, dass Sie die Datei \\''{0}.torrent\\'' löschen wollen? (Heruntergeladene Daten werden nicht gelöscht.)" +msgid "" +"Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded " +"data will not be deleted) ?" +msgstr "" +"Sind Sie sicher, dass Sie die Datei \\''{0}.torrent\\'' löschen wollen? " +"(Heruntergeladene Daten werden nicht gelöscht.)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:941 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:990 msgid "Remove" msgstr "Entfernen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:950 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1001 msgid "Delete the .torrent file and the associated data file(s)" msgstr "löscht die .torrent-Datei und dazugehörige Daten Datei(en)" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quite must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:955 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1006 #, java-format -msgid "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded data?" -msgstr "Sind Sie sicher, dass Sie die Torrentdatei \\''{0}\\'' und alle heruntergeladenen Daten löschen wollen?" +msgid "" +"Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded " +"data?" +msgstr "" +"Sind Sie sicher, dass Sie die Torrentdatei \\''{0}\\'' und alle " +"heruntergeladenen Daten löschen wollen?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1009 msgid "Delete" msgstr "Löschen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:991 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042 msgid "Unknown" msgstr "Unbekannt" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1001 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1054 msgid "Seed" msgstr "Quelle" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1019 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1077 msgid "Uninteresting (The peer has no pieces we need)" msgstr "uninteressant (Der Teilnehmer hat keine Teile, die wir benötigen)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1021 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1079 msgid "Choked (The peer is not allowing us to request pieces)" msgstr "gedrosselt (Der Teilnehmer hat uns nicht erlaubt, Teile anzufordern)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1035 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1099 msgid "Uninterested (We have no pieces the peer needs)" msgstr "uninteressiert (Wir haben keine Teile, die der Teilnehmer benötigt)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1037 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1101 msgid "Choking (We are not allowing the peer to request pieces)" msgstr "gedrosselt (Wir erlauben dem Teilnehmer nicht, Teile anzufordern)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1092 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1159 +#, java-format +msgid "Details at {0} tracker" +msgstr "Details beim Tracker {0}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1188 msgid "Add Torrent" msgstr "Torrent hinzufügen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1094 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190 msgid "From URL" msgstr "Quell-URL" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1097 -msgid "Torrent file must originate from an I2P-based tracker" -msgstr "Die Torrentdatei muss von einem Tracker in I2P stammen." +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1193 +msgid "" +"Enter the torrent file download URL (I2P only), magnet link, or maggot link" +msgstr "" +"Gib die Download-URL der torrent-Datei (nur I2P), einen Magnet- oder einen " +"Maggotlink an!" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1102 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1198 msgid "Add torrent" msgstr "Füge Torrent hinzu" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1105 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1201 #, java-format msgid "You can also copy .torrent files to: {0}." msgstr "Alternativ können Sie die .torrent-Dateien auch nach {0} kopieren." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1107 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1203 msgid "Removing a .torrent will cause it to stop." msgstr "Das Entfernen der .torrent-Datei stoppt den jeweiligen Torrent." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1131 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1226 msgid "Create Torrent" msgstr "Torrent erstellen" #. out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br>\n"); -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1134 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 msgid "Data to seed" msgstr "Daten zum Verteilen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1138 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233 msgid "File or directory to seed (must be within the specified path)" msgstr "Datei oder Verzeichnis zum Verteilen (muss im angegebenen Pfad sein)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1140 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1235 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684 msgid "Tracker" msgstr "Tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1142 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237 msgid "Select a tracker" msgstr "Wähle einen Tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1155 +#. out.write(_("Open trackers and DHT only")); +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1242 +msgid "Open trackers only" +msgstr "Benutze nur OpenTracker" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1257 msgid "or" msgstr "oder" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1158 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1260 msgid "Specify custom tracker announce URL" msgstr "Geben Sie eine Tracker-Announce-URL an!" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1161 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1263 msgid "Create torrent" msgstr "Erstelle Torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1180 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1317 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1281 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1420 msgid "Configuration" msgstr "Einstellungen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1184 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1285 msgid "Data directory" msgstr "Datenverzeichnis" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1186 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1287 msgid "Edit i2psnark.config and restart to change" msgstr "Zum Ändern, bearbeite die i2psnark.config und starte neu!" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291 msgid "Auto start" msgstr "Autostart" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1194 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1295 msgid "If checked, automatically start torrents that are added" msgstr "Wenn markiert, werden hinzugefügte Torrents automatisch gestartet." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1198 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1299 msgid "Theme" msgstr "Aufmachung" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1211 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1312 msgid "Startup delay" msgstr "Startverzögerung" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1213 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1314 msgid "minutes" msgstr "Minuten" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1338 msgid "Total uploader limit" msgstr "Gesamtlimit an Hochladern" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1341 msgid "peers" msgstr "Teilnehmer" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1244 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1345 msgid "Up bandwidth limit" msgstr "Bandbreitenbegrenzung beim Hochladen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1247 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1348 msgid "Half available bandwidth recommended." msgstr "Halbe verfügbare Bandbreite wird empfohlen." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1249 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1350 msgid "View or change router bandwidth" msgstr "Routerbandbreite ansehen oder ändern" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1253 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1354 msgid "Use open trackers also" msgstr "Benutze auch OpenTracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1257 -msgid "If checked, announce torrents to open trackers as well as the tracker listed in the torrent file" -msgstr "Wenn markiert, wird der Torrent neben dem angegebenen Tracker auch bei den OpenTrackern bekannt gegeben." +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1358 +msgid "" +"If checked, announce torrents to open trackers as well as the tracker listed " +"in the torrent file" +msgstr "" +"Wenn markiert, wird der Torrent neben dem angegebenen Tracker auch bei den " +"OpenTrackern bekannt gegeben." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1261 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1362 msgid "Open tracker announce URLs" msgstr "OpenTracker-Announce-URLs" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1273 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1374 msgid "Inbound Settings" msgstr "Einstellungen eingehend" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1279 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1380 msgid "Outbound Settings" msgstr "Einstellungen ausgehend" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1286 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1388 msgid "I2CP host" msgstr "I2CP-Host" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1393 msgid "I2CP port" msgstr "I2CP-Port" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1303 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1406 msgid "I2CP options" msgstr "I2CP-Optionen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1308 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1411 msgid "Save configuration" msgstr "Einstellungen speichern" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1436 +#, java-format +msgid "Invalid magnet URL {0}" +msgstr "ungültige Magnet-URL {0}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1470 +#, java-format +msgid "Invalid info hash in magnet URL {0}" +msgstr "ungültiger Infohash im Magnetlink {0}" + #. * dummies for translation -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1325 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1500 #, java-format msgid "1 hop" msgid_plural "{0} hops" msgstr[0] "1 Zwischenstation" msgstr[1] "{0} Zwischenstationen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1326 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1501 #, java-format msgid "1 tunnel" msgid_plural "{0} tunnels" msgstr[0] "1 Tunnel" msgstr[1] "{0} Tunnel" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1480 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1663 +msgid "Completion" +msgstr "Fortschritt" + +#. else unknown +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1716 msgid "Size" msgstr "Größe" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1487 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1672 +msgid "Files" +msgstr "Dateien" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1674 +msgid "Pieces" +msgstr "Stücke" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1675 +msgid "Piece size" +msgstr "Stückgröße" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697 +msgid "Magnet link" +msgstr "Magnetlink" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1753 +msgid "Directory" +msgstr "Verzeichnis" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1723 msgid "Priority" msgstr "Priorität" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1492 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1728 msgid "Up to higher level directory" msgstr "Eine Hierarchie nach oben" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 -msgid "Directory" -msgstr "Verzeichnis" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1522 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758 msgid "Torrent not found?" msgstr "Torrentdatei nicht gefunden?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1767 msgid "File not found in torrent?" msgstr "Datei nicht gefunden im Torrent?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1543 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1780 msgid "complete" msgstr "vollständig" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1781 msgid "bytes remaining" msgstr "Bytes ausstehend" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1595 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806 +msgid "Open" +msgstr "Öffnen" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1832 msgid "High" msgstr "hoch" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1837 msgid "Normal" msgstr "normal" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1605 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1842 msgid "Skip" msgstr "auslassen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1614 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851 msgid "Save priorities" msgstr "Prioritäten speichern" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1726 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1967 #, java-format msgid "Torrent fetched from {0}" msgstr "Torrent geholt von {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1746 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1989 #, java-format msgid "Torrent already running: {0}" msgstr "Torrent läuft schon: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1748 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1991 #, java-format msgid "Torrent already in the queue: {0}" msgstr "Torrent ist schon in der Warteschlange: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1755 -#, java-format -msgid "Failed to copy torrent file to {0}" -msgstr "Konnte Torrent-Datei nicht nach {0} kopieren" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1759 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1997 #, java-format msgid "Torrent at {0} was not valid" msgstr "Torrent in {0} war nicht gültig" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1764 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2004 #, java-format msgid "Torrent was not retrieved from {0}" msgstr "Torrent wurde nicht geladen von {0}" +#~ msgid "Torrent file must originate from an I2P-based tracker" +#~ msgstr "Die Torrentdatei muss von einem Tracker in I2P stammen." + #~ msgid " theme locked and loaded." #~ msgstr "Aufmachung geladen" + #~ msgid "Estimated Download Time" #~ msgstr "geschätzte verbleibende Zeit bis zur Fertigstellung" + #~ msgid "Torrent file {0} does not exist" #~ msgstr "Torrentdatei {0} existiert nicht" + #~ msgid "Copying torrent to {0}" #~ msgstr "Kopiere Torrent nach {0}" + #~ msgid "from {0}" #~ msgstr "von {0}" + #~ msgid "Downloading" #~ msgstr "lade herunter" -#~ msgid "File" -#~ msgstr "Datei" + #~ msgid "FileSize" #~ msgstr "Größe" + #~ msgid "Download Status" #~ msgstr "Zustand" + #~ msgid "size: {0}B" #~ msgstr "Größe: {0}Byte" + #~ msgid "Directory to store torrents and data" #~ msgstr "Verzeichnis zum Speichern von Torrentdateien und Daten" + #~ msgid "Do not download" #~ msgstr "nicht herunterladen" + #~ msgid "Details" #~ msgstr "Details" + #~ msgid "Cannot change the I2CP settings while torrents are active" #~ msgstr "" #~ "Kann nicht die I2CP Einstellungen ändern während Torrents aktiv sind." + #~ msgid "Non-i2p tracker in \"{0}\", deleting it from our list of trackers!" #~ msgstr "" #~ "Nicht-I2P Tracker in\"{0}\", entferne ihn aus unserer Liste der Tracker!" + #~ msgid "{0} torrents" #~ msgstr "{0} Torrents" + #~ msgid "Uninteresting" #~ msgstr "nicht interessiert" + #~ msgid "Choked" #~ msgstr "Gestaut" + #~ msgid "Uninterested" #~ msgstr "Nicht interessiert" + #~ msgid "Choking" #~ msgstr "Stau" + #~ msgid "Custom tracker URL" #~ msgstr "Spezifische Tracker URL" + #~ msgid "Configure" #~ msgstr "Einstellungen" - diff --git a/apps/i2psnark/locale/messages_en.po b/apps/i2psnark/locale/messages_en.po new file mode 100644 index 0000000000000000000000000000000000000000..e88100e853dbf907737b64e526208885e3f4c649 --- /dev/null +++ b/apps/i2psnark/locale/messages_en.po @@ -0,0 +1,909 @@ +# 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: 2011-03-03 18:28+0000\n" +"PO-Revision-Date: 2010-06-15 14:09+0100\n" +"Last-Translator: duck <duck@mail.i2p>\n" +"Language-Team: duck <duck@mail.i2p>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: ../java/src/org/klomp/snark/SnarkManager.java:307 +#, java-format +msgid "Total uploaders limit changed to {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:309 +#, java-format +msgid "Minimum total uploaders limit is {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:321 +#, java-format +msgid "Up BW limit changed to {0}KBps" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:323 +#, java-format +msgid "Minimum up bandwidth limit is {0}KBps" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:335 +#, java-format +msgid "Startup delay changed to {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:386 +msgid "I2CP and tunnel changes will take effect after stopping all torrents" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:393 +msgid "Disconnecting old I2CP destination" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:397 +#, java-format +msgid "I2CP settings changed to {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:402 +msgid "" +"Unable to connect with the new settings, reverting to the old I2CP settings" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:406 +msgid "Unable to reconnect with the old settings!" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:408 +msgid "Reconnected on the new I2CP destination" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:418 +#, java-format +msgid "I2CP listener restarted for \"{0}\"" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:429 +msgid "Enabled autostart" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:431 +msgid "Disabled autostart" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:437 +msgid "Enabled open trackers - torrent restart required to take effect." +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:439 +msgid "Disabled open trackers - torrent restart required to take effect." +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:447 +msgid "Open Tracker list changed - torrent restart required to take effect." +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:454 +#, java-format +msgid "{0} theme loaded, return to main i2psnark page to view." +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:461 +msgid "Configuration unchanged." +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:471 +#, java-format +msgid "Unable to save the config to {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:536 +msgid "Connecting to I2P" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:539 +msgid "Error connecting to I2P - check your I2CP settings!" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:548 +#, java-format +msgid "Error: Could not add the torrent {0}" +msgstr "" + +#. catch this here so we don't try do delete it below +#: ../java/src/org/klomp/snark/SnarkManager.java:570 +#, java-format +msgid "Cannot open \"{0}\"" +msgstr "" + +#. TODO - if the existing one is a magnet, delete it and add the metainfo instead? +#: ../java/src/org/klomp/snark/SnarkManager.java:586 +#: ../java/src/org/klomp/snark/SnarkManager.java:661 +#: ../java/src/org/klomp/snark/SnarkManager.java:716 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1976 +#, java-format +msgid "Torrent with this info hash is already running: {0}" +msgstr "" + +#. addMessage(_("Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and DHT only.", info.getName())); +#: ../java/src/org/klomp/snark/SnarkManager.java:593 +#, java-format +msgid "" +"Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers " +"only." +msgstr "" + +#. addMessage(_("Warning - No I2P trackers in \"{0}\", and DHT and open trackers are disabled, you should enable open trackers or DHT before starting the torrent.", info.getName())); +#: ../java/src/org/klomp/snark/SnarkManager.java:598 +#, java-format +msgid "" +"Warning - No I2P Trackers found in \"{0}\". Make sure Open Tracker is " +"enabled before starting this torrent." +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:619 +#, java-format +msgid "Torrent in \"{0}\" is invalid" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:624 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1999 +#, java-format +msgid "ERROR - Out of memory, cannot create torrent from {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:635 +#, java-format +msgid "Torrent added and started: \"{0}\"" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:637 +#, java-format +msgid "Torrent added: \"{0}\"" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:672 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:490 +#, java-format +msgid "Fetching {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:675 +#, java-format +msgid "" +"We have no saved peers and no other torrents are running. Fetch of {0} will " +"not succeed until you start another torrent." +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:679 +#, java-format +msgid "Adding {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:726 +#: ../java/src/org/klomp/snark/SnarkManager.java:749 +#: ../java/src/org/klomp/snark/SnarkManager.java:1174 +#, java-format +msgid "Failed to copy torrent file to {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:972 +#, java-format +msgid "Too many files in \"{0}\" ({1}), deleting it!" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:974 +#, java-format +msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:976 +#, java-format +msgid "No pieces in \"{0}\", deleting it!" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:978 +#, java-format +msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:980 +#, java-format +msgid "Pieces are too large in \"{0}\" ({1}B), deleting it." +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:981 +#, java-format +msgid "Limit is {0}B" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:989 +#, java-format +msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\"" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1005 +#, java-format +msgid "Error: Could not remove the torrent {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1026 +#: ../java/src/org/klomp/snark/SnarkManager.java:1044 +#, java-format +msgid "Torrent stopped: \"{0}\"" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1065 +#, java-format +msgid "Torrent removed: \"{0}\"" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1073 +#, java-format +msgid "Adding torrents in {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1122 +#, java-format +msgid "Download finished: {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1170 +#, java-format +msgid "Metainfo received for {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1171 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:525 +#, java-format +msgid "Starting up torrent {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1225 +msgid "Unable to connect to I2P!" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1231 +#, java-format +msgid "Unable to add {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:205 +msgid "I2PSnark - Anonymous BitTorrent Client" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:218 +msgid "Torrents" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:221 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:228 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1028 +msgid "I2PSnark" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:225 +msgid "Refresh page" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:230 +msgid "Forum" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:284 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1719 +msgid "Status" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:290 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:292 +msgid "Hide Peers" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:297 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:299 +msgid "Show Peers" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1659 +msgid "Torrent" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:310 +msgid "Estimated time remaining" +msgstr "" + +#. Translators: Please keep short or translate as " " +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313 +msgid "ETA" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317 +msgid "Downloaded" +msgstr "" + +#. Translators: Please keep short or translate as " " +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:320 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:334 +msgid "RX" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324 +msgid "Uploaded" +msgstr "" + +#. Translators: Please keep short or translate as " " +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:327 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:344 +msgid "TX" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:332 +msgid "Down Rate" +msgstr "" + +#. Translators: Please keep short or translate as " " +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:337 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:346 +msgid "Rate" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:342 +msgid "Up Rate" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:365 +msgid "Stop all torrents and the I2P tunnel" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:367 +msgid "Stop All" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:376 +msgid "Start all torrents and the I2P tunnel" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:378 +msgid "Start All" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:397 +msgid "No torrents loaded." +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:402 +msgid "Totals" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:404 +#, java-format +msgid "1 torrent" +msgid_plural "{0} torrents" +msgstr[0] "" +msgstr[1] "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:407 +#, java-format +msgid "1 connected peer" +msgid_plural "{0} connected peers" +msgstr[0] "" +msgstr[1] "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:496 +#, java-format +msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:544 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571 +#, java-format +msgid "Magnet deleted: {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:552 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:577 +#, java-format +msgid "Torrent file deleted: {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:593 +#, java-format +msgid "Data file deleted: {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:595 +#, java-format +msgid "Data file could not be deleted: {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:604 +#, java-format +msgid "Data dir deleted: {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:637 +msgid "Error creating torrent - you must select a tracker" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:653 +#, java-format +msgid "Torrent created for \"{0}\"" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:655 +#, java-format +msgid "" +"Many I2P trackers require you to register new torrents before seeding - " +"please do so before starting \"{0}\"" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:657 +#, java-format +msgid "Error creating a torrent for \"{0}\"" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:660 +#, java-format +msgid "Cannot create a torrent for the nonexistent data: {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:663 +msgid "Error creating torrent - you must enter a file or directory" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:666 +msgid "Stopping all torrents and closing the I2P tunnel." +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:677 +msgid "I2P tunnel closed." +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680 +msgid "Opening the I2P tunnel and starting all torrents." +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:803 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:808 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:814 +msgid "Tracker Error" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:806 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:810 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:822 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:826 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:834 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:838 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:843 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:847 +#, java-format +msgid "1 peer" +msgid_plural "{0} peers" +msgstr[0] "" +msgstr[1] "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:819 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:824 +msgid "Seeding" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:828 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1665 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1770 +msgid "Complete" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:831 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:836 +msgid "OK" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:840 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:845 +msgid "Stalled" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:849 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:852 +msgid "No Peers" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 +msgid "Stopped" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:886 +msgid "Torrent details" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:898 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1160 +msgid "Info" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:913 +msgid "View files" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:915 +msgid "Open file" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:957 +msgid "Stop the torrent" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:959 +msgid "Stop" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:969 +msgid "Start the torrent" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:971 +msgid "Start" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:982 +msgid "Remove the torrent from the active list, deleting the .torrent file" +msgstr "" + +#. Can't figure out how to escape double quotes inside the onclick string. +#. Single quotes in translate strings with parameters must be doubled. +#. Then the remaining single quite must be escaped +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:987 +#, java-format +msgid "" +"Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded " +"data will not be deleted) ?" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:990 +msgid "Remove" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1001 +msgid "Delete the .torrent file and the associated data file(s)" +msgstr "" + +#. Can't figure out how to escape double quotes inside the onclick string. +#. Single quotes in translate strings with parameters must be doubled. +#. Then the remaining single quite must be escaped +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1006 +#, java-format +msgid "" +"Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded " +"data?" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1009 +msgid "Delete" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042 +msgid "Unknown" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1054 +msgid "Seed" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1077 +msgid "Uninteresting (The peer has no pieces we need)" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1079 +msgid "Choked (The peer is not allowing us to request pieces)" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1099 +msgid "Uninterested (We have no pieces the peer needs)" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1101 +msgid "Choking (We are not allowing the peer to request pieces)" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1159 +#, java-format +msgid "Details at {0} tracker" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1188 +msgid "Add Torrent" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190 +msgid "From URL" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1193 +msgid "" +"Enter the torrent file download URL (I2P only), magnet link, or maggot link" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1198 +msgid "Add torrent" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1201 +#, java-format +msgid "You can also copy .torrent files to: {0}." +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1203 +msgid "Removing a .torrent will cause it to stop." +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1226 +msgid "Create Torrent" +msgstr "" + +#. out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br>\n"); +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 +msgid "Data to seed" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233 +msgid "File or directory to seed (must be within the specified path)" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1235 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684 +msgid "Tracker" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237 +msgid "Select a tracker" +msgstr "" + +#. out.write(_("Open trackers and DHT only")); +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1242 +msgid "Open trackers only" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1257 +msgid "or" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1260 +msgid "Specify custom tracker announce URL" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1263 +msgid "Create torrent" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1281 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1420 +msgid "Configuration" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1285 +msgid "Data directory" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1287 +msgid "Edit i2psnark.config and restart to change" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291 +msgid "Auto start" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1295 +msgid "If checked, automatically start torrents that are added" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1299 +msgid "Theme" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1312 +msgid "Startup delay" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1314 +msgid "minutes" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1338 +msgid "Total uploader limit" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1341 +msgid "peers" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1345 +msgid "Up bandwidth limit" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1348 +msgid "Half available bandwidth recommended." +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1350 +msgid "View or change router bandwidth" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1354 +msgid "Use open trackers also" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1358 +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:1362 +msgid "Open tracker announce URLs" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1374 +msgid "Inbound Settings" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1380 +msgid "Outbound Settings" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1388 +msgid "I2CP host" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1393 +msgid "I2CP port" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1406 +msgid "I2CP options" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1411 +msgid "Save configuration" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1436 +#, java-format +msgid "Invalid magnet URL {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1470 +#, java-format +msgid "Invalid info hash in magnet URL {0}" +msgstr "" + +#. * dummies for translation +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1500 +#, java-format +msgid "1 hop" +msgid_plural "{0} hops" +msgstr[0] "" +msgstr[1] "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1501 +#, java-format +msgid "1 tunnel" +msgid_plural "{0} tunnels" +msgstr[0] "" +msgstr[1] "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1663 +msgid "Completion" +msgstr "" + +#. else unknown +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1716 +msgid "Size" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1672 +msgid "Files" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1674 +msgid "Pieces" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1675 +msgid "Piece size" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697 +msgid "Magnet link" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1753 +msgid "Directory" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1723 +msgid "Priority" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1728 +msgid "Up to higher level directory" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758 +msgid "Torrent not found?" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1767 +msgid "File not found in torrent?" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1780 +msgid "complete" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1781 +msgid "bytes remaining" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806 +msgid "Open" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1832 +msgid "High" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1837 +msgid "Normal" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1842 +msgid "Skip" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851 +msgid "Save priorities" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1967 +#, java-format +msgid "Torrent fetched from {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1989 +#, java-format +msgid "Torrent already running: {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1991 +#, java-format +msgid "Torrent already in the queue: {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1997 +#, java-format +msgid "Torrent at {0} was not valid" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2004 +#, java-format +msgid "Torrent was not retrieved from {0}" +msgstr "" diff --git a/apps/i2psnark/locale/messages_es.po b/apps/i2psnark/locale/messages_es.po index cf863e521cc2880addbce1e5e8998030e27687c5..d9202455796fb4efe5e397acf469dd459b629787 100644 --- a/apps/i2psnark/locale/messages_es.po +++ b/apps/i2psnark/locale/messages_es.po @@ -6,857 +6,894 @@ # msgid "" msgstr "" -"Project-Id-Version: I2P i2psnark\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-12-19 03:16+0000\n" -"PO-Revision-Date: 2011-01-03 00:58+0100\n" +"Project-Id-Version: I2P\n" +"Report-Msgid-Bugs-To: https://trac.i2p2.de/\n" +"POT-Creation-Date: 2011-03-03 18:28+0000\n" +"PO-Revision-Date: 2011-04-03 01:46+0100\n" "Last-Translator: mixxy <m1xxy@mail.i2p>\n" -"Language-Team: foo <foo@bar>\n" +"Language-Team: Spanish (Castilian) <None>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Poedit-Language: Spanish\n" +"Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ../java/src/org/klomp/snark/SnarkManager.java:94 -#, java-format -msgid "Adding torrents in {0} minutes" -msgstr "Se añaden los torrents en {0} minutos ..." - -#: ../java/src/org/klomp/snark/SnarkManager.java:296 +#: ../java/src/org/klomp/snark/SnarkManager.java:307 #, java-format msgid "Total uploaders limit changed to {0}" -msgstr "LÃmite del número total de subidores cambiado a {0}" +msgstr "LÃmite del número total de subidores ha cambiado a {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:298 +#: ../java/src/org/klomp/snark/SnarkManager.java:309 #, java-format msgid "Minimum total uploaders limit is {0}" msgstr "El lÃmite mÃnimo de subidores es {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:310 +#: ../java/src/org/klomp/snark/SnarkManager.java:321 #, java-format msgid "Up BW limit changed to {0}KBps" msgstr "Ancho de banda para la subida ha sido cambiado a {0} kbyte/s." -#: ../java/src/org/klomp/snark/SnarkManager.java:312 +#: ../java/src/org/klomp/snark/SnarkManager.java:323 #, java-format msgid "Minimum up bandwidth limit is {0}KBps" msgstr "El lÃmite mÃnimo de ancho de banda para la subida está en {0} kbyte/s." -#: ../java/src/org/klomp/snark/SnarkManager.java:324 +#: ../java/src/org/klomp/snark/SnarkManager.java:335 #, java-format -msgid "Startup delay limit changed to {0} minutes" -msgstr "Demora del arranque cambiado a {0} minutos" +msgid "Startup delay changed to {0}" +msgstr "Tiempo de espera al inicio fue cambiada a {0}." -#: ../java/src/org/klomp/snark/SnarkManager.java:371 +#: ../java/src/org/klomp/snark/SnarkManager.java:386 msgid "I2CP and tunnel changes will take effect after stopping all torrents" msgstr "Cambios de I2CP y del túnel tomarán efecto despues de detener todos los torrents." -#: ../java/src/org/klomp/snark/SnarkManager.java:378 +#: ../java/src/org/klomp/snark/SnarkManager.java:393 msgid "Disconnecting old I2CP destination" msgstr "Desconectando anterior Destino I2CP" -#: ../java/src/org/klomp/snark/SnarkManager.java:382 +#: ../java/src/org/klomp/snark/SnarkManager.java:397 #, java-format msgid "I2CP settings changed to {0}" msgstr "Preferencias de I2CP cambiadas a {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:386 +#: ../java/src/org/klomp/snark/SnarkManager.java:402 msgid "Unable to connect with the new settings, reverting to the old I2CP settings" msgstr "Conectarse no fue posÃble con las nuevas preferencias I2CP, utilizaré las anteriores." -#: ../java/src/org/klomp/snark/SnarkManager.java:390 +#: ../java/src/org/klomp/snark/SnarkManager.java:406 msgid "Unable to reconnect with the old settings!" msgstr "Conectarse usando las preferencias anteriores no fue posible!" -#: ../java/src/org/klomp/snark/SnarkManager.java:392 +#: ../java/src/org/klomp/snark/SnarkManager.java:408 msgid "Reconnected on the new I2CP destination" msgstr "Conectado con la nueva Destino I2CP" -#: ../java/src/org/klomp/snark/SnarkManager.java:403 +#: ../java/src/org/klomp/snark/SnarkManager.java:418 #, java-format msgid "I2CP listener restarted for \"{0}\"" msgstr "Conexión I2CP reestablecida para \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:414 +#: ../java/src/org/klomp/snark/SnarkManager.java:429 msgid "Enabled autostart" msgstr "Arranque automático activado" -#: ../java/src/org/klomp/snark/SnarkManager.java:416 +#: ../java/src/org/klomp/snark/SnarkManager.java:431 msgid "Disabled autostart" msgstr "Arranque automático desactivado" -#: ../java/src/org/klomp/snark/SnarkManager.java:422 +#: ../java/src/org/klomp/snark/SnarkManager.java:437 msgid "Enabled open trackers - torrent restart required to take effect." msgstr "Rastreadores abiertos activados - Para aplicar ello es necesario que reinicies los torrents." -#: ../java/src/org/klomp/snark/SnarkManager.java:424 +#: ../java/src/org/klomp/snark/SnarkManager.java:439 msgid "Disabled open trackers - torrent restart required to take effect." msgstr "Rastreadores abiertos desactivados - Para aplicar ello es necesario que reinicies los torrents." -#: ../java/src/org/klomp/snark/SnarkManager.java:431 +#: ../java/src/org/klomp/snark/SnarkManager.java:447 msgid "Open Tracker list changed - torrent restart required to take effect." msgstr "Lista de rastreadores abiertos cambiada - Para aplicar ello es necesario que reinicies los torrents." -#: ../java/src/org/klomp/snark/SnarkManager.java:438 +#: ../java/src/org/klomp/snark/SnarkManager.java:454 #, java-format msgid "{0} theme loaded, return to main i2psnark page to view." msgstr "Tema {0} cargado. ¡Vuelve a la página principal de i2psnark para verlo!" -#: ../java/src/org/klomp/snark/SnarkManager.java:445 +#: ../java/src/org/klomp/snark/SnarkManager.java:461 msgid "Configuration unchanged." msgstr "Configuración no cambiada." -#: ../java/src/org/klomp/snark/SnarkManager.java:455 +#: ../java/src/org/klomp/snark/SnarkManager.java:471 #, java-format msgid "Unable to save the config to {0}" msgstr "No se pudo guardar la configuración en {0}." -#: ../java/src/org/klomp/snark/SnarkManager.java:494 +#: ../java/src/org/klomp/snark/SnarkManager.java:536 msgid "Connecting to I2P" msgstr "Conectando a I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:497 +#: ../java/src/org/klomp/snark/SnarkManager.java:539 msgid "Error connecting to I2P - check your I2CP settings!" msgstr "Error al conectar a I2P - Compruebe su configuración I2CP!" -#: ../java/src/org/klomp/snark/SnarkManager.java:506 +#: ../java/src/org/klomp/snark/SnarkManager.java:548 #, java-format msgid "Error: Could not add the torrent {0}" msgstr "Error: No se ha podido añadir el torrent {0}." #. catch this here so we don't try do delete it below -#: ../java/src/org/klomp/snark/SnarkManager.java:528 +#: ../java/src/org/klomp/snark/SnarkManager.java:570 #, java-format msgid "Cannot open \"{0}\"" msgstr "No se puede abrir \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:541 +#. TODO - if the existing one is a magnet, delete it and add the metainfo +#. instead? +#: ../java/src/org/klomp/snark/SnarkManager.java:586 +#: ../java/src/org/klomp/snark/SnarkManager.java:661 +#: ../java/src/org/klomp/snark/SnarkManager.java:716 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1976 #, java-format -msgid "Warning - Ignoring non-i2p tracker in \"{0}\", will announce to i2p open trackers only" -msgstr "Advertencia - Se ignora rastreado no I2P en \"{0}\", anunciando sólo a los rastreadorse abiertos de I2P" +msgid "Torrent with this info hash is already running: {0}" +msgstr "Ya hay un Torrent con este hash ejecutándose: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:543 +#. addMessage(_("Warning - No I2P trackers in \"{0}\", will announce to I2P +#. open trackers and DHT only.", info.getName())); +#: ../java/src/org/klomp/snark/SnarkManager.java:593 #, java-format -msgid "Warning - Ignoring non-i2p tracker in \"{0}\", and open trackers are disabled, you must enable open trackers before starting the torrent!" -msgstr "Advertencia - Se ignora rastreado no I2P en \"{0}\", rastreadores abiertos están desactivados. ¡Tienes que activarlos antes de iniciar el torrent!" +msgid "Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers only." +msgstr "Advertencia - No hay rastreadores de I2P en \"{0}\", se anunciará solamente a los rastreadores I2P abiertos." -#: ../java/src/org/klomp/snark/SnarkManager.java:563 +#. addMessage(_("Warning - No I2P trackers in \"{0}\", and DHT and open +#. trackers are disabled, you should enable open trackers or DHT before +#. starting the torrent.", info.getName())); +#: ../java/src/org/klomp/snark/SnarkManager.java:598 +#, java-format +msgid "Warning - No I2P Trackers found in \"{0}\". Make sure Open Tracker is enabled before starting this torrent." +msgstr "Advertencia - No se encuentran rastreadores de I2P en \"{0}\". Asegúrate de que OpenTracker esté activado antes de iniciar este torrent." + +#: ../java/src/org/klomp/snark/SnarkManager.java:619 #, java-format msgid "Torrent in \"{0}\" is invalid" msgstr "El archivo .torrent en \"{0}\" no es válido." -#: ../java/src/org/klomp/snark/SnarkManager.java:578 +#: ../java/src/org/klomp/snark/SnarkManager.java:624 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1999 +#, java-format +msgid "ERROR - Out of memory, cannot create torrent from {0}" +msgstr "ERROR - Falta de memoria, no se puede crear un torrent de {0}." + +#: ../java/src/org/klomp/snark/SnarkManager.java:635 #, java-format msgid "Torrent added and started: \"{0}\"" msgstr "Torrent añadido e iniciado: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:580 +#: ../java/src/org/klomp/snark/SnarkManager.java:637 #, java-format msgid "Torrent added: \"{0}\"" msgstr "Torrent añadido: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:734 +#: ../java/src/org/klomp/snark/SnarkManager.java:672 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:490 +#, java-format +msgid "Fetching {0}" +msgstr "Recogiendo {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:675 +#, java-format +msgid "We have no saved peers and no other torrents are running. Fetch of {0} will not succeed until you start another torrent." +msgstr "No tenemos guardado ningún par y no se está activo ningún otro torrent. La obtención de {0} no tendrá éxito hasta que inicies otro torrent." + +#: ../java/src/org/klomp/snark/SnarkManager.java:679 +#, java-format +msgid "Adding {0}" +msgstr "Añadiendo {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:726 +#: ../java/src/org/klomp/snark/SnarkManager.java:749 +#: ../java/src/org/klomp/snark/SnarkManager.java:1174 +#, java-format +msgid "Failed to copy torrent file to {0}" +msgstr "No se pudo copiar el torrent a {0}." + +#: ../java/src/org/klomp/snark/SnarkManager.java:972 #, java-format msgid "Too many files in \"{0}\" ({1}), deleting it!" msgstr "Hay demasiados archivos en \"{0}\", se borrará ({1}). " -#: ../java/src/org/klomp/snark/SnarkManager.java:736 +#: ../java/src/org/klomp/snark/SnarkManager.java:974 #, java-format msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!" msgstr "Archivo de datos del torrent \"{0}\" no puede terminar en \".torrent' y será borrado." -#: ../java/src/org/klomp/snark/SnarkManager.java:738 +#: ../java/src/org/klomp/snark/SnarkManager.java:976 #, java-format msgid "No pieces in \"{0}\", deleting it!" msgstr "No hay partes en \"{0}\", se borrará." -#: ../java/src/org/klomp/snark/SnarkManager.java:740 +#: ../java/src/org/klomp/snark/SnarkManager.java:978 #, java-format msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!" msgstr "Hay demasiadas partes en \"{0}\" y el lÃmite es {1}. Se borrarán." -#: ../java/src/org/klomp/snark/SnarkManager.java:742 +#: ../java/src/org/klomp/snark/SnarkManager.java:980 #, java-format msgid "Pieces are too large in \"{0}\" ({1}B), deleting it." msgstr "Partes en \"{0}\" son demasiado grandes ({1}B). Se borrarán." -#: ../java/src/org/klomp/snark/SnarkManager.java:743 +#: ../java/src/org/klomp/snark/SnarkManager.java:981 #, java-format msgid "Limit is {0}B" msgstr "El lÃmite es de \"{0}\"Bytes" -#: ../java/src/org/klomp/snark/SnarkManager.java:751 +#: ../java/src/org/klomp/snark/SnarkManager.java:989 #, java-format msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\"" msgstr "Torrents más grandes que \"{0}\"Bytes aún no funcionan, se borrará \"{1}\"." -#: ../java/src/org/klomp/snark/SnarkManager.java:767 +#: ../java/src/org/klomp/snark/SnarkManager.java:1005 #, java-format msgid "Error: Could not remove the torrent {0}" msgstr "Error: No se pudo quitar el torrent \"{0}\"." -#: ../java/src/org/klomp/snark/SnarkManager.java:794 +#: ../java/src/org/klomp/snark/SnarkManager.java:1026 +#: ../java/src/org/klomp/snark/SnarkManager.java:1044 #, java-format msgid "Torrent stopped: \"{0}\"" msgstr "Torrent detenido: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:814 +#: ../java/src/org/klomp/snark/SnarkManager.java:1065 #, java-format msgid "Torrent removed: \"{0}\"" msgstr "Torrent quitado: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:852 +#: ../java/src/org/klomp/snark/SnarkManager.java:1073 +#, java-format +msgid "Adding torrents in {0}" +msgstr "Añadiendo torrents en {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1122 #, java-format msgid "Download finished: {0}" msgstr "Terminada la descarga de \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:880 +#: ../java/src/org/klomp/snark/SnarkManager.java:1170 +#, java-format +msgid "Metainfo received for {0}" +msgstr "Metainfo recibida para {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1171 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:525 +#, java-format +msgid "Starting up torrent {0}" +msgstr "Iniciando el torrent {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1225 msgid "Unable to connect to I2P!" msgstr "Imposible de conectarse con I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:886 +#: ../java/src/org/klomp/snark/SnarkManager.java:1231 #, java-format msgid "Unable to add {0}" msgstr "Imposible de añadir {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:185 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:205 msgid "I2PSnark - Anonymous BitTorrent Client" msgstr "I2PSnark - Cliente de BitTorrent Anónimo" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:198 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:218 msgid "Torrents" msgstr "Torrents" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:201 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:208 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:977 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:221 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:228 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1028 msgid "I2PSnark" msgstr "I2PSnark" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:205 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:225 msgid "Refresh page" msgstr "Actualizar página" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:210 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:230 msgid "Forum" msgstr "Foro" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:264 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1483 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:284 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1719 msgid "Status" msgstr "Estado" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:270 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:272 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:290 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:292 msgid "Hide Peers" msgstr "ocultar pares" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:277 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:279 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:297 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:299 msgid "Show Peers" msgstr "mostrar pares" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:286 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1464 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1659 msgid "Torrent" msgstr "Torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:290 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:310 msgid "Estimated time remaining" msgstr "Tiempo restante para completar la descarga" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313 msgid "ETA" msgstr "Tiempo" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:297 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317 msgid "Downloaded" msgstr "Descargado" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:300 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:314 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:320 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:334 msgid "RX" msgstr "Bajado" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:304 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324 msgid "Uploaded" msgstr "Subido" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:307 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:327 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:344 msgid "TX" msgstr "Subido" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:312 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:332 msgid "Down Rate" msgstr "Tasa de descarga" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:337 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:346 msgid "Rate" msgstr "Tasa" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:322 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:342 msgid "Up Rate" msgstr "Tasa de subida" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:340 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:365 msgid "Stop all torrents and the I2P tunnel" msgstr "Detener todos los torrents y el túnel I2P" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:342 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:367 msgid "Stop All" msgstr "Detener todos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:351 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:376 msgid "Start all torrents and the I2P tunnel" msgstr "Iniciar todos los torrents y el túnel I2P" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:353 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:378 msgid "Start All" msgstr "Arrancar todos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:372 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:397 msgid "No torrents loaded." msgstr "No está cargado ningún torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:377 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:402 msgid "Totals" msgstr "Total" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:379 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:404 #, java-format msgid "1 torrent" msgid_plural "{0} torrents" msgstr[0] "1 torrent" msgstr[1] "{0} torrents" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:382 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:407 #, java-format msgid "1 connected peer" msgid_plural "{0} connected peers" msgstr[0] "1 par conectado" msgstr[1] "{0} pares conectados" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:454 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:496 #, java-format -msgid "Fetching {0}" -msgstr "Recogiendo {0}" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:458 -msgid "Invalid URL - must start with http://" -msgstr "Dirección no válida - tiene que comenzar con http://" +msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"" +msgstr "URL no válida: debe comenzar con \"http://\", \"{0}\", o \"{1}\"." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:489 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:544 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571 #, java-format -msgid "Starting up torrent {0}" -msgstr "Iniciando el torrent {0}" +msgid "Magnet deleted: {0}" +msgstr "Magnet eliminado: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:509 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:527 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:552 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:577 #, java-format msgid "Torrent file deleted: {0}" msgstr "Borrado archivo torrent: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:533 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:543 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:593 #, java-format msgid "Data file deleted: {0}" msgstr "Borrado el archivo de datos: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:535 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:545 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:595 #, java-format msgid "Data file could not be deleted: {0}" msgstr "No se pudo borrar el archivo de datos: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:554 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:604 #, java-format msgid "Data dir deleted: {0}" msgstr "Ha sido borrada la carpeta de datos: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:587 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:637 msgid "Error creating torrent - you must select a tracker" msgstr "Error al crear el torrents - Tienes que elegir un rastreador." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:602 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:653 #, java-format msgid "Torrent created for \"{0}\"" msgstr "Torrent creado para \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:605 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:655 #, java-format msgid "Many I2P trackers require you to register new torrents before seeding - please do so before starting \"{0}\"" msgstr "Muchos rastreadores en I2P requieren que te registres, antes de que puedas subir el torrent. Por favor, ¡hazlo antes de iniciar \"{0}\"!" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:607 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:657 #, java-format msgid "Error creating a torrent for \"{0}\"" msgstr "Error al crear el torrent \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:610 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:660 #, java-format msgid "Cannot create a torrent for the nonexistent data: {0}" msgstr "No se puede crear un torrent para datos inexistentes: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:613 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:663 msgid "Error creating torrent - you must enter a file or directory" msgstr "Error al crear el torrent - Tienes que especificar un archivo o una carpeta." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:616 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:666 msgid "Stopping all torrents and closing the I2P tunnel." msgstr "Deteniendo todos los torrents y cerrando el túnel I2P" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:627 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:677 msgid "I2P tunnel closed." msgstr "Túnel I2P cerrado" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:630 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680 msgid "Opening the I2P tunnel and starting all torrents." msgstr "Abriendo el túnel I2P e iniciando los torrents ..." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:759 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:764 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:770 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:803 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:808 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:814 msgid "Tracker Error" msgstr "Error del rastrador" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:762 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:766 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:778 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:782 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:790 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:794 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:799 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:803 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:806 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:810 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:822 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:826 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:834 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:838 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:843 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:847 #, java-format msgid "1 peer" msgid_plural "{0} peers" msgstr[0] "1 par" msgstr[1] "{0} pares" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:775 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:780 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:819 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:824 msgid "Seeding" msgstr "sembrando" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:784 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1533 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:828 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1665 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1770 msgid "Complete" msgstr "completo" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:787 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:792 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:831 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:836 msgid "OK" msgstr "bien" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:796 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:801 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:840 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:845 msgid "Stalled" msgstr "estancado" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:805 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:808 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:849 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:852 msgid "No Peers" msgstr "sin pares" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:810 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 msgid "Stopped" msgstr "detenido" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:837 -#, java-format -msgid "Details at {0} tracker" -msgstr "Detalles en el rastreador {0}" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:886 +msgid "Torrent details" +msgstr "Detalles del torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:838 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:898 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1160 msgid "Info" msgstr "Info" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:853 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:913 msgid "View files" msgstr "mostrar archivos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:855 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:915 msgid "Open file" msgstr "abrir archivo" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:865 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1569 -msgid "Open" -msgstr "abrir" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:909 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:957 msgid "Stop the torrent" msgstr "Detener el torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:911 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:959 msgid "Stop" msgstr "Detener" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:921 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:969 msgid "Start the torrent" msgstr "Iniciar el torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:923 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:971 msgid "Start" msgstr "Iniciar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:933 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:982 msgid "Remove the torrent from the active list, deleting the .torrent file" msgstr "Quita el torrent de la lista de los torrents activos borrando el archivo .torrent" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quite must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:938 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:987 #, java-format msgid "Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded data will not be deleted) ?" msgstr "¿Estás seguro de que quieres borrar el archivo \\''{0}.torrent\\''? (Datos bajados no se borrarán.)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:941 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:990 msgid "Remove" msgstr "Quitar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:950 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1001 msgid "Delete the .torrent file and the associated data file(s)" msgstr "Borrar el archivo torrent y el/los archivo(s) de datos pertenecientes" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quite must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:955 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1006 #, java-format msgid "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded data?" msgstr "¿Estás seguro de que quieres borrar el archivo torrent \\''{0}\\'' y todos los datos descargados de este torrent?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1009 msgid "Delete" msgstr "Borrar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:991 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042 msgid "Unknown" msgstr "desconocido" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1001 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1054 msgid "Seed" msgstr "Sembrador" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1019 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1077 msgid "Uninteresting (The peer has no pieces we need)" msgstr "no interesante (El par no tiene partes que nos interesen.)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1021 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1079 msgid "Choked (The peer is not allowing us to request pieces)" msgstr "moderado (De momento el par no nos permite solicitar más partes)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1035 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1099 msgid "Uninterested (We have no pieces the peer needs)" msgstr "desinteresado (No tenemos las partes que el par quiere.)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1037 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1101 msgid "Choking (We are not allowing the peer to request pieces)" -msgstr "Moderando (De momento no se le permite al par solicitar más partes)" +msgstr "moderando (De momento no se le permite al par solicitar más partes)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1092 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1159 +#, java-format +msgid "Details at {0} tracker" +msgstr "Detalles en el rastreador {0}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1188 msgid "Add Torrent" msgstr "Añadir un torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1094 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190 msgid "From URL" msgstr "URL fuente" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1097 -msgid "Torrent file must originate from an I2P-based tracker" -msgstr "El archivo torrent debe incluir un rastreador I2P." +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1193 +msgid "Enter the torrent file download URL (I2P only), magnet link, or maggot link" +msgstr "Introduce la URL de descarga de torrent (I2P solamente), enlace magnet o un enlace maggot" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1102 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1198 msgid "Add torrent" msgstr "Añadir torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1105 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1201 #, java-format msgid "You can also copy .torrent files to: {0}." msgstr "También puedes copiar archivos torrent a {0}." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1107 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1203 msgid "Removing a .torrent will cause it to stop." msgstr "Quitar un archivo torrent resultará en que se detenga el torrent perteneciente." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1131 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1226 msgid "Create Torrent" msgstr "Crear un torrent" -#. out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br>\n"); -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1134 +#. out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" +#. value=\"" + newFile + "\" /><br>\n"); +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 msgid "Data to seed" msgstr "Datos para sembrar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1138 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233 msgid "File or directory to seed (must be within the specified path)" msgstr "Archivo o carpeta para sembrar (tiene que estár en la carpeta especificada)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1140 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1235 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684 msgid "Tracker" msgstr "Rastreador" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1142 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237 msgid "Select a tracker" msgstr "Selecciona un rastreador" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1155 +#. out.write(_("Open trackers and DHT only")); +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1242 +msgid "Open trackers only" +msgstr "Sólo rastreadores abiertos" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1257 msgid "or" msgstr "o" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1158 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1260 msgid "Specify custom tracker announce URL" msgstr "¡Especifica una URL para anunciar al rastreador!" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1161 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1263 msgid "Create torrent" msgstr "Crear torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1180 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1317 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1281 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1420 msgid "Configuration" msgstr "Preferencias" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1184 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1285 msgid "Data directory" msgstr "Carpeta de datos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1186 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1287 msgid "Edit i2psnark.config and restart to change" msgstr "Para cambiar, ¡modifica el archivo i2psnark.config y reinicia!" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291 msgid "Auto start" msgstr "Arranque automático" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1194 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1295 msgid "If checked, automatically start torrents that are added" msgstr "Si marcado, los torrents añadidos se iniciarán de forma automática." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1198 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1299 msgid "Theme" msgstr "Tema" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1211 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1312 msgid "Startup delay" -msgstr "Demora del arranque" +msgstr "Tiempo de espera al arrancar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1213 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1314 msgid "minutes" msgstr "minutos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1338 msgid "Total uploader limit" msgstr "LÃmite global de subidores" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1341 msgid "peers" msgstr "pares" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1244 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1345 msgid "Up bandwidth limit" msgstr "LÃmite del ancho de banda para la subida" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1247 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1348 msgid "Half available bandwidth recommended." msgstr "Se recomienda la mitad del ancho de banda disponible." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1249 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1350 msgid "View or change router bandwidth" msgstr "Mostrar y cambiar preferencias del ancho de banda del enrutador" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1253 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1354 msgid "Use open trackers also" msgstr "Usar también rastreadores abiertos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1257 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1358 msgid "If checked, announce torrents to open trackers as well as the tracker listed in the torrent file" msgstr "Si está marcado, el torrent se anunciará a los rastreadores abiertos, además de a los rastreadores especificados." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1261 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1362 msgid "Open tracker announce URLs" msgstr "URL(s) para anunciar a rastreadores abiertos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1273 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1374 msgid "Inbound Settings" msgstr "Preferencias de entrada" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1279 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1380 msgid "Outbound Settings" msgstr "Preferencias de salida" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1286 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1388 msgid "I2CP host" msgstr "Anfitrión I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1393 msgid "I2CP port" msgstr "Puerto I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1303 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1406 msgid "I2CP options" msgstr "Opciones I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1308 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1411 msgid "Save configuration" msgstr "Guardar ajustes" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1436 +#, java-format +msgid "Invalid magnet URL {0}" +msgstr "URL de magnet no válida: {0}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1470 +#, java-format +msgid "Invalid info hash in magnet URL {0}" +msgstr "Hash de información no válido en la URL magnet {0}" + #. * dummies for translation -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1325 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1500 #, java-format msgid "1 hop" msgid_plural "{0} hops" msgstr[0] "1 salto" msgstr[1] "{0} saltos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1326 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1501 #, java-format msgid "1 tunnel" msgid_plural "{0} tunnels" msgstr[0] "1 túnel" msgstr[1] "{0} túneles" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1480 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1663 +msgid "Completion" +msgstr "Completado" + +#. else unknown +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1716 msgid "Size" msgstr "Tamaño" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1487 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1672 +msgid "Files" +msgstr "Archivos" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1674 +msgid "Pieces" +msgstr "Partes" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1675 +msgid "Piece size" +msgstr "Tamaño de las partes" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697 +msgid "Magnet link" +msgstr "Enlace de magnet" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1753 +msgid "Directory" +msgstr "Carpeta" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1723 msgid "Priority" msgstr "Prioridad" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1492 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1728 msgid "Up to higher level directory" msgstr "Subir una herarquÃa" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 -msgid "Directory" -msgstr "Carpeta" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1522 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758 msgid "Torrent not found?" msgstr "¿No se encotró el archivo torrent?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1767 msgid "File not found in torrent?" msgstr "¿Archivo no encontrado en el torrent?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1543 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1780 msgid "complete" msgstr "completo" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1781 msgid "bytes remaining" msgstr "Bytes faltando" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1595 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806 +msgid "Open" +msgstr "abrir" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1832 msgid "High" msgstr "alta" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1837 msgid "Normal" msgstr "normal" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1605 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1842 msgid "Skip" msgstr "dejar de lado" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1614 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851 msgid "Save priorities" msgstr "Guardar prioridades" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1726 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1967 #, java-format msgid "Torrent fetched from {0}" msgstr "Torrent obtenido desde {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1746 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1989 #, java-format msgid "Torrent already running: {0}" msgstr "Torrent ya en marcha: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1748 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1991 #, java-format msgid "Torrent already in the queue: {0}" msgstr "Torrent ya encolado: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1755 -#, java-format -msgid "Failed to copy torrent file to {0}" -msgstr "No se pudo copiar el torrent a {0}." - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1759 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1997 #, java-format msgid "Torrent at {0} was not valid" msgstr "Torrent en {0} no era válido" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1764 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2004 #, java-format msgid "Torrent was not retrieved from {0}" msgstr "Torrent no se ha podido obtener de {0}" -#~ msgid " theme locked and loaded." -#~ msgstr "tema cargado" -#~ msgid "Hide All Attached Peers [connected/total in swarm]" -#~ msgstr "Ocultar todos los pares conectados [conectados/todos]" -#~ msgid "Show All Attached Peers [connected/total in swarm]" -#~ msgstr "Mostrar todos los pares conectados [conectados/todos]" -#~ msgid "Loaded Torrents" -#~ msgstr "Torrents" -#~ msgid "Estimated Download Time" -#~ msgstr "tiempo restante de descarga" -#~ msgid "1" -#~ msgid_plural "{0}" -#~ msgstr[0] "{0}" -#~ msgstr[1] "{0}" -#~ msgid "Torrent file {0} does not exist" -#~ msgstr "Archivo del torrent {0} no existe" -#~ msgid "Copying torrent to {0}" -#~ msgstr "Copiando torrent a {0}" -#~ msgid "from {0}" -#~ msgstr "de {0}" -#~ msgid "Downloading" -#~ msgstr "descargando" -#~ msgid "File" -#~ msgstr "Archivo" -#~ msgid "FileSize" -#~ msgstr "Tamaño" -#~ msgid "Download Status" -#~ msgstr "Estado" -#~ msgid "size: {0}B" -#~ msgstr "Tamaño: {0}Bytes" -#~ msgid "Directory to store torrents and data" -#~ msgstr "Carpeta para guardar los archivos torrent y los datos" -#~ msgid "Do not download" -#~ msgstr "No descargues" -#~ msgid "Details" -#~ msgstr "Detalles" -#~ msgid "Cannot change the I2CP settings while torrents are active" -#~ msgstr "" -#~ "No se puede cammbiar los ajustes I2CP mientras estén activos los torrents" -#~ msgid "Non-i2p tracker in \"{0}\", deleting it from our list of trackers!" -#~ msgstr "" -#~ "Rastreador fuera de I2P en \"{0}\", borrando de la lista de rastreadores" -#~ msgid "{0} torrents" -#~ msgstr "{0} Torrents" -#~ msgid "Uninteresting" -#~ msgstr "no interesante" -#~ msgid "Choked" -#~ msgstr "frenado" -#~ msgid "Uninterested" -#~ msgstr "desinteresado" -#~ msgid "Choking" -#~ msgstr "frenando" -#~ msgid "Custom tracker URL" -#~ msgstr "URL especial del rastreador" -#~ msgid "Configure" -#~ msgstr "Ajustes" - diff --git a/apps/i2psnark/locale/messages_fr.po b/apps/i2psnark/locale/messages_fr.po index e7981f2822d0b1fb122fd3743520c506814f905f..930d9c43031a255d62462656245b0a34fb09b2eb 100644 --- a/apps/i2psnark/locale/messages_fr.po +++ b/apps/i2psnark/locale/messages_fr.po @@ -8,848 +8,960 @@ msgid "" msgstr "" "Project-Id-Version: I2P i2psnark\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-12-28 00:08+0000\n" -"PO-Revision-Date: 2010-12-31 02:22+0100\n" -"Last-Translator: mixxy <m1xxy@mail.i2p>\n" +"POT-Creation-Date: 2011-05-02 11:08+0000\n" +"PO-Revision-Date: 2011-05-19 07:39+0100\n" +"Last-Translator: magma <magma@mail.i2p>\n" "Language-Team: foo <foo@bar>\n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n >= 2)\n" "X-Poedit-Language: French\n" -#: ../java/src/org/klomp/snark/SnarkManager.java:94 -#, java-format -msgid "Adding torrents in {0} minutes" -msgstr "Ajouter des torrents dans {0} minutes" - -#: ../java/src/org/klomp/snark/SnarkManager.java:296 +#: ../java/src/org/klomp/snark/SnarkManager.java:307 #, java-format msgid "Total uploaders limit changed to {0}" msgstr "Limite agrégée des uploaders modifiée : {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:298 +#: ../java/src/org/klomp/snark/SnarkManager.java:309 #, java-format msgid "Minimum total uploaders limit is {0}" msgstr "La limite minimale agrégée des uploaders est : {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:310 +#: ../java/src/org/klomp/snark/SnarkManager.java:321 #, java-format msgid "Up BW limit changed to {0}KBps" -msgstr "La limite d'upload modifiée : {0} Ko/s" +msgstr "Limite d’envoi modifiée : {0} ko/s" -#: ../java/src/org/klomp/snark/SnarkManager.java:312 +#: ../java/src/org/klomp/snark/SnarkManager.java:323 #, java-format msgid "Minimum up bandwidth limit is {0}KBps" -msgstr "La limite minimale d'upload est {0} Ko/s" +msgstr "La limite minimale d’envoi est {0} ko/s" -#: ../java/src/org/klomp/snark/SnarkManager.java:324 +#: ../java/src/org/klomp/snark/SnarkManager.java:335 #, java-format -msgid "Startup delay limit changed to {0} minutes" -msgstr "Delais de démarrage modifié : {0] minutes" +msgid "Startup delay changed to {0}" +msgstr "Délai de démarrage modifié à {0} minutes" -#: ../java/src/org/klomp/snark/SnarkManager.java:371 +#: ../java/src/org/klomp/snark/SnarkManager.java:386 msgid "I2CP and tunnel changes will take effect after stopping all torrents" -msgstr "Les modifications I2CP et des tunnels seront prise en compte après avoir arrêté tous les torrents" +msgstr "Les modifications d'I2CP et des tunnels seront prise en compte après avoir arrêté tous les torrents" -#: ../java/src/org/klomp/snark/SnarkManager.java:378 +#: ../java/src/org/klomp/snark/SnarkManager.java:393 msgid "Disconnecting old I2CP destination" msgstr "Déconnexion des anciennes destination I2CP" -#: ../java/src/org/klomp/snark/SnarkManager.java:382 +#: ../java/src/org/klomp/snark/SnarkManager.java:397 #, java-format msgid "I2CP settings changed to {0}" msgstr "Les paramètres I2CP ont été changés : {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:386 +#: ../java/src/org/klomp/snark/SnarkManager.java:402 msgid "Unable to connect with the new settings, reverting to the old I2CP settings" msgstr "Impossible de se connecter avec les nouveaux paramètres, retour à l'ancienne configuration I2CP" -#: ../java/src/org/klomp/snark/SnarkManager.java:390 +#: ../java/src/org/klomp/snark/SnarkManager.java:406 msgid "Unable to reconnect with the old settings!" msgstr "Impossible de se reconnecter avec les anciens paramètres!" -#: ../java/src/org/klomp/snark/SnarkManager.java:392 +#: ../java/src/org/klomp/snark/SnarkManager.java:408 msgid "Reconnected on the new I2CP destination" msgstr "Reconnexion sur la nouvelle destination I2CP" -#: ../java/src/org/klomp/snark/SnarkManager.java:403 +#: ../java/src/org/klomp/snark/SnarkManager.java:418 #, java-format msgid "I2CP listener restarted for \"{0}\"" -msgstr "Listener I2CP redémarré pour \"{0}\"" +msgstr "Écouteur I2CP redémarré pour \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:414 +#: ../java/src/org/klomp/snark/SnarkManager.java:429 msgid "Enabled autostart" -msgstr "Le démarrage automatique est activé" +msgstr "Démarrage automatique activé" -#: ../java/src/org/klomp/snark/SnarkManager.java:416 +#: ../java/src/org/klomp/snark/SnarkManager.java:431 msgid "Disabled autostart" -msgstr "Le démarrage automatique est désactivé" +msgstr "Démarrage automatique désactivé" -#: ../java/src/org/klomp/snark/SnarkManager.java:422 +#: ../java/src/org/klomp/snark/SnarkManager.java:437 msgid "Enabled open trackers - torrent restart required to take effect." -msgstr "Les open trackers sont activés - ceci a nécessité un redémarrage des torrents pour être pris en compte." +msgstr "Open trackers activés - redémarrage des torrents requis pour prise en compte." -#: ../java/src/org/klomp/snark/SnarkManager.java:424 +#: ../java/src/org/klomp/snark/SnarkManager.java:439 msgid "Disabled open trackers - torrent restart required to take effect." -msgstr "Les open trackers sont désactivés - ceci a nécessité un redémarrage des torrents pour être pris en compte." +msgstr "Open trackers désactivés - redémarrage des torrents requis pour prise en compte." -#: ../java/src/org/klomp/snark/SnarkManager.java:431 +#: ../java/src/org/klomp/snark/SnarkManager.java:447 msgid "Open Tracker list changed - torrent restart required to take effect." -msgstr "Liste des Open trackers modifiée - ceci nécessite un redémarrage des torrents pour être pris en compte" +msgstr "Liste des Open trackers modifiée - redémarrage des torrents requis pour prise en compte" -#: ../java/src/org/klomp/snark/SnarkManager.java:438 +#: ../java/src/org/klomp/snark/SnarkManager.java:454 #, java-format msgid "{0} theme loaded, return to main i2psnark page to view." -msgstr "" +msgstr "Thème {0} chargé, revenez à la page d''accueil d''i2psnark pour voir comme il est beau !" -#: ../java/src/org/klomp/snark/SnarkManager.java:445 +#: ../java/src/org/klomp/snark/SnarkManager.java:461 msgid "Configuration unchanged." -msgstr "La configuration n'a pas été modifiée" +msgstr "Aucun changement de configuration." -#: ../java/src/org/klomp/snark/SnarkManager.java:455 +#: ../java/src/org/klomp/snark/SnarkManager.java:471 #, java-format msgid "Unable to save the config to {0}" msgstr "Impossible de sauvegarder la configuration vers {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:494 +#: ../java/src/org/klomp/snark/SnarkManager.java:536 msgid "Connecting to I2P" msgstr "Connexion à I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:497 +#: ../java/src/org/klomp/snark/SnarkManager.java:539 msgid "Error connecting to I2P - check your I2CP settings!" msgstr "Erreur de connexion à I2P - Vérifiez vos paramètres I2CP!" -#: ../java/src/org/klomp/snark/SnarkManager.java:506 +#: ../java/src/org/klomp/snark/SnarkManager.java:548 #, java-format msgid "Error: Could not add the torrent {0}" -msgstr "Erreur : Impossible d'ajouter le torrent : {0}" +msgstr "Erreur : Impossible d’ajouter le torrent : {0}" #. catch this here so we don't try do delete it below -#: ../java/src/org/klomp/snark/SnarkManager.java:528 +#: ../java/src/org/klomp/snark/SnarkManager.java:570 #, java-format msgid "Cannot open \"{0}\"" -msgstr "Impossible d'ouvrir: \"{0}\"" +msgstr "Impossible d’ouvrir: \"{0}\"" + +#. TODO - if the existing one is a magnet, delete it and add the metainfo instead? +#: ../java/src/org/klomp/snark/SnarkManager.java:589 +#: ../java/src/org/klomp/snark/SnarkManager.java:665 +#: ../java/src/org/klomp/snark/SnarkManager.java:720 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1976 +#, java-format +msgid "Torrent with this info hash is already running: {0}" +msgstr "Un torrent avec cette empreinte est déjà actif: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:541 +#. addMessage(_("Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and DHT only.", info.getName())); +#: ../java/src/org/klomp/snark/SnarkManager.java:596 #, java-format -msgid "Warning - Ignoring non-i2p tracker in \"{0}\", will announce to i2p open trackers only" -msgstr "Attention - Les trackers non-i2p dans \"{0}\" sont ignorés, seuls les open trackers I2P seront utilisés!" +msgid "Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers only." +msgstr "Attention - Les trackers non-i2p dans \"{0}\" sont ignorés, seuls les trackers ouverts I2P seront utilisés!" -#: ../java/src/org/klomp/snark/SnarkManager.java:543 +#. addMessage(_("Warning - No I2P trackers in \"{0}\", and DHT and open trackers are disabled, you should enable open trackers or DHT before starting the torrent.", info.getName())); +#: ../java/src/org/klomp/snark/SnarkManager.java:601 #, java-format -msgid "Warning - Ignoring non-i2p tracker in \"{0}\", and open trackers are disabled, you must enable open trackers before starting the torrent!" -msgstr "Attention - Les trackers non-i2p dans \"{0}\" sont ignorés, et les open trackers sont désactivés, vous devez activer les open trackers avant de démarrer le torrent!" +msgid "Warning - No I2P Trackers found in \"{0}\". Make sure Open Tracker is enabled before starting this torrent." +msgstr "Attention - aucun tracker i2p dans \"{0}\". Vous devez activer les open trackers avant de démarrer le torrent!" -#: ../java/src/org/klomp/snark/SnarkManager.java:563 +#: ../java/src/org/klomp/snark/SnarkManager.java:622 #, java-format msgid "Torrent in \"{0}\" is invalid" msgstr "Le torrent dans \"{0}\" est invalide" -#: ../java/src/org/klomp/snark/SnarkManager.java:578 +#: ../java/src/org/klomp/snark/SnarkManager.java:627 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1998 +#, java-format +msgid "ERROR - Out of memory, cannot create torrent from {0}" +msgstr "ERREUR - Mémoire insuffisante, impossible de créer le torrent de {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:639 #, java-format msgid "Torrent added and started: \"{0}\"" msgstr "Torrent ajouté et démarré: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:580 +#: ../java/src/org/klomp/snark/SnarkManager.java:641 #, java-format msgid "Torrent added: \"{0}\"" msgstr "Torrent ajouté: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:734 +#: ../java/src/org/klomp/snark/SnarkManager.java:676 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:491 +#, java-format +msgid "Fetching {0}" +msgstr "Envoi {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:679 +#, java-format +msgid "We have no saved peers and no other torrents are running. Fetch of {0} will not succeed until you start another torrent." +msgstr "Aucun pair sauvegardé et aucun autre torrent en cours. Le téléchargement de {0} ne commencera que lorsque vous démarrerez un autre torrent." + +#: ../java/src/org/klomp/snark/SnarkManager.java:683 +#, java-format +msgid "Adding {0}" +msgstr "Ajout {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:730 +#: ../java/src/org/klomp/snark/SnarkManager.java:753 +#: ../java/src/org/klomp/snark/SnarkManager.java:1180 +#, java-format +msgid "Failed to copy torrent file to {0}" +msgstr "Impossible de copier le torrent vers {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:976 #, java-format msgid "Too many files in \"{0}\" ({1}), deleting it!" msgstr "Trop de fichiers dans \"{0}\" ({1}), suppression! " -#: ../java/src/org/klomp/snark/SnarkManager.java:736 +#: ../java/src/org/klomp/snark/SnarkManager.java:978 #, java-format msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!" msgstr "Le fichier torrent \"{0}\" ne peut pas se terminer par \".torrent\", suppression!" -#: ../java/src/org/klomp/snark/SnarkManager.java:738 +#: ../java/src/org/klomp/snark/SnarkManager.java:980 #, java-format msgid "No pieces in \"{0}\", deleting it!" -msgstr "Pas de morceaux dans \"{0}\", suppression!" +msgstr "Pas de tronçon dans \"{0}\", suppression!" -#: ../java/src/org/klomp/snark/SnarkManager.java:740 +#: ../java/src/org/klomp/snark/SnarkManager.java:982 #, java-format msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!" -msgstr "Trop de morceaux dans \"{0}\" , la limite est {1}, suppression!" +msgstr "Trop de tronçons dans \"{0}\" , la limite est {1}, suppression!" -#: ../java/src/org/klomp/snark/SnarkManager.java:742 +#: ../java/src/org/klomp/snark/SnarkManager.java:984 #, java-format msgid "Pieces are too large in \"{0}\" ({1}B), deleting it." -msgstr "Les morceaux sont trop larges dans \"{0}\" ({1}B), suppresion." +msgstr "Les tronçons sont trop larges dans \"{0}\" ({1}B), suppression." -#: ../java/src/org/klomp/snark/SnarkManager.java:743 +#: ../java/src/org/klomp/snark/SnarkManager.java:985 #, java-format msgid "Limit is {0}B" -msgstr "La limite est de \"{0}\"Octets" +msgstr "La limite est de \"{0}\"octets" + +#: ../java/src/org/klomp/snark/SnarkManager.java:987 +#, java-format +msgid "Torrent \"{0}\" has no data, deleting it!" +msgstr "Le fichier torrent \"{0}\" n'a pas de données, suppression!" -#: ../java/src/org/klomp/snark/SnarkManager.java:751 +#: ../java/src/org/klomp/snark/SnarkManager.java:995 #, java-format msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\"" -msgstr "Les torrents dont la taille est supérieure à \"{0}\"Octets ne sont pas encore supportés, suppression \"{1}\"." +msgstr "Les torrents dont la taille est supérieure à \"{0}\"octets ne sont pas encore supportés, suppression \"{1}\"." -#: ../java/src/org/klomp/snark/SnarkManager.java:767 +#: ../java/src/org/klomp/snark/SnarkManager.java:1011 #, java-format msgid "Error: Could not remove the torrent {0}" msgstr "Erreur: Impossible de supprimer le torrent \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:794 +#: ../java/src/org/klomp/snark/SnarkManager.java:1032 +#: ../java/src/org/klomp/snark/SnarkManager.java:1050 #, java-format msgid "Torrent stopped: \"{0}\"" msgstr "Torrent arrêté:\"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:814 +#: ../java/src/org/klomp/snark/SnarkManager.java:1071 #, java-format msgid "Torrent removed: \"{0}\"" msgstr "Torrent supprimé:\"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:852 +#: ../java/src/org/klomp/snark/SnarkManager.java:1079 +#, java-format +msgid "Adding torrents in {0}" +msgstr "Ajout des torrents dans {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1128 #, java-format msgid "Download finished: {0}" msgstr "Téléchargement terminé:\"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:880 +#: ../java/src/org/klomp/snark/SnarkManager.java:1176 +#, java-format +msgid "Metainfo received for {0}" +msgstr "Metainfo reçue pour {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1177 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:526 +#, java-format +msgid "Starting up torrent {0}" +msgstr "Démarrage du torrent {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1231 msgid "Unable to connect to I2P!" msgstr "Impossible de se connecter à I2P!" -#: ../java/src/org/klomp/snark/SnarkManager.java:886 +#: ../java/src/org/klomp/snark/SnarkManager.java:1237 #, java-format msgid "Unable to add {0}" -msgstr "Impossible d'ajouter {0}" +msgstr "Impossible d’ajouter {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:185 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:205 msgid "I2PSnark - Anonymous BitTorrent Client" msgstr "I2PSnark - Client BitTorrent anonyme" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:198 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:218 msgid "Torrents" msgstr "Torrents" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:201 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:208 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:977 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:221 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:228 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1028 msgid "I2PSnark" msgstr "I2PSnark" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:205 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:225 msgid "Refresh page" msgstr "Rafraîchir la page" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:210 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:230 msgid "Forum" msgstr "Forum" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:264 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1483 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:284 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1719 msgid "Status" msgstr "État" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:270 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:272 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:290 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:292 msgid "Hide Peers" msgstr "Cacher les pairs" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:277 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:279 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:297 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:299 msgid "Show Peers" msgstr "Afficher les pairs" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:286 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1464 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1659 msgid "Torrent" msgstr "Torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:290 -#, fuzzy +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:310 msgid "Estimated time remaining" -msgstr "Octets restants" +msgstr "temps restant estimé" # NOTE: purposely left blank to leave more room in the table header # msgstr "Temps restant" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313 msgid "ETA" -msgstr " Temps" +msgstr "Temps" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:297 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317 msgid "Downloaded" msgstr "Téléchargé" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:300 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:314 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:320 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:334 msgid "RX" msgstr "Reçu" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:304 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324 msgid "Uploaded" msgstr "Envoyé" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:307 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:327 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:344 msgid "TX" msgstr "Envoyé" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:312 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:332 msgid "Down Rate" msgstr "Taux de téléchargement" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:337 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:346 msgid "Rate" msgstr "Vitesse" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:322 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:342 msgid "Up Rate" msgstr "Taux d'envoi" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:340 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:366 msgid "Stop all torrents and the I2P tunnel" msgstr "Arrêter tous les torrents et le tunnel I2P" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:342 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:368 msgid "Stop All" msgstr "Arrêter tout" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:351 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:377 msgid "Start all torrents and the I2P tunnel" msgstr "Démarrer tous les torrents et le tunnel I2P" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:353 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:379 msgid "Start All" msgstr "Démarrer tout" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:372 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:398 msgid "No torrents loaded." msgstr "Aucun torrent chargé." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:377 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:403 msgid "Totals" msgstr "Totaux" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:379 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:405 #, java-format msgid "1 torrent" msgid_plural "{0} torrents" -msgstr[0] "1 torrent" +msgstr[0] "{0} torrent" msgstr[1] "{0} torrents" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:382 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:408 #, java-format msgid "1 connected peer" msgid_plural "{0} connected peers" -msgstr[0] "1 pair connecté" +msgstr[0] "{0} pair connecté" msgstr[1] "{0} pairs connectés" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:454 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:497 #, java-format -msgid "Fetching {0}" -msgstr "Envoi {0}" +msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"" +msgstr "URL incorrecte - elle doit débuter par \"http://\", \"{0}\", ou \"{1}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:458 -msgid "Invalid URL - must start with http://" -msgstr "URL invalide - elle doit débuter par http://" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:489 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:545 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:572 #, java-format -msgid "Starting up torrent {0}" -msgstr "Démarrage du torrent {0}" +msgid "Magnet deleted: {0}" +msgstr "Magnet supprimé: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:509 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:527 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:553 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:578 #, java-format msgid "Torrent file deleted: {0}" msgstr "Fichier torrent effacé: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:533 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:543 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:584 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:594 #, java-format msgid "Data file deleted: {0}" msgstr "Fichier de données effacé: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:535 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:545 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:586 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:596 #, java-format msgid "Data file could not be deleted: {0}" msgstr "Le fichier de données ne peut être effacé: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:554 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:605 #, java-format msgid "Data dir deleted: {0}" msgstr "Répertoire des données effacé: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:587 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:638 msgid "Error creating torrent - you must select a tracker" msgstr "Erreur lors de la création du torrent - vous devez sélectionner un tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:602 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:653 #, java-format msgid "Torrent created for \"{0}\"" msgstr "Torrent créé pour \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:605 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:655 #, java-format msgid "Many I2P trackers require you to register new torrents before seeding - please do so before starting \"{0}\"" -msgstr "De nombreux trackers I2P nécessitent d'enregistrer les nouveaux torrents avant de seeder - faites-le avant de démarrer \"{0}\"!" +msgstr "De nombreux trackers I2P nécessitent d’enregistrer les nouveaux torrents avant de seeder - faites-le avant de démarrer \"{0}\"!" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:607 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:657 #, java-format msgid "Error creating a torrent for \"{0}\"" msgstr "Erreur de création du torrent pour \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:610 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:660 #, java-format msgid "Cannot create a torrent for the nonexistent data: {0}" msgstr "Impossible de créer un torrent pour des données inexistantes: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:613 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:663 msgid "Error creating torrent - you must enter a file or directory" msgstr "Erreur de création du torrent - vous devez saisir un fichier ou un répertoire" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:616 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:666 msgid "Stopping all torrents and closing the I2P tunnel." msgstr "Arrêt de tous les torrents et fermeture du tunnel I2P." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:627 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:677 msgid "I2P tunnel closed." msgstr "Tunnel I2P fermé." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:630 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680 msgid "Opening the I2P tunnel and starting all torrents." msgstr "Ouverture du tunnel I2P and démarrage de tous les torrents." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:759 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:764 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:770 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:803 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:808 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:814 msgid "Tracker Error" msgstr "Erreur du tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:762 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:766 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:778 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:782 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:790 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:794 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:799 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:803 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:806 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:810 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:822 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:826 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:834 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:838 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:843 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:847 #, java-format msgid "1 peer" msgid_plural "{0} peers" -msgstr[0] "1 Pair" -msgstr[1] "{0} Pairs" +msgstr[0] "{0} pair" +msgstr[1] "{0} pairs" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:775 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:780 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:819 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:824 msgid "Seeding" msgstr "Seed en cours" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:784 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1533 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:828 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1665 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1770 msgid "Complete" msgstr "Complet" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:787 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:792 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:831 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:836 msgid "OK" msgstr "OK" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:796 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:801 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:840 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:845 msgid "Stalled" msgstr "Figé" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:805 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:808 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:849 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:852 msgid "No Peers" msgstr "Pas de pair" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:810 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 msgid "Stopped" msgstr "Arrêté" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:837 -#, fuzzy, java-format -msgid "Details at {0} tracker" -msgstr "Sélectionner un tracker" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:886 +msgid "Torrent details" +msgstr "Détails du torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:838 -#, fuzzy +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:898 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1160 msgid "Info" -msgstr "Ignore" +msgstr "Info" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:853 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:913 msgid "View files" msgstr "Voir les fichiers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:855 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:915 msgid "Open file" msgstr "Ouvrir fichier" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:865 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1569 -#, fuzzy -msgid "Open" -msgstr "Ouvrir fichier" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:909 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:957 msgid "Stop the torrent" msgstr "Arrêter le torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:911 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:959 msgid "Stop" msgstr "Arrêter" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:921 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:969 msgid "Start the torrent" -msgstr "Arrêter le torrent" +msgstr "Démarrer le torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:923 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:971 msgid "Start" msgstr "Démarrer" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:933 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:982 msgid "Remove the torrent from the active list, deleting the .torrent file" msgstr "Enlever le torrent de la liste active, suprression du fichier .torrent" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quite must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:938 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:987 #, java-format msgid "Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded data will not be deleted) ?" -msgstr "Etes-vous certain de vouloir supprimer le fichier \\''{0}.torrent\\'' (les données déjà téléchargées ne seront pas supprimées) ?" +msgstr "Êtes-vous certain de vouloir supprimer le fichier \\''{0}.torrent\\'' (les données déjà téléchargées ne seront pas supprimées) ?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:941 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:990 msgid "Remove" msgstr "Enlever" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:950 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1001 msgid "Delete the .torrent file and the associated data file(s)" msgstr "Supprimer le fichier .torrent et le(s) fichier(s) de données associé(s)" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quite must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:955 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1006 #, java-format msgid "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded data?" -msgstr "Etes-vous certain de vouloir supprimer le torrent \\''{0}\\'' ainsi que toutes les données téléchargées ?" +msgstr "Êtes-vous certain de vouloir supprimer le torrent \\''{0}\\'' ainsi que toutes les données téléchargées ?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1009 msgid "Delete" msgstr "Supprimer" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:991 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042 msgid "Unknown" msgstr "Inconnu" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1001 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1054 msgid "Seed" msgstr "Seed" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1019 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1077 msgid "Uninteresting (The peer has no pieces we need)" -msgstr "aucun intérêt (le pair n'a aucun morceau utile)" +msgstr "Aucun intérêt (le pair n'a aucun tronçon utile)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1021 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1079 msgid "Choked (The peer is not allowing us to request pieces)" -msgstr "bridé (le pair ne nous permet pas de demander un morceau)" +msgstr "bridé (le pair ne nous permet pas de demander des tronçons)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1035 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1099 msgid "Uninterested (We have no pieces the peer needs)" -msgstr "aucun intérêt (nous n'avons aucun morceau utile au pair)" +msgstr "Pas intéressé (aucun tronçon utile au pair)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1037 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1101 msgid "Choking (We are not allowing the peer to request pieces)" -msgstr "bridage (nous ne permettons pas au pair de demander un morceau)" +msgstr "bridage (nous ne permettons pas au pair de demander un tronçon)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1092 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1159 +#, java-format +msgid "Details at {0} tracker" +msgstr "Détails au tracker {0}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1188 msgid "Add Torrent" msgstr "Ajouter torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1094 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190 msgid "From URL" -msgstr "Depuis l'url" +msgstr "Depuis l'URL" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1097 -msgid "Torrent file must originate from an I2P-based tracker" -msgstr "Le fichier torrent doit provenir d'un tracker I2P" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1193 +msgid "Enter the torrent file download URL (I2P only), magnet link, or maggot link" +msgstr "Entrez l'URL (I2P uniquement) de téléchargement du fichier torrent, du lien magnet ou maggot." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1102 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1198 msgid "Add torrent" msgstr "Ajouter torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1105 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1201 #, java-format msgid "You can also copy .torrent files to: {0}." msgstr "Vous pouvez aussi copier les fichiers .torrent vers {0}." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1107 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1203 msgid "Removing a .torrent will cause it to stop." -msgstr "La suppression d'un fichier .torrent entraine l'arrêt du torrent" +msgstr "La suppression d'un fichier .torrent entraîne l'arrêt du torrent." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1131 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1226 msgid "Create Torrent" msgstr "Créer torrent" #. out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br>\n"); -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1134 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 msgid "Data to seed" msgstr "Données à seeder" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1138 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233 msgid "File or directory to seed (must be within the specified path)" msgstr "Fichier ou répertoire à seeder (doit être dans le chemin spécifié)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1140 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1235 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684 msgid "Tracker" msgstr "Tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1142 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237 msgid "Select a tracker" msgstr "Sélectionner un tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1155 +#. out.write(_("Open trackers and DHT only")); +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1242 +msgid "Open trackers only" +msgstr "Trackers ouverts seulement" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1257 msgid "or" msgstr "ou" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1158 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1260 msgid "Specify custom tracker announce URL" -msgstr "Spécifier une URL personnalisée d'annonce de tracker" +msgstr "Spécifier une URL d'annonce de tracker personnalisé" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1161 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1263 msgid "Create torrent" msgstr "Créer torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1180 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1317 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1281 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1420 msgid "Configuration" msgstr "Configuration" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1184 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1285 msgid "Data directory" msgstr "Répertoire de données" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1186 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1287 msgid "Edit i2psnark.config and restart to change" msgstr "Editez i2psnark.config et redémarrez pour prendre en compte les modifications" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291 msgid "Auto start" msgstr "Démarrage automatique" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1194 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1295 msgid "If checked, automatically start torrents that are added" -msgstr "Si coché, les torrents démarrerons automatiquement lors de l'ajout" +msgstr "Si coché, les torrents démarreront automatiquement lors de l'ajout" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1198 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1299 msgid "Theme" -msgstr "" +msgstr "Thème" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1211 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1312 msgid "Startup delay" msgstr "Délais de démarrage" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1213 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1314 msgid "minutes" msgstr "minutes" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1338 msgid "Total uploader limit" msgstr "Limite totale d'envoi" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1341 msgid "peers" msgstr "pairs" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1244 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1345 msgid "Up bandwidth limit" msgstr "Limite de bande passante en envoi" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1247 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1348 msgid "Half available bandwidth recommended." msgstr "La moitié de la bande passante est recommandée." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1249 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1350 msgid "View or change router bandwidth" msgstr "Consulter ou modifier la bande passante du routeur" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1253 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1354 msgid "Use open trackers also" msgstr "Utiliser les open trackers aussi" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1257 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1358 msgid "If checked, announce torrents to open trackers as well as the tracker listed in the torrent file" msgstr "Si coché, les torrents seront annoncés vers les open trackers ainsi que vers les trackers indiqués dans le fichier torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1261 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1362 msgid "Open tracker announce URLs" -msgstr "URL d'annonce open tracker" +msgstr "URLs d'annonce open tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1273 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1374 msgid "Inbound Settings" msgstr "Paramètres entrants" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1279 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1380 msgid "Outbound Settings" msgstr "Paramètres sortants" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1286 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1388 msgid "I2CP host" msgstr "Hôte I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1393 msgid "I2CP port" msgstr "Port I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1303 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1406 msgid "I2CP options" msgstr "Options I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1308 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1411 msgid "Save configuration" msgstr "Sauvegarder la configuration" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1436 +#, java-format +msgid "Invalid magnet URL {0}" +msgstr "URL magnet {0} incorrecte" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1470 +#, java-format +msgid "Invalid info hash in magnet URL {0}" +msgstr "Info d'empreinte incorrecte dans l'URL magnet {0}" + #. * dummies for translation -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1325 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1500 #, java-format msgid "1 hop" msgid_plural "{0} hops" -msgstr[0] "1 saut" +msgstr[0] "{0} saut" msgstr[1] "{0} sauts" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1326 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1501 #, java-format msgid "1 tunnel" msgid_plural "{0} tunnels" -msgstr[0] "1 tunnel" +msgstr[0] "{0} tunnel" msgstr[1] "{0} tunnels" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1480 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1663 +msgid "Completion" +msgstr "Finalisation" + +#. else unknown +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1716 msgid "Size" msgstr "Taille" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1487 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1672 +msgid "Files" +msgstr "Fichiers" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1674 +msgid "Pieces" +msgstr "Tronçons" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1675 +msgid "Piece size" +msgstr "Taille des tronçons" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697 +msgid "Magnet link" +msgstr "Lien magnet" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1753 +msgid "Directory" +msgstr "Répertoire" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1723 msgid "Priority" msgstr "Priorité" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1492 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1728 msgid "Up to higher level directory" msgstr "Vers le répertoire parent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 -msgid "Directory" -msgstr "Répertoire" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1522 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758 msgid "Torrent not found?" msgstr "Torrent non trouvé?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1767 msgid "File not found in torrent?" msgstr "Fichier non trouvé dans le torrent?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1543 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1780 msgid "complete" msgstr "complet" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1781 msgid "bytes remaining" msgstr "Octets restants" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1595 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806 +msgid "Open" +msgstr "Ouvrir le fichier" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1832 msgid "High" msgstr "Haut" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1837 msgid "Normal" msgstr "Normal" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1605 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1842 msgid "Skip" -msgstr "" +msgstr "Ignorer" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1614 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851 msgid "Save priorities" msgstr "Sauvegarder les priorités" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1726 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1967 #, java-format msgid "Torrent fetched from {0}" -msgstr "Torrent envoyé de {0}" +msgstr "Torrent reçu de {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1746 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1988 #, java-format msgid "Torrent already running: {0}" msgstr "Torrent déjà actif: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1748 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1990 #, java-format msgid "Torrent already in the queue: {0}" -msgstr "Torrent déjà dans la queue: {0}" +msgstr "Torrent déjà dans la file d''attente: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1755 -#, fuzzy, java-format -msgid "Failed to copy torrent file to {0}" -msgstr "Impossible de copier le torrent vers {0}" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1759 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1996 #, java-format msgid "Torrent at {0} was not valid" -msgstr "Le torrent {0} n'est pas valide" +msgstr "Le torrent {0} est invalide" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1764 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2003 #, java-format msgid "Torrent was not retrieved from {0}" -msgstr "Le torrent n'a pas été reçu par {0}" +msgstr "Le torrent n’a pas été reçu de {0}" + +#~ msgid "Torrent file must originate from an I2P-based tracker" +#~ msgstr "Le fichier torrent doit provenir d'un tracker I2P" #~ msgid "size: {0}B" #~ msgstr "Taille: {0}Octets" + #~ msgid "Estimated Download Time" #~ msgstr "Temps estimé de téléchargement" + #~ msgid "Torrent file {0} does not exist" #~ msgstr "Le fichier torrent {0} n'existe pas" + #~ msgid "Copying torrent to {0}" #~ msgstr "Copie du torrent vers {0}" + #~ msgid "from {0}" #~ msgstr "depuis {0}" + #~ msgid "Downloading" #~ msgstr "Téléchargement en cours" -#~ msgid "File" -#~ msgstr "Fichier" + #~ msgid "FileSize" #~ msgstr "Taille du fichier" + #~ msgid "Download Status" #~ msgstr "État du téléchargement" + #~ msgid "Details" #~ msgstr "Détails" + #~ msgid "Depuis l'URL" #~ msgstr "Quell-URL" + #~ msgid "Directory to store torrents and data" #~ msgstr "Répertoire de stockage des torrents et des données" + #~ msgid "Cannot change the I2CP settings while torrents are active" #~ msgstr "" #~ "On ne peut changer les paramètres I2CP pendant que des torrents sont " #~ "actifs" + #~ msgid "Non-i2p tracker in \"{0}\", deleting it from our list of trackers!" #~ msgstr "" #~ "Tracker non-i2p dans \"{0}\", suppression de notre liste de trackers!" + #~ msgid "{0} torrents" #~ msgstr "{0} Torrents" + #~ msgid "Uninteresting" #~ msgstr "Pas intéressant" + #~ msgid "Choked" #~ msgstr "Choked" + #~ msgid "Uninterested" #~ msgstr "Pas interessé" + #~ msgid "Choking" #~ msgstr "Choking" + #~ msgid "Custom tracker URL" #~ msgstr "URL tracker spécifique" + #~ msgid "Configure" #~ msgstr "Configurer" - diff --git a/apps/i2psnark/locale/messages_nl.po b/apps/i2psnark/locale/messages_nl.po index 1eebf765e8ec773d56a5615af0a0e47a67d56212..860e9d7fe07bf9d3e14dfd8b53521320f2f1935b 100644 --- a/apps/i2psnark/locale/messages_nl.po +++ b/apps/i2psnark/locale/messages_nl.po @@ -6,404 +6,459 @@ # msgid "" msgstr "" -"Project-Id-Version: I2P i2psnark\n" +"Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-12-17 15:04+0000\n" -"PO-Revision-Date: 2010-06-15 09:07+0100\n" -"Last-Translator: duck <duck@mail.i2p>\n" -"Language-Team: duck <duck@mail.i2p>, monkeybrains <monkeybrains@mail.i2p>\n" +"POT-Creation-Date: 2011-03-03 18:28+0000\n" +"PO-Revision-Date: 2011-02-20 12:15+0000\n" +"Last-Translator: ducki2p <ducki2p@gmail.com>\n" +"Language-Team: Dutch <>\n" +"Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Poedit-Language: Dutch\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ../java/src/org/klomp/snark/SnarkManager.java:94 -#, java-format -msgid "Adding torrents in {0} minutes" -msgstr "Torrents toevoegen in {0} minuten" - -#: ../java/src/org/klomp/snark/SnarkManager.java:296 +#: ../java/src/org/klomp/snark/SnarkManager.java:307 #, java-format msgid "Total uploaders limit changed to {0}" msgstr "Totale uploaders limiet gewijzigd in {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:298 +#: ../java/src/org/klomp/snark/SnarkManager.java:309 #, java-format msgid "Minimum total uploaders limit is {0}" msgstr "Minimum totale uploaders limiet is {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:310 +#: ../java/src/org/klomp/snark/SnarkManager.java:321 #, java-format msgid "Up BW limit changed to {0}KBps" msgstr "Up bandbreedte limiet gewijzigd in {0}KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:312 +#: ../java/src/org/klomp/snark/SnarkManager.java:323 #, java-format msgid "Minimum up bandwidth limit is {0}KBps" msgstr "Minimum up bandbreedte limiet is {0}KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:324 +#: ../java/src/org/klomp/snark/SnarkManager.java:335 #, java-format -msgid "Startup delay limit changed to {0} minutes" -msgstr "Startup vertragings limiet gewijzigd in {0} minuten" +msgid "Startup delay changed to {0}" +msgstr "Opstartvertraging gewijzigd in {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:371 +#: ../java/src/org/klomp/snark/SnarkManager.java:386 msgid "I2CP and tunnel changes will take effect after stopping all torrents" msgstr "" "I2CP en tunnel wijzigingen hebben pas effect na het stoppen van alle torrents" -#: ../java/src/org/klomp/snark/SnarkManager.java:378 +#: ../java/src/org/klomp/snark/SnarkManager.java:393 msgid "Disconnecting old I2CP destination" msgstr "Oude I2CP destination wordt afgesloten" -#: ../java/src/org/klomp/snark/SnarkManager.java:382 +#: ../java/src/org/klomp/snark/SnarkManager.java:397 #, java-format msgid "I2CP settings changed to {0}" msgstr "I2CP instellingen gewijzigd in {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:386 +#: ../java/src/org/klomp/snark/SnarkManager.java:402 msgid "" "Unable to connect with the new settings, reverting to the old I2CP settings" msgstr "" "Kan geen connectie maken met de nieuwe instellingen, we keren terug naar " "oude I2CP instellingen" -#: ../java/src/org/klomp/snark/SnarkManager.java:390 +#: ../java/src/org/klomp/snark/SnarkManager.java:406 msgid "Unable to reconnect with the old settings!" msgstr "Kan niet opnieuw verbinden met de oude instellingen!" -#: ../java/src/org/klomp/snark/SnarkManager.java:392 +#: ../java/src/org/klomp/snark/SnarkManager.java:408 msgid "Reconnected on the new I2CP destination" msgstr "Opnieuw verbonden met de nieuwe I2CP destination" -#: ../java/src/org/klomp/snark/SnarkManager.java:403 +#: ../java/src/org/klomp/snark/SnarkManager.java:418 #, java-format msgid "I2CP listener restarted for \"{0}\"" msgstr "I2CP listener herstart voor \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:414 +#: ../java/src/org/klomp/snark/SnarkManager.java:429 msgid "Enabled autostart" msgstr "Autostart ingeschakeld" -#: ../java/src/org/klomp/snark/SnarkManager.java:416 +#: ../java/src/org/klomp/snark/SnarkManager.java:431 msgid "Disabled autostart" msgstr "Autostart uitgeschakeld" -#: ../java/src/org/klomp/snark/SnarkManager.java:422 +#: ../java/src/org/klomp/snark/SnarkManager.java:437 msgid "Enabled open trackers - torrent restart required to take effect." msgstr "Open Trackers ingeschakeld - torrent herstart nodig." -#: ../java/src/org/klomp/snark/SnarkManager.java:424 +#: ../java/src/org/klomp/snark/SnarkManager.java:439 msgid "Disabled open trackers - torrent restart required to take effect." msgstr "Open Trackers uitgeschakeld - torrent herstart nodig." -#: ../java/src/org/klomp/snark/SnarkManager.java:431 +#: ../java/src/org/klomp/snark/SnarkManager.java:447 msgid "Open Tracker list changed - torrent restart required to take effect." msgstr "Open Tracker lijst gewijzigd - torrent herstart nodig." -#: ../java/src/org/klomp/snark/SnarkManager.java:438 +#: ../java/src/org/klomp/snark/SnarkManager.java:454 #, java-format msgid "{0} theme loaded, return to main i2psnark page to view." -msgstr "{0} thema geladen, ga naar de hoofd i2psnark pagina om deze te bekijken." +msgstr "" +"{0} thema geladen, ga naar de hoofd i2psnark pagina om deze te bekijken." -#: ../java/src/org/klomp/snark/SnarkManager.java:445 +#: ../java/src/org/klomp/snark/SnarkManager.java:461 msgid "Configuration unchanged." msgstr "Configuratie ongewijzigd." -#: ../java/src/org/klomp/snark/SnarkManager.java:455 +#: ../java/src/org/klomp/snark/SnarkManager.java:471 #, java-format msgid "Unable to save the config to {0}" msgstr "Kan de configuratie niet opslaan in {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:494 +#: ../java/src/org/klomp/snark/SnarkManager.java:536 msgid "Connecting to I2P" msgstr "Verbinden met I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:497 +#: ../java/src/org/klomp/snark/SnarkManager.java:539 msgid "Error connecting to I2P - check your I2CP settings!" msgstr "Fout bij verbinden met I2P - controlleer je I2CP instellingen!" -#: ../java/src/org/klomp/snark/SnarkManager.java:506 +#: ../java/src/org/klomp/snark/SnarkManager.java:548 #, java-format msgid "Error: Could not add the torrent {0}" msgstr "Fout: Kan de torrent {0} niet toevoegen" #. catch this here so we don't try do delete it below -#: ../java/src/org/klomp/snark/SnarkManager.java:528 +#: ../java/src/org/klomp/snark/SnarkManager.java:570 #, java-format msgid "Cannot open \"{0}\"" msgstr "Kan \"{0}\" niet openen" -#: ../java/src/org/klomp/snark/SnarkManager.java:541 +#. TODO - if the existing one is a magnet, delete it and add the metainfo instead? +#: ../java/src/org/klomp/snark/SnarkManager.java:586 +#: ../java/src/org/klomp/snark/SnarkManager.java:661 +#: ../java/src/org/klomp/snark/SnarkManager.java:716 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1976 +#, java-format +msgid "Torrent with this info hash is already running: {0}" +msgstr "Torrent met deze info hash is al actief: {0}" + +#. addMessage(_("Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and DHT only.", info.getName())); +#: ../java/src/org/klomp/snark/SnarkManager.java:593 #, java-format msgid "" -"Warning - Ignoring non-i2p tracker in \"{0}\", will announce to i2p open " -"trackers only" +"Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers " +"only." msgstr "" -"Waarschuwing - Niet-I2P tracker in \"{0}\" wordt genegeerd, zal alleen " -"aankondigen naar i2p open trackers" +"Waarschuwing - Niet-I2P trackers in \"{0}\", zal alleen aankondigen bij I2P " +"open trackers." -#: ../java/src/org/klomp/snark/SnarkManager.java:543 +#. addMessage(_("Warning - No I2P trackers in \"{0}\", and DHT and open trackers are disabled, you should enable open trackers or DHT before starting the torrent.", info.getName())); +#: ../java/src/org/klomp/snark/SnarkManager.java:598 #, java-format msgid "" -"Warning - Ignoring non-i2p tracker in \"{0}\", and open trackers are " -"disabled, you must enable open trackers before starting the torrent!" +"Warning - No I2P Trackers found in \"{0}\". Make sure Open Tracker is " +"enabled before starting this torrent." msgstr "" -"Waarschuwing - Niet-I2P tracker in \"{0}\" wordt genegeerd, en open trackers " -"zijn uitgeschakeld, je moet open trackers inschakelen voor het starten van " -"de torrent!" +"Waarschuwing - Niet-I2P Trackers gevonden in \"{0}\". Zorg ervoor dat Open " +"Tracker is ingeschakeld voordat je deze torrent start." -#: ../java/src/org/klomp/snark/SnarkManager.java:563 +#: ../java/src/org/klomp/snark/SnarkManager.java:619 #, java-format msgid "Torrent in \"{0}\" is invalid" msgstr "Torrent in \"{0}\" is ongeldig" -#: ../java/src/org/klomp/snark/SnarkManager.java:578 +#: ../java/src/org/klomp/snark/SnarkManager.java:624 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1999 +#, java-format +msgid "ERROR - Out of memory, cannot create torrent from {0}" +msgstr "ERROR - Geen geheugen meer, kan geen torrent maken van {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:635 #, java-format msgid "Torrent added and started: \"{0}\"" msgstr "Torrent toegevoegd en gestart: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:580 +#: ../java/src/org/klomp/snark/SnarkManager.java:637 #, java-format msgid "Torrent added: \"{0}\"" msgstr "Torrent toegevoegd: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:734 +#: ../java/src/org/klomp/snark/SnarkManager.java:672 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:490 +#, java-format +msgid "Fetching {0}" +msgstr "Downloaden {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:675 +#, java-format +msgid "" +"We have no saved peers and no other torrents are running. Fetch of {0} will " +"not succeed until you start another torrent." +msgstr "" +"We hebben geen opgeslagen peers en er zijn geen andere torrents actief. Het " +"ophalen van {0} zal niet lukken totdat je een andere torrent start." + +#: ../java/src/org/klomp/snark/SnarkManager.java:679 +#, java-format +msgid "Adding {0}" +msgstr "Toevoegen van {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:726 +#: ../java/src/org/klomp/snark/SnarkManager.java:749 +#: ../java/src/org/klomp/snark/SnarkManager.java:1174 +#, java-format +msgid "Failed to copy torrent file to {0}" +msgstr "Kan het torrent bestand niet kopieren naar {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:972 #, java-format msgid "Too many files in \"{0}\" ({1}), deleting it!" msgstr "Te veel bestanden in \"{0}\" ({1}), wordt verwijderd!" -#: ../java/src/org/klomp/snark/SnarkManager.java:736 +#: ../java/src/org/klomp/snark/SnarkManager.java:974 #, java-format msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!" msgstr "" "Torrent bestand \"{0}\" kan niet eindigen in \".torrent\", wordt verwijderd!" -#: ../java/src/org/klomp/snark/SnarkManager.java:738 +#: ../java/src/org/klomp/snark/SnarkManager.java:976 #, java-format msgid "No pieces in \"{0}\", deleting it!" msgstr "Geen stukken in \"{0}\", wordt verwijderd!" -#: ../java/src/org/klomp/snark/SnarkManager.java:740 +#: ../java/src/org/klomp/snark/SnarkManager.java:978 #, java-format msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!" msgstr "Te veel stukken in \"{0}\", limiet is {1}, wordt verwijderd!" -#: ../java/src/org/klomp/snark/SnarkManager.java:742 +#: ../java/src/org/klomp/snark/SnarkManager.java:980 #, java-format msgid "Pieces are too large in \"{0}\" ({1}B), deleting it." msgstr "Stukken zijn te groot in \"{0}\" ({1}B), wordt verwijderd." -#: ../java/src/org/klomp/snark/SnarkManager.java:743 +#: ../java/src/org/klomp/snark/SnarkManager.java:981 #, java-format msgid "Limit is {0}B" msgstr "Limiet is {0}B" -#: ../java/src/org/klomp/snark/SnarkManager.java:751 +#: ../java/src/org/klomp/snark/SnarkManager.java:989 #, java-format msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\"" msgstr "" "Torrents groter dan {0}B worden nog niet ondersteund, verwijder \"{1}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:767 +#: ../java/src/org/klomp/snark/SnarkManager.java:1005 #, java-format msgid "Error: Could not remove the torrent {0}" msgstr "Fout: Kan de torrent {0} niet verwijderen" -#: ../java/src/org/klomp/snark/SnarkManager.java:794 +#: ../java/src/org/klomp/snark/SnarkManager.java:1026 +#: ../java/src/org/klomp/snark/SnarkManager.java:1044 #, java-format msgid "Torrent stopped: \"{0}\"" msgstr "Torrent gestopt: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:814 +#: ../java/src/org/klomp/snark/SnarkManager.java:1065 #, java-format msgid "Torrent removed: \"{0}\"" msgstr "Torrent verwijderd: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:852 +#: ../java/src/org/klomp/snark/SnarkManager.java:1073 +#, java-format +msgid "Adding torrents in {0}" +msgstr "Toevoegen van torrents in {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1122 #, java-format msgid "Download finished: {0}" msgstr "Download gereed: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:880 +#: ../java/src/org/klomp/snark/SnarkManager.java:1170 +#, java-format +msgid "Metainfo received for {0}" +msgstr "Metainfo ontvangen voor {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1171 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:525 +#, java-format +msgid "Starting up torrent {0}" +msgstr "Starten met torrent {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1225 msgid "Unable to connect to I2P!" msgstr "Kan niet verbinden met I2P!" -#: ../java/src/org/klomp/snark/SnarkManager.java:886 +#: ../java/src/org/klomp/snark/SnarkManager.java:1231 #, java-format msgid "Unable to add {0}" msgstr "Kan {0} niet toevoegen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:185 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:205 msgid "I2PSnark - Anonymous BitTorrent Client" msgstr "I2PSnark - Anonieme BitTorrent Client" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:198 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:218 msgid "Torrents" msgstr "Torrents" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:201 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:208 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:977 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:221 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:228 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1028 msgid "I2PSnark" msgstr "I2PSnark" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:205 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:225 msgid "Refresh page" msgstr "Ververs pagina" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:210 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:230 msgid "Forum" msgstr "Forum" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:264 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1483 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:284 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1719 msgid "Status" msgstr "Status" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:270 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:272 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:290 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:292 msgid "Hide Peers" msgstr "Verberg Peers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:277 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:279 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:297 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:299 msgid "Show Peers" msgstr "Toon Peers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:286 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1464 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1659 msgid "Torrent" msgstr "Torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:290 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:310 msgid "Estimated time remaining" msgstr "Schatting resterende tijd" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313 msgid "ETA" msgstr "ETA" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:297 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317 msgid "Downloaded" msgstr "Gedownload" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:300 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:314 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:320 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:334 msgid "RX" msgstr "RX" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:304 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324 msgid "Uploaded" msgstr "Geupload" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:307 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:327 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:344 msgid "TX" msgstr "TX" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:312 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:332 msgid "Down Rate" msgstr "Down Snelheid" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:337 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:346 msgid "Rate" msgstr "Rato" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:322 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:342 msgid "Up Rate" msgstr "Up Snelheid" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:340 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:365 msgid "Stop all torrents and the I2P tunnel" msgstr "Stop alle torrents en de I2P tunnel" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:342 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:367 msgid "Stop All" msgstr "Stop Alle" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:351 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:376 msgid "Start all torrents and the I2P tunnel" msgstr "Start alle torrents en de I2P tunnel" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:353 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:378 msgid "Start All" msgstr "Start Alle" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:372 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:397 msgid "No torrents loaded." msgstr "Geen torrents geladen." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:377 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:402 msgid "Totals" msgstr "Totalen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:379 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:404 #, java-format msgid "1 torrent" msgid_plural "{0} torrents" msgstr[0] "1 torrent" msgstr[1] "{0} torrents" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:382 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:407 #, java-format msgid "1 connected peer" msgid_plural "{0} connected peers" msgstr[0] "1 verbonden peer" msgstr[1] "{0} verbonden peers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:454 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:496 #, java-format -msgid "Fetching {0}" -msgstr "Downloaden {0}" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:458 -msgid "Invalid URL - must start with http://" -msgstr "Ongeldige URL - moet beginnen met http://" +msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"" +msgstr "Ongeldige URL: moet beginnen met \"http://\", \"{0}\", of \"{1}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:489 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:544 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571 #, java-format -msgid "Starting up torrent {0}" -msgstr "Starten met torrent {0}" +msgid "Magnet deleted: {0}" +msgstr "Magnet verwijderd: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:509 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:527 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:552 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:577 #, java-format msgid "Torrent file deleted: {0}" msgstr "Torrent bestand verwijderd: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:533 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:543 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:593 #, java-format msgid "Data file deleted: {0}" msgstr "Data bestand verwijderd: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:535 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:545 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:595 #, java-format msgid "Data file could not be deleted: {0}" msgstr "Kan data bestand niet verwijderen: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:554 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:604 #, java-format msgid "Data dir deleted: {0}" msgstr "Data directory verwijderd: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:587 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:637 msgid "Error creating torrent - you must select a tracker" msgstr "Fout bij maken van torrent - je moet een tracker selecteren" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:602 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:653 #, java-format msgid "Torrent created for \"{0}\"" msgstr "Torrent gemaakt voor \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:605 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:655 #, java-format msgid "" "Many I2P trackers require you to register new torrents before seeding - " @@ -412,121 +467,117 @@ msgstr "" "Veel I2P trackers vereisen dat je de nieuwe torrent registreert voor het " "seeden - doe dit voordat je \"{0}\" start" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:607 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:657 #, java-format msgid "Error creating a torrent for \"{0}\"" msgstr "Fout bij het maken van een torrent voor \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:610 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:660 #, java-format msgid "Cannot create a torrent for the nonexistent data: {0}" msgstr "Kan geen torrent maken voor niet-bestaande data: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:613 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:663 msgid "Error creating torrent - you must enter a file or directory" msgstr "" "Fout bij het maken van de torrent - je moet een bestand of directory invullen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:616 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:666 msgid "Stopping all torrents and closing the I2P tunnel." msgstr "Stoppen van alle torrents en sluiten van I2P tunnel." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:627 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:677 msgid "I2P tunnel closed." msgstr "I2P tunnel gesloten." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:630 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680 msgid "Opening the I2P tunnel and starting all torrents." msgstr "Openen van de I2P tunnel en starten van alle torrents." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:759 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:764 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:770 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:803 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:808 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:814 msgid "Tracker Error" msgstr "Tracker Fout" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:762 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:766 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:778 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:782 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:790 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:794 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:799 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:803 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:806 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:810 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:822 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:826 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:834 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:838 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:843 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:847 #, java-format msgid "1 peer" msgid_plural "{0} peers" msgstr[0] "1 peer" msgstr[1] "{0} peers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:775 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:780 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:819 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:824 msgid "Seeding" msgstr "Seeding" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:784 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1533 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:828 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1665 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1770 msgid "Complete" msgstr "Voltooid" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:787 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:792 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:831 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:836 msgid "OK" msgstr "OK" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:796 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:801 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:840 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:845 msgid "Stalled" msgstr "Vastgelopen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:805 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:808 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:849 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:852 msgid "No Peers" msgstr "Geen Peers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:810 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 msgid "Stopped" msgstr "Gestopt" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:837 -#, java-format -msgid "Details at {0} tracker" -msgstr "Details op de {0} tracker" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:886 +msgid "Torrent details" +msgstr "Torrent details" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:838 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:898 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1160 msgid "Info" msgstr "Info" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:853 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:913 msgid "View files" msgstr "Bekijk bestanden" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:855 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:915 msgid "Open file" msgstr "Open bestand" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:865 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1569 -msgid "Open" -msgstr "Open" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:909 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:957 msgid "Stop the torrent" msgstr "Stop de torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:911 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:959 msgid "Stop" msgstr "Stop" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:921 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:969 msgid "Start the torrent" msgstr "Start de torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:923 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:971 msgid "Start" msgstr "Start" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:933 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:982 msgid "Remove the torrent from the active list, deleting the .torrent file" msgstr "" "Verwijder de torrent van de actieve lijst, het .torrent bestand wordt " @@ -535,7 +586,7 @@ msgstr "" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quite must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:938 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:987 #, java-format msgid "" "Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded " @@ -544,18 +595,18 @@ msgstr "" "Weet je zeker dat je het bestand \\''{0}.torrent\\'' wilt verwijderen " "(gedownloade data zal niet worden verwijderd) ?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:941 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:990 msgid "Remove" msgstr "Weghalen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:950 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1001 msgid "Delete the .torrent file and the associated data file(s)" msgstr "Verwijder het .torrent bestand en de gerelateerde data bestand(en)" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quite must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:955 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1006 #, java-format msgid "" "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded " @@ -564,151 +615,163 @@ msgstr "" "Weet je zeker dat je de torrent \\''{0}\\'' en alle gedownloade data wilt " "verwijderen?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1009 msgid "Delete" msgstr "Verwijderen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:991 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042 msgid "Unknown" msgstr "Onbekend" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1001 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1054 msgid "Seed" msgstr "Seed" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1019 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1077 msgid "Uninteresting (The peer has no pieces we need)" msgstr "Niet interessant (De peer heeft geen stukken die we nodig hebben)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1021 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1079 msgid "Choked (The peer is not allowing us to request pieces)" msgstr "Verstikt (De peer laat ons niet toe om stukken op te vragen)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1035 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1099 msgid "Uninterested (We have no pieces the peer needs)" msgstr "Niet geïnteresseerd (We heben geen stukken die de peer nodig heeft)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1037 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1101 msgid "Choking (We are not allowing the peer to request pieces)" msgstr "Verstikt (We laten de peer niet toe om stukken op te vragen)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1092 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1159 +#, java-format +msgid "Details at {0} tracker" +msgstr "Details op de {0} tracker" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1188 msgid "Add Torrent" msgstr "Torrent Toevoegen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1094 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190 msgid "From URL" msgstr "Van URL" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1097 -msgid "Torrent file must originate from an I2P-based tracker" -msgstr "Torrent bestand moet vaan een I2P tracker komen" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1193 +msgid "" +"Enter the torrent file download URL (I2P only), magnet link, or maggot link" +msgstr "Geef de torrent download URL (alleen I2P), magnet link, of maggot link" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1102 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1198 msgid "Add torrent" msgstr "Torrent toevoegen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1105 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1201 #, java-format msgid "You can also copy .torrent files to: {0}." msgstr "Je kan ook .torrent bestanden kopieren naar: {0}." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1107 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1203 msgid "Removing a .torrent will cause it to stop." msgstr "Verwijderen van een .torrent zorgt dat deze stopt." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1131 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1226 msgid "Create Torrent" msgstr "Creëer Torrent" #. out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br>\n"); -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1134 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 msgid "Data to seed" msgstr "Data om te seeden" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1138 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233 msgid "File or directory to seed (must be within the specified path)" msgstr "" "Bestand of directory om te seeden (moet binnen het gespecificeerde pad zijn)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1140 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1235 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684 msgid "Tracker" msgstr "Tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1142 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237 msgid "Select a tracker" msgstr "Selecteer een tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1155 +#. out.write(_("Open trackers and DHT only")); +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1242 +msgid "Open trackers only" +msgstr "Alleen Open trackers" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1257 msgid "or" msgstr "of" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1158 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1260 msgid "Specify custom tracker announce URL" msgstr "Specificeer aangepaste tracker aankondigings URL" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1161 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1263 msgid "Create torrent" msgstr "Creëer torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1180 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1317 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1281 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1420 msgid "Configuration" msgstr "Configuratie" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1184 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1285 msgid "Data directory" msgstr "Data directory" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1186 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1287 msgid "Edit i2psnark.config and restart to change" msgstr "Bewerk i2psnark.config en herstart de wijziging" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291 msgid "Auto start" msgstr "Auto start" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1194 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1295 msgid "If checked, automatically start torrents that are added" msgstr "Indien aangevinkt, start toegevoegde torrents automatisch" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1198 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1299 msgid "Theme" msgstr "Thema" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1211 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1312 msgid "Startup delay" msgstr "Startup vertraging" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1213 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1314 msgid "minutes" msgstr "minuten" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1338 msgid "Total uploader limit" msgstr "Totale uploader limiet" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1341 msgid "peers" msgstr "peers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1244 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1345 msgid "Up bandwidth limit" msgstr "Up bandbreedte limiet" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1247 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1348 msgid "Half available bandwidth recommended." msgstr "Helft van beschikbare bandbreedte aanbevolen." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1249 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1350 msgid "View or change router bandwidth" msgstr "Bekijk of wijzig router bandbreedte" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1253 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1354 msgid "Use open trackers also" msgstr "Gebruik ook open trackers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1257 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1358 msgid "" "If checked, announce torrents to open trackers as well as the tracker listed " "in the torrent file" @@ -716,123 +779,155 @@ msgstr "" "Indien aangevinkt, kondig torrents ook aan bij de tracker uit het torrent " "bestand" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1261 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1362 msgid "Open tracker announce URLs" msgstr "Open tracker aankondigings URLs" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1273 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1374 msgid "Inbound Settings" msgstr "Inkomende Instellingen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1279 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1380 msgid "Outbound Settings" msgstr "Uitgaande Instellingen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1286 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1388 msgid "I2CP host" msgstr "I2CP host" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1393 msgid "I2CP port" msgstr "I2CP poort" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1303 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1406 msgid "I2CP options" msgstr "I2CP opties" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1308 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1411 msgid "Save configuration" msgstr "Configuratie opslaan" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1436 +#, java-format +msgid "Invalid magnet URL {0}" +msgstr "Ongeldige magnet URL {0}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1470 +#, java-format +msgid "Invalid info hash in magnet URL {0}" +msgstr "Ongeldige info hash in magnet URL {0}" + #. * dummies for translation -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1325 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1500 #, java-format msgid "1 hop" msgid_plural "{0} hops" msgstr[0] "1 hop" msgstr[1] "{0} hops" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1326 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1501 #, java-format msgid "1 tunnel" msgid_plural "{0} tunnels" msgstr[0] "1 tunnel" msgstr[1] "{0} tunnels" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1480 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1663 +msgid "Completion" +msgstr "Voltooiing" + +#. else unknown +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1716 msgid "Size" msgstr "Grootte" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1487 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1672 +msgid "Files" +msgstr "Bestanden" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1674 +msgid "Pieces" +msgstr "Stukken" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1675 +msgid "Piece size" +msgstr "Stukgrootte" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697 +msgid "Magnet link" +msgstr "Magnet link" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1753 +msgid "Directory" +msgstr "Directory" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1723 msgid "Priority" msgstr "Prioriteit" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1492 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1728 msgid "Up to higher level directory" msgstr "Naar bovenliggende directory" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 -msgid "Directory" -msgstr "Directory" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1522 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758 msgid "Torrent not found?" msgstr "Torrent niet gevonden?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1767 msgid "File not found in torrent?" msgstr "Bestand niet gevonden in torrent?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1543 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1780 msgid "complete" msgstr "voltooid" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1781 msgid "bytes remaining" msgstr "bytes resterend" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1595 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806 +msgid "Open" +msgstr "Open" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1832 msgid "High" msgstr "Hoog" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1837 msgid "Normal" msgstr "Normaal" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1605 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1842 msgid "Skip" msgstr "Overslaan" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1614 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851 msgid "Save priorities" msgstr "Prioriteiten opslaan" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1726 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1967 #, java-format msgid "Torrent fetched from {0}" msgstr "Torrent gedownload van {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1746 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1989 #, java-format msgid "Torrent already running: {0}" msgstr "Torrent draait al: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1748 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1991 #, java-format msgid "Torrent already in the queue: {0}" msgstr "Torrent zit al in de wachtrij: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1755 -#, java-format -msgid "Failed to copy torrent file to {0}" -msgstr "Kan het torrent bestand niet kopieren naar {0}" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1759 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1997 #, java-format msgid "Torrent at {0} was not valid" msgstr "Torrent op {0} was niet geldig" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1764 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2004 #, java-format msgid "Torrent was not retrieved from {0}" msgstr "Torrent was niet ontvangen van {0}" diff --git a/apps/i2psnark/locale/messages_pt.po b/apps/i2psnark/locale/messages_pt.po index 4c9547c316ae71494a2f1ed276f20679305c7b81..ae9ed03c8e289973f1f7fa68b68041ae43627a05 100644 --- a/apps/i2psnark/locale/messages_pt.po +++ b/apps/i2psnark/locale/messages_pt.po @@ -8,857 +8,1018 @@ msgid "" msgstr "" "Project-Id-Version: I2P i2psnark\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-12-19 03:16+0000\n" -"PO-Revision-Date: 2010-12-31 01:09+0100\n" +"POT-Creation-Date: 2011-03-03 18:28+0000\n" +"PO-Revision-Date: 2011-02-27 18:48+0100\n" "Last-Translator: mixxy <m1xxy@mail.i2p>\n" "Language-Team: foo <foo@bar>\n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Spanish\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ../java/src/org/klomp/snark/SnarkManager.java:94 -#, java-format -msgid "Adding torrents in {0} minutes" -msgstr "Os torrents serão adicionados em {0} minutos ..." - -#: ../java/src/org/klomp/snark/SnarkManager.java:296 +#: ../java/src/org/klomp/snark/SnarkManager.java:307 #, java-format msgid "Total uploaders limit changed to {0}" msgstr "Limite total de subidores mudado a {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:298 +#: ../java/src/org/klomp/snark/SnarkManager.java:309 #, java-format msgid "Minimum total uploaders limit is {0}" msgstr "O limite mÃnimo de subidores é {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:310 +#: ../java/src/org/klomp/snark/SnarkManager.java:321 #, java-format msgid "Up BW limit changed to {0}KBps" msgstr "Largura de banda para a subida foi mudada para {0} kbyte/s." -#: ../java/src/org/klomp/snark/SnarkManager.java:312 +#: ../java/src/org/klomp/snark/SnarkManager.java:323 #, java-format msgid "Minimum up bandwidth limit is {0}KBps" msgstr "O limite mÃnimo da largura de banda para a subida está em {0} kbyte/s." -#: ../java/src/org/klomp/snark/SnarkManager.java:324 -#, java-format -msgid "Startup delay limit changed to {0} minutes" +#: ../java/src/org/klomp/snark/SnarkManager.java:335 +#, fuzzy, java-format +msgid "Startup delay changed to {0}" msgstr "Demora do arranque mudado a {0} minutos" -#: ../java/src/org/klomp/snark/SnarkManager.java:371 +#: ../java/src/org/klomp/snark/SnarkManager.java:386 msgid "I2CP and tunnel changes will take effect after stopping all torrents" -msgstr "Mudanças do I2CP e do túnel terão efeito depois de parar todos os torrents" +msgstr "" +"Mudanças do I2CP e do túnel terão efeito depois de deter todos os torrentes" -#: ../java/src/org/klomp/snark/SnarkManager.java:378 +#: ../java/src/org/klomp/snark/SnarkManager.java:393 msgid "Disconnecting old I2CP destination" msgstr "Desconectando anterior Destinação I2CP" -#: ../java/src/org/klomp/snark/SnarkManager.java:382 +#: ../java/src/org/klomp/snark/SnarkManager.java:397 #, java-format msgid "I2CP settings changed to {0}" msgstr "Preferências de I2CP mudadas a {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:386 -msgid "Unable to connect with the new settings, reverting to the old I2CP settings" -msgstr "Conectar-se não foi posÃvel com as novas preferências I2CP, utilizarei as anteriores." +#: ../java/src/org/klomp/snark/SnarkManager.java:402 +msgid "" +"Unable to connect with the new settings, reverting to the old I2CP settings" +msgstr "" +"Conectar-se não foi posÃvel com as novas preferências I2CP, utilizarei as " +"anteriores." -#: ../java/src/org/klomp/snark/SnarkManager.java:390 +#: ../java/src/org/klomp/snark/SnarkManager.java:406 msgid "Unable to reconnect with the old settings!" msgstr "ImpossÃvel se conectar usando as preferências anteriores!" -#: ../java/src/org/klomp/snark/SnarkManager.java:392 +#: ../java/src/org/klomp/snark/SnarkManager.java:408 msgid "Reconnected on the new I2CP destination" msgstr "Conectado com a nova Destinação I2CP" -#: ../java/src/org/klomp/snark/SnarkManager.java:403 +#: ../java/src/org/klomp/snark/SnarkManager.java:418 #, java-format msgid "I2CP listener restarted for \"{0}\"" msgstr "Conexão I2CP re-estabelecida para \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:414 +#: ../java/src/org/klomp/snark/SnarkManager.java:429 msgid "Enabled autostart" msgstr "Ativado o iniciar automáticamente" -#: ../java/src/org/klomp/snark/SnarkManager.java:416 +#: ../java/src/org/klomp/snark/SnarkManager.java:431 msgid "Disabled autostart" msgstr "Desativado o iniciar automáticamente" -#: ../java/src/org/klomp/snark/SnarkManager.java:422 +#: ../java/src/org/klomp/snark/SnarkManager.java:437 msgid "Enabled open trackers - torrent restart required to take effect." -msgstr "Uso de rastreadores abertos ativado - Para ter efeito é necesário reiniciar os torrents." +msgstr "" +"Uso de rastreadores abertos ativado - Para ter efeito é necesário reiniciar " +"os torrentes." -#: ../java/src/org/klomp/snark/SnarkManager.java:424 +#: ../java/src/org/klomp/snark/SnarkManager.java:439 msgid "Disabled open trackers - torrent restart required to take effect." -msgstr "Uso dos rastreadores abertos desativado - Para ter efeito é necesário reiniciar os torrents." +msgstr "" +"Uso dos rastreadores abertos desativado - Para ter efeito é necesário " +"reiniciar os torrentes." -#: ../java/src/org/klomp/snark/SnarkManager.java:431 +#: ../java/src/org/klomp/snark/SnarkManager.java:447 msgid "Open Tracker list changed - torrent restart required to take effect." -msgstr "Listado de rastreadores abertos mudado - Para ter efeito é necesário reiniciar os torrents." +msgstr "" +"Listado de rastreadores abertos mudado - Para ter efeito é necesário " +"reiniciar os torrentes." -#: ../java/src/org/klomp/snark/SnarkManager.java:438 +#: ../java/src/org/klomp/snark/SnarkManager.java:454 #, java-format msgid "{0} theme loaded, return to main i2psnark page to view." msgstr "Tema {0} foi carregado. Volte no menú principal para vê-lo." -#: ../java/src/org/klomp/snark/SnarkManager.java:445 +#: ../java/src/org/klomp/snark/SnarkManager.java:461 msgid "Configuration unchanged." msgstr "Configuração não mudada." -#: ../java/src/org/klomp/snark/SnarkManager.java:455 +#: ../java/src/org/klomp/snark/SnarkManager.java:471 #, java-format msgid "Unable to save the config to {0}" msgstr "Não se pode guardar a configuração em {0}." -#: ../java/src/org/klomp/snark/SnarkManager.java:494 +#: ../java/src/org/klomp/snark/SnarkManager.java:536 msgid "Connecting to I2P" msgstr "Conectando com I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:497 +#: ../java/src/org/klomp/snark/SnarkManager.java:539 msgid "Error connecting to I2P - check your I2CP settings!" msgstr "Erro ao se conectar com I2P - Verifique a sua configuração I2CP!" -#: ../java/src/org/klomp/snark/SnarkManager.java:506 +#: ../java/src/org/klomp/snark/SnarkManager.java:548 #, java-format msgid "Error: Could not add the torrent {0}" -msgstr "Erro: Não se pode adicionar o torrent {0}." +msgstr "Erro: Não se pode adicionar o torrente {0}." #. catch this here so we don't try do delete it below -#: ../java/src/org/klomp/snark/SnarkManager.java:528 +#: ../java/src/org/klomp/snark/SnarkManager.java:570 #, java-format msgid "Cannot open \"{0}\"" msgstr "Não pode se abrir \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:541 -#, java-format -msgid "Warning - Ignoring non-i2p tracker in \"{0}\", will announce to i2p open trackers only" -msgstr "Aviso - Se ignorará rastreado não I2P no \"{0}\", anunciando só aos rastreadores abertos do I2P" +#. TODO - if the existing one is a magnet, delete it and add the metainfo instead? +#: ../java/src/org/klomp/snark/SnarkManager.java:586 +#: ../java/src/org/klomp/snark/SnarkManager.java:661 +#: ../java/src/org/klomp/snark/SnarkManager.java:716 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1976 +#, fuzzy, java-format +msgid "Torrent with this info hash is already running: {0}" +msgstr "torrente já em marcha: {0}" + +#. addMessage(_("Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and DHT only.", info.getName())); +#: ../java/src/org/klomp/snark/SnarkManager.java:593 +#, fuzzy, java-format +msgid "" +"Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers " +"only." +msgstr "" +"Aviso - Se ignorará rastreado não I2P no \"{0}\", anunciando só aos " +"rastreadores abertos do I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:543 -#, java-format -msgid "Warning - Ignoring non-i2p tracker in \"{0}\", and open trackers are disabled, you must enable open trackers before starting the torrent!" -msgstr "Aviso - Se ignorará rastreador não I2P no \"{0}\", rastreadores abertos estão desativados. Tens que ativá-los antes de iniciar o torrent!" +#. addMessage(_("Warning - No I2P trackers in \"{0}\", and DHT and open trackers are disabled, you should enable open trackers or DHT before starting the torrent.", info.getName())); +#: ../java/src/org/klomp/snark/SnarkManager.java:598 +#, fuzzy, java-format +msgid "" +"Warning - No I2P Trackers found in \"{0}\". Make sure Open Tracker is " +"enabled before starting this torrent." +msgstr "" +"Aviso - Se ignorará rastreador não I2P no \"{0}\", rastreadores abertos " +"estão desativados. Tens que ativá-los antes de iniciar o torrente!" -#: ../java/src/org/klomp/snark/SnarkManager.java:563 +#: ../java/src/org/klomp/snark/SnarkManager.java:619 #, java-format msgid "Torrent in \"{0}\" is invalid" msgstr "O arquivo .torrent em \"{0}\" não é válido." -#: ../java/src/org/klomp/snark/SnarkManager.java:578 +#: ../java/src/org/klomp/snark/SnarkManager.java:624 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1999 +#, java-format +msgid "ERROR - Out of memory, cannot create torrent from {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:635 #, java-format msgid "Torrent added and started: \"{0}\"" -msgstr "Torrent adicionado e iniciado: \"{0}\"" +msgstr "torrente adicionado e iniciado: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:580 +#: ../java/src/org/klomp/snark/SnarkManager.java:637 #, java-format msgid "Torrent added: \"{0}\"" -msgstr "Torrent adicionado: \"{0}\"" +msgstr "torrente adicionado: \"{0}\"" + +#: ../java/src/org/klomp/snark/SnarkManager.java:672 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:490 +#, java-format +msgid "Fetching {0}" +msgstr "Buscando {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:675 +#, java-format +msgid "" +"We have no saved peers and no other torrents are running. Fetch of {0} will " +"not succeed until you start another torrent." +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:679 +#, fuzzy, java-format +msgid "Adding {0}" +msgstr "Buscando {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:734 +#: ../java/src/org/klomp/snark/SnarkManager.java:726 +#: ../java/src/org/klomp/snark/SnarkManager.java:749 +#: ../java/src/org/klomp/snark/SnarkManager.java:1174 +#, java-format +msgid "Failed to copy torrent file to {0}" +msgstr "Não se pode copiar o torrente para {0}." + +#: ../java/src/org/klomp/snark/SnarkManager.java:972 #, java-format msgid "Too many files in \"{0}\" ({1}), deleting it!" msgstr "Ha arquivos demais no \"{0}\", se apagará ({1}). " -#: ../java/src/org/klomp/snark/SnarkManager.java:736 +#: ../java/src/org/klomp/snark/SnarkManager.java:974 #, java-format msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!" -msgstr "O arquivo de dados do torrent \"{0}\" não pode terminar em \".torrent' e será apagado." +msgstr "" +"O arquivo de dados do torrente \"{0}\" não pode terminar em \".torrent' e " +"será apagado." -#: ../java/src/org/klomp/snark/SnarkManager.java:738 +#: ../java/src/org/klomp/snark/SnarkManager.java:976 #, java-format msgid "No pieces in \"{0}\", deleting it!" msgstr "Não ha peças no \"{0}\", se apagará." -#: ../java/src/org/klomp/snark/SnarkManager.java:740 +#: ../java/src/org/klomp/snark/SnarkManager.java:978 #, java-format msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!" msgstr "Ha peças demais no \"{0}\" e o limite é {1}. Se apagarão." -#: ../java/src/org/klomp/snark/SnarkManager.java:742 +#: ../java/src/org/klomp/snark/SnarkManager.java:980 #, java-format msgid "Pieces are too large in \"{0}\" ({1}B), deleting it." msgstr "Peças no \"{0}\" são grandes demais ({1}B). Se apagarão." -#: ../java/src/org/klomp/snark/SnarkManager.java:743 +#: ../java/src/org/klomp/snark/SnarkManager.java:981 #, java-format msgid "Limit is {0}B" msgstr "O limite são \"{0}\"Bytes" -#: ../java/src/org/klomp/snark/SnarkManager.java:751 +#: ../java/src/org/klomp/snark/SnarkManager.java:989 #, java-format msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\"" -msgstr "Torrents maiores que \"{0}\" Bytes ainda não funcionam, se apagará \"{1}\"." +msgstr "" +"torrentes maiores que \"{0}\" Bytes ainda não funcionam, se apagará \"{1}\"." -#: ../java/src/org/klomp/snark/SnarkManager.java:767 +#: ../java/src/org/klomp/snark/SnarkManager.java:1005 #, java-format msgid "Error: Could not remove the torrent {0}" -msgstr "Erro: Não se pode quitar o torrent \"{0}\"." +msgstr "Erro: Não se pode quitar o torrente \"{0}\"." -#: ../java/src/org/klomp/snark/SnarkManager.java:794 +#: ../java/src/org/klomp/snark/SnarkManager.java:1026 +#: ../java/src/org/klomp/snark/SnarkManager.java:1044 #, java-format msgid "Torrent stopped: \"{0}\"" -msgstr "Torrent parado: \"{0}\"" +msgstr "torrente detido: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:814 +#: ../java/src/org/klomp/snark/SnarkManager.java:1065 #, java-format msgid "Torrent removed: \"{0}\"" -msgstr "Torrent quitado: \"{0}\"" +msgstr "torrente quitado: \"{0}\"" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1073 +#, fuzzy, java-format +msgid "Adding torrents in {0}" +msgstr "Os torrentes serão adicionados em {0} minutos ..." -#: ../java/src/org/klomp/snark/SnarkManager.java:852 +#: ../java/src/org/klomp/snark/SnarkManager.java:1122 #, java-format msgid "Download finished: {0}" msgstr "Finalizada a descarga de \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:880 +#: ../java/src/org/klomp/snark/SnarkManager.java:1170 +#, fuzzy, java-format +msgid "Metainfo received for {0}" +msgstr "Não se pode obter torrente de {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1171 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:525 +#, java-format +msgid "Starting up torrent {0}" +msgstr "Iniciando o torrente {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1225 msgid "Unable to connect to I2P!" msgstr "ImpossÃvel de se conectar com I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:886 +#: ../java/src/org/klomp/snark/SnarkManager.java:1231 #, java-format msgid "Unable to add {0}" msgstr "ImpossÃvel de adicionar {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:185 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:205 msgid "I2PSnark - Anonymous BitTorrent Client" msgstr "I2PSnark - Cliente de BitTorrent Anônimo" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:198 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:218 msgid "Torrents" -msgstr "Torrents" +msgstr "torrentes" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:201 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:208 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:977 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:221 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:228 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1028 msgid "I2PSnark" msgstr "I2PSnark" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:205 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:225 msgid "Refresh page" msgstr "Atualizar página" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:210 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:230 msgid "Forum" msgstr "Foro" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:264 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1483 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:284 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1719 msgid "Status" msgstr "Estado" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:270 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:272 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:290 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:292 msgid "Hide Peers" -msgstr "ocultar pares" +msgstr "ocultar parceiros" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:277 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:279 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:297 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:299 msgid "Show Peers" -msgstr "mostrar pares" +msgstr "mostrar parceiros" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:286 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1464 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1659 msgid "Torrent" -msgstr "Torrent" +msgstr "torrente" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:290 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:310 msgid "Estimated time remaining" msgstr "Tempo que falta para completar" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313 msgid "ETA" msgstr "Tempo" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:297 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317 msgid "Downloaded" msgstr "Descarregado" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:300 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:314 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:320 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:334 msgid "RX" msgstr "Baixado" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:304 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324 msgid "Uploaded" msgstr "Subido" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:307 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:327 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:344 msgid "TX" msgstr "Subido" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:312 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:332 msgid "Down Rate" msgstr "Taça de descarga" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:337 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:346 msgid "Rate" msgstr "Taça" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:322 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:342 msgid "Up Rate" msgstr "Taça de subida" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:340 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:365 msgid "Stop all torrents and the I2P tunnel" -msgstr "Parar todos os torrents e o túnel I2P" +msgstr "Deter todos os torrentes e o túnel I2P" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:342 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:367 msgid "Stop All" -msgstr "Parar tudos" +msgstr "Deter tudos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:351 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:376 msgid "Start all torrents and the I2P tunnel" -msgstr "Iniciar todos os torrents e o túnel I2P" +msgstr "Iniciar todos os torrentes e o túnel I2P" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:353 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:378 msgid "Start All" msgstr "Arrancar todos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:372 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:397 msgid "No torrents loaded." -msgstr "Não carregado nenhum torrent" +msgstr "Não carregado nenhum torrente" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:377 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:402 msgid "Totals" msgstr "Total" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:379 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:404 #, java-format msgid "1 torrent" msgid_plural "{0} torrents" -msgstr[0] "1 torrent" -msgstr[1] "{0} torrents" +msgstr[0] "1 torrente" +msgstr[1] "{0} torrentes" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:382 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:407 #, java-format msgid "1 connected peer" msgid_plural "{0} connected peers" -msgstr[0] "1 par conectado" -msgstr[1] "{0} pares conectados" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:454 -#, java-format -msgid "Fetching {0}" -msgstr "Buscando {0}" +msgstr[0] "1 parceiro conectado" +msgstr[1] "{0} parceiros conectados" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:458 -msgid "Invalid URL - must start with http://" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:496 +#, fuzzy, java-format +msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"" msgstr "Endereço não válido - tem que começar com http://" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:489 -#, java-format -msgid "Starting up torrent {0}" -msgstr "Iniciando o torrent {0}" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:544 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571 +#, fuzzy, java-format +msgid "Magnet deleted: {0}" +msgstr "Apagada a pasta de dados: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:509 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:527 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:552 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:577 #, java-format msgid "Torrent file deleted: {0}" -msgstr "Apagado o arquivo torrent: {0}" +msgstr "Apagado o arquivo torrente: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:533 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:543 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:593 #, java-format msgid "Data file deleted: {0}" msgstr "Apagado o arquivo de dados: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:535 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:545 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:595 #, java-format msgid "Data file could not be deleted: {0}" msgstr "Não se pode apagar o arquivo de dados: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:554 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:604 #, java-format msgid "Data dir deleted: {0}" msgstr "Apagada a pasta de dados: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:587 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:637 msgid "Error creating torrent - you must select a tracker" -msgstr "Erro ao criar o torrent - Tens que elegir um rastreador." +msgstr "Erro ao criar o torrente - Tens que elegir um rastreador." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:602 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:653 #, java-format msgid "Torrent created for \"{0}\"" -msgstr "Torrent criado para \"{0}\"" +msgstr "torrente criado para \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:605 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:655 #, java-format -msgid "Many I2P trackers require you to register new torrents before seeding - please do so before starting \"{0}\"" -msgstr "Muitos rastreadores no I2P exigem que você registre novos torrents antes de poder semeá-los. Por favor, faça isto antes de iniciar \"{0}\"!" +msgid "" +"Many I2P trackers require you to register new torrents before seeding - " +"please do so before starting \"{0}\"" +msgstr "" +"Muitos rastreadores no I2P exigem que você registre novos torrentes antes de " +"poder semeá-los. Por favor, faça isto antes de iniciar \"{0}\"!" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:607 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:657 #, java-format msgid "Error creating a torrent for \"{0}\"" -msgstr "Erro ao criar o torrent \"{0}\"" +msgstr "Erro ao criar o torrente \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:610 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:660 #, java-format msgid "Cannot create a torrent for the nonexistent data: {0}" -msgstr "Não se pode criar um torrent para dados que não existam: {0}" +msgstr "Não se pode criar um torrente para dados que não existam: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:613 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:663 msgid "Error creating torrent - you must enter a file or directory" -msgstr "Erro ao criar o torrent - Tens que especificar um arquivo ou uma pasta." +msgstr "" +"Erro ao criar o torrente - Tens que especificar um arquivo ou uma pasta." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:616 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:666 msgid "Stopping all torrents and closing the I2P tunnel." -msgstr "Parando todos os torrents e fechando o túnel I2P" +msgstr "Detindo todos os torrentes e fechando o túnel I2P" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:627 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:677 msgid "I2P tunnel closed." msgstr "Túnel I2P fechado" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:630 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680 msgid "Opening the I2P tunnel and starting all torrents." -msgstr "Abrendo o túnel I2P e iniciando os torrents ..." +msgstr "Abrendo o túnel I2P e iniciando os torrentes ..." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:759 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:764 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:770 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:803 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:808 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:814 msgid "Tracker Error" msgstr "Erro do rastreador" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:762 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:766 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:778 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:782 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:790 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:794 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:799 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:803 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:806 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:810 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:822 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:826 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:834 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:838 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:843 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:847 #, java-format msgid "1 peer" msgid_plural "{0} peers" -msgstr[0] "1 par" -msgstr[1] "{0} pares" +msgstr[0] "1 parceiro" +msgstr[1] "{0} parceiros" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:775 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:780 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:819 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:824 msgid "Seeding" msgstr "semeando" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:784 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1533 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:828 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1665 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1770 msgid "Complete" msgstr "completo" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:787 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:792 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:831 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:836 msgid "OK" msgstr "bem" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:796 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:801 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:840 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:845 msgid "Stalled" msgstr "estancado" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:805 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:808 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:849 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:852 msgid "No Peers" -msgstr "sem pares" +msgstr "sem parceiros" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:810 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 msgid "Stopped" msgstr "detenido" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:837 -#, java-format -msgid "Details at {0} tracker" -msgstr "Detalhes no rastreador {0}" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:886 +#, fuzzy +msgid "Torrent details" +msgstr "torrentes" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:838 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:898 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1160 msgid "Info" msgstr "Info" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:853 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:913 msgid "View files" msgstr "mostrar arquivos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:855 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:915 msgid "Open file" msgstr "abrir arquivo" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:865 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1569 -msgid "Open" -msgstr "abrir" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:909 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:957 msgid "Stop the torrent" -msgstr "Parar o torrent" +msgstr "Deter o torrente" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:911 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:959 msgid "Stop" -msgstr "Parar" +msgstr "Deter" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:921 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:969 msgid "Start the torrent" -msgstr "Iniciar o torrent" +msgstr "Iniciar o torrente" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:923 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:971 msgid "Start" msgstr "Iniciar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:933 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:982 msgid "Remove the torrent from the active list, deleting the .torrent file" -msgstr "Retire o torrent da lista ativa, apagando o arquivo .torrent" +msgstr "Retire o torrente da lista ativa, apagando o arquivo .torrent" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quite must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:938 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:987 #, java-format -msgid "Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded data will not be deleted) ?" -msgstr "Está seguro de que quer apagar o arquivo \\''{0}.torrent\\''? (Dados baixados não se apagarão.)" +msgid "" +"Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded " +"data will not be deleted) ?" +msgstr "" +"Está seguro de que quer apagar o arquivo \\''{0}.torrent\\''? (Dados " +"baixados não se apagarão.)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:941 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:990 msgid "Remove" msgstr "Quitar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:950 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1001 msgid "Delete the .torrent file and the associated data file(s)" -msgstr "Apagar o arquivo torrent e o(s) arquivo(s) de dados pertenecentes" +msgstr "Apagar o arquivo torrente e o(s) arquivo(s) de dados pertenecentes" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quite must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:955 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1006 #, java-format -msgid "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded data?" -msgstr "Está seguro de que quer apagar o arquivo torrent \\''{0}\\'' e todos os dados descarregados deste torrent?" +msgid "" +"Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded " +"data?" +msgstr "" +"Está seguro de que quer apagar o arquivo torrente \\''{0}\\'' e todos os " +"dados descarregados deste torrente?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1009 msgid "Delete" msgstr "Apagar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:991 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042 msgid "Unknown" msgstr "desconhecido" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1001 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1054 msgid "Seed" msgstr "Semeador" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1019 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1077 msgid "Uninteresting (The peer has no pieces we need)" -msgstr "não interessante (O par não tem peças que precisamos.)" +msgstr "não interessante (O parceiro não tem peças que precisamos.)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1021 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1079 msgid "Choked (The peer is not allowing us to request pieces)" -msgstr "sufocado (De momento o par não está nos permitindo pedir mais peças.c)" +msgstr "" +"sufocado (De momento o parceiro não está nos permitindo pedir mais peças.c)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1035 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1099 msgid "Uninterested (We have no pieces the peer needs)" -msgstr "desinteressado (Não temos as peças que o par quer.)" +msgstr "desinteressado (Não temos as peças que o parceiro quer.)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1037 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1101 msgid "Choking (We are not allowing the peer to request pieces)" -msgstr "sufocando (De momento não estamos permitindo que os pares peçam mais peças)" +msgstr "" +"sufocando (De momento não estamos permitindo que os parceiros peçam mais " +"peças)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1092 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1159 +#, java-format +msgid "Details at {0} tracker" +msgstr "Detalhes no rastreador {0}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1188 msgid "Add Torrent" -msgstr "Adicionar um torrent" +msgstr "Adicionar um torrente" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1094 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190 msgid "From URL" msgstr "URL fonte:" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1097 -msgid "Torrent file must originate from an I2P-based tracker" -msgstr "O arquivo torrent tem que incluir um rastreador I2P." +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1193 +msgid "" +"Enter the torrent file download URL (I2P only), magnet link, or maggot link" +msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1102 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1198 msgid "Add torrent" -msgstr "Adicionar torrent" +msgstr "Adicionar torrente" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1105 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1201 #, java-format msgid "You can also copy .torrent files to: {0}." -msgstr "Também pode copiar arquivos torrent a {0}." +msgstr "Também pode copiar arquivos torrentes a {0}." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1107 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1203 msgid "Removing a .torrent will cause it to stop." msgstr "A remoção de um arquivo .torrent fará com que ele pare." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1131 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1226 msgid "Create Torrent" -msgstr "Criar um torrent" +msgstr "Criar um torrente" #. out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br>\n"); -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1134 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 msgid "Data to seed" msgstr "Dados para semear" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1138 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233 msgid "File or directory to seed (must be within the specified path)" msgstr "Arquivo ou pasta para semear (deve estar no caminho especificado)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1140 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1235 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684 msgid "Tracker" msgstr "Rastreador" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1142 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237 msgid "Select a tracker" msgstr "Selecione um rastreador" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1155 +#. out.write(_("Open trackers and DHT only")); +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1242 +#, fuzzy +msgid "Open trackers only" +msgstr "usar também rastreadores abertos" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1257 msgid "or" msgstr "ou" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1158 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1260 msgid "Specify custom tracker announce URL" msgstr "Especifique o URL de rastreador personalizado" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1161 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1263 msgid "Create torrent" -msgstr "Criar torrent" +msgstr "Criar torrente" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1180 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1317 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1281 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1420 msgid "Configuration" msgstr "Preferências" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1184 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1285 msgid "Data directory" msgstr "Pasta de dados" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1186 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1287 msgid "Edit i2psnark.config and restart to change" msgstr "Para mudar, modifique o arquivo i2psnark.config e re-inÃcie!" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291 msgid "Auto start" msgstr "Iniciar automáticamente" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1194 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1295 msgid "If checked, automatically start torrents that are added" -msgstr "se marcado, os torrents adicionados se iniciarão automaticamente" +msgstr "se marcado, os torrentes adicionados se iniciarão automaticamente" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1198 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1299 msgid "Theme" msgstr "Tema" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1211 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1312 msgid "Startup delay" msgstr "Demora do arranque" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1213 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1314 msgid "minutes" msgstr "minutos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1338 msgid "Total uploader limit" msgstr "Limite global de subidores" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1341 msgid "peers" -msgstr "pares" +msgstr "parceiros" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1244 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1345 msgid "Up bandwidth limit" msgstr "Limite de largura de banda para a subida" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1247 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1348 msgid "Half available bandwidth recommended." msgstr "Se recomenda a metade da largura de banda disponÃvel." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1249 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1350 msgid "View or change router bandwidth" msgstr "mostrar e mudar as preferências da largura de banda do roteador" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1253 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1354 msgid "Use open trackers also" msgstr "usar também rastreadores abertos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1257 -msgid "If checked, announce torrents to open trackers as well as the tracker listed in the torrent file" -msgstr "Se marcado, anunciar os torrents aos rastreadores abertos, assim como aos rastreadores listados no arquivo torrent" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1358 +msgid "" +"If checked, announce torrents to open trackers as well as the tracker listed " +"in the torrent file" +msgstr "" +"Se marcado, anunciar os torrentes aos rastreadores abertos, assim como aos " +"rastreadores listados no arquivo torrente" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1261 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1362 msgid "Open tracker announce URLs" msgstr "URL(s) para anunciar aos rastreadores abertos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1273 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1374 msgid "Inbound Settings" msgstr "Preferências de entrada" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1279 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1380 msgid "Outbound Settings" msgstr "Preferências de saida" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1286 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1388 msgid "I2CP host" msgstr "Anfitrião I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1393 msgid "I2CP port" msgstr "Porto I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1303 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1406 msgid "I2CP options" msgstr "Opções I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1308 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1411 msgid "Save configuration" msgstr "Guardar configuração" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1436 +#, java-format +msgid "Invalid magnet URL {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1470 +#, java-format +msgid "Invalid info hash in magnet URL {0}" +msgstr "" + #. * dummies for translation -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1325 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1500 #, java-format msgid "1 hop" msgid_plural "{0} hops" msgstr[0] "1 salto" msgstr[1] "{0} saltos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1326 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1501 #, java-format msgid "1 tunnel" msgid_plural "{0} tunnels" msgstr[0] "1 túnel" msgstr[1] "{0} túneles" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1480 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1663 +#, fuzzy +msgid "Completion" +msgstr "completo" + +#. else unknown +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1716 msgid "Size" msgstr "Tamanho" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1487 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1672 +#, fuzzy +msgid "Files" +msgstr "Arquivo" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1674 +msgid "Pieces" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1675 +msgid "Piece size" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697 +msgid "Magnet link" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1753 +msgid "Directory" +msgstr "Pasta" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1723 msgid "Priority" msgstr "Prioridade" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1492 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1728 msgid "Up to higher level directory" msgstr "Subir uma herarquia" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 -msgid "Directory" -msgstr "Pasta" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1522 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758 msgid "Torrent not found?" -msgstr "Não achei o arquivo torrent?" +msgstr "Não achei o arquivo torrente?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1767 msgid "File not found in torrent?" -msgstr "Arquivo não achado no torrent?" +msgstr "Arquivo não achado no torrente?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1543 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1780 msgid "complete" msgstr "completo" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1781 msgid "bytes remaining" msgstr "Bytes faltando" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1595 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806 +msgid "Open" +msgstr "abrir" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1832 msgid "High" msgstr "alta" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1837 msgid "Normal" msgstr "normal" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1605 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1842 msgid "Skip" msgstr "Ignorar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1614 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851 msgid "Save priorities" msgstr "Guardar prioridades" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1726 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1967 #, java-format msgid "Torrent fetched from {0}" -msgstr "Torrent obtido de {0}" +msgstr "torrente obtido de {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1746 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1989 #, java-format msgid "Torrent already running: {0}" -msgstr "Torrent já em marcha: {0}" +msgstr "torrente já em marcha: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1748 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1991 #, java-format msgid "Torrent already in the queue: {0}" -msgstr "Torrent já na cola: {0}" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1755 -#, java-format -msgid "Failed to copy torrent file to {0}" -msgstr "Não se pode copiar o torrent para {0}." +msgstr "torrente já na cola: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1759 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1997 #, java-format msgid "Torrent at {0} was not valid" -msgstr "Torrent em {0} não foi válido" +msgstr "torrente em {0} não foi válido" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1764 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2004 #, java-format msgid "Torrent was not retrieved from {0}" -msgstr "Não se pode obter torrent de {0}" +msgstr "Não se pode obter torrente de {0}" + +#~ msgid "Torrent file must originate from an I2P-based tracker" +#~ msgstr "O arquivo torrente tem que incluir um rastreador I2P." #~ msgid " theme locked and loaded." #~ msgstr "tema carregado" + #~ msgid "Hide All Attached Peers [connected/total in swarm]" -#~ msgstr "Ocultar todos os pares [conectados/total neste torrent]" +#~ msgstr "Ocultar todos os pares [conectados/total neste torrente]" + #~ msgid "Show All Attached Peers [connected/total in swarm]" -#~ msgstr "Mostrar todos os pares [conectados/total neste torrent]" +#~ msgstr "Mostrar todos os pares [conectados/total neste torrente]" + #~ msgid "Loaded Torrents" -#~ msgstr "Torrents carregados" +#~ msgstr "torrentes carregados" + #~ msgid "Estimated Download Time" #~ msgstr "tempo restante da descarga" + #~ msgid "1" #~ msgid_plural "{0}" #~ msgstr[0] "1" #~ msgstr[1] "{0}" + #~ msgid "Torrent file {0} does not exist" -#~ msgstr "Arquivo do torrent {0} não existe" +#~ msgstr "Arquivo do torrente {0} não existe" + #~ msgid "Copying torrent to {0}" -#~ msgstr "Copiando torrent para {0}" +#~ msgstr "Copiando torrente para {0}" + #~ msgid "from {0}" #~ msgstr "de {0}" + #~ msgid "Downloading" #~ msgstr "descarregando" -#~ msgid "File" -#~ msgstr "Arquivo" + #~ msgid "FileSize" #~ msgstr "Tamanho do arquivo" + #~ msgid "Download Status" #~ msgstr "Estado" #, fuzzy #~ msgid "size: {0}B" #~ msgstr "Tamaño: {0}Bytes" + #~ msgid "Directory to store torrents and data" -#~ msgstr "Carpeta para guardar los archivos torrent y los datos" +#~ msgstr "Carpeta para guardar os arquivos torrentes e os dados" + #~ msgid "Do not download" #~ msgstr "No descargues" + #~ msgid "Details" #~ msgstr "Detalles" + #~ msgid "Cannot change the I2CP settings while torrents are active" #~ msgstr "" #~ "No se puede cammbiar los ajustes I2CP mientras estén activos los torrents" + #~ msgid "Non-i2p tracker in \"{0}\", deleting it from our list of trackers!" #~ msgstr "" #~ "Rastreador fuera de I2P en \"{0}\", borrando de la lista de rastreadores" + #~ msgid "{0} torrents" -#~ msgstr "{0} Torrents" +#~ msgstr "{0} torrentes" + #~ msgid "Uninteresting" #~ msgstr "no interesante" + #~ msgid "Choked" #~ msgstr "frenado" + #~ msgid "Uninterested" #~ msgstr "desinteresado" + #~ msgid "Choking" #~ msgstr "frenando" + #~ msgid "Custom tracker URL" #~ msgstr "URL especial del rastreador" + #~ msgid "Configure" #~ msgstr "Ajustes" - diff --git a/apps/i2psnark/locale/messages_ru.po b/apps/i2psnark/locale/messages_ru.po index ed82ff35c9c065dcf7c797927f043ccf067fb41a..582446cde10c694432b7ca27d6c4f4734819cb5e 100644 --- a/apps/i2psnark/locale/messages_ru.po +++ b/apps/i2psnark/locale/messages_ru.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: I2P i2psnark\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-12-13 19:43+0000\n" -"PO-Revision-Date: 2010-12-16 00:10+0500\n" +"POT-Creation-Date: 2011-03-03 18:28+0000\n" +"PO-Revision-Date: 2011-02-15 22:27+0500\n" "Last-Translator: Hidden Z <hiddenz@mail.i2p>\n" "Language-Team: foo <foo@bar>\n" "Language: \n" @@ -17,320 +17,400 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Russian\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" -#: ../java/src/org/klomp/snark/SnarkManager.java:94 -#, java-format -msgid "Adding torrents in {0} minutes" -msgstr "Торренты будут подгружены через {0} минут(Ñ‹)" - -#: ../java/src/org/klomp/snark/SnarkManager.java:296 +#: ../java/src/org/klomp/snark/SnarkManager.java:307 #, java-format msgid "Total uploaders limit changed to {0}" msgstr "Ðовое значение лимита количеÑтва Ñлотов отдачи: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:298 +#: ../java/src/org/klomp/snark/SnarkManager.java:309 #, java-format msgid "Minimum total uploaders limit is {0}" msgstr "Минимально допуÑтимое значение Ð´Ð»Ñ ÐºÐ¾Ð»Ð¸Ñ‡ÐµÑтва Ñлотов: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:310 +#: ../java/src/org/klomp/snark/SnarkManager.java:321 #, java-format msgid "Up BW limit changed to {0}KBps" msgstr "Ðовое значение лимита ÑкороÑти отдачи: {0} KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:312 +#: ../java/src/org/klomp/snark/SnarkManager.java:323 #, java-format msgid "Minimum up bandwidth limit is {0}KBps" msgstr "Минимально допуÑтимое значение Ð´Ð»Ñ Ð»Ð¸Ð¼Ð¸Ñ‚Ð° ÑкороÑти отдачи: {0} KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:324 +#: ../java/src/org/klomp/snark/SnarkManager.java:335 #, java-format -msgid "Startup delay limit changed to {0} minutes" -msgstr "Ðовое значение задержки запуÑка: {0} минут(Ñ‹)" +msgid "Startup delay changed to {0}" +msgstr "Задержка запуÑка изменена на {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:371 +#: ../java/src/org/klomp/snark/SnarkManager.java:386 msgid "I2CP and tunnel changes will take effect after stopping all torrents" -msgstr "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ð°Ñтроек I2CP и туннелей вÑтупÑÑ‚ в Ñилу поÑле оÑтановки вÑех торрентов." +msgstr "" +"Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ð°Ñтроек I2CP и туннелей вÑтупÑÑ‚ в Ñилу поÑле оÑтановки вÑех " +"торрентов." -#: ../java/src/org/klomp/snark/SnarkManager.java:378 +#: ../java/src/org/klomp/snark/SnarkManager.java:393 msgid "Disconnecting old I2CP destination" msgstr "РаÑÑоединÑемÑÑ Ð¿Ð¾ Ñтарому адреÑу I2CP" -#: ../java/src/org/klomp/snark/SnarkManager.java:382 +#: ../java/src/org/klomp/snark/SnarkManager.java:397 #, java-format msgid "I2CP settings changed to {0}" msgstr "Ðовые параметры I2CP: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:386 -msgid "Unable to connect with the new settings, reverting to the old I2CP settings" -msgstr "Ðе удалоÑÑŒ ÑоединитьÑÑ Ñ Ð¸Ñпользованием новых наÑтроек I2CP, возвращаемÑÑ Ðº Ñтарым наÑтройкам" +#: ../java/src/org/klomp/snark/SnarkManager.java:402 +msgid "" +"Unable to connect with the new settings, reverting to the old I2CP settings" +msgstr "" +"Ðе удалоÑÑŒ ÑоединитьÑÑ Ñ Ð¸Ñпользованием новых наÑтроек I2CP, возвращаемÑÑ Ðº " +"Ñтарым наÑтройкам" -#: ../java/src/org/klomp/snark/SnarkManager.java:390 +#: ../java/src/org/klomp/snark/SnarkManager.java:406 msgid "Unable to reconnect with the old settings!" msgstr "Ðе удалоÑÑŒ переÑоединитьÑÑ Ñ Ð¸Ñпользованием Ñтарых наÑтроек I2CP!" -#: ../java/src/org/klomp/snark/SnarkManager.java:392 +#: ../java/src/org/klomp/snark/SnarkManager.java:408 msgid "Reconnected on the new I2CP destination" msgstr "ПереÑоединилиÑÑŒ по новому адреÑу I2CP" -#: ../java/src/org/klomp/snark/SnarkManager.java:403 +#: ../java/src/org/klomp/snark/SnarkManager.java:418 #, java-format msgid "I2CP listener restarted for \"{0}\"" msgstr "I2CP-приёмник перезапущен Ð´Ð»Ñ \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:414 +#: ../java/src/org/klomp/snark/SnarkManager.java:429 msgid "Enabled autostart" msgstr "ÐвтоÑтарт включен" -#: ../java/src/org/klomp/snark/SnarkManager.java:416 +#: ../java/src/org/klomp/snark/SnarkManager.java:431 msgid "Disabled autostart" msgstr "ÐвтоÑтарт выключен" -#: ../java/src/org/klomp/snark/SnarkManager.java:422 +#: ../java/src/org/klomp/snark/SnarkManager.java:437 msgid "Enabled open trackers - torrent restart required to take effect." -msgstr "Включено иÑпользование открытых трекеров. ТребуетÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк торрента, чтобы Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ñтупили в Ñилу." +msgstr "" +"Включено иÑпользование открытых трекеров. ТребуетÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк торрента, " +"чтобы Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ñтупили в Ñилу." -#: ../java/src/org/klomp/snark/SnarkManager.java:424 +#: ../java/src/org/klomp/snark/SnarkManager.java:439 msgid "Disabled open trackers - torrent restart required to take effect." -msgstr "Отключено иÑпользование открытых трекеров. ТребуетÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк торрента, чтобы Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ñтупили в Ñилу." +msgstr "" +"Отключено иÑпользование открытых трекеров. ТребуетÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк торрента, " +"чтобы Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ñтупили в Ñилу." -#: ../java/src/org/klomp/snark/SnarkManager.java:431 +#: ../java/src/org/klomp/snark/SnarkManager.java:447 msgid "Open Tracker list changed - torrent restart required to take effect." -msgstr "Изменен ÑпиÑок открытых трекеров. ТребуетÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк торрента, чтобы Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ñтупили в Ñилу." +msgstr "" +"Изменен ÑпиÑок открытых трекеров. ТребуетÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк торрента, чтобы " +"Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ñтупили в Ñилу." -#: ../java/src/org/klomp/snark/SnarkManager.java:438 +#: ../java/src/org/klomp/snark/SnarkManager.java:454 #, java-format msgid "{0} theme loaded, return to main i2psnark page to view." -msgstr "{0} тема загружена, вернитеÑÑŒ на оÑновную Ñтраницу i2psnark Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра." +msgstr "" +"{0} тема загружена, вернитеÑÑŒ на оÑновную Ñтраницу i2psnark Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра." -#: ../java/src/org/klomp/snark/SnarkManager.java:445 +#: ../java/src/org/klomp/snark/SnarkManager.java:461 msgid "Configuration unchanged." msgstr "ÐаÑтройки не изменилиÑÑŒ." -#: ../java/src/org/klomp/snark/SnarkManager.java:455 +#: ../java/src/org/klomp/snark/SnarkManager.java:471 #, java-format msgid "Unable to save the config to {0}" msgstr "Ðе удалоÑÑŒ Ñохранить наÑтройки в {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:494 +#: ../java/src/org/klomp/snark/SnarkManager.java:536 msgid "Connecting to I2P" msgstr "УÑтанавливаетÑÑ Ñоединение Ñ I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:497 +#: ../java/src/org/klomp/snark/SnarkManager.java:539 msgid "Error connecting to I2P - check your I2CP settings!" msgstr "Ошибка ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ I2P, проверьте наÑтройки I2CP!" -#: ../java/src/org/klomp/snark/SnarkManager.java:506 +#: ../java/src/org/klomp/snark/SnarkManager.java:548 #, java-format msgid "Error: Could not add the torrent {0}" msgstr "Ошибка: Ðе удалоÑÑŒ добавить торрент {0}" #. catch this here so we don't try do delete it below -#: ../java/src/org/klomp/snark/SnarkManager.java:528 +#: ../java/src/org/klomp/snark/SnarkManager.java:570 #, java-format msgid "Cannot open \"{0}\"" msgstr "Ðе удалоÑÑŒ открыть \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:541 +#. TODO - if the existing one is a magnet, delete it and add the metainfo instead? +#: ../java/src/org/klomp/snark/SnarkManager.java:586 +#: ../java/src/org/klomp/snark/SnarkManager.java:661 +#: ../java/src/org/klomp/snark/SnarkManager.java:716 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1976 #, java-format -msgid "Warning - Ignoring non-i2p tracker in \"{0}\", will announce to i2p open trackers only" -msgstr "Внимание: указанные в \"{0}\" не-i2p трекеры будут проигнорированы, будут иÑпользоватьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ открытые i2p трекеры" +msgid "Torrent with this info hash is already running: {0}" +msgstr "Торрент Ñ Ñ‚Ð°ÐºÐ¸Ð¼ info hash уже запущен: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:543 +#. addMessage(_("Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and DHT only.", info.getName())); +#: ../java/src/org/klomp/snark/SnarkManager.java:593 #, java-format -msgid "Warning - Ignoring non-i2p tracker in \"{0}\", and open trackers are disabled, you must enable open trackers before starting the torrent!" -msgstr "Внимание: указанные в \"{0}\" не-i2p трекеры будут проигнорированы, однако иÑпользование открытых i2p трекеров отключено, Ð’Ñ‹ должны включить поддержку открытых i2p трекеров перед запуÑком Ñтого торрента!" +msgid "" +"Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers " +"only." +msgstr "" +"Внимание - в \"{0}\" не найдено I2P трекеров, анонÑирование будет " +"производитьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ на открытых трекерах I2P." -#: ../java/src/org/klomp/snark/SnarkManager.java:563 +#. addMessage(_("Warning - No I2P trackers in \"{0}\", and DHT and open trackers are disabled, you should enable open trackers or DHT before starting the torrent.", info.getName())); +#: ../java/src/org/klomp/snark/SnarkManager.java:598 +#, java-format +msgid "" +"Warning - No I2P Trackers found in \"{0}\". Make sure Open Tracker is " +"enabled before starting this torrent." +msgstr "" +"Внимание - в \"{0}\" не найдено I2P трекеров. Перед запуÑком торрента " +"убедитеÑÑŒ, что иÑпользование открытых трекеров включено." + +#: ../java/src/org/klomp/snark/SnarkManager.java:619 #, java-format msgid "Torrent in \"{0}\" is invalid" msgstr "Торрент в \"{0}\" некорректен" -#: ../java/src/org/klomp/snark/SnarkManager.java:578 +#: ../java/src/org/klomp/snark/SnarkManager.java:624 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1999 +#, java-format +msgid "ERROR - Out of memory, cannot create torrent from {0}" +msgstr "ОШИБКР- нехватка памÑти, невозможно Ñоздать торрент из {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:635 #, java-format msgid "Torrent added and started: \"{0}\"" msgstr "Торрент добавлен и запущен: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:580 +#: ../java/src/org/klomp/snark/SnarkManager.java:637 #, java-format msgid "Torrent added: \"{0}\"" msgstr "Торрент добавлен: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:734 +#: ../java/src/org/klomp/snark/SnarkManager.java:672 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:490 +#, java-format +msgid "Fetching {0}" +msgstr "Получение торрента: {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:675 +#, java-format +msgid "" +"We have no saved peers and no other torrents are running. Fetch of {0} will " +"not succeed until you start another torrent." +msgstr "" +"Мы не имеем Ñохранённых пиров и нет других запущенных торрентов. Загрузка " +"{0} не будет уÑпешна пока вы не запуÑтите другой торрент." + +#: ../java/src/org/klomp/snark/SnarkManager.java:679 +#, java-format +msgid "Adding {0}" +msgstr "Добавление {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:726 +#: ../java/src/org/klomp/snark/SnarkManager.java:749 +#: ../java/src/org/klomp/snark/SnarkManager.java:1174 +#, java-format +msgid "Failed to copy torrent file to {0}" +msgstr "Ðе удалоÑÑŒ Ñкопировать торрент в: {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:972 #, java-format msgid "Too many files in \"{0}\" ({1}), deleting it!" msgstr "Слишком много файлов в торренте \"{0}\" ({1}), удалÑем его!" -#: ../java/src/org/klomp/snark/SnarkManager.java:736 +#: ../java/src/org/klomp/snark/SnarkManager.java:974 #, java-format msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!" -msgstr "Торрент \"{0}\" Ñодержит единÑтвенный файл заканчивающийÑÑ Ð½Ð° \".torrent\", удалÑем его!" +msgstr "" +"Торрент \"{0}\" Ñодержит единÑтвенный файл заканчивающийÑÑ Ð½Ð° \".torrent\", " +"удалÑем его!" -#: ../java/src/org/klomp/snark/SnarkManager.java:738 +#: ../java/src/org/klomp/snark/SnarkManager.java:976 #, java-format msgid "No pieces in \"{0}\", deleting it!" msgstr "Ð’ торренте \"{0}\" не оказалоÑÑŒ ни одной чаÑти, удалÑем его!" -#: ../java/src/org/klomp/snark/SnarkManager.java:740 +#: ../java/src/org/klomp/snark/SnarkManager.java:978 #, java-format msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!" msgstr "Слишком много чаÑтей в торренте \"{0}\" (наш предел {1}), удалÑем его!" -#: ../java/src/org/klomp/snark/SnarkManager.java:742 +#: ../java/src/org/klomp/snark/SnarkManager.java:980 #, java-format msgid "Pieces are too large in \"{0}\" ({1}B), deleting it." msgstr "Слишком крупные чаÑти в торренте \"{0}\" ({1}B), удалÑем его." -#: ../java/src/org/klomp/snark/SnarkManager.java:743 +#: ../java/src/org/klomp/snark/SnarkManager.java:981 #, java-format msgid "Limit is {0}B" msgstr "Ðаш предел {0}B" -#: ../java/src/org/klomp/snark/SnarkManager.java:751 +#: ../java/src/org/klomp/snark/SnarkManager.java:989 #, 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:767 +#: ../java/src/org/klomp/snark/SnarkManager.java:1005 #, java-format msgid "Error: Could not remove the torrent {0}" msgstr "Ошибка: Ðевозможно удалить торрент {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:794 +#: ../java/src/org/klomp/snark/SnarkManager.java:1026 +#: ../java/src/org/klomp/snark/SnarkManager.java:1044 #, java-format msgid "Torrent stopped: \"{0}\"" msgstr "Торрент оÑтановлен: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:814 +#: ../java/src/org/klomp/snark/SnarkManager.java:1065 #, java-format msgid "Torrent removed: \"{0}\"" msgstr "Торрент удален: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:852 +#: ../java/src/org/klomp/snark/SnarkManager.java:1073 +#, java-format +msgid "Adding torrents in {0}" +msgstr "Добавление торрентов через {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1122 #, java-format msgid "Download finished: {0}" msgstr "Закачка завершена: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:880 +#: ../java/src/org/klomp/snark/SnarkManager.java:1170 +#, java-format +msgid "Metainfo received for {0}" +msgstr "Метаданные получены Ð´Ð»Ñ {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1171 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:525 +#, java-format +msgid "Starting up torrent {0}" +msgstr "ЗапуÑкаем торрент: {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1225 msgid "Unable to connect to I2P!" msgstr "Ðе удалоÑÑŒ уÑтановить Ñоединение Ñ I2P!" -#: ../java/src/org/klomp/snark/SnarkManager.java:886 +#: ../java/src/org/klomp/snark/SnarkManager.java:1231 #, java-format msgid "Unable to add {0}" msgstr "Ðе удаётÑÑ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:185 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:205 msgid "I2PSnark - Anonymous BitTorrent Client" msgstr "I2PSnark — Ðнонимный BitTorrent Клиент" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:198 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:218 msgid "Torrents" msgstr "Торренты" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:201 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:208 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:977 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:221 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:228 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1028 msgid "I2PSnark" msgstr "I2PSnark" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:205 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:225 msgid "Refresh page" msgstr "Обновить Ñтраницу" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:210 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:230 msgid "Forum" msgstr "Форум" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:264 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1483 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:284 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1719 msgid "Status" msgstr "СтатуÑ" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:270 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:272 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:290 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:292 msgid "Hide Peers" msgstr "ÑпрÑтать ÑпиÑок пиров" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:277 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:279 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:297 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:299 msgid "Show Peers" msgstr "показать ÑпиÑок пиров" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:286 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1464 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1659 msgid "Torrent" msgstr "Торрент" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:290 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:310 msgid "Estimated time remaining" msgstr "Примерное оÑтавшееÑÑ Ð²Ñ€ÐµÐ¼Ñ" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313 msgid "ETA" msgstr "ОÑталоÑÑŒ" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:297 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317 msgid "Downloaded" msgstr "Получено" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:300 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:314 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:320 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:334 msgid "RX" msgstr "ПринÑто" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:304 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324 msgid "Uploaded" msgstr "Отдано" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:307 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:327 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:344 msgid "TX" msgstr "Отдано" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:312 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:332 msgid "Down Rate" msgstr "СкороÑÑ‚ÑŒ загрузки" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:337 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:346 msgid "Rate" msgstr "СкороÑÑ‚ÑŒ" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:322 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:342 msgid "Up Rate" msgstr "СкороÑÑ‚ÑŒ отдачи" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:340 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:365 msgid "Stop all torrents and the I2P tunnel" msgstr "ОÑтановить вÑе торренты и закрыть Ñоединение Ñ I2P" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:342 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:367 msgid "Stop All" msgstr "ОÑтановить вÑе" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:351 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:376 msgid "Start all torrents and the I2P tunnel" msgstr "ЗапуÑтить вÑе торренты и открыть Ñоединение Ñ I2P" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:353 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:378 msgid "Start All" msgstr "ЗапуÑтить вÑе" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:372 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:397 msgid "No torrents loaded." msgstr "Ðет загруженных торрентов." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:377 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:402 msgid "Totals" msgstr "Ð’Ñего" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:379 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:404 #, java-format msgid "1 torrent" msgid_plural "{0} torrents" @@ -338,7 +418,7 @@ msgstr[0] "{0} торрент" msgstr[1] "{0} торрента" msgstr[2] "{0} торрентов" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:382 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:407 #, java-format msgid "1 connected peer" msgid_plural "{0} connected peers" @@ -346,98 +426,101 @@ msgstr[0] "{0} подÑоединенный пир" msgstr[1] "{0} подÑоединенных пиров" msgstr[2] "{0} подÑоединенных пиров" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:454 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:496 #, java-format -msgid "Fetching {0}" -msgstr "Получение торрента: {0}" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:458 -msgid "Invalid URL - must start with http://" -msgstr "Ðекорректный URL, должен начинатьÑÑ Ñ http://" +msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"" +msgstr "" +"Ðекорректный URL: должен начинатьÑÑ Ñ \"http://\", \"{0}\", или \"{1}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:489 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:544 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571 #, java-format -msgid "Starting up torrent {0}" -msgstr "ЗапуÑкаем торрент: {0}" +msgid "Magnet deleted: {0}" +msgstr "Magnet удален: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:509 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:527 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:552 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:577 #, java-format msgid "Torrent file deleted: {0}" msgstr "Удален торрент: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:533 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:543 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:593 #, java-format msgid "Data file deleted: {0}" msgstr "Файл удален: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:535 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:545 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:595 #, java-format msgid "Data file could not be deleted: {0}" msgstr "Ðе удалоÑÑŒ удалить файл: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:554 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:604 #, java-format msgid "Data dir deleted: {0}" msgstr "Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð°: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:587 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:637 msgid "Error creating torrent - you must select a tracker" msgstr "Торрент не Ñоздан — вы должны указать трекер" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:602 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:653 #, java-format msgid "Torrent created for \"{0}\"" msgstr "Создан торрент Ð´Ð»Ñ \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:605 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:655 #, java-format -msgid "Many I2P trackers require you to register new torrents before seeding - please do so before starting \"{0}\"" -msgstr "Многие I2P трекеры требуют зарегиÑтрировать на них торрент перед началом раздачи — пожалуйÑта проверьте требуетÑÑ Ð»Ð¸ Ñто перед запуÑком \"{0}\"" +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:607 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:657 #, java-format msgid "Error creating a torrent for \"{0}\"" msgstr "Ошибка при Ñоздании торрента длÑ: \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:610 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:660 #, java-format msgid "Cannot create a torrent for the nonexistent data: {0}" -msgstr "Ðевозможно Ñоздать торрент Ð´Ð»Ñ Ð½ÐµÑущеÑтвующего файла или директории: {0}" +msgstr "" +"Ðевозможно Ñоздать торрент Ð´Ð»Ñ Ð½ÐµÑущеÑтвующего файла или директории: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:613 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:663 msgid "Error creating torrent - you must enter a file or directory" msgstr "Торрент не Ñоздан — вы должны указать файл или директорию" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:616 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:666 msgid "Stopping all torrents and closing the I2P tunnel." msgstr "ОÑтанавливаем вÑе торренты и закрываем Ñоединение Ñ I2P" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:627 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:677 msgid "I2P tunnel closed." msgstr "Соединение Ñ I2P закрыто." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:630 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680 msgid "Opening the I2P tunnel and starting all torrents." msgstr "СоединÑемÑÑ Ñ I2P и запуÑкаем вÑе торренты." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:759 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:764 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:770 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:803 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:808 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:814 msgid "Tracker Error" msgstr "Ошибка Трекера" # TODO should replace "uploader limit NN peers" with "global number of upload slots: NN" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:762 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:766 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:778 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:782 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:790 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:794 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:799 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:803 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:806 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:810 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:822 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:826 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:834 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:838 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:843 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:847 #, java-format msgid "1 peer" msgid_plural "{0} peers" @@ -445,279 +528,314 @@ msgstr[0] "{0} пир" msgstr[1] "{0} пира" msgstr[2] "{0} пиров" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:775 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:780 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:819 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:824 msgid "Seeding" msgstr "РаздаетÑÑ" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:784 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1533 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:828 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1665 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1770 msgid "Complete" msgstr "Завершен" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:787 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:792 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:831 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:836 msgid "OK" msgstr "ЗагружаетÑÑ" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:796 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:801 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:840 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:845 msgid "Stalled" msgstr "ПроÑтаивает" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:805 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:808 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:849 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:852 msgid "No Peers" msgstr "Ðет Пиров" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:810 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 msgid "Stopped" msgstr "ОÑтановлен" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:837 -#, java-format -msgid "Details at {0} tracker" -msgstr "Детали на трекере {0}" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:886 +msgid "Torrent details" +msgstr "ÐŸÐ¾Ð´Ñ€Ð¾Ð±Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:838 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:898 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1160 msgid "Info" msgstr "ИнформациÑ" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:853 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:913 msgid "View files" msgstr "Открыть директорию" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:855 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:915 msgid "Open file" msgstr "Открыть файл" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:865 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1569 -msgid "Open" -msgstr "Открыть" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:909 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:957 msgid "Stop the torrent" msgstr "ОÑтановить торрент" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:911 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:959 msgid "Stop" msgstr "ОÑтановить" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:921 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:969 msgid "Start the torrent" msgstr "ЗапуÑтить торрент" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:923 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:971 msgid "Start" msgstr "ЗапуÑтить" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:933 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:982 msgid "Remove the torrent from the active list, deleting the .torrent file" msgstr "Удалить торрент из ÑпиÑка и Ñ Ð´Ð¸Ñка" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quite must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:938 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:987 #, java-format -msgid "Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded data will not be deleted) ?" -msgstr "Ð’Ñ‹ дейÑтвительно хотите удалить \\''{0}.torrent\\''? (загруженные файлы удалÑÑ‚ÑŒÑÑ ÐЕ будут)" +msgid "" +"Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded " +"data will not be deleted) ?" +msgstr "" +"Ð’Ñ‹ дейÑтвительно хотите удалить \\''{0}.torrent\\''? (загруженные файлы " +"удалÑÑ‚ÑŒÑÑ ÐЕ будут)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:941 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:990 msgid "Remove" msgstr "Удалить" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:950 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1001 msgid "Delete the .torrent file and the associated data file(s)" msgstr "Удалить торрент и Ñтереть загруженные файлы" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quite must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:955 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1006 #, java-format -msgid "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded data?" -msgstr "Ð’Ñ‹ дейÑтвительно хотите удалить торрент \\''{0}\\'' и вÑе загруженные файлы?" +msgid "" +"Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded " +"data?" +msgstr "" +"Ð’Ñ‹ дейÑтвительно хотите удалить торрент \\''{0}\\'' и вÑе загруженные файлы?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1009 msgid "Delete" msgstr "Стереть" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:991 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042 msgid "Unknown" msgstr "ÐеизвеÑтный" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1001 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1054 msgid "Seed" msgstr "Сид" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1019 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1077 msgid "Uninteresting (The peer has no pieces we need)" msgstr "Uninteresting (У пира нет нужных нам чаÑтей торрента)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1021 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1079 msgid "Choked (The peer is not allowing us to request pieces)" msgstr "Choked (Ðтот пир не позволÑет нам запрашивать чаÑти торрента)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1035 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1099 msgid "Uninterested (We have no pieces the peer needs)" msgstr "Uninterested (У Ð½Ð°Ñ Ð½ÑƒÐ¶Ð½Ñ‹Ñ… Ñтому пиру чаÑтей торрента)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1037 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1101 msgid "Choking (We are not allowing the peer to request pieces)" msgstr "Choking (Мы не позволÑем Ñтому пиру запрашивать у Ð½Ð°Ñ Ñ‡Ð°Ñти торрента)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1092 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1159 +#, java-format +msgid "Details at {0} tracker" +msgstr "Детали на трекере {0}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1188 msgid "Add Torrent" msgstr "Добавить Торрент" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1094 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190 msgid "From URL" msgstr "Из URL" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1097 -msgid "Torrent file must originate from an I2P-based tracker" -msgstr "Торрент-файл должен быть Ñ I2P-трекера" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1193 +msgid "" +"Enter the torrent file download URL (I2P only), magnet link, or maggot link" +msgstr "" +"Введите URL (только I2P) Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸ торрент-файла, magnet-ÑÑылку, или " +"maggot-ÑÑылку" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1102 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1198 msgid "Add torrent" msgstr "Добавить торрент" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1105 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1201 #, java-format msgid "You can also copy .torrent files to: {0}." msgstr "Либо вы можете проÑто Ñкопировать .torrent-файлы в директорию {0}." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1107 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1203 msgid "Removing a .torrent will cause it to stop." msgstr "Удаление .torrent-файла приведёт к оÑтановке торрента." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1131 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1226 msgid "Create Torrent" msgstr "Создать Торрент" #. out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br>\n"); -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1134 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 msgid "Data to seed" msgstr "Файлы Ð´Ð»Ñ Ñ€Ð°Ð·Ð´Ð°Ñ‡Ð¸" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1138 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233 msgid "File or directory to seed (must be within the specified path)" -msgstr "Файл или Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð´Ð»Ñ Ñ€Ð°Ð·Ð´Ð°Ñ‡Ð¸ (вводите только название файла или директории, указание абÑолютных путей не поддерживаетÑÑ)" +msgstr "" +"Файл или Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð´Ð»Ñ Ñ€Ð°Ð·Ð´Ð°Ñ‡Ð¸ (вводите только название файла или " +"директории, указание абÑолютных путей не поддерживаетÑÑ)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1140 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1235 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684 msgid "Tracker" msgstr "Трекер" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1142 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237 msgid "Select a tracker" msgstr "Выбрать трекер" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1155 +#. out.write(_("Open trackers and DHT only")); +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1242 +msgid "Open trackers only" +msgstr "Только открытые трекеры" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1257 msgid "or" msgstr "или" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1158 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1260 msgid "Specify custom tracker announce URL" msgstr "Задать URL анонÑера вручную" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1161 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1263 msgid "Create torrent" msgstr "Создать торрент" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1180 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1317 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1281 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1420 msgid "Configuration" msgstr "ÐаÑтройки" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1184 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1285 msgid "Data directory" msgstr "Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð²" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1186 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1287 msgid "Edit i2psnark.config and restart to change" -msgstr "Ð”Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€ÑƒÐ¹Ñ‚Ðµ файл i2psnark.config и перезагрузите I2PSnark" +msgstr "" +"Ð”Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€ÑƒÐ¹Ñ‚Ðµ файл i2psnark.config и перезагрузите I2PSnark" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291 msgid "Auto start" msgstr "ÐвтозапуÑк" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1194 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1295 msgid "If checked, automatically start torrents that are added" msgstr "ÐвтоматичеÑки запуÑкать торренты поÑле добавлениÑ" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1198 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1299 msgid "Theme" msgstr "Тема" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1211 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1312 msgid "Startup delay" msgstr "Задержка запуÑка" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1213 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1314 msgid "minutes" msgstr "минут" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1338 msgid "Total uploader limit" msgstr "Ограничение количеÑтва Ñлотов отдачи" # TODO should replace "uploader limit NN peers" with "global number of upload slots: NN" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1341 msgid "peers" msgstr "пиров" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1244 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1345 msgid "Up bandwidth limit" msgstr "Ограничение ÑкороÑти отдачи" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1247 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1348 msgid "Half available bandwidth recommended." -msgstr "РекомендуетÑÑ Ð¸Ñпользовать половину от доÑтупной пропуÑкной ÑпоÑобноÑти." +msgstr "" +"РекомендуетÑÑ Ð¸Ñпользовать половину от доÑтупной пропуÑкной ÑпоÑобноÑти." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1249 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1350 msgid "View or change router bandwidth" msgstr "ПоÑмотреть/наÑтроить Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ ÑкороÑти в маршрутизаторе I2P" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1253 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1354 msgid "Use open trackers also" msgstr "Дополнительно иÑпользовать открытые трекеры" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1257 -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:1358 +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:1261 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1362 msgid "Open tracker announce URLs" msgstr "URL открытых трекеров" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1273 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1374 msgid "Inbound Settings" msgstr "ВходÑщие туннели" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1279 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1380 msgid "Outbound Settings" msgstr "ИÑходÑщие туннели" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1286 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1388 msgid "I2CP host" msgstr "ÐÐ´Ñ€ÐµÑ I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1393 msgid "I2CP port" msgstr "Порт I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1303 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1406 msgid "I2CP options" msgstr "Параметры I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1308 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1411 msgid "Save configuration" msgstr "Сохранить наÑтройки" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1436 +#, java-format +msgid "Invalid magnet URL {0}" +msgstr "Ðеправильный magnet URL {0}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1470 +#, java-format +msgid "Invalid info hash in magnet URL {0}" +msgstr "Ðеправильный info hash в magnet URL {0}" + #. * dummies for translation -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1325 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1500 #, java-format msgid "1 hop" msgid_plural "{0} hops" @@ -725,7 +843,7 @@ msgstr[0] "{0} хоп" msgstr[1] "{0} хопа" msgstr[2] "{0} хопов" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1326 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1501 #, java-format msgid "1 tunnel" msgid_plural "{0} tunnels" @@ -733,86 +851,111 @@ msgstr[0] "{0} туннель" msgstr[1] "{0} туннелÑ" msgstr[2] "{0} туннелей" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1480 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1663 +msgid "Completion" +msgstr "Загружено" + +#. else unknown +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1716 msgid "Size" msgstr "Размер" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1487 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1672 +msgid "Files" +msgstr "Файлов" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1674 +msgid "Pieces" +msgstr "ЧаÑти" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1675 +msgid "Piece size" +msgstr "Размер чаÑти" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697 +msgid "Magnet link" +msgstr "Magnet ÑÑылка" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1753 +msgid "Directory" +msgstr "ДиректориÑ" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1723 msgid "Priority" msgstr "Приоритет" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1492 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1728 msgid "Up to higher level directory" msgstr "Перейти в директорию уровнем выше" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 -msgid "Directory" -msgstr "ДиректориÑ" - # This debug error message intentionally left in English -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1522 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758 msgid "Torrent not found?" msgstr "Torrent not found?" # This debug error message intentionally left in English -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1767 msgid "File not found in torrent?" msgstr "File not found in torrent?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1543 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1780 msgid "complete" msgstr "Ñкачано" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1781 msgid "bytes remaining" msgstr "байт оÑталоÑÑŒ" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1595 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806 +msgid "Open" +msgstr "Открыть" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1832 msgid "High" msgstr "Ð’Ñ‹Ñокий" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1837 msgid "Normal" msgstr "Ðормальный" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1605 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1842 msgid "Skip" msgstr "ПропуÑтить" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1614 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851 msgid "Save priorities" msgstr "Сохранить приоритеты" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1726 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1967 #, java-format msgid "Torrent fetched from {0}" msgstr "Получен торрент из: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1746 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1989 #, java-format msgid "Torrent already running: {0}" msgstr "Торрент уже запущен: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1748 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1991 #, java-format msgid "Torrent already in the queue: {0}" msgstr "Торрент уже в очереди: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1755 -#, java-format -msgid "Failed to copy torrent file to {0}" -msgstr "Ðе удалоÑÑŒ Ñкопировать торрент в: {0}" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1759 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1997 #, java-format msgid "Torrent at {0} was not valid" msgstr "Торрент полученный из {0} некорректен" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1764 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2004 #, java-format msgid "Torrent was not retrieved from {0}" msgstr "Ðе удалоÑÑŒ получить торрент из: {0}" +#~ msgid "Torrent file must originate from an I2P-based tracker" +#~ msgstr "Торрент-файл должен быть Ñ I2P-трекера" + #~ msgid "size: {0}B" #~ msgstr "размер: {0}B" @@ -831,9 +974,6 @@ msgstr "Ðе удалоÑÑŒ получить торрент из: {0}" #~ msgid "Downloading" #~ msgstr "Идёт загрузка" -#~ msgid "File" -#~ msgstr "Файл" - #~ msgid "FileSize" #~ msgstr "Размер Файла" diff --git a/apps/i2psnark/locale/messages_zh.po b/apps/i2psnark/locale/messages_zh.po index b649d8c589e5bc2f7e0ca0a90f6b16faa08d619f..6fb391d1c3aa8cc28c9369b3c5c811323558274c 100644 --- a/apps/i2psnark/locale/messages_zh.po +++ b/apps/i2psnark/locale/messages_zh.po @@ -8,814 +8,1088 @@ msgid "" msgstr "" "Project-Id-Version: I2P i2psnark\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-04 02:45+0000\n" -"PO-Revision-Date: 2010-10-04 12:00+0800\n" -"Last-Translator: walking <walking@mail.i2p>\n" +"POT-Creation-Date: 2011-03-03 18:28+0000\n" +"PO-Revision-Date: 2011-02-20 15:26+0800\n" +"Last-Translator: \n" "Language-Team: foo <foo@bar>\n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Chinese\n" "Plural-Forms: nplurals=1; plural=0\n" -#: ../java/src/org/klomp/snark/SnarkManager.java:88 -#, java-format -msgid "Adding torrents in {0} minutes" -msgstr "{0}分钟内完æˆæ·»åŠ " - -#: ../java/src/org/klomp/snark/SnarkManager.java:258 +#: ../java/src/org/klomp/snark/SnarkManager.java:307 #, java-format msgid "Total uploaders limit changed to {0}" msgstr "æ€»ä¸Šä¼ ç§åæ•°é™åˆ¶å·²æ›´æ–°ä¸º{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:260 +#: ../java/src/org/klomp/snark/SnarkManager.java:309 #, java-format msgid "Minimum total uploaders limit is {0}" msgstr "æœ€ä½Žä¸Šä¼ ç§åæ•°é™åˆ¶ä¸º{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:272 +#: ../java/src/org/klomp/snark/SnarkManager.java:321 #, java-format msgid "Up BW limit changed to {0}KBps" msgstr "ä¸Šä¼ å¸¦å®½é™åˆ¶æ”¹ä¸º {0} KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:274 +#: ../java/src/org/klomp/snark/SnarkManager.java:323 #, java-format msgid "Minimum up bandwidth limit is {0}KBps" msgstr "最å°ä¸Šä¼ 带宽é™åˆ¶ä¸º {0} KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:286 +#: ../java/src/org/klomp/snark/SnarkManager.java:335 #, java-format -msgid "Startup delay limit changed to {0} minutes" -msgstr "å¯åŠ¨å»¶è¿Ÿå·²æ›´æ–°ä¸º{0}" +msgid "Startup delay changed to {0}" +msgstr "下载å‰çš„延迟已更新为{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:333 +#: ../java/src/org/klomp/snark/SnarkManager.java:386 msgid "I2CP and tunnel changes will take effect after stopping all torrents" msgstr "I2CP与隧é“设置的å˜åŒ–在所有ç§ååœæ¢åŽæ‰èƒ½ç”Ÿæ•ˆ" -#: ../java/src/org/klomp/snark/SnarkManager.java:339 +#: ../java/src/org/klomp/snark/SnarkManager.java:393 msgid "Disconnecting old I2CP destination" msgstr "æ£åœ¨æ–开旧的I2CPç›®æ ‡" -#: ../java/src/org/klomp/snark/SnarkManager.java:343 +#: ../java/src/org/klomp/snark/SnarkManager.java:397 #, java-format msgid "I2CP settings changed to {0}" msgstr "I2CP设置改为{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:347 -msgid "Unable to connect with the new settings, reverting to the old I2CP settings" +#: ../java/src/org/klomp/snark/SnarkManager.java:402 +msgid "" +"Unable to connect with the new settings, reverting to the old I2CP settings" msgstr "æ— æ³•é€šè¿‡æ–°è®¾ç½®è¿žæŽ¥ï¼Œæ¢å¤I2CP的旧设置" -#: ../java/src/org/klomp/snark/SnarkManager.java:351 +#: ../java/src/org/klomp/snark/SnarkManager.java:406 msgid "Unable to reconnect with the old settings!" msgstr "æ—§è®¾ç½®ä¹Ÿæ— æ³•è¿žæŽ¥ï¼" -#: ../java/src/org/klomp/snark/SnarkManager.java:353 +#: ../java/src/org/klomp/snark/SnarkManager.java:408 msgid "Reconnected on the new I2CP destination" msgstr "é‡æ–°è¿žæŽ¥æ–°I2CPç›®æ ‡" -#: ../java/src/org/klomp/snark/SnarkManager.java:364 +#: ../java/src/org/klomp/snark/SnarkManager.java:418 #, java-format msgid "I2CP listener restarted for \"{0}\"" msgstr "\"{0}\"çš„I2CP监å¬ç«¯å£å·²å¯åŠ¨" -#: ../java/src/org/klomp/snark/SnarkManager.java:375 +#: ../java/src/org/klomp/snark/SnarkManager.java:429 msgid "Enabled autostart" msgstr "å¯ç”¨è‡ªåŠ¨å¯åŠ¨" -#: ../java/src/org/klomp/snark/SnarkManager.java:377 +#: ../java/src/org/klomp/snark/SnarkManager.java:431 msgid "Disabled autostart" msgstr "ç¦ç”¨è‡ªåŠ¨å¯åŠ¨" -#: ../java/src/org/klomp/snark/SnarkManager.java:383 +#: ../java/src/org/klomp/snark/SnarkManager.java:437 msgid "Enabled open trackers - torrent restart required to take effect." msgstr "å¯ç”¨OpenTracker-é‡æ–°å¯åŠ¨ç§ååŽç”Ÿæ•ˆ" -#: ../java/src/org/klomp/snark/SnarkManager.java:385 +#: ../java/src/org/klomp/snark/SnarkManager.java:439 msgid "Disabled open trackers - torrent restart required to take effect." msgstr "ç¦ç”¨OpenTracker - é‡æ–°å¯åŠ¨ç§ååŽç”Ÿæ•ˆ" -#: ../java/src/org/klomp/snark/SnarkManager.java:392 +#: ../java/src/org/klomp/snark/SnarkManager.java:447 msgid "Open Tracker list changed - torrent restart required to take effect." msgstr "OpenTrackeråˆ—è¡¨å·²æ”¹å˜ - é‡æ–°å¯åŠ¨ç§ååŽç”Ÿæ•ˆ" -#: ../java/src/org/klomp/snark/SnarkManager.java:399 +#: ../java/src/org/klomp/snark/SnarkManager.java:454 +#, java-format +msgid "{0} theme loaded, return to main i2psnark page to view." +msgstr "{0} ä¸»é¢˜å·²åŠ è½½ï¼Œæµè§ˆæ•ˆæžœè¯·åˆ° i2psnark 主页。" + +#: ../java/src/org/klomp/snark/SnarkManager.java:461 msgid "Configuration unchanged." msgstr "设置未改å˜" -#: ../java/src/org/klomp/snark/SnarkManager.java:409 +#: ../java/src/org/klomp/snark/SnarkManager.java:471 #, java-format msgid "Unable to save the config to {0}" msgstr "æ— æ³•ä¿å˜è®¾ç½®åˆ°{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:445 +#: ../java/src/org/klomp/snark/SnarkManager.java:536 msgid "Connecting to I2P" msgstr "æ£åœ¨è¿žæŽ¥åˆ°I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:448 +#: ../java/src/org/klomp/snark/SnarkManager.java:539 msgid "Error connecting to I2P - check your I2CP settings!" msgstr "连接I2Pæ—¶å‘生错误 - 请检查I2CP设置!" -#: ../java/src/org/klomp/snark/SnarkManager.java:457 +#: ../java/src/org/klomp/snark/SnarkManager.java:548 #, java-format msgid "Error: Could not add the torrent {0}" msgstr "é”™è¯¯ï¼šæ— æ³•æ·»åŠ ç§å{0}" #. catch this here so we don't try do delete it below -#: ../java/src/org/klomp/snark/SnarkManager.java:479 +#: ../java/src/org/klomp/snark/SnarkManager.java:570 #, java-format msgid "Cannot open \"{0}\"" msgstr "æ— æ³•æ‰“å¼€ \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:492 +#. TODO - if the existing one is a magnet, delete it and add the metainfo instead? +#: ../java/src/org/klomp/snark/SnarkManager.java:586 +#: ../java/src/org/klomp/snark/SnarkManager.java:661 +#: ../java/src/org/klomp/snark/SnarkManager.java:716 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1976 +#, java-format +msgid "Torrent with this info hash is already running: {0}" +msgstr "具有相åŒHash链接的ç§å已在下载ä¸:{0}" + +#. addMessage(_("Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and DHT only.", info.getName())); +#: ../java/src/org/klomp/snark/SnarkManager.java:593 #, java-format -msgid "Warning - Ignoring non-i2p tracker in \"{0}\", will announce to i2p open trackers only" -msgstr "è¦å‘Š - 忽略\"{0}\"文件ä¸I2P网络外的TrackeræœåŠ¡å™¨ï¼Œæ–‡ä»¶å°†ä»…å‘布至 I2P 内的 Open Tracker æœåŠ¡å™¨ã€‚" +msgid "" +"Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers " +"only." +msgstr "" +"æ示 - “{0}â€æ–‡ä»¶ä¸ä¸åŒ…å« I2P TrackeræœåŠ¡å™¨ï¼Œæ–‡ä»¶å°†ä»…å‘布至 I2P çš„ Open " +"Tracker 。" -#: ../java/src/org/klomp/snark/SnarkManager.java:494 +#. addMessage(_("Warning - No I2P trackers in \"{0}\", and DHT and open trackers are disabled, you should enable open trackers or DHT before starting the torrent.", info.getName())); +#: ../java/src/org/klomp/snark/SnarkManager.java:598 #, java-format -msgid "Warning - Ignoring non-i2p tracker in \"{0}\", and open trackers are disabled, you must enable open trackers before starting the torrent!" -msgstr "è¦å‘Š - 忽略\"{0}\"文件ä¸I2P网络外的TrackeræœåŠ¡å™¨ï¼ŒOpenTrackerå·²ç¦ç”¨ï¼Œå¯åŠ¨æ¤ç§åå‰æ‚¨å¿…é¡»å¯ç”¨OpenTracker。" +msgid "" +"Warning - No I2P Trackers found in \"{0}\". Make sure Open Tracker is " +"enabled before starting this torrent." +msgstr "" +"è¦å‘Š -“{0}â€ä¸ä¸åŒ…å« I2P Tracker æœåŠ¡å™¨ï¼Œä¸‹è½½æ¤ç§å请先å¯ç”¨ Open Tracker。" -#: ../java/src/org/klomp/snark/SnarkManager.java:513 +#: ../java/src/org/klomp/snark/SnarkManager.java:619 #, java-format msgid "Torrent in \"{0}\" is invalid" msgstr "æ— æ•ˆç§å \"{0}\" " -#: ../java/src/org/klomp/snark/SnarkManager.java:528 +#: ../java/src/org/klomp/snark/SnarkManager.java:624 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1999 +#, java-format +msgid "ERROR - Out of memory, cannot create torrent from {0}" +msgstr "错误: 内å˜ä¸è¶³ï¼Œæ— 法为 {0} 创建ç§å。" + +#: ../java/src/org/klomp/snark/SnarkManager.java:635 #, java-format msgid "Torrent added and started: \"{0}\"" msgstr "å·²æ·»åŠ å¹¶å¯åŠ¨ç§å:\"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:530 +#: ../java/src/org/klomp/snark/SnarkManager.java:637 #, java-format msgid "Torrent added: \"{0}\"" msgstr "å·²æ·»åŠ ç§å:\"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:627 +#: ../java/src/org/klomp/snark/SnarkManager.java:672 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:490 +#, java-format +msgid "Fetching {0}" +msgstr "æ£åœ¨èŽ·å–{0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:675 +#, java-format +msgid "" +"We have no saved peers and no other torrents are running. Fetch of {0} will " +"not succeed until you start another torrent." +msgstr "" +"程åºè¿˜ä¸çŸ¥é“其他客户端的å˜åœ¨ï¼Œç›®å‰ä¹Ÿæ²¡æœ‰å…¶ä»–ç§åæ£åœ¨è¿è¡Œã€‚在您å¯åŠ¨å…¶ä»–ç§åå‰" +"文件 {0} æ— æ³•æˆåŠŸä¸‹è½½ã€‚" + +#: ../java/src/org/klomp/snark/SnarkManager.java:679 +#, java-format +msgid "Adding {0}" +msgstr "æ£åœ¨æ·»åŠ {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:726 +#: ../java/src/org/klomp/snark/SnarkManager.java:749 +#: ../java/src/org/klomp/snark/SnarkManager.java:1174 +#, java-format +msgid "Failed to copy torrent file to {0}" +msgstr "æ— æ³•å¤åˆ¶ç§å文件到{0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:972 #, java-format msgid "Too many files in \"{0}\" ({1}), deleting it!" msgstr "\"{0}\" ({1}) å«æœ‰å¤ªå¤šæ–‡ä»¶ï¼Œåˆ 除之!" -#: ../java/src/org/klomp/snark/SnarkManager.java:629 +#: ../java/src/org/klomp/snark/SnarkManager.java:974 #, java-format msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!" msgstr "ç§å文件 \"{0}\" ä¸ä»¥ \".torrent\"结尾,æ£åœ¨åˆ 除ï¼" -#: ../java/src/org/klomp/snark/SnarkManager.java:631 +#: ../java/src/org/klomp/snark/SnarkManager.java:976 #, java-format msgid "No pieces in \"{0}\", deleting it!" msgstr "\"{0}\" ä¸æ²¡æœ‰æ•°æ®ç‰‡ï¼Œåˆ 除之!" -#: ../java/src/org/klomp/snark/SnarkManager.java:633 +#: ../java/src/org/klomp/snark/SnarkManager.java:978 #, java-format msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!" msgstr "\"{0}\" ä¸æ–‡ä»¶åˆ†ç‰‡å¤ªå¤šï¼Œé™é¢ä¸º{1}ï¼Œåˆ é™¤ä¹‹ï¼" -#: ../java/src/org/klomp/snark/SnarkManager.java:635 +#: ../java/src/org/klomp/snark/SnarkManager.java:980 #, java-format msgid "Pieces are too large in \"{0}\" ({1}B), deleting it." msgstr "\"{0}\" ({1}B) ä¸æ–‡ä»¶åˆ†ç‰‡è¿‡å¤§ï¼Œåˆ 除之。" -#: ../java/src/org/klomp/snark/SnarkManager.java:636 +#: ../java/src/org/klomp/snark/SnarkManager.java:981 #, java-format msgid "Limit is {0}B" msgstr "é™é¢ä¸º {0}B" -#: ../java/src/org/klomp/snark/SnarkManager.java:644 +#: ../java/src/org/klomp/snark/SnarkManager.java:989 #, 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:660 +#: ../java/src/org/klomp/snark/SnarkManager.java:1005 #, java-format msgid "Error: Could not remove the torrent {0}" msgstr "错误:æ— æ³•åˆ é™¤ç§å{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:681 +#: ../java/src/org/klomp/snark/SnarkManager.java:1026 +#: ../java/src/org/klomp/snark/SnarkManager.java:1044 #, java-format msgid "Torrent stopped: \"{0}\"" msgstr "ç§åå·²åœæ¢:\"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:696 +#: ../java/src/org/klomp/snark/SnarkManager.java:1065 #, java-format msgid "Torrent removed: \"{0}\"" msgstr "ç§åå·²åˆ é™¤:\"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:729 +#: ../java/src/org/klomp/snark/SnarkManager.java:1073 +#, java-format +msgid "Adding torrents in {0}" +msgstr "{0} 分钟内完æˆæ·»åŠ " + +#: ../java/src/org/klomp/snark/SnarkManager.java:1122 #, java-format -msgid "Download finished: \"{0}\"" -msgstr "下载已完æˆ:\"{0}\"" +msgid "Download finished: {0}" +msgstr "下载已完æˆ: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:729 +#: ../java/src/org/klomp/snark/SnarkManager.java:1170 #, java-format -msgid "size: {0}B" -msgstr "大å°:{0}B" +msgid "Metainfo received for {0}" +msgstr "已获得 {0} çš„ Metainfo" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1171 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:525 +#, java-format +msgid "Starting up torrent {0}" +msgstr "æ£åœ¨å¯åŠ¨ç§å{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:757 +#: ../java/src/org/klomp/snark/SnarkManager.java:1225 msgid "Unable to connect to I2P!" msgstr "æ— æ³•è¿žæŽ¥è‡³I2P!" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:174 +#: ../java/src/org/klomp/snark/SnarkManager.java:1231 +#, java-format +msgid "Unable to add {0}" +msgstr "æ·»åŠ {0}失败" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:205 msgid "I2PSnark - Anonymous BitTorrent Client" msgstr "I2PSnark - 匿åBitTorrent客户端" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:185 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:218 msgid "Torrents" msgstr "ç§å" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:187 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:837 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:221 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:228 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1028 msgid "I2PSnark" -msgstr "" +msgstr "I2PSnark" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:191 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:225 msgid "Refresh page" msgstr "刷新页é¢" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:193 -msgid "<img border=\"0\" src=\"/themes/console/snark/images/arrow_refresh.png\"> I2PSnark" -msgstr "" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:195 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:230 msgid "Forum" msgstr "论å›" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:240 -msgid "<img border=\"0\" src=\"/themes/console/snark/images/status.png\" title=\"Torrent Status\">Status" -msgstr "<img border=\"0\" src=\"/themes/console/snark/images/status.png\" title=\"ç§å状æ€\">状æ€" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:246 -msgid "<img border=\"0\" src=\"/themes/console/snark/images/showpeers.png\" title=\"Toggle Peer Visibility\" alt=\"Hide Peers\">" -msgstr "<img border=\"0\" src=\"/themes/console/snark/images/showpeers.png\" title=\"éšè—节点\" alt=\"éšè—节点\">" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:284 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1719 +msgid "Status" +msgstr "状æ€" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:249 -msgid "<img border=\"0\" src=\"/themes/console/snark/images/hidepeers.png\" title=\"Toggle Peer Visibility\" alt=\"Show Peers\">" -msgstr "<img border=\"0\" src=\"/themes/console/snark/images/hidepeers.png\" title=\"显示节点\" alt=\"显示节点\">" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:290 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:292 +msgid "Hide Peers" +msgstr "éšè—用户" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:254 -msgid "<img border=\"0\" src=\"/themes/console/snark/images/torrent.png\" title=\"Loaded Torrents\">Torrent" -msgstr "<img border=\"0\" src=\"/themes/console/snark/images/torrent.png\" title=\"载入的ç§å\">ç§å" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:256 -msgid "<img border=\"0\" src=\"/themes/console/snark/images/eta.png\" title=\"Estimated Download Time\">ETA" -msgstr "<img border=\"0\" src=\"/themes/console/snark/images/eta.png\" title=\"预计剩余时间\">预计剩余时间" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:258 -msgid "<img border=\"0\" src=\"/themes/console/images/inbound.png\" title=\"Data Downloaded\">RX" -msgstr "<img border=\"0\" src=\"/themes/console/images/inbound.png\" title=\"下载数æ®é‡\">下载" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:297 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:299 +msgid "Show Peers" +msgstr "显示用户" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:260 -msgid "<img border=\"0\" src=\"/themes/console/images/outbound.png\" title=\"Data Uploaded\">TX" -msgstr "<img border=\"0\" src=\"/themes/console/images/outbound.png\" title=\"ä¸Šä¼ æ•°æ®é‡\">ä¸Šä¼ " +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1659 +msgid "Torrent" +msgstr "ç§å" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:262 -msgid "<img border=\"0\" src=\"/themes/console/images/inbound.png\" title=\"Download Speed\">Rate" -msgstr "<img border=\"0\" src=\"/themes/console/images/inbound.png\" title=\"下载速度\">下载速度" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:310 +msgid "Estimated time remaining" +msgstr "预计剩余时间" + +#. Translators: Please keep short or translate as " " +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313 +msgid "ETA" +msgstr "预计剩余时间" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317 +msgid "Downloaded" +msgstr "已下载" + +#. Translators: Please keep short or translate as " " +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:320 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:334 +msgid "RX" +msgstr "已接收" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324 +msgid "Uploaded" +msgstr "å·²ä¸Šä¼ " + +#. Translators: Please keep short or translate as " " +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:327 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:344 +msgid "TX" +msgstr "å·²å‘é€" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:332 +msgid "Down Rate" +msgstr "下载速度" + +#. Translators: Please keep short or translate as " " +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:337 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:346 +msgid "Rate" +msgstr "速度" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:264 -msgid "<img border=\"0\" src=\"/themes/console/images/outbound.png\" title=\"Upload Speed\">Rate" -msgstr "<img border=\"0\" src=\"/themes/console/images/outbound.png\" title=\"ä¸Šä¼ é€Ÿåº¦\">ä¸Šä¼ é€Ÿåº¦" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:342 +msgid "Up Rate" +msgstr "ä¸Šä¼ é€Ÿåº¦" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:271 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:365 msgid "Stop all torrents and the I2P tunnel" msgstr "åœæ¢å…¨éƒ¨ç§ååŠI2P隧é“" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:273 -msgid "<img src=\"/themes/console/snark/images/stop_all.png\" title=\"Stop All Torrents\" alt=\"Stop All\">" -msgstr "<img src=\"/themes/console/snark/images/stop_all.png\" title=\"全部åœæ¢\" alt=\"全部åœæ¢\">" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:367 +msgid "Stop All" +msgstr "åœæ¢å…¨éƒ¨" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:278 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:376 msgid "Start all torrents and the I2P tunnel" msgstr "å¯åŠ¨å…¨éƒ¨ç§ååŠI2P隧é“" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:280 -msgid "<img src=\"/themes/console/snark/images/start_all.png\" title=\"Start All Torrents\" alt=\"Start All\">" -msgstr "<img src=\"/themes/console/snark/images/start_all.png\" title=\"全部开始\" alt=\"全部开始\">" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:378 +msgid "Start All" +msgstr "å¯åŠ¨å…¨éƒ¨" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:297 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:397 msgid "No torrents loaded." msgstr "未载入任何ç§å" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:302 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:402 msgid "Totals" msgstr "总计" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:304 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:404 #, java-format msgid "1 torrent" msgid_plural "{0} torrents" msgstr[0] "{0}个ç§å" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:307 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:407 #, java-format msgid "1 connected peer" msgid_plural "{0} connected peers" msgstr[0] "{0}个已连接用户" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:336 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:496 #, java-format -msgid "Torrent file {0} does not exist" -msgstr "ç§å文件{0}ä¸å˜åœ¨" +msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"" +msgstr "æ— æ•ˆé“¾æŽ¥ - 链接必须以“http://â€ï¼Œâ€œ{0}â€æˆ–“{1}â€å¼€å¤´" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:346 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1481 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:544 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571 #, java-format -msgid "Torrent already running: {0}" -msgstr "ç§åå·²å¯åŠ¨:{0}" +msgid "Magnet deleted: {0}" +msgstr "Magnet å·²åˆ é™¤:{0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:348 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1483 -#, java-format -msgid "Torrent already in the queue: {0}" -msgstr "ç§å排队ä¸:{0}" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:352 -#, java-format -msgid "Copying torrent to {0}" -msgstr "æ£åœ¨å¤åˆ¶ç§å到{0}" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:355 -#, java-format -msgid "Unable to copy the torrent to {0}" -msgstr "æ— æ³•å¤åˆ¶ç§å文件到{0}" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:355 -#, java-format -msgid "from {0}" -msgstr "æ¥æº{0}" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:363 -#, java-format -msgid "Fetching {0}" -msgstr "æ£åœ¨èŽ·å–{0}" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:367 -msgid "Invalid URL - must start with http://" -msgstr "æ— æ•ˆé“¾æŽ¥ - 必须以http:// 开头" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:397 -#, java-format -msgid "Starting up torrent {0}" -msgstr "æ£åœ¨å¯åŠ¨ç§å{0}" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:417 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:435 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:552 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:577 #, java-format msgid "Torrent file deleted: {0}" msgstr "ç§åæ–‡ä»¶å·²åˆ é™¤:{0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:441 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:593 #, java-format msgid "Data file deleted: {0}" msgstr "æ•°æ®æ–‡ä»¶å·²åˆ 除:{0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:443 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:453 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:595 #, java-format msgid "Data file could not be deleted: {0}" msgstr "æ— æ³•åˆ é™¤æ•°æ®æ–‡ä»¶:{0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:462 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:604 #, java-format msgid "Data dir deleted: {0}" msgstr "æ•°æ®æ–‡ä»¶å¤¹å·²åˆ 除:{0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:494 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:637 msgid "Error creating torrent - you must select a tracker" msgstr "创建ç§åæ—¶å‘生错误 - 您必须选择一个Tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:509 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:653 #, java-format msgid "Torrent created for \"{0}\"" msgstr "ç§å创建æˆåŠŸ\"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:512 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:655 #, java-format -msgid "Many I2P trackers require you to register new torrents before seeding - please do so before starting \"{0}\"" -msgstr "多数I2PTracker需è¦ç”¨æˆ·åœ¨åšç§å‰æ³¨å†Œæ–°ç§å - 请在å¯åŠ¨ \"{0}\"å‰åˆ°æ‰€ä½¿ç”¨çš„Tracker进行注册。" +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:514 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:657 #, java-format msgid "Error creating a torrent for \"{0}\"" msgstr "创建ç§åæ—¶å‘生错误 \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:517 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:660 #, java-format msgid "Cannot create a torrent for the nonexistent data: {0}" msgstr "æ— æ³•ä¸ºä¸å˜åœ¨çš„æ•°æ®æ–‡ä»¶åˆ›å»ºç§å:{0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:520 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:663 msgid "Error creating torrent - you must enter a file or directory" msgstr "创建ç§åæ—¶å‘生错误 - 必须指定文件或文件夹" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:523 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:666 msgid "Stopping all torrents and closing the I2P tunnel." msgstr "æ£åœ¨åœç”¨æ‰€æœ‰ç§å并关é—I2P隧é“。" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:532 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:677 msgid "I2P tunnel closed." msgstr "I2P隧é“已关é—" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:535 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680 msgid "Opening the I2P tunnel and starting all torrents." msgstr "æ£åœ¨æ‰“å¼€I2P隧é“并å¯åŠ¨æ‰€æœ‰ç§å" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:657 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:851 -msgid "Unknown" -msgstr "未知" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:660 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:665 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:670 -msgid "TrackerErr" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:803 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:808 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:814 +msgid "Tracker Error" msgstr "Tracker错误" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:663 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:666 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:677 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:688 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:691 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:696 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:806 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:810 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:822 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:826 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:834 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:838 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:843 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:847 #, java-format msgid "1 peer" msgid_plural "{0} peers" msgstr[0] "{0}个用户" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:674 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:679 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:819 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:824 msgid "Seeding" msgstr "æ£åšç§" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:682 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1317 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:828 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1665 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1770 msgid "Complete" msgstr "完æˆ" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:685 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:690 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:831 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:836 msgid "OK" msgstr "确定" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:693 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:698 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:840 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:845 msgid "Stalled" msgstr "ç‰å¾…" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:701 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:849 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:852 msgid "No Peers" msgstr "没有用户" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:703 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 msgid "Stopped" msgstr "å·²åœç”¨" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:718 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:886 +msgid "Torrent details" +msgstr "ç§å详情" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:898 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1160 +msgid "Info" +msgstr "ä¿¡æ¯" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:913 msgid "View files" msgstr "æµè§ˆæ–‡ä»¶" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:720 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:915 msgid "Open file" msgstr "打开文件" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:750 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:967 -msgid "Tracker" -msgstr "TrackeræœåŠ¡å™¨" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:751 -msgid "<img border=\"0\" src=\"/themes/console/snark/images/details.png\">" -msgstr "" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:785 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:957 msgid "Stop the torrent" msgstr "åœæ¢ç§å" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:787 -msgid "<img src=\"/themes/console/snark/images/stop.png\" title=\"Stop Torrent\" alt=\"Stop\">" -msgstr "<img src=\"/themes/console/snark/images/stop.png\" title=\"åœæ¢ä¸‹è½½\" alt=\"åœæ¢\">" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:959 +msgid "Stop" +msgstr "åœæ¢" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:793 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:969 msgid "Start the torrent" msgstr "å¯åŠ¨ç§å" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:795 -msgid "<img src=\"/themes/console/snark/images/start.png\" title=\"Start Torrent\" alt=\"Start\">" -msgstr "<img src=\"/themes/console/snark/images/start.png\" title=\"开始下载\" alt=\"开始\">" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:971 +msgid "Start" +msgstr "å¯åŠ¨" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:800 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:982 msgid "Remove the torrent from the active list, deleting the .torrent file" msgstr "å–æ¶ˆä¸‹è½½ä»»åŠ¡å¹¶åˆ é™¤å¯¹åº”ç§å文件。" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quite must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:805 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:987 #, java-format -msgid "Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded data will not be deleted) ?" +msgid "" +"Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded " +"data will not be deleted) ?" msgstr "您确定è¦åˆ 除文件“{0}.torrentâ€(下载的数æ®æ–‡ä»¶ä¸ä¼šè¢«åˆ 除)?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:807 -msgid "<img src=\"/themes/console/snark/images/remove.png\" title=\"Remove Torrent\" alt=\"Remove\">" -msgstr "<img src=\"/themes/console/snark/images/remove.png\" title=\"åˆ é™¤ç§å\" alt=\"åˆ é™¤ç§å\">" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:990 +msgid "Remove" +msgstr "移除" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1001 msgid "Delete the .torrent file and the associated data file(s)" msgstr "åˆ é™¤ç§ååŠæ‰€ä¸‹è½½çš„文件" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quite must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:816 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1006 #, java-format -msgid "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded data?" +msgid "" +"Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded " +"data?" msgstr "您确定è¦åˆ 除ç§å“{0}â€(下载的数æ®æ–‡ä»¶ä¼šä¸€å¹¶è¢«åˆ 除)?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:818 -msgid "<img src=\"/themes/console/snark/images/delete.png\" title=\"Delete Torrent + Data\" alt=\"Delete\">" -msgstr "<img src=\"/themes/console/snark/images/delete.png\" title=\"åˆ é™¤ç§å + æ•°æ®\" alt=\"åˆ é™¤ç§å + æ•°æ®\">" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1009 +msgid "Delete" +msgstr "åˆ é™¤" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:861 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042 +msgid "Unknown" +msgstr "未知" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1054 msgid "Seed" msgstr "ç§å" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:879 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1077 msgid "Uninteresting (The peer has no pieces we need)" msgstr "æ— éœ€è¦éƒ¨åˆ†" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:881 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1079 msgid "Choked (The peer is not allowing us to request pieces)" msgstr "æ‹’ç»è¯·æ±‚" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:895 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1099 msgid "Uninterested (We have no pieces the peer needs)" msgstr "æ— éœ€è¦éƒ¨åˆ†" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:897 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1101 msgid "Choking (We are not allowing the peer to request pieces)" msgstr "æ‹’ç»è¯·æ±‚" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:927 -msgid "<img border=\"0\" src=\"/themes/console/snark/images/add.png\">Add Torrent" -msgstr "<img border=\"0\" src=\"/themes/console/snark/images/add.png\">æ·»åŠ ç§å" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1159 +#, java-format +msgid "Details at {0} tracker" +msgstr "Tracker {0} 上的详细信æ¯" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:929 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1188 +msgid "Add Torrent" +msgstr "æ·»åŠ ç§å" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190 msgid "From URL" msgstr "从URL" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:934 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1193 +msgid "" +"Enter the torrent file download URL (I2P only), magnet link, or maggot link" +msgstr "请输入输入 torrent 文件下载链接(ä»…é™.i2p)ã€magnet 链接或 maggot 链接" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1198 msgid "Add torrent" msgstr "æ·»åŠ ç§å" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:937 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1201 #, java-format -msgid "You can also copy .torrent files to: <code>{0}" -msgstr "或者您å¯ä»¥å°†.torrent文件å¤åˆ¶åˆ°<code>{0}." +msgid "You can also copy .torrent files to: {0}." +msgstr "您也å¯ä»¥å°†.torrent文件å¤åˆ¶åˆ°: {0}." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:939 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1203 msgid "Removing a .torrent will cause it to stop." msgstr "åˆ é™¤ç§å文件将导致该下载任务ä¸æ¢ã€‚" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 -msgid "<img border=\"0\" src=\"/themes/console/snark/images/create.png\">Create Torrent" -msgstr "<img border=\"0\" src=\"/themes/console/snark/images/create.png\">创建ç§å" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1226 +msgid "Create Torrent" +msgstr "创建ç§å" #. out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br>\n"); -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:961 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 msgid "Data to seed" msgstr "åšç§æ•°æ®" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:965 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233 msgid "File or directory to seed (must be within the specified path)" msgstr "åšç§æ–‡ä»¶æˆ–文件夹(必须下é¢ä¸ºSnark指定的文件夹ä¸)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:969 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1235 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684 +msgid "Tracker" +msgstr "TrackeræœåŠ¡å™¨" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237 msgid "Select a tracker" msgstr "选择一个Tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:982 -msgid "or " -msgstr "或 " +#. out.write(_("Open trackers and DHT only")); +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1242 +msgid "Open trackers only" +msgstr "仅通过 Open Trackerå‘布链接" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1257 +msgid "or" +msgstr "或" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:985 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1260 msgid "Specify custom tracker announce URL" msgstr "指定Open Trackerå‘布链接" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:988 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1263 msgid "Create torrent" msgstr "创建ç§å" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1006 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1133 -msgid "<img border=\"0\" src=\"/themes/console/snark/images/config.png\">Configuration" -msgstr "<img border=\"0\" src=\"/themes/console/snark/images/config.png\">设置" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1281 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1420 +msgid "Configuration" +msgstr "设置" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1009 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1285 msgid "Data directory" msgstr "æ•°æ®æ–‡ä»¶å¤¹" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1012 -msgid "Directory to store torrents and data" -msgstr "ç§ååŠè¢«åšç§æ–‡ä»¶çš„ä¿å˜ä½ç½®ã€‚" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1014 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1287 msgid "Edit i2psnark.config and restart to change" msgstr "编辑 i2psnark.config 并é‡å¯SnarkåŽç”Ÿæ•ˆ" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1018 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291 msgid "Auto start" msgstr "自动å¯åŠ¨" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1022 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1295 msgid "If checked, automatically start torrents that are added" msgstr "选ä¸åŽSnark将自动å¯åŠ¨å·²æ·»åŠ 的所有ç§å。" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1026 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1299 +msgid "Theme" +msgstr "主题" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1312 msgid "Startup delay" msgstr "å¯åŠ¨å»¶è¿Ÿ" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1028 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1314 msgid "minutes" msgstr "分" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1052 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1338 msgid "Total uploader limit" msgstr "é™åˆ¶æ€»ä¸Šä¼ ç§å数为" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1055 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1341 msgid "peers" msgstr "用户" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1059 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1345 msgid "Up bandwidth limit" msgstr "ä¸Šä¼ å¸¦å®½é™åˆ¶" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1062 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1348 msgid "Half available bandwidth recommended." msgstr "推è设置为å¯ç”¨å¸¦å®½çš„一åŠã€‚" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1064 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1350 msgid "View or change router bandwidth" msgstr "æµè§ˆæˆ–修改路由器带宽" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1354 msgid "Use open trackers also" msgstr "åŒæ—¶ä½¿ç”¨OpenTracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1072 -msgid "If checked, announce torrents to open trackers as well as the tracker listed in the torrent file" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1358 +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:1076 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1362 msgid "Open tracker announce URLs" msgstr "Open Trackerå‘布链接" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1088 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1374 msgid "Inbound Settings" msgstr "入站设置" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1094 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1380 msgid "Outbound Settings" msgstr "出站设置" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1101 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1388 msgid "I2CP host" msgstr "I2CP主机" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1106 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1393 msgid "I2CP port" msgstr "I2CP端å£" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1118 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1406 msgid "I2CP options" msgstr "I2CP选项" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1124 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1411 msgid "Save configuration" msgstr "ä¿å˜è®¾ç½®" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1436 +#, java-format +msgid "Invalid magnet URL {0}" +msgstr "ç£æ€§é“¾æŽ¥ {0} æ— æ•ˆ" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1470 +#, java-format +msgid "Invalid info hash in magnet URL {0}" +msgstr "magnetç£æ€§é“¾æŽ¥â€œ{0}â€ä¸çš„hashä¿¡æ¯æœ‰è¯¯ã€‚" + #. * dummies for translation -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1141 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1500 #, java-format msgid "1 hop" msgid_plural "{0} hops" msgstr[0] "{0}è·³" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1142 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1501 #, java-format msgid "1 tunnel" msgid_plural "{0} tunnels" msgstr[0] "{0}隧é“" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271 -msgid "Torrent" -msgstr "ç§å" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1663 +msgid "Completion" +msgstr "完æˆ" + +#. else unknown +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1716 +msgid "Size" +msgstr "大å°" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1672 +msgid "Files" +msgstr "文件" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1278 -msgid "<img border=\"0\" src=\"/themes/console/snark/images/file.png\" title=\"File\" alt=\"File\"> " -msgstr "<img border=\"0\" src=\"/themes/console/snark/images/file.png\" title=\"文件\" alt=\"文件\"> " +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1674 +msgid "Pieces" +msgstr "分å—æ•°é‡" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1278 -msgid "<img border=\"0\" src=\"/themes/console/snark/images/size.png\" title=\"FileSize\" alt=\"FileSize\">Size" -msgstr "<img border=\"0\" src=\"/themes/console/snark/images/size.png\" title=\"文件大å°\" alt=\"文件大å°\">大å°" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1675 +msgid "Piece size" +msgstr "分å—大å°" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1279 -msgid "<img border=\"0\" src=\"/themes/console/snark/images/status.png\" title=\"Download Status\">Status" -msgstr "<img border=\"0\" src=\"/themes/console/snark/images/status.png\" title=\"下载状æ€\">状æ€" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697 +msgid "Magnet link" +msgstr "Magnetç£æ€§é“¾æŽ¥" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1301 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1753 msgid "Directory" msgstr "文件夹" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1306 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1723 +msgid "Priority" +msgstr "优先级" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1728 +msgid "Up to higher level directory" +msgstr "上一层文件夹" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758 msgid "Torrent not found?" msgstr "ç§å未找到" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1314 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1767 msgid "File not found in torrent?" msgstr "ç§åä¸æ²¡æœ‰å‘现文件?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1320 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1780 msgid "complete" msgstr "完æˆ" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1321 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1781 msgid "bytes remaining" msgstr "剩余å—节数" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1373 -msgid "Up to higher level directory" -msgstr "上一层文件夹" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806 +msgid "Open" +msgstr "打开" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1832 +msgid "High" +msgstr "高" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1837 +msgid "Normal" +msgstr "普通" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1461 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1842 +msgid "Skip" +msgstr "跳过" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851 +msgid "Save priorities" +msgstr "ä¿å˜ä¼˜å…ˆçº§" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1967 #, java-format msgid "Torrent fetched from {0}" msgstr "从{0}获å–ç§åæˆåŠŸ" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1989 +#, java-format +msgid "Torrent already running: {0}" +msgstr "ç§åå·²å¯åŠ¨:{0}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1991 +#, java-format +msgid "Torrent already in the queue: {0}" +msgstr "ç§å排队ä¸:{0}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1997 #, java-format msgid "Torrent at {0} was not valid" msgstr "{0}çš„ç§åä¸æœ‰é”™è¯¯" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1494 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2004 #, java-format msgid "Torrent was not retrieved from {0}" msgstr "从{0}获得ç§å失败" -#~ msgid "Status" -#~ msgstr "状æ€" -#~ msgid "Hide Peers" -#~ msgstr "éšè—用户" -#~ msgid "Show Peers" -#~ msgstr "显示用户" -#~ msgid "ETA" -#~ msgstr "预计剩余时间" -#~ msgid "Downloaded" -#~ msgstr "已下载" -#~ msgid "Uploaded" -#~ msgstr "å·²ä¸Šä¼ " -#~ msgid "Down Rate" -#~ msgstr "下载速度" -#~ msgid "Up Rate" -#~ msgstr "ä¸Šä¼ é€Ÿåº¦" -#~ msgid "Stop All" -#~ msgstr "åœæ¢å…¨éƒ¨" -#~ msgid "Start All" -#~ msgstr "å¯åŠ¨å…¨éƒ¨" +#~ msgid "Torrent file must originate from an I2P-based tracker" +#~ msgstr "ç§å文件必须æ¥åœ¨I2P内网ä¸çš„TrackeræœåŠ¡å™¨ã€‚" + +#~ msgid "size: {0}B" +#~ msgstr "大å°:{0}B" + +#~ msgid "" +#~ "<img border=\"0\" src=\"/themes/console/snark/images/status.png\" title=" +#~ "\"Torrent Status\">Status" +#~ msgstr "" +#~ "<img border=\"0\" src=\"/themes/console/snark/images/status.png\" title=" +#~ "\"ç§å状æ€\">状æ€" + +#~ msgid "" +#~ "<img border=\"0\" src=\"/themes/console/snark/images/showpeers.png\" " +#~ "title=\"Toggle Peer Visibility\" alt=\"Hide Peers\">" +#~ msgstr "" +#~ "<img border=\"0\" src=\"/themes/console/snark/images/showpeers.png\" " +#~ "title=\"éšè—节点\" alt=\"éšè—节点\">" + +#~ msgid "" +#~ "<img border=\"0\" src=\"/themes/console/snark/images/hidepeers.png\" " +#~ "title=\"Toggle Peer Visibility\" alt=\"Show Peers\">" +#~ msgstr "" +#~ "<img border=\"0\" src=\"/themes/console/snark/images/hidepeers.png\" " +#~ "title=\"显示节点\" alt=\"显示节点\">" + +#~ msgid "" +#~ "<img border=\"0\" src=\"/themes/console/snark/images/torrent.png\" title=" +#~ "\"Loaded Torrents\">Torrent" +#~ msgstr "" +#~ "<img border=\"0\" src=\"/themes/console/snark/images/torrent.png\" title=" +#~ "\"载入的ç§å\">ç§å" + +#~ msgid "" +#~ "<img border=\"0\" src=\"/themes/console/snark/images/eta.png\" title=" +#~ "\"Estimated Download Time\">ETA" +#~ msgstr "" +#~ "<img border=\"0\" src=\"/themes/console/snark/images/eta.png\" title=\"预" +#~ "计剩余时间\">预计剩余时间" + +#~ msgid "" +#~ "<img border=\"0\" src=\"/themes/console/images/inbound.png\" title=\"Data " +#~ "Downloaded\">RX" +#~ msgstr "" +#~ "<img border=\"0\" src=\"/themes/console/images/inbound.png\" title=\"下载" +#~ "æ•°æ®é‡\">下载" + +#~ msgid "" +#~ "<img border=\"0\" src=\"/themes/console/images/outbound.png\" title=" +#~ "\"Data Uploaded\">TX" +#~ msgstr "" +#~ "<img border=\"0\" src=\"/themes/console/images/outbound.png\" title=\"ä¸Šä¼ " +#~ "æ•°æ®é‡\">ä¸Šä¼ " + +#~ msgid "" +#~ "<img border=\"0\" src=\"/themes/console/images/inbound.png\" title=" +#~ "\"Download Speed\">Rate" +#~ msgstr "" +#~ "<img border=\"0\" src=\"/themes/console/images/inbound.png\" title=\"下载" +#~ "速度\">下载速度" + +#~ msgid "" +#~ "<img border=\"0\" src=\"/themes/console/images/outbound.png\" title=" +#~ "\"Upload Speed\">Rate" +#~ msgstr "" +#~ "<img border=\"0\" src=\"/themes/console/images/outbound.png\" title=\"ä¸Šä¼ " +#~ "速度\">ä¸Šä¼ é€Ÿåº¦" + +#~ msgid "" +#~ "<img src=\"/themes/console/snark/images/stop_all.png\" title=\"Stop All " +#~ "Torrents\" alt=\"Stop All\">" +#~ msgstr "" +#~ "<img src=\"/themes/console/snark/images/stop_all.png\" title=\"全部åœæ¢\" " +#~ "alt=\"全部åœæ¢\">" + +#~ msgid "" +#~ "<img src=\"/themes/console/snark/images/start_all.png\" title=\"Start All " +#~ "Torrents\" alt=\"Start All\">" +#~ msgstr "" +#~ "<img src=\"/themes/console/snark/images/start_all.png\" title=\"全部开始" +#~ "\" alt=\"全部开始\">" + +#~ msgid "Torrent file {0} does not exist" +#~ msgstr "ç§å文件{0}ä¸å˜åœ¨" + +#~ msgid "Copying torrent to {0}" +#~ msgstr "æ£åœ¨å¤åˆ¶ç§å到{0}" + +#~ msgid "from {0}" +#~ msgstr "æ¥æº{0}" + +#~ msgid "" +#~ "<img src=\"/themes/console/snark/images/stop.png\" title=\"Stop Torrent\" " +#~ "alt=\"Stop\">" +#~ msgstr "" +#~ "<img src=\"/themes/console/snark/images/stop.png\" title=\"åœæ¢ä¸‹è½½\" alt=" +#~ "\"åœæ¢\">" + +#~ msgid "" +#~ "<img src=\"/themes/console/snark/images/start.png\" title=\"Start Torrent" +#~ "\" alt=\"Start\">" +#~ msgstr "" +#~ "<img src=\"/themes/console/snark/images/start.png\" title=\"开始下载\" " +#~ "alt=\"开始\">" + +#~ msgid "" +#~ "<img src=\"/themes/console/snark/images/remove.png\" title=\"Remove " +#~ "Torrent\" alt=\"Remove\">" +#~ msgstr "" +#~ "<img src=\"/themes/console/snark/images/remove.png\" title=\"åˆ é™¤ç§å\" " +#~ "alt=\"åˆ é™¤ç§å\">" + +#~ msgid "" +#~ "<img src=\"/themes/console/snark/images/delete.png\" title=\"Delete " +#~ "Torrent + Data\" alt=\"Delete\">" +#~ msgstr "" +#~ "<img src=\"/themes/console/snark/images/delete.png\" title=\"åˆ é™¤ç§å + æ•°" +#~ "æ®\" alt=\"åˆ é™¤ç§å + æ•°æ®\">" + +#~ msgid "" +#~ "<img border=\"0\" src=\"/themes/console/snark/images/add.png\">Add Torrent" +#~ msgstr "" +#~ "<img border=\"0\" src=\"/themes/console/snark/images/add.png\">æ·»åŠ ç§å" + +#~ msgid "" +#~ "<img border=\"0\" src=\"/themes/console/snark/images/create.png\">Create " +#~ "Torrent" +#~ msgstr "" +#~ "<img border=\"0\" src=\"/themes/console/snark/images/create.png\">创建ç§å" + +#~ msgid "or " +#~ msgstr "或 " + +#~ msgid "" +#~ "<img border=\"0\" src=\"/themes/console/snark/images/config.png" +#~ "\">Configuration" +#~ msgstr "" +#~ "<img border=\"0\" src=\"/themes/console/snark/images/config.png\">设置" + +#~ msgid "Directory to store torrents and data" +#~ msgstr "ç§ååŠè¢«åšç§æ–‡ä»¶çš„ä¿å˜ä½ç½®ã€‚" + +#~ msgid "" +#~ "<img border=\"0\" src=\"/themes/console/snark/images/file.png\" title=" +#~ "\"File\" alt=\"File\"> " +#~ msgstr "" +#~ "<img border=\"0\" src=\"/themes/console/snark/images/file.png\" title=\"æ–‡" +#~ "件\" alt=\"文件\"> " + +#~ msgid "" +#~ "<img border=\"0\" src=\"/themes/console/snark/images/size.png\" title=" +#~ "\"FileSize\" alt=\"FileSize\">Size" +#~ msgstr "" +#~ "<img border=\"0\" src=\"/themes/console/snark/images/size.png\" title=\"æ–‡" +#~ "件大å°\" alt=\"文件大å°\">大å°" + +#~ msgid "" +#~ "<img border=\"0\" src=\"/themes/console/snark/images/status.png\" title=" +#~ "\"Download Status\">Status" +#~ msgstr "" +#~ "<img border=\"0\" src=\"/themes/console/snark/images/status.png\" title=" +#~ "\"下载状æ€\">状æ€" + #~ msgid "Details" #~ msgstr "详情" -#~ msgid "Stop" -#~ msgstr "åœæ¢" -#~ msgid "Start" -#~ msgstr "å¯åŠ¨" -#~ msgid "Remove" -#~ msgstr "移除" -#~ msgid "Delete" -#~ msgstr "åˆ é™¤" -#~ msgid "Add Torrent" -#~ msgstr "æ·»åŠ ç§å" -#~ msgid "Create Torrent" -#~ msgstr "创建ç§å" -#~ msgid "or" -#~ msgstr "或" -#~ msgid "Configuration" -#~ msgstr "设置" -#~ msgid "File" -#~ msgstr "文件" -#~ msgid "Size" -#~ msgstr "大å°" + #~ msgid "Cannot change the I2CP settings while torrents are active" #~ msgstr "æ£åœ¨ä¸‹è½½/ä¸Šä¼ ï¼Œæ— æ³•æ›´æ”¹I2CP设置" + #~ msgid "{0} torrents" #~ msgstr "{0} 个ç§å" + #~ msgid "Non-i2p tracker in \"{0}\", deleting it from our list of trackers!" #~ msgstr "" #~ "ã€åŒ¿å性è¦å‘Šã€‘\"{0}\" ä¸å«æœ‰éžI2P Tracker,程åºå°†ä»ŽTracker列表ä¸å°†å…¶åˆ 除。" + #~ msgid "Custom tracker URL" #~ msgstr "自定义TrackerURL" + #~ msgid "Configure" #~ msgstr "设置" - diff --git a/apps/i2ptunnel/java/bmsg.sh b/apps/i2ptunnel/java/bmsg.sh deleted file mode 100644 index b9d294b32336537241eb2f9953fb65673c93b524..0000000000000000000000000000000000000000 --- a/apps/i2ptunnel/java/bmsg.sh +++ /dev/null @@ -1,17 +0,0 @@ -# -# Update messages_xx.po and messages_xx.class files, -# from both java and jsp sources. -# Requires installed programs xgettext, msgfmt, msgmerge, and find. -# zzz - public domain -# - -## launching sh.exe with -login parameter will open a shell with the current path always pointing to \bin\ -## need to cd into our orignal path - where we call sh.exe from. - -cd $CALLFROM -## echo $PWD - -## except this everything is the same with bundle-message.sh -## walking - public domain :-D - -source bundle-messages.sh $PARAS \ No newline at end of file diff --git a/apps/i2ptunnel/java/build.xml b/apps/i2ptunnel/java/build.xml index f50fadd3e17a6aea43abd6aedc651ca34c7a3e4c..56ca6f30b08a6c63702aec839aba8968c1954e12 100644 --- a/apps/i2ptunnel/java/build.xml +++ b/apps/i2ptunnel/java/build.xml @@ -28,6 +28,7 @@ srcdir="./src" debug="true" deprecation="on" source="1.5" target="1.5" destdir="./build/obj" + includeAntRuntime="false" classpath="../../../core/java/build/i2p.jar:../../ministreaming/java/build/mstreaming.jar" > <compilerarg line="${javac.compilerargs}" /> </javac> @@ -36,27 +37,47 @@ <!-- TODO: Move the web classes from the jar to the war - they are not part of the API - This will require sponge to rewrite some seedless stuff that uses it. --> - <target name="jar" depends="builddep, compile"> + <target name="jar" depends="builddep, compile, jarUpToDate" unless="jar.uptodate" > + <exec executable="mtn" outputproperty="workspace.changes.j" errorproperty="mtn.error2" failifexecutionfails="false" > + <arg value="list" /> + <arg value="changed" /> + <arg value="." /> + </exec> + <!-- \n in an attribute value generates an invalid manifest --> + <exec executable="tr" inputstring="${workspace.changes.j}" outputproperty="workspace.changes.j.tr" errorproperty="mtn.error2" failifexecutionfails="false" > + <arg value="-s" /> + <arg value="[:space:]" /> + <arg value="," /> + </exec> <jar destfile="./build/i2ptunnel.jar" basedir="./build/obj" includes="**/*.class"> <manifest> <attribute name="Main-Class" value="net.i2p.i2ptunnel.I2PTunnel" /> <attribute name="Class-Path" value="i2p.jar mstreaming.jar" /> + <attribute name="Build-Date" value="${build.timestamp}" /> + <attribute name="Base-Revision" value="${workspace.version}" /> + <attribute name="Workspace-Changes" value="${workspace.changes.j.tr}" /> </manifest> </jar> </target> + <target name="jarUpToDate"> + <uptodate property="jar.uptodate" targetfile="build/i2ptunnel.jar" > + <srcfiles dir= "build/obj" includes="**/*.class" /> + </uptodate> + </target> + <target name="bundle" depends="compile, precompilejsp"> <!-- Update the messages_*.po files. We need to supply the bat file for windows, and then change the fail property to true --> - <exec executable="sh" osfamily="unix" failifexecutionfails="false" > + <exec executable="sh" osfamily="unix" failifexecutionfails="true" > <arg value="./bundle-messages.sh" /> </exec> - <exec executable="sh" osfamily="mac" failifexecutionfails="false" > + <exec executable="sh" osfamily="mac" failifexecutionfails="true" > <arg value="./bundle-messages.sh" /> </exec> - <exec executable="cmd" osfamily="windows" failifexecutionfails="false" > - <arg value="/c" /> - <arg value="bundle-messages.bat" /> + <!-- multi-lang is optional --> + <exec executable="sh" osfamily="windows" failifexecutionfails="false" > + <arg value="./bundle-messages.sh" /> </exec> </target> @@ -70,19 +91,40 @@ <arg value="./bundle-messages.sh" /> <arg value="-p" /> </exec> - <exec executable="cmd" osfamily="windows" failifexecutionfails="true" > - <arg value="/c" /> - <arg value="bundle-messages.bat" /> + <exec executable="sh" osfamily="windows" failifexecutionfails="true" > + <arg value="./bundle-messages.sh" /> <arg value="-p" /> </exec> </target> - <target name="war" depends="precompilejsp, bundle"> + <target name="war" depends="precompilejsp, bundle, warUpToDate" unless="war.uptodate" > + <exec executable="mtn" outputproperty="workspace.changes.w" errorproperty="mtn.error2" failifexecutionfails="false" > + <arg value="list" /> + <arg value="changed" /> + <arg value="../jsp" /> + </exec> + <!-- \n in an attribute value generates an invalid manifest --> + <exec executable="tr" inputstring="${workspace.changes.w}" outputproperty="workspace.changes.w.tr" errorproperty="mtn.error2" failifexecutionfails="false" > + <arg value="-s" /> + <arg value="[:space:]" /> + <arg value="," /> + </exec> <war destfile="build/i2ptunnel.war" webxml="../jsp/web-out.xml" basedir="../jsp/" excludes="web.xml, web-fragment.xml, web-out.xml, **/*.java, *.jsp"> + <manifest> + <attribute name="Build-Date" value="${build.timestamp}" /> + <attribute name="Base-Revision" value="${workspace.version}" /> + <attribute name="Workspace-Changes" value="${workspace.changes.w.tr}" /> + </manifest> </war> </target> + <target name="warUpToDate"> + <uptodate property="war.uptodate" targetfile="build/i2ptunnel.war" > + <srcfiles dir= "../jsp" excludes="web.xml, web-fragment.xml, **/*.java, *.jsp" /> + </uptodate> + </target> + <target name="precompilejsp" depends="jar" unless="precompilejsp.uptodate"> <delete dir="../jsp/WEB-INF/" /> <delete file="../jsp/web-fragment.xml" /> @@ -110,6 +152,7 @@ <arg value="../jsp/" /> </java> <javac debug="true" deprecation="on" source="1.5" target="1.5" + includeAntRuntime="false" destdir="../jsp/WEB-INF/classes/" srcdir="../jsp/WEB-INF/classes" includes="**/*.java"> <compilerarg line="${javac.compilerargs}" /> <classpath> @@ -141,6 +184,55 @@ splitindex="true" windowtitle="I2PTunnel" /> </target> + + <target name="compileTest"> + <mkdir dir="./build" /> + <mkdir dir="./build/obj" /> + <!-- We need the ant runtime, as it includes junit --> + <javac srcdir="./src:./test" debug="true" source="1.5" target="1.5" + includeAntRuntime="true" + deprecation="on" destdir="./build/obj" > + <compilerarg line="${javac.compilerargs}" /> + <classpath> + <pathelement location="../../../core/java/build/i2p.jar" /> + <pathelement location="../../ministreaming/java/build/mstreaming.jar" /> + </classpath> + </javac> + </target> + <target name="test" depends="clean, compileTest"> + <junit printsummary="on" fork="yes"> + <classpath> + <pathelement path="${classpath}" /> + <pathelement location="./build/obj" /> + <pathelement location="../../../core/java/build/i2p.jar" /> + </classpath> + <batchtest> + <fileset dir="./test/"> + <include name="**/*Test.java" /> + </fileset> + </batchtest> + <formatter type="xml"/> + </junit> + <mkdir dir="../../../reports/" /> + <mkdir dir="../../../reports/i2ptunnel/" /> + <mkdir dir="../../../reports/i2ptunnel/junit/" /> + <delete> + <fileset dir="../../../reports/i2ptunnel/junit"> + <include name="TEST-*.xml"/> + </fileset> + </delete> + <copy todir="../../../reports/i2ptunnel/junit"> + <fileset dir="."> + <include name="TEST-*.xml"/> + </fileset> + </copy> + <delete> + <fileset dir="."> + <include name="TEST-*.xml"/> + </fileset> + </delete> + </target> + <target name="clean"> <delete dir="./build" /> <delete dir="../jsp/WEB-INF/" /> diff --git a/apps/i2ptunnel/java/bundle-messages.bat b/apps/i2ptunnel/java/bundle-messages.bat deleted file mode 100644 index 90feca972a6457eebf97f9bdbea6028ac88d7789..0000000000000000000000000000000000000000 --- a/apps/i2ptunnel/java/bundle-messages.bat +++ /dev/null @@ -1,26 +0,0 @@ -@echo off -set Callfrom=%cd% -set Paras=%1 - -rem before calling make sure you have msys and mingw 's "bin" path -rem in your current searching path -rem type "set path" to check -if not exist ..\locale\*.only goto updateALL - -rem put a messages_xx.only(eg messages_zh.only) into locale folder -rem this script will only touch the po file(eg zh) you specified, leaving other po files untact. - -for %%i in (..\locale\*.only) do set PO=%%~ni -echo [Notice] Yu choose to Ony update the choosen file: %PO%.po -for %%i in (..\locale\*.po) do if not %%~ni==%PO% ren %%i %%~ni.po- - -call sh --login %cd%\bmsg.sh - -for %%i in (..\locale\*.po-) do if not %%~ni==%PO% ren %%i %%~ni.po -goto end - -:updateALL -call sh --login %cd%\bmsg.sh - -:end -echo End of Message Bundling \ No newline at end of file diff --git a/apps/i2ptunnel/java/bundle-messages.sh b/apps/i2ptunnel/java/bundle-messages.sh index 236b0ad0114d1ca9cfcf7903e4f31ed08e8dd4b7..74bbc573e1b11b8bc44df91a2c12124ff5b2d84e 100755 --- a/apps/i2ptunnel/java/bundle-messages.sh +++ b/apps/i2ptunnel/java/bundle-messages.sh @@ -18,6 +18,14 @@ then POUPDATE=1 fi +# on windows, one must specify the path of commnad find +# since windows has its own retarded version of find. +if which find|grep -q -i windows ; then + export PATH=.:/bin:/usr/local/bin:$PATH +fi +# Fast mode - update ondemond +# set LG2 to the language you need in envrionment varibales to enable this + # add ../java/ so the refs will work in the po file JPATHS="../java/src ../jsp/WEB-INF" for i in ../locale/messages_*.po @@ -26,6 +34,11 @@ do LG=${i#../locale/messages_} LG=${LG%.po} + # skip, if specified + if [ $LG2 ]; then + [ $LG != $LG2 ] && continue || echo INFO: Language update is set to [$LG2] only. + fi + if [ "$POUPDATE" = "1" ] then # make list of java files newer than the .po file @@ -72,15 +85,19 @@ do touch $i fi - echo "Generating ${CLASS}_$LG ResourceBundle..." + if [ "$LG" != "en" ] + then + # only generate for non-source language + echo "Generating ${CLASS}_$LG ResourceBundle..." - # convert to class files in build/obj - msgfmt --java --statistics -r $CLASS -l $LG -d ../jsp/WEB-INF/classes $i - if [ $? -ne 0 ] - then - echo 'Warning - msgfmt failed, not updating translations' - break - fi + # convert to class files in build/obj + msgfmt --java --statistics -r $CLASS -l $LG -d ../jsp/WEB-INF/classes $i + if [ $? -ne 0 ] + then + echo 'Warning - msgfmt failed, not updating translations' + break + fi + fi done rm -f $TMPFILE # todo: return failure diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java index 75a276aa00a939c8b7ae6ba154e742fda950ef3d..293703ac9c9786580ad4a1e6c6b691099d95d2e8 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java @@ -43,13 +43,13 @@ import java.io.OutputStream; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; -import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Properties; import java.util.Set; import java.util.StringTokenizer; +import java.util.concurrent.CopyOnWriteArraySet; import net.i2p.I2PAppContext; import net.i2p.I2PException; @@ -99,7 +99,7 @@ public class I2PTunnel implements Logging, EventDispatcher { private final List tasks = new ArrayList(); private int next_task_id = 1; - private final Set listeners = new HashSet(); + private final Set listeners = new CopyOnWriteArraySet(); public static void main(String[] args) throws IOException { new I2PTunnel(args); @@ -118,8 +118,8 @@ public class I2PTunnel implements Logging, EventDispatcher { _tunnelId = ++__tunnelId; _log = _context.logManager().getLog(I2PTunnel.class); _event = new EventDispatcherImpl(); - Properties p = new Properties(); - p.putAll(System.getProperties()); + // as of 0.8.4, include context properties + Properties p = _context.getProperties(); _clientOptions = p; _sessions = new ArrayList(1); @@ -1626,16 +1626,12 @@ public class I2PTunnel implements Logging, EventDispatcher { public void addConnectionEventListener(ConnectionEventListener lsnr) { if (lsnr == null) return; - synchronized (listeners) { - listeners.add(lsnr); - } + listeners.add(lsnr); } public void removeConnectionEventListener(ConnectionEventListener lsnr) { if (lsnr == null) return; - synchronized (listeners) { - listeners.remove(lsnr); - } + listeners.remove(lsnr); } private String getPrefix() { return "[" + _tunnelId + "]: "; } @@ -1649,12 +1645,10 @@ public class I2PTunnel implements Logging, EventDispatcher { */ void routerDisconnected() { _log.error(getPrefix() + "Router disconnected - firing notification events"); - synchronized (listeners) { for (Iterator iter = listeners.iterator(); iter.hasNext();) { ConnectionEventListener lsnr = (ConnectionEventListener) iter.next(); if (lsnr != null) lsnr.routerDisconnected(); } - } } /** diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java index 70265a154d2a14fd94169b929921b1a427f00c29..1014a986b71438b91a75c2650be2d156c2041a4e 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java @@ -169,6 +169,9 @@ public class I2PTunnelConnectClient extends I2PTunnelHTTPClientBase implements R // Use this rather than BufferedReader because we can't have readahead, // since we are passing the stream on to I2PTunnelRunner line = DataHelper.readLine(in); + if(line == null) { + break; + } line = line.trim(); if (_log.shouldLog(Log.DEBUG)) _log.debug(getPrefix(requestId) + "Line=[" + line + "]"); diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java index d4efaa8ea4ba0425664e07f917f0159c4b7c458b..d44f5539a9d04eae6cedab919146e56a254270a0 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java @@ -10,7 +10,11 @@ import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; import java.net.SocketException; +import java.util.ArrayList; +import java.util.HashMap; import java.util.Iterator; +import java.util.List; +import java.util.Map; import java.util.Properties; import java.util.zip.GZIPOutputStream; @@ -49,7 +53,7 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { "Connection: close\r\n"+ "Proxy-Connection: close\r\n"+ "\r\n"+ - "<html><head><title>503 Service Unavailable<title></head>\n"+ + "<html><head><title>503 Service Unavailable</title></head>\n"+ "<body><h2>503 Service Unavailable</h2>\n" + "<p>This I2P eepsite is unavailable. It may be down or undergoing maintenance.</p>\n" + "</body></html>") @@ -94,28 +98,24 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { InputStream in = socket.getInputStream(); StringBuilder command = new StringBuilder(128); - Properties headers = readHeaders(in, command, + Map<String, List<String>> headers = readHeaders(in, command, CLIENT_SKIPHEADERS, getTunnel().getContext()); - headers.setProperty(HASH_HEADER, socket.getPeerDestination().calculateHash().toBase64()); - headers.setProperty(DEST32_HEADER, Base32.encode(socket.getPeerDestination().calculateHash().getData()) + ".b32.i2p" ); - headers.setProperty(DEST64_HEADER, socket.getPeerDestination().toBase64()); + + addEntry(headers, HASH_HEADER, socket.getPeerDestination().calculateHash().toBase64()); + addEntry(headers, DEST32_HEADER, Base32.encode(socket.getPeerDestination().calculateHash().getData()) + ".b32.i2p"); + addEntry(headers, DEST64_HEADER, socket.getPeerDestination().toBase64()); if ( (_spoofHost != null) && (_spoofHost.trim().length() > 0) ) - headers.setProperty("Host", _spoofHost); - headers.setProperty("Connection", "close"); + setEntry(headers, "Host", _spoofHost); + setEntry(headers, "Connection", "close"); // we keep the enc sent by the browser before clobbering it, since it may have // been x-i2p-gzip - String enc = headers.getProperty("Accept-encoding"); - String altEnc = headers.getProperty("X-Accept-encoding"); + String enc = getEntryOrNull(headers, "Accept-encoding"); + String altEnc = getEntryOrNull(headers, "X-Accept-encoding"); // according to rfc2616 s14.3, this *should* force identity, even if // "identity;q=1, *;q=0" didn't. - headers.setProperty("Accept-encoding", ""); - String modifiedHeader = formatHeaders(headers, command); - - //String modifiedHeader = getModifiedHeader(socket); - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Modified header: [" + modifiedHeader + "]"); + setEntry(headers, "Accept-encoding", ""); socket.setReadTimeout(readTimeout); Socket s = new Socket(remoteHost, remotePort); @@ -133,9 +133,15 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { } if (_log.shouldLog(Log.INFO)) _log.info("HTTP server encoding header: " + enc + "/" + altEnc); - boolean useGZIP = ( (enc != null) && (enc.indexOf("x-i2p-gzip") >= 0) ); - if ( (!useGZIP) && (altEnc != null) && (altEnc.indexOf("x-i2p-gzip") >= 0) ) - useGZIP = true; + boolean alt = (altEnc != null) && (altEnc.indexOf("x-i2p-gzip") >= 0); + boolean useGZIP = alt || ( (enc != null) && (enc.indexOf("x-i2p-gzip") >= 0) ); + // Don't pass this on, outproxies should strip so I2P traffic isn't so obvious but they probably don't + if (alt) + headers.remove("X-Accept-encoding"); + + String modifiedHeader = formatHeaders(headers, command); + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Modified header: [" + modifiedHeader + "]"); if (allowGZIP && useGZIP) { I2PAppThread req = new I2PAppThread( @@ -234,7 +240,7 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { //Change headers to protect server identity StringBuilder command = new StringBuilder(128); - Properties headers = readHeaders(serverin, command, + Map<String, List<String>> headers = readHeaders(serverin, command, SERVER_SKIPHEADERS, _ctx); String modifiedHeaders = formatHeaders(headers, command); compressedOut.write(modifiedHeaders.getBytes()); @@ -360,13 +366,14 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { } } - private static String formatHeaders(Properties headers, StringBuilder command) { + protected static String formatHeaders(Map<String, List<String>> headers, StringBuilder command) { StringBuilder buf = new StringBuilder(command.length() + headers.size() * 64); buf.append(command.toString().trim()).append("\r\n"); - for (Iterator iter = headers.keySet().iterator(); iter.hasNext(); ) { + for (Iterator<String> iter = headers.keySet().iterator(); iter.hasNext(); ) { String name = (String)iter.next(); - String val = headers.getProperty(name); - buf.append(name.trim()).append(": ").append(val.trim()).append("\r\n"); + for(String val: headers.get(name)) { + buf.append(name.trim()).append(": ").append(val.trim()).append("\r\n"); + } } buf.append("\r\n"); return buf.toString(); @@ -374,9 +381,46 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { /** ridiculously long, just to prevent OOM DOS @since 0.7.13 */ private static final int MAX_HEADERS = 60; + + /** + * Add an entry to the multimap. + */ + private static void addEntry(Map<String, List<String>> headers, String key, String value) { + List<String> entry = headers.get(key); + if(entry == null) { + headers.put(key, entry = new ArrayList<String>()); + } + entry.add(value); + } + + /** + * Remove the other matching entries and set this entry as the only one. + */ + private static void setEntry(Map<String, List<String>> headers, String key, String value) { + List<String> entry = headers.get(key); + if(entry == null) { + headers.put(key, entry = new ArrayList<String>()); + } + entry.clear(); + entry.add(value); + } + + /** + * Get the first matching entry in the multimap + * @return the first matching entry or null + */ + private static String getEntryOrNull(Map<String, List<String>> headers, String key) { + List<String> entries = headers.get(key); + if(entries == null || entries.size() < 1) { + return null; + } + else { + return entries.get(0); + } + } - private static Properties readHeaders(InputStream in, StringBuilder command, String[] skipHeaders, I2PAppContext ctx) throws IOException { - Properties headers = new Properties(); + protected static Map<String, List<String>> readHeaders(InputStream in, StringBuilder command, String[] skipHeaders, I2PAppContext ctx) throws IOException { + HashMap<String, List<String>> headers = new HashMap<String, List<String>>(); StringBuilder buf = new StringBuilder(128); boolean ok = DataHelper.readLine(in, command); @@ -438,7 +482,7 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { continue; } - headers.setProperty(name, value); + addEntry(headers, name, value); //if (_log.shouldLog(Log.DEBUG)) // _log.debug("Read the header [" + name + "] = [" + value + "]"); } diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCClient.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCClient.java index d5b3dda65cd4b1b1aec0521cf74b99d60f51550f..6bfbdedd1e7f8aba09e03edccd9efa149b44a2bd 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCClient.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCClient.java @@ -89,9 +89,9 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase implements Runnable i2ps = createI2PSocket(clientDest); i2ps.setReadTimeout(readTimeout); StringBuffer expectedPong = new StringBuffer(); - Thread in = new I2PAppThread(new IrcInboundFilter(s,i2ps, expectedPong), "IRC Client " + __clientId + " in", true); + Thread in = new I2PAppThread(new IrcInboundFilter(s,i2ps, expectedPong, _log), "IRC Client " + __clientId + " in", true); in.start(); - Thread out = new I2PAppThread(new IrcOutboundFilter(s,i2ps, expectedPong), "IRC Client " + __clientId + " out", true); + Thread out = new I2PAppThread(new IrcOutboundFilter(s,i2ps, expectedPong, _log), "IRC Client " + __clientId + " out", true); out.start(); } catch (Exception ex) { if (_log.shouldLog(Log.ERROR)) @@ -128,13 +128,13 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase implements Runnable private Socket local; private I2PSocket remote; private StringBuffer expectedPong; - // shadows _log in super() - private final Log _log = new Log(I2PTunnelIRCClient.class); + private final Log _log; - public IrcInboundFilter(Socket _local, I2PSocket _remote, StringBuffer pong) { + public IrcInboundFilter(Socket _local, I2PSocket _remote, StringBuffer pong, Log log) { local=_local; remote=_remote; expectedPong=pong; + _log = log; } public void run() { @@ -207,13 +207,13 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase implements Runnable private Socket local; private I2PSocket remote; private StringBuffer expectedPong; - // shadows _log in super() - private final Log _log = new Log(I2PTunnelIRCClient.class); + private final Log _log; - public IrcOutboundFilter(Socket _local, I2PSocket _remote, StringBuffer pong) { + public IrcOutboundFilter(Socket _local, I2PSocket _remote, StringBuffer pong, Log log) { local=_local; remote=_remote; expectedPong=pong; + _log = log; } public void run() { diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelServer.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelServer.java index 5427130bc781366df814519bc292a9a3338a0ac6..babdba976de36619bbcdcbb3cda169d257f5880f 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelServer.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelServer.java @@ -210,7 +210,9 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable { * */ public void startRunning() { - Thread t = new I2PAppThread(this, "Server " + remoteHost + ':' + remotePort, true); + // prevent JVM exit when running outside the router + boolean isDaemon = getTunnel().getContext().isRouterContext(); + Thread t = new I2PAppThread(this, "Server " + remoteHost + ':' + remotePort, isDaemon); t.start(); } @@ -302,9 +304,10 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable { try { i2ps.close(); } catch (IOException ioe) {} - if (open && _log.shouldLog(Log.ERROR)) - _log.error("ServerHandler queue full for " + remoteHost + ':' + remotePort + - "; increase " + PROP_HANDLER_COUNT + '?', ree); + if (open) + _log.logAlways(Log.WARN, "ServerHandler queue full, dropping incoming connection to " + + remoteHost + ':' + remotePort + + "; increase server max threads or " + PROP_HANDLER_COUNT); } } else { // use only for standard servers that can't get slowlorissed! Not for http or irc diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelControllerGroup.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelControllerGroup.java index 618b035f7b68cf8bb7838cbb67f897d116c902d8..f1e9f7108dac21555fae15d887d0b0d2176a9074 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelControllerGroup.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelControllerGroup.java @@ -1,18 +1,15 @@ package net.i2p.i2ptunnel; import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; -import java.util.TreeMap; import net.i2p.I2PAppContext; import net.i2p.client.I2PSession; @@ -20,7 +17,7 @@ import net.i2p.client.I2PSessionException; import net.i2p.data.DataHelper; import net.i2p.util.I2PAppThread; import net.i2p.util.Log; -import net.i2p.util.SecureFileOutputStream; +import net.i2p.util.OrderedProperties; /** * Coordinate a set of tunnels within the JVM, loading and storing their config @@ -223,14 +220,15 @@ public class TunnelControllerGroup { * file * */ - public void saveConfig() { + public void saveConfig() throws IOException { saveConfig(_configFile); } + /** * Save the configuration of all known tunnels to the given file * */ - public void saveConfig(String configFile) { + public void saveConfig(String configFile) throws IOException { _configFile = configFile; File cfgFile = new File(configFile); if (!cfgFile.isAbsolute()) @@ -239,32 +237,14 @@ public class TunnelControllerGroup { if ( (parent != null) && (!parent.exists()) ) parent.mkdirs(); - - TreeMap map = new TreeMap(); + Properties map = new OrderedProperties(); for (int i = 0; i < _controllers.size(); i++) { TunnelController controller = _controllers.get(i); Properties cur = controller.getConfig("tunnel." + i + "."); map.putAll(cur); } - StringBuilder buf = new StringBuilder(1024); - for (Iterator iter = map.keySet().iterator(); iter.hasNext(); ) { - String key = (String)iter.next(); - String val = (String)map.get(key); - buf.append(key).append('=').append(val).append('\n'); - } - - FileOutputStream fos = null; - try { - fos = new SecureFileOutputStream(cfgFile); - fos.write(buf.toString().getBytes("UTF-8")); - if (_log.shouldLog(Log.INFO)) - _log.info("Config written to " + cfgFile.getPath()); - } catch (IOException ioe) { - _log.error("Error writing out the config"); - } finally { - if (fos != null) try { fos.close(); } catch (IOException ioe) {} - } + DataHelper.storeProps(map, cfgFile); } /** @@ -310,7 +290,7 @@ public class TunnelControllerGroup { synchronized (_sessions) { Set<TunnelController> owners = _sessions.get(session); if (owners == null) { - owners = new HashSet(1); + owners = new HashSet(2); _sessions.put(session, owners); } owners.add(controller); diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/I2PSOCKSIRCTunnel.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/I2PSOCKSIRCTunnel.java index 84e66cf7289e9f89d29c88c0b444c97c8235e702..a197636781fe82f0653d4bcea3249bb9e57fe61f 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/I2PSOCKSIRCTunnel.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/I2PSOCKSIRCTunnel.java @@ -50,9 +50,11 @@ public class I2PSOCKSIRCTunnel extends I2PSOCKSTunnel { Socket clientSock = serv.getClientSocket(); I2PSocket destSock = serv.getDestinationI2PSocket(this); StringBuffer expectedPong = new StringBuffer(); - Thread in = new I2PAppThread(new I2PTunnelIRCClient.IrcInboundFilter(clientSock, destSock, expectedPong), "SOCKS IRC Client " + (++__clientId) + " in", true); + Thread in = new I2PAppThread(new I2PTunnelIRCClient.IrcInboundFilter(clientSock, destSock, expectedPong, _log), + "SOCKS IRC Client " + (++__clientId) + " in", true); in.start(); - Thread out = new I2PAppThread(new I2PTunnelIRCClient.IrcOutboundFilter(clientSock, destSock, expectedPong), "SOCKS IRC Client " + __clientId + " out", true); + Thread out = new I2PAppThread(new I2PTunnelIRCClient.IrcOutboundFilter(clientSock, destSock, expectedPong, _log), + "SOCKS IRC Client " + __clientId + " out", true); out.start(); } catch (SOCKSException e) { _log.error("Error from SOCKS connection", e); diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java index 2184b434f1f02aa968cc9f698e47b84b53a8b758..63f119bca852e1527ece1fd4dfef1c0d49a3707e 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java @@ -115,7 +115,7 @@ public class EditBean extends IndexBean { if (tun != null) return "true".equalsIgnoreCase(tun.getSharedClient()); else - return true; + return false; } public boolean shouldDelay(int tunnel) { diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java index 9787078894a7998b4fd3ba6a234ebc497690291b..eb36a64bc4c3757ec090b4e9fd218820086b4971 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java @@ -8,7 +8,7 @@ package net.i2p.i2ptunnel.web; * */ -import java.util.concurrent.ConcurrentHashMap; +import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; @@ -17,6 +17,7 @@ import java.util.Map; import java.util.Properties; import java.util.Set; import java.util.StringTokenizer; +import java.util.concurrent.ConcurrentHashMap; import net.i2p.I2PAppContext; import net.i2p.data.Base32; @@ -299,14 +300,22 @@ public class IndexBean { } } - List msgs = doSave(); - msgs.add(0, "Changes saved"); + List<String> msgs = doSave(); return getMessages(msgs); } - private List doSave() { - _group.saveConfig(); - return _group.clearAllMessages(); + + private List<String> doSave() { + List<String> rv = _group.clearAllMessages(); + try { + _group.saveConfig(); + rv.add(0, _("Configuration changes saved")); + } catch (IOException ioe) { + _log.error("Failed to save config file", ioe); + rv.add(0, _("Failed to save configuration") + ": " + ioe.toString()); + } + return rv; } + private String deleteTunnel() { if (!_removeConfirmed) return "Please confirm removal"; @@ -1095,16 +1104,16 @@ public class IndexBean { return null; } - private static String getMessages(List msgs) { + private static String getMessages(List<String> msgs) { StringBuilder buf = new StringBuilder(128); getMessages(msgs, buf); return buf.toString(); } - private static void getMessages(List msgs, StringBuilder buf) { + private static void getMessages(List<String> msgs, StringBuilder buf) { if (msgs == null) return; for (int i = 0; i < msgs.size(); i++) { - buf.append((String)msgs.get(i)).append("\n"); + buf.append(msgs.get(i)).append("\n"); } } diff --git a/apps/i2ptunnel/java/test/net/i2p/i2ptunnel/I2PTunnelHTTPServerTest.java b/apps/i2ptunnel/java/test/net/i2p/i2ptunnel/I2PTunnelHTTPServerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..8cd7cf3227ea3c866ae8d6b2888e89225452157a --- /dev/null +++ b/apps/i2ptunnel/java/test/net/i2p/i2ptunnel/I2PTunnelHTTPServerTest.java @@ -0,0 +1,61 @@ +package net.i2p.i2ptunnel; + +import java.io.BufferedWriter; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.util.Map; +import java.util.List; + +import junit.framework.TestCase; + +public class I2PTunnelHTTPServerTest extends TestCase { + + public InputStream fillInputStream(String headers) throws IOException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(baos)); + bw.write(headers); + bw.flush(); + byte[] bytes = baos.toByteArray(); + return new ByteArrayInputStream(bytes); + } + + public void testSimpleHeader() throws IOException { + String headerString = "GET /blah HTTP/1.1\r\n"; + headerString += "BLAH: something\r\n"; + headerString += "\r\n"; + InputStream in = fillInputStream(headerString); + Map<String, List<String>> headers = I2PTunnelHTTPServer.readHeaders(in, new StringBuilder(128), new String[0], null); + assertEquals(headers.size(), 1); //One header + } + + public void testDuplicateHeader() throws IOException { + String headerString = "GET /something HTTP/1.1\r\n"; + headerString += "someHeader: blabla bla bloooo\r\n"; + headerString += "someHeader: oh my, duplication!\r\n"; + headerString += "\r\n"; + InputStream in = fillInputStream(headerString); + Map<String, List<String>> headers = I2PTunnelHTTPServer.readHeaders(in, new StringBuilder(128), new String[0], null); + assertEquals(headers.size(), 1); + assertEquals(headers.get("someHeader").size(), 2); + } + + public void testDuplicateHeadersFormat() throws IOException { + String headerString = "GET /something HTTP/1.1\r\n"; + headerString += "abc: def\r\n"; + headerString += "abc: blaaah\r\n"; + headerString += "manamana: toe toe toedoedoe\r\n"; + headerString += "\r\n"; + InputStream in = fillInputStream(headerString); + StringBuilder builder = new StringBuilder(128); + Map<String, List<String>> headers = I2PTunnelHTTPServer.readHeaders(in, builder, new String[0], null); + String result = I2PTunnelHTTPServer.formatHeaders(headers, builder); + int first = result.indexOf("abc"); + assertTrue(first >= 0); + int second = result.indexOf("abc", first); + assertTrue(second >= 0); + } + +} diff --git a/apps/i2ptunnel/jsp/edit.jsp b/apps/i2ptunnel/jsp/edit.jsp index 2da356e9cdc95435eb61ad047eaedd957023dd0a..e35f23c0fb2cd1909c9334f4d16325766de912d3 100644 --- a/apps/i2ptunnel/jsp/edit.jsp +++ b/apps/i2ptunnel/jsp/edit.jsp @@ -1,13 +1,17 @@ -<%@page pageEncoding="UTF-8"%> -<%@page contentType="text/html" import="net.i2p.i2ptunnel.web.EditBean" %><% +<% + // NOTE: Do the header carefully so there is no whitespace before the <?xml... line + +%><%@page pageEncoding="UTF-8" +%><%@page contentType="text/html" import="net.i2p.i2ptunnel.web.EditBean" +%><% String tun = request.getParameter("tunnel"); if (tun != null) { try { int curTunnel = Integer.parseInt(tun); if (EditBean.staticIsClient(curTunnel)) { - %><jsp:include page="editClient.jsp" /><% + %><jsp:include page="editClient.jsp" /><% } else { - %><jsp:include page="editServer.jsp" /><% + %><jsp:include page="editServer.jsp" /><% } } catch (NumberFormatException nfe) { %>Invalid tunnel parameter<% @@ -16,9 +20,9 @@ String tun = request.getParameter("tunnel"); String type = request.getParameter("type"); int curTunnel = -1; if (EditBean.isClient(type)) { - %><jsp:include page="editClient.jsp" /><% + %><jsp:include page="editClient.jsp" /><% } else { - %><jsp:include page="editServer.jsp" /><% + %><jsp:include page="editServer.jsp" /><% } } %> diff --git a/apps/i2ptunnel/jsp/editClient.jsp b/apps/i2ptunnel/jsp/editClient.jsp index cabfb2946479df5f7aba8cd4862c856e7d96cf7d..b95452b12919823d93e5c3897c890f7b7050cf9b 100644 --- a/apps/i2ptunnel/jsp/editClient.jsp +++ b/apps/i2ptunnel/jsp/editClient.jsp @@ -400,7 +400,7 @@ <label for="localDestination" accesskey="L"> <%=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> + <textarea rows="1" style="height: 3em;" cols="60" readonly="readonly" id="localDestination" title="Read Only: Local Destination (if known)" wrap="off" spellcheck="false"><%=editBean.getDestinationBase64(curTunnel)%></textarea> <span class="comment"><%=intl._("(if known)")%></span> </div> @@ -465,7 +465,7 @@ <label><%=intl._("Jump URL List")%>:</label> </div> <div id="hostField" class="rowItem"> - <textarea rows="2" style="height: 8em;" cols="60" id="hostField" name="jumpList" title="List of helper URLs to offer when a host is not found in your addressbook" wrap="off"><%=editBean.getJumpList(curTunnel)%></textarea> + <textarea rows="2" style="height: 8em;" cols="60" id="hostField" name="jumpList" title="List of helper URLs to offer when a host is not found in your addressbook" wrap="off" spellcheck="false"><%=editBean.getJumpList(curTunnel)%></textarea> </div> <div class="subdivider"> <hr /> diff --git a/apps/i2ptunnel/jsp/editServer.jsp b/apps/i2ptunnel/jsp/editServer.jsp index 4f45b86672c9f70d3d2c7ee8cd132175b713d92a..45e96f73d0000fdc7fa638124ab6a93325bd2e2d 100644 --- a/apps/i2ptunnel/jsp/editServer.jsp +++ b/apps/i2ptunnel/jsp/editServer.jsp @@ -186,9 +186,9 @@ <label for="localDestination" accesskey="L"> <%=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> + <textarea rows="1" style="height: 3em;" cols="60" readonly="readonly" id="localDestination" title="Read Only: Local Destination (if known)" wrap="off" spellcheck="false"><%=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"><%=intl._("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> @@ -334,13 +334,13 @@ <label for="encrypt" accesskey="e"> <%=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> + <textarea rows="1" style="height: 3em;" cols="44" id="portField" name="encryptKey" title="Encrypt Key" wrap="off" spellcheck="false"><%=editBean.getEncryptKey(curTunnel)%></textarea> </div> <div id="portField" class="rowItem"> <label for="force" accesskey="c"> <%=intl._("Generate New Key")%>: </label> - <button id="controlSave" accesskey="S" class="control" type="submit" name="action" value="Generate" title="Generate New Key Now"><%=intl._("Generate")%></button> + <button 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> @@ -365,7 +365,7 @@ <label for="accessList" accesskey="s"> <%=intl._("Access List")%>: </label> - <textarea rows="2" style="height: 8em;" cols="60" id="hostField" name="accessList" title="Access List" wrap="off"><%=editBean.getAccessList(curTunnel)%></textarea> + <textarea rows="2" style="height: 8em;" cols="60" id="hostField" name="accessList" title="Access List" wrap="off" spellcheck="false"><%=editBean.getAccessList(curTunnel)%></textarea> </div> <div class="subdivider"> @@ -374,7 +374,7 @@ <div class="rowItem"> <div id="optionsField" class="rowItem"> - <label><%=intl._("Inbound connection limits (0 to disable)")%><br><%=intl._("Per client")%>:</label> + <label><%=intl._("Inbound connection limits (0=unlimited)")%><br /><%=intl._("Per client")%>:</label> </div> <div id="portField" class="rowItem"> <label><%=intl._("Per minute")%>:</label> @@ -405,7 +405,7 @@ </div> <div class="rowItem"> <div id="optionsField" class="rowItem"> - <label><%=intl._("Max concurrent connections (0 to disable)")%>:</label> + <label><%=intl._("Max concurrent connections (0=unlimited)")%>:</label> </div> <div id="portField" class="rowItem"> <input type="text" id="port" name="maxStreams" value="<%=editBean.getMaxStreams(curTunnel)%>" class="freetext" /> @@ -453,7 +453,6 @@ <div id="portField" class="rowItem"> <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><%=intl._("Hashcash (effort)")%></label> @@ -465,13 +464,12 @@ <label for="force" accesskey="c"> <%=intl._("Hashcash Calc Time")%>: </label> - <button id="controlSave" accesskey="S" class="control" type="submit" name="action" value="Estimate" title="Estimate Calculation Time"><%=intl._("Estimate")%></button> + <button 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><%=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"> @@ -479,14 +477,13 @@ </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" /> - <span class="comment"></span> </div> </div> <div id="portField" class="rowItem"> <label for="force" accesskey="c"> <%=intl._("Modify Certificate")%>: </label> - <button id="controlSave" accesskey="S" class="control" type="submit" name="action" value="Modify" title="Force New Cert Now"><%=intl._("Modify")%></button> + <button 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> diff --git a/apps/i2ptunnel/jsp/index.jsp b/apps/i2ptunnel/jsp/index.jsp index faf904de034f52e0ea2e26bd2e26291e9a754273..9b4149195037837fa17b2656b4cd57bbee50fed6 100644 --- a/apps/i2ptunnel/jsp/index.jsp +++ b/apps/i2ptunnel/jsp/index.jsp @@ -1,10 +1,13 @@ <% + // NOTE: Do the header carefully so there is no whitespace before the <?xml... line + // 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" import="net.i2p.i2ptunnel.web.IndexBean"%><?xml version="1.0" encoding="UTF-8"?> + +%><%@page pageEncoding="UTF-8" +%><%@page contentType="text/html" import="net.i2p.i2ptunnel.web.IndexBean" +%><?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <jsp:useBean class="net.i2p.i2ptunnel.web.IndexBean" id="indexBean" scope="request" /> <jsp:setProperty name="indexBean" property="*" /> @@ -236,9 +239,9 @@ <% /* should only happen for streamr client */ String cHost= indexBean.getClientInterface(curClient); - if ("".equals(cHost)) { + if (cHost == null || "".equals(cHost)) { out.write("<font color=\"red\">"); - out.write(intl._("Hort not set")); + out.write(intl._("Host not set")); out.write("</font>"); } else { out.write(cHost); diff --git a/apps/i2ptunnel/locale/messages_ar.po b/apps/i2ptunnel/locale/messages_ar.po new file mode 100644 index 0000000000000000000000000000000000000000..b67ac63e29941c203aacabb4e680a95be6d0d4b4 --- /dev/null +++ b/apps/i2ptunnel/locale/messages_ar.po @@ -0,0 +1,783 @@ +# 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: 2011-03-03 18:29+0000\n" +"PO-Revision-Date: 2011-03-03 17:02-0000\n" +"Last-Translator: hamada <hamada@mail.i2p>\n" +"Language-Team: duck <duck@mail.i2p>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:474 +#, java-format +msgid "" +"To visit the destination in your host database, click <a href=\"{0}\">here</" +"a>. To visit the conflicting addresshelper destination, click <a href=" +"\"{1}\">here</a>." +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:931 +msgid "" +"Click a link below to look for an address helper by using a \"jump\" service:" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:326 +#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:336 +msgid "internal" +msgstr "داخلي" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:171 +msgid "" +"Invalid form submission, probably because you used the 'back' or 'reload' " +"button on your browser. Please resubmit." +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:218 +msgid "Configuration reloaded for all tunnels" +msgstr "تم اعادة تØميل تغيرات الاعدادات" + +#. and give them something to look at in any case +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:230 +msgid "Starting tunnel" +msgstr "ابدأ النÙÙ‚" + +#. and give them something to look at in any case +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:243 +msgid "Stopping tunnel" +msgstr "توقي٠النÙÙ‚" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:311 +msgid "Configuration changes saved" +msgstr "تم ØÙظ تغيرات الاعدادات" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:314 +msgid "Failed to save configuration" +msgstr "Ùشل ÙÙŠ ØÙظ الاعدادات" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:398 +msgid "New Tunnel" +msgstr "Ù†ÙÙ‚ جديد" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:418 +msgid "Standard client" +msgstr "مستخدم عادي" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:419 +msgid "HTTP client" +msgstr "HTTP client" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:420 +msgid "IRC client" +msgstr "IRC برنامج" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:421 +msgid "Standard server" +msgstr "خادم عادي" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:422 +msgid "HTTP server" +msgstr "HTTP خادم" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:423 +msgid "SOCKS 4/4a/5 proxy" +msgstr "SOCKS 4/4a/5 بروكسي" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:424 +msgid "SOCKS IRC proxy" +msgstr "SOCKS IRC بروكسي دردشة" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:425 +msgid "CONNECT/SSL/HTTPS proxy" +msgstr "اتصال/SSL/HTTPS بروكسي" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:426 +msgid "IRC server" +msgstr "IRC خادم" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:427 +msgid "Streamr client" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:428 +msgid "Streamr server" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:429 +msgid "HTTP bidir" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:517 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:290 +msgid "Host not set" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:521 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:272 +msgid "Port not set" +msgstr "منÙØ° غير Ù…Øدد" + +#: ../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:279 +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:386 +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 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:162 +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:150 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:192 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:153 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:167 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:213 +msgid "required" +msgstr "مطلوب" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:159 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:178 +msgid "Reachable by" +msgstr "متصل ب" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:180 +msgid "Outproxies" +msgstr "بروكسي خارجي" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:187 +msgid "Tunnel Destination" +msgstr "وجهة النÙÙ‚" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:199 +msgid "name or destination" +msgstr "اسم او اتجاه" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:202 +msgid "b32 not recommended" +msgstr "b32 غير Ù…Ù†ØµÙˆØ Ø¨Ø§Ø³ØªØ¹Ù…Ø§Ù„Ù‡" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:208 +msgid "Shared Client" +msgstr "المستخدمين المشاركين" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:212 +msgid "" +"(Share tunnels with other clients and irc/httpclients? Change requires " +"restart of client proxy)" +msgstr "" +"(شارك النÙÙ‚ مع باقي المستخدمين Ùˆ irc/httpclientsØŸ التغيير بØاجة الى اعادة " +"التشغيل)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:216 +#: ../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:220 +#: ../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:222 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:243 +msgid "Advanced networking options" +msgstr "اعدادات متقدمة للشبكة" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:224 +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:226 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:245 +msgid "Tunnel Options" +msgstr "اعدادات النÙÙ‚" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:228 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:247 +msgid "Length" +msgstr "طول" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:254 +msgid "0 hop tunnel (low anonymity, low latency)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:258 +msgid "1 hop tunnel (medium anonymity, medium latency)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:262 +msgid "2 hop tunnel (high anonymity, high latency)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:247 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:266 +msgid "3 hop tunnel (very high anonymity, poor performance)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:256 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:275 +msgid "hop tunnel (very poor performance)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:261 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:280 +msgid "Variance" +msgstr "Ùرق" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:268 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:287 +msgid "0 hop variance (no randomisation, consistant performance)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:272 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:291 +msgid "" +"+ 0-1 hop variance (medium additive randomisation, subtractive performance)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:276 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:295 +msgid "" +"+ 0-2 hop variance (high additive randomisation, subtractive performance)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:280 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:299 +msgid "+/- 0-1 hop variance (standard randomisation, standard performance)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:284 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:303 +msgid "+/- 0-2 hop variance (not recommended)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:296 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:315 +msgid "hop variance" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:301 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:320 +msgid "Count" +msgstr "عد" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:308 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:327 +msgid "1 inbound, 1 outbound tunnel (low bandwidth usage, less reliability)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:312 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:331 +msgid "" +"2 inbound, 2 outbound tunnels (standard bandwidth usage, standard " +"reliability)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:316 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:335 +msgid "" +"3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:325 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:344 +msgid "tunnels" +msgstr "أنÙاق" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:330 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:349 +msgid "Backup Count" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:337 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:356 +msgid "0 backup tunnels (0 redundancy, no added resource usage)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:341 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:360 +msgid "1 backup tunnel each direction (low redundancy, low resource usage)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:345 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364 +msgid "" +"2 backup tunnels each direction (medium redundancy, medium resource usage)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:349 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:368 +msgid "3 backup tunnels each direction (high redundancy, high resource usage)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:358 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:377 +msgid "backup tunnels" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:365 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:384 +msgid "Profile" +msgstr "بروÙايل" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:372 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:391 +msgid "interactive connection" +msgstr "اتصال تÙاعلي" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:376 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:395 +msgid "bulk connection (downloads/websites/BT)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:378 +msgid "Delay Connect" +msgstr "تأخر الاتصال" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:382 +msgid "for request/response connections" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:386 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:399 +msgid "Router I2CP Address" +msgstr " I2CP عنوان" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:388 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:401 +msgid "Host" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:396 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:148 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:409 +#: ../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:479 +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/editClient_jsp.java:472 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:486 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:419 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:481 +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:485 +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:489 +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 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:435 +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:220 +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:470 +msgid "Local Authorization" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:476 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:490 +msgid "Username" +msgstr "اسم مستخدم" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:480 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:494 +msgid "Password" +msgstr "كلمة السر" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:484 +msgid "Outproxy Authorization" +msgstr "اعدادات البروكسي الخارجي" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:502 +msgid "Jump URL List" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:508 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:525 +msgid "Custom options" +msgstr "خيارات خاصة" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:512 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:529 +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:514 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:531 +msgid "Cancel" +msgstr "الغاء" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:518 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:535 +msgid "Delete" +msgstr "خذÙ" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:520 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:537 +msgid "Save" +msgstr "ØÙظ" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:73 +msgid "I2P Tunnel Manager - Edit Server Tunnel" +msgstr "" + +#: ../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:199 +msgid "Website name" +msgstr "اسم موقع جديد" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:203 +msgid "(leave blank for outproxies)" +msgstr "(دعه Ùارغا من أجل البروكسي الخارجي)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:208 +msgid "Private key file" +msgstr "مل٠مÙØªØ§Ø Ø§Ù„Ø®Ø§Øµ" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:230 +msgid "Add to local addressbook" +msgstr "أض٠الى دÙتر العناوين" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:237 +msgid "Hostname Signature" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:417 +msgid "Encrypt Leaseset" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:423 +msgid "Encryption Key" +msgstr "Ù…ÙØªØ§Ø Ø§Ù„ØªØ´Ùير" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:427 +msgid "Generate New Key" +msgstr "أنشئ Ù…ÙØªØ§Ø Ø¬Ø¯ÙŠØ¯" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:429 +msgid "Generate" +msgstr "أنشئ" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:431 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:523 +msgid "(Tunnel must be stopped first)" +msgstr "(يجب ايقا٠النÙÙ‚)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:433 +msgid "Restricted Access List" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:439 +msgid "Whitelist" +msgstr "قائمة بيضاء" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:443 +msgid "Blacklist" +msgstr "قائمة سوداء" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:447 +msgid "Access List" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:451 +msgid "Inbound connection limits (0=unlimited)" +msgstr "Øد الاتصال الداخلي (0=unlimited)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:453 +msgid "Per client" +msgstr "لكل مستخدم" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:455 +msgid "Per minute" +msgstr "لكل دقيقة" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:459 +msgid "Per hour" +msgstr "لكل ساعة" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:463 +msgid "Per day" +msgstr "لكل يوم" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:467 +msgid "Total" +msgstr "المجموع" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:475 +msgid "Max concurrent connections (0=unlimited)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:493 +msgid "New Certificate type" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:495 +msgid "None" +msgstr "لاشئ" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:499 +msgid "Hashcash (effort)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:505 +msgid "Hashcash Calc Time" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:507 +msgid "Estimate" +msgstr "تقدير" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:509 +msgid "Hidden" +msgstr "مخبئ" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:513 +msgid "Signed (signed by)" +msgstr "امضاء من" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:519 +msgid "Modify Certificate" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:521 +msgid "Modify" +msgstr "غير" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:71 +msgid "I2P Tunnel Manager - List" +msgstr "" + +#: ../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:297 +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:304 +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:311 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:325 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:339 +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:332 +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:346 +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:353 +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:396 +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:398 +msgid "Create" +msgstr "أنشئ" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:240 +msgid "I2P Client Tunnels" +msgstr "Ù†ÙÙ‚ المستخدمين" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:248 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:283 +msgid "Interface" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:318 +msgid "Standby" +msgstr "انتظر" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:363 +msgid "Outproxy" +msgstr "بروكسي خارجي" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:367 +msgid "Destination" +msgstr "اتجاه" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:381 +msgid "none" +msgstr "ﻻشيء" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:394 +msgid "New client tunnel" +msgstr "Ù†ÙÙ‚ مستخدم جديد" diff --git a/apps/i2ptunnel/locale/messages_de.po b/apps/i2ptunnel/locale/messages_de.po index d253333ae300db13c12e62b2fbf060977befae68..d9f49c3adfca91c4b4bb9cfd91a4d782a90a52ea 100644 --- a/apps/i2ptunnel/locale/messages_de.po +++ b/apps/i2ptunnel/locale/messages_de.po @@ -8,94 +8,118 @@ msgid "" msgstr "" "Project-Id-Version: I2P i2ptunnel\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-12-04 17:23+0000\n" -"PO-Revision-Date: 2010-12-19 04:36+0100\n" -"Last-Translator: mixxy <m1xxy@mail.i2p>\n" +"POT-Creation-Date: 2011-02-27 16:03+0000\n" +"PO-Revision-Date: 2011-02-27 17:38+0100\n" +"Last-Translator: \n" "Language-Team: foo <foo@bar>\n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: German\n" -#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:475 +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:474 #, java-format msgid "To visit the destination in your host database, click <a href=\"{0}\">here</a>. To visit the conflicting addresshelper destination, click <a href=\"{1}\">here</a>." msgstr "Um das Ziel in Ihrer Host-Datenbank zu besuchen, klicken Sie <a href=\"{0}\">hier</a>, und um das Ziel aus der kollidierenden Adresshelfer-Anfrage zu besuchen, <a href=\"{1}\">hier</a>!" -#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:932 +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:931 msgid "Click a link below to look for an address helper by using a \"jump\" service:" msgstr "Durch Klicken auf einen der untenstehenden Links bekommen Sie einen Adresshelfer von einem \"Sprung\"-Service:" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:170 +#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:326 +#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:336 +msgid "internal" +msgstr "intern" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:171 msgid "Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit." msgstr "Ungültige Formulareingabe - wahrscheinlich haben Sie den \"Zurück\"-Knopf Ihres Browsers betätigt. Bitte neuladen!" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:217 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:218 msgid "Configuration reloaded for all tunnels" msgstr "Einstellungen für alle Tunnel neugeladen" #. and give them something to look at in any case -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:229 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:230 msgid "Starting tunnel" msgstr "Starte Tunnel ..." #. and give them something to look at in any case -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:242 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:243 msgid "Stopping tunnel" msgstr "Beende Tunnel ..." -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:389 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:311 +msgid "Configuration changes saved" +msgstr "Änderungen der Einstellungen gespeichert" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:314 +msgid "Failed to save configuration" +msgstr "Einstellungen nicht gespeichert" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:398 msgid "New Tunnel" msgstr "Neuer Tunnel" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:409 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:418 msgid "Standard client" msgstr "Standardklient" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:410 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:419 msgid "HTTP client" msgstr "HTTP-Klient" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:411 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:420 msgid "IRC client" msgstr "IRC-Klient" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:412 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:421 msgid "Standard server" msgstr "Standardserver" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:413 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:422 msgid "HTTP server" msgstr "HTTP-Server" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:414 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:423 msgid "SOCKS 4/4a/5 proxy" msgstr "SOCKS-4/4a/5-Proxy" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:415 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:424 msgid "SOCKS IRC proxy" msgstr "SOCKS-IRC-Proxy" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:416 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:425 msgid "CONNECT/SSL/HTTPS proxy" msgstr "CONNECT/SSL/HTTPS-Proxy" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:417 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:426 msgid "IRC server" msgstr "IRC-Server" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:418 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:427 msgid "Streamr client" msgstr "Streamr-Klient" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:419 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:428 msgid "Streamr server" msgstr "Streamr-Server" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:420 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:429 msgid "HTTP bidir" msgstr "HTTP Bidir" +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:517 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:290 +msgid "Host not set" +msgstr "Host nicht gesetzt" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:521 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:272 +msgid "Port not set" +msgstr "Port nicht gesetzt" + #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:73 msgid "I2P Tunnel Manager - Edit Client Tunnel" msgstr "I2P-Tunnel-Manager - Kliententunnel bearbeiten" @@ -120,14 +144,14 @@ msgstr "Name" #: ../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 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:279 msgid "Type" msgstr "Typ" #: ../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:367 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:386 msgid "Description" msgstr "Beschreibung" @@ -138,357 +162,340 @@ msgstr "Ziel" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:130 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:132 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:167 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:162 msgid "Access Point" msgstr "Zugriffspunkt" #: ../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:172 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:228 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:150 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:192 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:153 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:167 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:213 msgid "required" msgstr "benötigt" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:150 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:183 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:159 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:178 msgid "Reachable by" msgstr "Erreichbar von" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:162 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:195 -msgid "Locally (127.0.0.1)" -msgstr "Lokal (127.0.0.1)" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:166 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:199 -msgid "Everyone (0.0.0.0)" -msgstr "Ãœberall (0.0.0.0)" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:170 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:203 -msgid "LAN Hosts (Please specify your LAN address)" -msgstr "LAN-Hosts (Bitte geben Sie ihre LAN-Adressen an!)" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:186 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:205 -msgid "Other" -msgstr "Anderen" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:195 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:180 msgid "Outproxies" msgstr "Ausgehende Proxies" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:202 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:187 msgid "Tunnel Destination" msgstr "Ziel des Tunnels" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:214 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:199 msgid "name or destination" msgstr "Name oder Ziel" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:217 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:202 msgid "b32 not recommended" msgstr "B32-Adressen nicht empfohlen" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:208 msgid "Shared Client" msgstr "versch. Klienten" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:212 msgid "(Share tunnels with other clients and irc/httpclients? Change requires restart of client proxy)" msgstr "(Soll dieser Tunnel mit anderen Klienten und IRC/HTTP-Klienten geteilt werden? Änderungen benötigen Neustart des Klientenproxys)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:231 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:216 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:124 msgid "Auto Start" msgstr "Automatischer Start" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:220 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:128 msgid "(Check the Box for 'YES')" msgstr "(Aktiviere das Kästchen für 'ja')" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:237 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:258 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:243 msgid "Advanced networking options" msgstr "Erweiterte Netzwerkoptionen" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:224 msgid "(NOTE: when this client proxy is configured to share tunnels, then these options are for all the shared proxy clients!)" msgstr "(HINWEIS: Ist dieser Proxy konfiguriert, Tunnel mit anderen Klienten zu teilen, so gelten diese Optionen für alle Klienten des Proxys!)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:241 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:260 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:245 msgid "Tunnel Options" msgstr "Tunneloptionen" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:243 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:262 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:228 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:247 msgid "Length" msgstr "Länge" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:250 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:269 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:254 msgid "0 hop tunnel (low anonymity, low latency)" msgstr "0-Hop-Tunnel (geringe Anonymität, geringe Latenz)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:254 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:273 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:258 msgid "1 hop tunnel (medium anonymity, medium latency)" msgstr "1-Hop-Tunnel (mittlere Anonymität, mittlere Latenz)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:258 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:277 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:262 msgid "2 hop tunnel (high anonymity, high latency)" msgstr "2-Hop-Tunnel (hohe Anonymität, hohe Latenz)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:262 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:281 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:247 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:266 msgid "3 hop tunnel (very high anonymity, poor performance)" msgstr "3-Hop-Tunnel (sehr hohe Anonymität, geringe Leistung)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:271 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:290 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:256 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:275 msgid "hop tunnel (very poor performance)" msgstr "Hop-Tunnel (sehr geringe Leistung)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:276 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:295 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:261 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:280 msgid "Variance" msgstr "Varianz" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:283 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:302 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:268 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:287 msgid "0 hop variance (no randomisation, consistant performance)" msgstr "0-Hop-Varianz (keine zufällige Längenveränderung, konsistente Leistung)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:287 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:306 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:272 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:291 msgid "+ 0-1 hop variance (medium additive randomisation, subtractive performance)" msgstr "+ 0-1 Hop Varianz (mittlere zufällige Verlängerung, verringert die Leistung)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:291 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:310 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:276 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:295 msgid "+ 0-2 hop variance (high additive randomisation, subtractive performance)" msgstr "+ 0-2 Hops Varianz (hohe zufällige Verlängerung, verringerte Leistung)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:295 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:314 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:280 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:299 msgid "+/- 0-1 hop variance (standard randomisation, standard performance)" msgstr "+/- 0-1 Hop Varianz (geringe zufällige Längenänderung, Standardleistung)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:299 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:318 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:284 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:303 msgid "+/- 0-2 hop variance (not recommended)" msgstr "+/- 0-2 Hops Varianz (nicht empfohlen)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:311 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:330 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:296 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:315 msgid "hop variance" msgstr "Hops Varianz" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:316 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:301 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:320 msgid "Count" msgstr "Anzahl" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:323 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:342 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:308 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:327 msgid "1 inbound, 1 outbound tunnel (low bandwidth usage, less reliability)" msgstr "1 eingehender, 1 ausgehender Tunnel (geringe Bandbreitennutzung, weniger zuverlässig)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:327 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:346 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:312 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:331 msgid "2 inbound, 2 outbound tunnels (standard bandwidth usage, standard reliability)" msgstr "2 eingehende, 2 ausgehende Tunnel (Standardbandbreitennutzung, zuverlässig)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:331 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:350 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:316 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:335 msgid "3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)" msgstr "3 eingehende, 3 ausgehende Tunnel (hohe Bandbreitennutzung, zuverlässiger)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:340 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:359 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:325 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:344 msgid "tunnels" msgstr "Tunnel" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:345 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:330 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:349 msgid "Backup Count" msgstr "Anzahl an Ersatztunneln" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:352 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:371 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:337 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:356 msgid "0 backup tunnels (0 redundancy, no added resource usage)" msgstr "0 Ersatztunnel (0 Redundanz, keine zusätzliche Ressourcennutzung)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:356 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:375 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:341 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:360 msgid "1 backup tunnel each direction (low redundancy, low resource usage)" msgstr "1 Ersatztunnel in jede Richtung (geringe Redundanz, geringe Ressourcennutzung)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:360 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:379 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:345 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364 msgid "2 backup tunnels each direction (medium redundancy, medium resource usage)" msgstr "2 Ersatztunnel in jede Richtung (mittlere Redundanz, mittlere Ressourcennutzung)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:364 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:383 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:349 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:368 msgid "3 backup tunnels each direction (high redundancy, high resource usage)" msgstr "3 Ersatztunnel in jede Richtung (hohe Redundanz, hohe Ressourcennutzung)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:373 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:392 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:358 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:377 msgid "backup tunnels" msgstr "Ersatztunnel" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:380 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:399 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:365 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:384 msgid "Profile" msgstr "Profil" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:387 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:406 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:372 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:391 msgid "interactive connection" msgstr "Interaktive Verbindung" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:391 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:410 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:376 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:395 msgid "bulk connection (downloads/websites/BT)" msgstr "Mengenverbindung (Download/Webseiten/BitTorrent)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:393 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:378 msgid "Delay Connect" msgstr "Verbindung verzögern" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:397 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:382 msgid "for request/response connections" msgstr "für Verbindungen mit Anfragen/Antworten" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:401 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:414 -msgid "I2CP Options" -msgstr "I2CP-Optionen" +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:386 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:399 +msgid "Router I2CP Address" +msgstr "I2CP-Adresse des Routers" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:403 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:146 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:416 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:388 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:401 msgid "Host" msgstr "Host" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:407 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:152 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:420 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:396 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:148 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:409 #: ../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 "Port" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:413 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:452 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:406 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:479 msgid "Reduce tunnel quantity when idle" msgstr "Anzahl an Tunneln im Leerlauf reduzieren" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:415 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:429 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:437 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:449 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:459 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:479 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:493 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:426 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:442 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:454 +#: ../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/editClient_jsp.java:472 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:486 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:419 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:481 msgid "Enable" msgstr "aktiviert" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:419 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:458 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:412 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:485 msgid "Reduced tunnel count" msgstr "Reduzierte Tunnelanzahl" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:423 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:443 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:462 +#: ../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:489 msgid "Idle minutes" msgstr "Minuten Inaktivität" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:427 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:420 msgid "Close tunnels when idle" msgstr "nicht genutzte Tunnel schließen" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:433 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:426 msgid "New Keys on Reopen" msgstr "Neue Schlüssel beim Wiederöffnen" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:441 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:434 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:435 msgid "Disable" msgstr "deaktiviert" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:447 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:440 msgid "Delay tunnel open until required" msgstr "Aufbau des Tunnela verzögern, bis dieser benötigt wird" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:457 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:450 msgid "Persistent private key" msgstr "Dauerhafter privater Schlüssel" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:463 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:456 msgid "File" msgstr "Datei" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:467 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:460 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:220 msgid "Local destination" msgstr "lokales Ziel" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:471 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:464 msgid "(if known)" msgstr "(falls bekannt)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:477 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:470 msgid "Local Authorization" msgstr "lokale Autorisation" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:483 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:497 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:476 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:490 msgid "Username" msgstr "Benutzername" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:487 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:501 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:480 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:494 msgid "Password" msgstr "Passwort" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:491 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:484 msgid "Outproxy Authorization" msgstr "Outproxy Autorisation" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:507 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:498 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:502 +msgid "Jump URL List" +msgstr "List der Sprung-URLs" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:508 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:525 msgid "Custom options" msgstr "Eigene Optionen" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:511 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:502 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:512 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:529 msgid "NOTE: If tunnel is currently running, most changes will not take effect until tunnel is stopped and restarted." msgstr "HINWEIS: Falls der Tunnel gerade aktiv ist, werden die meisten Änderungen erst nach einem Neustart des Tunnels wirksam." -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:513 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:504 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:514 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:531 msgid "Cancel" msgstr "Abbrechen" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:517 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:508 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:518 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:535 msgid "Delete" msgstr "Löschen" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:519 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:510 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:520 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:537 msgid "Save" msgstr "Speichern" @@ -504,92 +511,124 @@ msgstr "Servereinstellungen ändern" msgid "New server settings" msgstr "Neue Servereinstellungen" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:214 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:199 msgid "Website name" msgstr "Name der Webseite" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:218 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:203 msgid "(leave blank for outproxies)" msgstr "(für ausgehende Proxies leer lassen)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:208 msgid "Private key file" msgstr "private Schlüsseldatei" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:245 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:230 msgid "Add to local addressbook" msgstr "zum lokalen Adressbuch hinzufügen" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:252 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:237 msgid "Hostname Signature" msgstr "Signatur des Namens" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:424 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:417 msgid "Encrypt Leaseset" msgstr "Leaseset verschlüsseln" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:430 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:423 msgid "Encryption Key" msgstr "Schlüssel zum verschlüsseln" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:434 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:427 msgid "Generate New Key" msgstr "Erzeuge neuen Schlüssel" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:436 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:429 msgid "Generate" msgstr "Erzeugen" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:438 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:496 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:431 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:523 msgid "(Tunnel must be stopped first)" msgstr "(Tunnel muss zuerst beendet sein)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:440 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:433 msgid "Restricted Access List" msgstr "Zugang beschränken" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:446 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:439 +msgid "Whitelist" +msgstr "Zugangsliste" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:443 +msgid "Blacklist" +msgstr "Sperrliste" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:447 msgid "Access List" msgstr "Zugangsliste" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:450 -msgid "(Restrict to these clients only)" -msgstr "(Zugang wird auf diese Klienten beschränkt)" +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:451 +msgid "Inbound connection limits (0=unlimited)" +msgstr "Begrenzung eingehender Verbindungen (0=unbegrenzt)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:466 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:453 +msgid "Per client" +msgstr "pro Klient" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:455 +msgid "Per minute" +msgstr "pro Minute" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:459 +msgid "Per hour" +msgstr "pro Stunde" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:463 +msgid "Per day" +msgstr "pro Tag" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:467 +msgid "Total" +msgstr "Gesamt" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:475 +msgid "Max concurrent connections (0=unlimited)" +msgstr "max. Anzahl gleichzeitiger Verbindungen (0=unbegrenzt)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:493 msgid "New Certificate type" msgstr "Neuer Zertifizierungstyp" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:468 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:495 msgid "None" msgstr "Keiner" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:472 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:499 msgid "Hashcash (effort)" msgstr "Hashcash (Durchsatz)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:478 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:505 msgid "Hashcash Calc Time" msgstr "Hashcash Berechnungszeit" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:480 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:507 msgid "Estimate" msgstr "Abschätzung" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:482 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:509 msgid "Hidden" msgstr "Versteckt" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:486 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:513 msgid "Signed (signed by)" msgstr "Signiert (unterschrieben von)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:492 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:519 msgid "Modify Certificate" msgstr "Zertifikat modifizieren" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:494 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:521 msgid "Modify" msgstr "Modifizieren" @@ -639,7 +678,7 @@ msgstr "Vorschau" #: ../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 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:297 msgid "Status" msgstr "Status" @@ -652,30 +691,30 @@ msgid "No Preview" msgstr "Keine Vorschau" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:184 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:285 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:304 msgid "Starting..." msgstr "Starte ..." #: ../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 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:311 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:325 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:339 msgid "Stop" msgstr "Stopp" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:198 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:313 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:332 msgid "Running" msgstr "Aktiv" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:212 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:327 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:346 msgid "Stopped" msgstr "Gestoppt" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:334 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:353 msgid "Start" msgstr "Start" @@ -684,12 +723,12 @@ msgid "New server tunnel" msgstr "Neuer Servertunnel" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:236 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:377 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:396 msgid "Standard" msgstr "Standard" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:238 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:379 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:398 msgid "Create" msgstr "Erstellen" @@ -698,27 +737,40 @@ msgid "I2P Client Tunnels" msgstr "I2P-Klienten-Tunnel" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:248 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:274 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:283 msgid "Interface" msgstr "Interface" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:299 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:318 msgid "Standby" msgstr "Wartestellung" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:344 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:363 msgid "Outproxy" msgstr "Ausgehender Proxy" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:348 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:367 msgid "Destination" msgstr "Ziel" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:362 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:381 msgid "none" msgstr "Keiner" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:375 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:394 msgid "New client tunnel" msgstr "Neuer Kliententunnel" +#~ msgid "Locally (127.0.0.1)" +#~ msgstr "Lokal (127.0.0.1)" +#~ msgid "Everyone (0.0.0.0)" +#~ msgstr "Ãœberall (0.0.0.0)" +#~ msgid "LAN Hosts (Please specify your LAN address)" +#~ msgstr "LAN-Hosts (Bitte geben Sie ihre LAN-Adressen an!)" +#~ msgid "Other" +#~ msgstr "Anderen" +#~ msgid "I2CP Options" +#~ msgstr "I2CP-Optionen" +#~ msgid "(Restrict to these clients only)" +#~ msgstr "(Zugang wird auf diese Klienten beschränkt)" + diff --git a/apps/i2ptunnel/locale/messages_en.po b/apps/i2ptunnel/locale/messages_en.po new file mode 100644 index 0000000000000000000000000000000000000000..8cfb64f1017b01c9d35ac4adc2c6bf02e0522671 --- /dev/null +++ b/apps/i2ptunnel/locale/messages_en.po @@ -0,0 +1,780 @@ +# 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: 2011-03-03 18:29+0000\n" +"PO-Revision-Date: 2010-06-15 14:09+0100\n" +"Last-Translator: duck <duck@mail.i2p>\n" +"Language-Team: duck <duck@mail.i2p>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:474 +#, java-format +msgid "" +"To visit the destination in your host database, click <a href=\"{0}\">here</" +"a>. To visit the conflicting addresshelper destination, click <a href=" +"\"{1}\">here</a>." +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:931 +msgid "" +"Click a link below to look for an address helper by using a \"jump\" service:" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:326 +#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:336 +msgid "internal" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:171 +msgid "" +"Invalid form submission, probably because you used the 'back' or 'reload' " +"button on your browser. Please resubmit." +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:218 +msgid "Configuration reloaded for all tunnels" +msgstr "" + +#. and give them something to look at in any case +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:230 +msgid "Starting tunnel" +msgstr "" + +#. and give them something to look at in any case +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:243 +msgid "Stopping tunnel" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:311 +msgid "Configuration changes saved" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:314 +msgid "Failed to save configuration" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:398 +msgid "New Tunnel" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:418 +msgid "Standard client" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:419 +msgid "HTTP client" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:420 +msgid "IRC client" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:421 +msgid "Standard server" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:422 +msgid "HTTP server" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:423 +msgid "SOCKS 4/4a/5 proxy" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:424 +msgid "SOCKS IRC proxy" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:425 +msgid "CONNECT/SSL/HTTPS proxy" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:426 +msgid "IRC server" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:427 +msgid "Streamr client" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:428 +msgid "Streamr server" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:429 +msgid "HTTP bidir" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:517 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:290 +msgid "Host not set" +msgstr "" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:521 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:272 +msgid "Port not set" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:73 +msgid "I2P Tunnel Manager - Edit Client Tunnel" +msgstr "" + +#: ../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:279 +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:386 +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 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:162 +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:150 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:192 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:153 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:167 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:213 +msgid "required" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:159 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:178 +msgid "Reachable by" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:180 +msgid "Outproxies" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:187 +msgid "Tunnel Destination" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:199 +msgid "name or destination" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:202 +msgid "b32 not recommended" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:208 +msgid "Shared Client" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:212 +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:216 +#: ../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:220 +#: ../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:222 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:243 +msgid "Advanced networking options" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:224 +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:226 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:245 +msgid "Tunnel Options" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:228 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:247 +msgid "Length" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:254 +msgid "0 hop tunnel (low anonymity, low latency)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:258 +msgid "1 hop tunnel (medium anonymity, medium latency)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:262 +msgid "2 hop tunnel (high anonymity, high latency)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:247 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:266 +msgid "3 hop tunnel (very high anonymity, poor performance)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:256 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:275 +msgid "hop tunnel (very poor performance)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:261 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:280 +msgid "Variance" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:268 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:287 +msgid "0 hop variance (no randomisation, consistant performance)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:272 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:291 +msgid "" +"+ 0-1 hop variance (medium additive randomisation, subtractive performance)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:276 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:295 +msgid "" +"+ 0-2 hop variance (high additive randomisation, subtractive performance)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:280 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:299 +msgid "+/- 0-1 hop variance (standard randomisation, standard performance)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:284 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:303 +msgid "+/- 0-2 hop variance (not recommended)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:296 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:315 +msgid "hop variance" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:301 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:320 +msgid "Count" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:308 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:327 +msgid "1 inbound, 1 outbound tunnel (low bandwidth usage, less reliability)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:312 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:331 +msgid "" +"2 inbound, 2 outbound tunnels (standard bandwidth usage, standard " +"reliability)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:316 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:335 +msgid "" +"3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:325 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:344 +msgid "tunnels" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:330 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:349 +msgid "Backup Count" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:337 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:356 +msgid "0 backup tunnels (0 redundancy, no added resource usage)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:341 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:360 +msgid "1 backup tunnel each direction (low redundancy, low resource usage)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:345 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364 +msgid "" +"2 backup tunnels each direction (medium redundancy, medium resource usage)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:349 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:368 +msgid "3 backup tunnels each direction (high redundancy, high resource usage)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:358 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:377 +msgid "backup tunnels" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:365 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:384 +msgid "Profile" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:372 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:391 +msgid "interactive connection" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:376 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:395 +msgid "bulk connection (downloads/websites/BT)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:378 +msgid "Delay Connect" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:382 +msgid "for request/response connections" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:386 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:399 +msgid "Router I2CP Address" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:388 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:401 +msgid "Host" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:396 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:148 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:409 +#: ../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:479 +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/editClient_jsp.java:472 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:486 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:419 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:481 +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:485 +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:489 +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 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:435 +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:220 +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:470 +msgid "Local Authorization" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:476 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:490 +msgid "Username" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:480 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:494 +msgid "Password" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:484 +msgid "Outproxy Authorization" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:502 +msgid "Jump URL List" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:508 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:525 +msgid "Custom options" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:512 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:529 +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:514 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:531 +msgid "Cancel" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:518 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:535 +msgid "Delete" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:520 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:537 +msgid "Save" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:73 +msgid "I2P Tunnel Manager - Edit Server Tunnel" +msgstr "" + +#: ../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:199 +msgid "Website name" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:203 +msgid "(leave blank for outproxies)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:208 +msgid "Private key file" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:230 +msgid "Add to local addressbook" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:237 +msgid "Hostname Signature" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:417 +msgid "Encrypt Leaseset" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:423 +msgid "Encryption Key" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:427 +msgid "Generate New Key" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:429 +msgid "Generate" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:431 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:523 +msgid "(Tunnel must be stopped first)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:433 +msgid "Restricted Access List" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:439 +msgid "Whitelist" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:443 +msgid "Blacklist" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:447 +msgid "Access List" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:451 +msgid "Inbound connection limits (0=unlimited)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:453 +msgid "Per client" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:455 +msgid "Per minute" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:459 +msgid "Per hour" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:463 +msgid "Per day" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:467 +msgid "Total" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:475 +msgid "Max concurrent connections (0=unlimited)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:493 +msgid "New Certificate type" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:495 +msgid "None" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:499 +msgid "Hashcash (effort)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:505 +msgid "Hashcash Calc Time" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:507 +msgid "Estimate" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:509 +msgid "Hidden" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:513 +msgid "Signed (signed by)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:519 +msgid "Modify Certificate" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:521 +msgid "Modify" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:71 +msgid "I2P Tunnel Manager - List" +msgstr "" + +#: ../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 "" + +#: ../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:297 +msgid "Status" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:163 +msgid "Base32 Address" +msgstr "" + +#: ../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:304 +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:311 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:325 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:339 +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:332 +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:346 +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:353 +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:396 +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:398 +msgid "Create" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:240 +msgid "I2P Client Tunnels" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:248 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:283 +msgid "Interface" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:318 +msgid "Standby" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:363 +msgid "Outproxy" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:367 +msgid "Destination" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:381 +msgid "none" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:394 +msgid "New client tunnel" +msgstr "" diff --git a/apps/i2ptunnel/locale/messages_es.po b/apps/i2ptunnel/locale/messages_es.po new file mode 100644 index 0000000000000000000000000000000000000000..ce7098182d79602c8f95b7ecc3d3538a5215f615 --- /dev/null +++ b/apps/i2ptunnel/locale/messages_es.po @@ -0,0 +1,763 @@ +# 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\n" +"Report-Msgid-Bugs-To: https://trac.i2p2.de/\n" +"POT-Creation-Date: 2011-03-03 18:29+0000\n" +"PO-Revision-Date: 2011-04-18 21:39+0100\n" +"Last-Translator: mixxy <m1xxy@mail.i2p>\n" +"Language-Team: Spanish (Castilian) <None>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:474 +#, java-format +msgid "To visit the destination in your host database, click <a href=\"{0}\">here</a>. To visit the conflicting addresshelper destination, click <a href=\"{1}\">here</a>." +msgstr "Para visitar el destino en la base de datos de hosts, haga clic <a href=\"{0}\">aquÃ</a> . Para visitar el destino del ayudante de direcciones en conflicto, haga clic <a href=\"{1}\">aquÃ</a> ." + +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:931 +msgid "Click a link below to look for an address helper by using a \"jump\" service:" +msgstr "Haga clic en un enlace de debajo para buscar un ayudante de direcciones mediante el uso de un servicio de \"salto\":" + +#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:326 +#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:336 +msgid "internal" +msgstr "interno" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:171 +msgid "Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit." +msgstr "El formulario presentado es inválido, probablemente porque ha utilizado el botón 'atrás' o 'recargar' de su navegador. Por favor, vuelva a enviarlo." + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:218 +msgid "Configuration reloaded for all tunnels" +msgstr "Configuración recargada para todos los túneles" + +#. and give them something to look at in any case +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:230 +msgid "Starting tunnel" +msgstr "Inicializando el túnel" + +#. and give them something to look at in any case +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:243 +msgid "Stopping tunnel" +msgstr "Deteniendo el túnel" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:311 +msgid "Configuration changes saved" +msgstr "Cambios en la configuración guardados" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:314 +msgid "Failed to save configuration" +msgstr "No se pudo guardar la configuración" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:398 +msgid "New Tunnel" +msgstr "Nuevo túnel" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:418 +msgid "Standard client" +msgstr "Cliente estándar" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:419 +msgid "HTTP client" +msgstr "Cliente HTTP" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:420 +msgid "IRC client" +msgstr "Cliente IRC" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:421 +msgid "Standard server" +msgstr "Servidor estándar" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:422 +msgid "HTTP server" +msgstr "Servidor HTTP" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:423 +msgid "SOCKS 4/4a/5 proxy" +msgstr "Proxy SOCKS 4/4a/5" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:424 +msgid "SOCKS IRC proxy" +msgstr "Proxy IRC SOCKS" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:425 +msgid "CONNECT/SSL/HTTPS proxy" +msgstr "Proxy CONNECT/SSL/HTTPS" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:426 +msgid "IRC server" +msgstr "Servidor de IRC" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:427 +msgid "Streamr client" +msgstr "Cliente Streamr" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:428 +msgid "Streamr server" +msgstr "Servidor Streamr" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:429 +msgid "HTTP bidir" +msgstr "HTTP bidir" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:517 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:290 +msgid "Host not set" +msgstr "Host no establecido" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:521 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:272 +msgid "Port not set" +msgstr "Puerto no establecido" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:73 +msgid "I2P Tunnel Manager - Edit Client Tunnel" +msgstr "Gestor del túneles I2P - Editar túnel de cliente" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:93 +msgid "Edit proxy settings" +msgstr "Editar configuración de proxy" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:101 +msgid "New proxy settings" +msgstr "Nueva configuración de proxy" + +#: ../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 "Nombre" + +#: ../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:279 +msgid "Type" +msgstr "Tipo" + +#: ../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:386 +msgid "Description" +msgstr "Descripción" + +#: ../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 "Objetivo" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:130 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:132 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:162 +msgid "Access Point" +msgstr "Punto de Acceso" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:137 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:150 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:192 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:153 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:167 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:213 +msgid "required" +msgstr "requerido" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:159 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:178 +msgid "Reachable by" +msgstr "Accesible por" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:180 +msgid "Outproxies" +msgstr "Outproxis" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:187 +msgid "Tunnel Destination" +msgstr "Túnel del Destino" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:199 +msgid "name or destination" +msgstr "nombre o destino" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:202 +msgid "b32 not recommended" +msgstr "b32 no recomendado" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:208 +msgid "Shared Client" +msgstr "Túnel Compartido" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:212 +msgid "(Share tunnels with other clients and irc/httpclients? Change requires restart of client proxy)" +msgstr "(¿Compartir túneles con otros clientes y clientes de IRC/http? Cambiar esto requiere reiniciar el proxy de cliente)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:216 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:124 +msgid "Auto Start" +msgstr "Autoarranque" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:128 +msgid "(Check the Box for 'YES')" +msgstr "(Marque la casilla para \"SI\")" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:243 +msgid "Advanced networking options" +msgstr "Opciones avanzadas de red" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:224 +msgid "(NOTE: when this client proxy is configured to share tunnels, then these options are for all the shared proxy clients!)" +msgstr "(NOTA: cuando este proxy de cliente está configurado para compartir túneles, entonces estas opciones son para todos los clientes de proxy compartidos!)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:245 +msgid "Tunnel Options" +msgstr "Opciones de Túnel" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:228 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:247 +msgid "Length" +msgstr "Longitud" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:254 +msgid "0 hop tunnel (low anonymity, low latency)" +msgstr "Túnel de 0 saltos (anonimato bajo, latencia baja)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:258 +msgid "1 hop tunnel (medium anonymity, medium latency)" +msgstr "Túnel de 1 salto (anonimato medio, latencia media)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:262 +msgid "2 hop tunnel (high anonymity, high latency)" +msgstr "Túnel de 2 saltos (anonimato alto, latencia alta)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:247 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:266 +msgid "3 hop tunnel (very high anonymity, poor performance)" +msgstr "Túnel de 3 saltos (anonimato muy alto, rendimiento pobre)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:256 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:275 +msgid "hop tunnel (very poor performance)" +msgstr "saltos de túnel (rendimiento muy pobre)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:261 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:280 +msgid "Variance" +msgstr "Variación" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:268 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:287 +msgid "0 hop variance (no randomisation, consistant performance)" +msgstr "Variación de 0 saltos (sin aleatoriedad, rendimiento constante)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:272 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:291 +msgid "+ 0-1 hop variance (medium additive randomisation, subtractive performance)" +msgstr "Variación de + 0-1 saltos (aleatoriedad media aditiva, rendimiento substractivo)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:276 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:295 +msgid "+ 0-2 hop variance (high additive randomisation, subtractive performance)" +msgstr "Variación de + 0-2 saltos (aleatoriedad alta aditiva, rendimiento substractivo)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:280 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:299 +msgid "+/- 0-1 hop variance (standard randomisation, standard performance)" +msgstr "Variación de +/- 0-1 saltos (aleatoriedad estándar, rendimiento estándar)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:284 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:303 +msgid "+/- 0-2 hop variance (not recommended)" +msgstr "Variación de +/- 0-2 saltos (no recomendado)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:296 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:315 +msgid "hop variance" +msgstr "Variación de saltos" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:301 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:320 +msgid "Count" +msgstr "Número" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:308 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:327 +msgid "1 inbound, 1 outbound tunnel (low bandwidth usage, less reliability)" +msgstr "1 entrante, 1 túnel de salida (bajo uso de ancho de banda, menos fiabilidad)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:312 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:331 +msgid "2 inbound, 2 outbound tunnels (standard bandwidth usage, standard reliability)" +msgstr "2 entrantes, 2 túneles de salida (uso de ancho de banda estándar, fiabilidad estándar)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:316 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:335 +msgid "3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)" +msgstr "3 entrantes, 3 túneles de salida (mayor uso de ancho de banda, mayor fiabilidad)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:325 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:344 +msgid "tunnels" +msgstr "túneles" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:330 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:349 +msgid "Backup Count" +msgstr "Número de respaldo" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:337 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:356 +msgid "0 backup tunnels (0 redundancy, no added resource usage)" +msgstr "0 túneles de respaldo (redundancia 0, no aumenta el uso de recursos)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:341 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:360 +msgid "1 backup tunnel each direction (low redundancy, low resource usage)" +msgstr "1 túnel de respaldo en cada dirección (redundancia baja, uso bajo de recursos)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:345 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364 +msgid "2 backup tunnels each direction (medium redundancy, medium resource usage)" +msgstr "2 túneles de respaldo en cada dirección (redundancia media, uso de recursos medio)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:349 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:368 +msgid "3 backup tunnels each direction (high redundancy, high resource usage)" +msgstr "3 túneles de respaldo en cada dirección (alta redundancia, uso de recursos alto)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:358 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:377 +msgid "backup tunnels" +msgstr "túneles de respaldo" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:365 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:384 +msgid "Profile" +msgstr "Perfil" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:372 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:391 +msgid "interactive connection" +msgstr "conexión interactiva" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:376 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:395 +msgid "bulk connection (downloads/websites/BT)" +msgstr "conexión en masa (descargas/web/BT)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:378 +msgid "Delay Connect" +msgstr "Retrasar Conexión" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:382 +msgid "for request/response connections" +msgstr "para las conexiones de solicitud/respuesta" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:386 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:399 +msgid "Router I2CP Address" +msgstr "Dirección I2CP del router" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:388 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:401 +msgid "Host" +msgstr "Host" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:396 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:148 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:409 +#: ../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 "Puerto" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:406 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:479 +msgid "Reduce tunnel quantity when idle" +msgstr "Reducir la cantidad de túneles cuando se está inactivo" + +#: ../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/editClient_jsp.java:472 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:486 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:419 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:481 +msgid "Enable" +msgstr "Habilitar" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:412 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:485 +msgid "Reduced tunnel count" +msgstr "Número de túneles reducido" + +#: ../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:489 +msgid "Idle minutes" +msgstr "Minutos de inactividad" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:420 +msgid "Close tunnels when idle" +msgstr "Cerrar los túneles cuando se está inactivo" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:426 +msgid "New Keys on Reopen" +msgstr "Nuevas claves al reabrir" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:434 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:435 +msgid "Disable" +msgstr "Desactivar" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:440 +msgid "Delay tunnel open until required" +msgstr "Retrasar apertura del túnel hasta que sea necesario" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:450 +msgid "Persistent private key" +msgstr "Clave privada persistente" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:456 +msgid "File" +msgstr "Archivo" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:460 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:220 +msgid "Local destination" +msgstr "destino local" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:464 +msgid "(if known)" +msgstr "(Si se conoce)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:470 +msgid "Local Authorization" +msgstr "Autorización local" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:476 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:490 +msgid "Username" +msgstr "Nombre de usuario" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:480 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:494 +msgid "Password" +msgstr "Contraseña" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:484 +msgid "Outproxy Authorization" +msgstr "Autorización outproxy" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:502 +msgid "Jump URL List" +msgstr "Lista de URL de salto" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:508 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:525 +msgid "Custom options" +msgstr "Opciones personalizadas" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:512 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:529 +msgid "NOTE: If tunnel is currently running, most changes will not take effect until tunnel is stopped and restarted." +msgstr "NOTA: Si el túnel se está ejecutando actualmente, la mayorÃa de los cambios no tendrán efecto hasta que se detenga y reinicie el túnel." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:514 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:531 +msgid "Cancel" +msgstr "Cancelar" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:518 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:535 +msgid "Delete" +msgstr "Eliminar" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:520 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:537 +msgid "Save" +msgstr "Guardar" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:73 +msgid "I2P Tunnel Manager - Edit Server Tunnel" +msgstr "Gestor del túneles I2P - Editar túnel servidor" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:93 +msgid "Edit server settings" +msgstr "Editar configuración del servidor" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:101 +msgid "New server settings" +msgstr "Nueva configuración del servidor" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:199 +msgid "Website name" +msgstr "Nombre de la página" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:203 +msgid "(leave blank for outproxies)" +msgstr "(Dejar en blanco para outproxies)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:208 +msgid "Private key file" +msgstr "archivo de clave privada" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:230 +msgid "Add to local addressbook" +msgstr "Agregar a la libreta de direcciones local" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:237 +msgid "Hostname Signature" +msgstr "Firma del Hostname" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:417 +msgid "Encrypt Leaseset" +msgstr "Cifrar Leaseset" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:423 +msgid "Encryption Key" +msgstr "Clave de cifrado" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:427 +msgid "Generate New Key" +msgstr "Generar nueva clave" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:429 +msgid "Generate" +msgstr "Generar" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:431 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:523 +msgid "(Tunnel must be stopped first)" +msgstr "(El túnel debe detenerse primero)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:433 +msgid "Restricted Access List" +msgstr "Lista de acceso restringido" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:439 +msgid "Whitelist" +msgstr "Lista blanca" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:443 +msgid "Blacklist" +msgstr "Lista negra" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:447 +msgid "Access List" +msgstr "Lista de acceso" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:451 +msgid "Inbound connection limits (0=unlimited)" +msgstr "LÃmites de conexiones entrantes (0 = sin lÃmite)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:453 +msgid "Per client" +msgstr "Por cliente" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:455 +msgid "Per minute" +msgstr "por minuto" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:459 +msgid "Per hour" +msgstr "Por hora" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:463 +msgid "Per day" +msgstr "Por dÃa" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:467 +msgid "Total" +msgstr "Total" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:475 +msgid "Max concurrent connections (0=unlimited)" +msgstr "Número máximo de conexiones simultáneas (0 = sin lÃmite)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:493 +msgid "New Certificate type" +msgstr "Nuevo tipo de certificado" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:495 +msgid "None" +msgstr "Ninguno" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:499 +msgid "Hashcash (effort)" +msgstr "Hashcash (esfuerzo)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:505 +msgid "Hashcash Calc Time" +msgstr "Tiempo de Calc Hashcash " + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:507 +msgid "Estimate" +msgstr "Estimación" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:509 +msgid "Hidden" +msgstr "Oculto" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:513 +msgid "Signed (signed by)" +msgstr "Firmado (firmado por)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:519 +msgid "Modify Certificate" +msgstr "Modificar Certificado" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:521 +msgid "Modify" +msgstr "Modificar" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:71 +msgid "I2P Tunnel Manager - List" +msgstr "Gestor de túneles I2P - Lista" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:83 +msgid "Status Messages" +msgstr "Mensajes de estado" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:87 +msgid "Refresh" +msgstr "Actualizar" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:91 +msgid "Stop All" +msgstr "Detener todos" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:95 +msgid "Start All" +msgstr "Iniciar todos" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:99 +msgid "Restart All" +msgstr "Reiniciar todos" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:103 +msgid "Reload Config" +msgstr "Actualizar configuración" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:105 +msgid "I2P Server Tunnels" +msgstr "Túneles de servidor 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 "Apunta a" + +#: ../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 "Preview" + +#: ../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:297 +msgid "Status" +msgstr "Estado" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:163 +msgid "Base32 Address" +msgstr "Dirección Base32" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:171 +msgid "No Preview" +msgstr "Sin vista previa" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:184 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:304 +msgid "Starting..." +msgstr "Iniciando..." + +#: ../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:311 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:325 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:339 +msgid "Stop" +msgstr "Detener" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:198 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:332 +msgid "Running" +msgstr "Ejecutándose" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:212 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:346 +msgid "Stopped" +msgstr "Detenido" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:219 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:353 +msgid "Start" +msgstr "Iniciar" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:234 +msgid "New server tunnel" +msgstr "Nuevo servidor de túnel" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:396 +msgid "Standard" +msgstr "Estándar" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:238 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:398 +msgid "Create" +msgstr "Crear" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:240 +msgid "I2P Client Tunnels" +msgstr "Túneles de cliente I2P" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:248 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:283 +msgid "Interface" +msgstr "Interfaz" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:318 +msgid "Standby" +msgstr "En espera" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:363 +msgid "Outproxy" +msgstr "Outproxy" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:367 +msgid "Destination" +msgstr "Destino" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:381 +msgid "none" +msgstr "ninguno" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:394 +msgid "New client tunnel" +msgstr "Nuevo túnel de cliente" + diff --git a/apps/i2ptunnel/locale/messages_fr.po b/apps/i2ptunnel/locale/messages_fr.po new file mode 100644 index 0000000000000000000000000000000000000000..d35ca8152686b4fe584f917ee8eef0f6c183362f --- /dev/null +++ b/apps/i2ptunnel/locale/messages_fr.po @@ -0,0 +1,763 @@ +# 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: 2011-03-25 15:21+0000\n" +"PO-Revision-Date: 2011-04-09 02:46+0100\n" +"Last-Translator: magma <magma@mail.i2p>\n" +"Language-Team: duck <duck@mail.i2p>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n >= 2)\n" + +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:474 +#, java-format +msgid "To visit the destination in your host database, click <a href=\"{0}\">here</a>. To visit the conflicting addresshelper destination, click <a href=\"{1}\">here</a>." +msgstr "Pour aller à la destination de votre base de données d''hôtes, cliquez <a href=\"{0}\">here</a>. Pour aller à la destination de l''aide d''adresse en conflit, cliquez <a href=\"{1}\">ici</a>." + +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:931 +msgid "Click a link below to look for an address helper by using a \"jump\" service:" +msgstr "Cliquez sur un des liens ci-dessous pour chercher une aide d'adresse en utilisant un \"service de saut\":" + +#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:326 +#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:336 +msgid "internal" +msgstr "interne" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:171 +msgid "Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit." +msgstr "Échec de soumission du formulaire: vous avez peut-être utilisé le bouton \"Page précédente\" ou \"Recharger\" de votre navigateur. Merci de soumettre à nouveau." + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:218 +msgid "Configuration reloaded for all tunnels" +msgstr "Configuration rechargée pour tous les tunnels" + +#. and give them something to look at in any case +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:230 +msgid "Starting tunnel" +msgstr "Démarrage du tunnel" + +#. and give them something to look at in any case +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:243 +msgid "Stopping tunnel" +msgstr "Arrêt du tunnel" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:311 +msgid "Configuration changes saved" +msgstr "Modification de configuration enregistrée" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:314 +msgid "Failed to save configuration" +msgstr "Échec d'enregistrement de la configuration" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:398 +msgid "New Tunnel" +msgstr "Nouveau tunnel" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:418 +msgid "Standard client" +msgstr "Client standard" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:419 +msgid "HTTP client" +msgstr "Client HTTP" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:420 +msgid "IRC client" +msgstr "Client IRC" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:421 +msgid "Standard server" +msgstr "Serveur standard" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:422 +msgid "HTTP server" +msgstr "Serveur HTTP" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:423 +msgid "SOCKS 4/4a/5 proxy" +msgstr "Mandataire SOCKS 4/4a/5" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:424 +msgid "SOCKS IRC proxy" +msgstr "Mandataire IRC SOCKS" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:425 +msgid "CONNECT/SSL/HTTPS proxy" +msgstr "Mandataire CONNECT/SSL/HTTPS" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:426 +msgid "IRC server" +msgstr "Serveur IRC" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:427 +msgid "Streamr client" +msgstr "Client flux" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:428 +msgid "Streamr server" +msgstr "Serveur flux" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:429 +msgid "HTTP bidir" +msgstr "bidir HTTP" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:517 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:293 +msgid "Host not set" +msgstr "Hôte non défini" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:521 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:275 +msgid "Port not set" +msgstr "Port non défini" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:73 +msgid "I2P Tunnel Manager - Edit Client Tunnel" +msgstr "Gestionnaire de tunnels I2P: Modifiez le tunnel client" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:93 +msgid "Edit proxy settings" +msgstr "Modifiez les réglages de mandataire" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:101 +msgid "New proxy settings" +msgstr "Paramètres de nouveau mandataire" + +#: ../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:110 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:124 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:245 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:260 +msgid "Name" +msgstr "Nom" + +#: ../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:249 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:282 +msgid "Type" +msgstr "Type" + +#: ../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:229 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:389 +msgid "Description" +msgstr "Description" + +#: ../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 "Cible" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:130 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:132 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:162 +msgid "Access Point" +msgstr "Point d'accès" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:137 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:150 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:192 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:153 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:167 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:213 +msgid "required" +msgstr "requis" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:159 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:178 +msgid "Reachable by" +msgstr "Joignable par" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:180 +msgid "Outproxies" +msgstr "Mandataires sortants" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:187 +msgid "Tunnel Destination" +msgstr "Destination de tunnel" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:199 +msgid "name or destination" +msgstr "nom ou destination" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:202 +msgid "b32 not recommended" +msgstr "b32 déconseillée" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:208 +msgid "Shared Client" +msgstr "Client partagé" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:212 +msgid "(Share tunnels with other clients and irc/httpclients? Change requires restart of client proxy)" +msgstr "Partager les tunnels avec d'autres clients et des clients http/irc? La modification requiert le redémarrage du client mandataire)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:216 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:124 +msgid "Auto Start" +msgstr "Démarrage automatique" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:128 +msgid "(Check the Box for 'YES')" +msgstr "(Cochez la case pour le démarrage auto en même temps que le routeur)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:243 +msgid "Advanced networking options" +msgstr "Options de réseau avancées" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:224 +msgid "(NOTE: when this client proxy is configured to share tunnels, then these options are for all the shared proxy clients!)" +msgstr "(ATTENTION : quand ce mandataire client est configuré pour partager les tunnels, ces options sont appliquées à tous les mandataires clients partagés)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:245 +msgid "Tunnel Options" +msgstr "Options de tunnel" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:228 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:247 +msgid "Length" +msgstr "Longueur" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:254 +msgid "0 hop tunnel (low anonymity, low latency)" +msgstr "Tunnel à 0 saut (anonymat et latence faibles)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:258 +msgid "1 hop tunnel (medium anonymity, medium latency)" +msgstr "Tunnel à 1 saut (anonymat et latence moyens)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:262 +msgid "2 hop tunnel (high anonymity, high latency)" +msgstr "Tunnel à 2 sauts (anonymat et latence élevés)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:247 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:266 +msgid "3 hop tunnel (very high anonymity, poor performance)" +msgstr "Tunnel à 3 sauts (anonymat et latence très élevés)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:256 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:275 +msgid "hop tunnel (very poor performance)" +msgstr "Tunnel de saut (performances médiocres)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:261 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:280 +msgid "Variance" +msgstr "Variance" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:268 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:287 +msgid "0 hop variance (no randomisation, consistant performance)" +msgstr "Variance à 0 saut (pas d'aléa, performances stables)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:272 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:291 +msgid "+ 0-1 hop variance (medium additive randomisation, subtractive performance)" +msgstr "Variance à + 0 ou 1 saut (aléa moyen, performances diminuées)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:276 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:295 +msgid "+ 0-2 hop variance (high additive randomisation, subtractive performance)" +msgstr "Variance à + 0 à 2 sauts (aléa élevé, performances diminuées)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:280 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:299 +msgid "+/- 0-1 hop variance (standard randomisation, standard performance)" +msgstr "Variance à +/- 0 ou 1 saut (aléas légers, performances diminuées)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:284 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:303 +msgid "+/- 0-2 hop variance (not recommended)" +msgstr "Variance à +/- 0 à 2 sauts (déconseillée)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:296 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:315 +msgid "hop variance" +msgstr "variance de saut" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:301 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:320 +msgid "Count" +msgstr "Nombre" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:308 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:327 +msgid "1 inbound, 1 outbound tunnel (low bandwidth usage, less reliability)" +msgstr "Tunnel à 1 entrant/1 sortant (faible consommation de bande passante, moins fiable)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:312 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:331 +msgid "2 inbound, 2 outbound tunnels (standard bandwidth usage, standard reliability)" +msgstr "Tunnels à 2 entrants/2 sortants (consommation de bande passante standard, fiabilité standard)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:316 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:335 +msgid "3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)" +msgstr "Tunnels à 3 entrants/3 sortants (consommation de bande passante plus élevée, fiabilité élevée)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:325 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:344 +msgid "tunnels" +msgstr "tunnels" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:330 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:349 +msgid "Backup Count" +msgstr "Secours" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:337 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:356 +msgid "0 backup tunnels (0 redundancy, no added resource usage)" +msgstr "Aucun tunnel de secours (pas de tolérance de pannes, pas de consommation de ressources) " + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:341 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:360 +msgid "1 backup tunnel each direction (low redundancy, low resource usage)" +msgstr "1 tunnel de secours par direction (légère tolérance de pannes, faible consommation de ressources)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:345 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364 +msgid "2 backup tunnels each direction (medium redundancy, medium resource usage)" +msgstr "2 tunnels de secours par direction (tolérance de pannes moyenne, consommation de ressources moyenne)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:349 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:368 +msgid "3 backup tunnels each direction (high redundancy, high resource usage)" +msgstr "3 tunnels de secours par direction (tolérance de pannes élevée, consommation de ressources élevée)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:358 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:377 +msgid "backup tunnels" +msgstr "Tunnels de secours" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:365 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:384 +msgid "Profile" +msgstr "Profil" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:372 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:391 +msgid "interactive connection" +msgstr "connexion interactive" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:376 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:395 +msgid "bulk connection (downloads/websites/BT)" +msgstr "connexion forts transferts (téléchargements/sites web/BT)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:378 +msgid "Delay Connect" +msgstr "Retard à la connexion" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:382 +msgid "for request/response connections" +msgstr "pour les connexions de demandes/réponses" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:386 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:399 +msgid "Router I2CP Address" +msgstr "Adresse I2CP du routeur" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:388 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:401 +msgid "Host" +msgstr "Hôte" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:396 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:148 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:409 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:247 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:269 +msgid "Port" +msgstr "Port" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:406 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:479 +msgid "Reduce tunnel quantity when idle" +msgstr "Réduire le nombre de tunnels quand inactif" + +#: ../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/editClient_jsp.java:472 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:486 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:419 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:481 +msgid "Enable" +msgstr "Activer" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:412 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:485 +msgid "Reduced tunnel count" +msgstr "Réduire à " + +#: ../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:489 +msgid "Idle minutes" +msgstr "Minutes d'inactivité" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:420 +msgid "Close tunnels when idle" +msgstr "Fermer les tunnels quand inactif" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:426 +msgid "New Keys on Reopen" +msgstr "Nouvelles clés à la réouverture" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:434 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:435 +msgid "Disable" +msgstr "Désactiver" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:440 +msgid "Delay tunnel open until required" +msgstr "Retarder l'ouverture jusqu'à l'utilisation" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:450 +msgid "Persistent private key" +msgstr "Clé privée persistante" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:456 +msgid "File" +msgstr "Fichier" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:460 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:220 +msgid "Local destination" +msgstr "Destination locale" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:464 +msgid "(if known)" +msgstr "(si connu)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:470 +msgid "Local Authorization" +msgstr "Autorisation locale" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:476 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:490 +msgid "Username" +msgstr "Identifiant" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:480 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:494 +msgid "Password" +msgstr "Mot de passe" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:484 +msgid "Outproxy Authorization" +msgstr "Autorisation de mandataire sortant" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:502 +msgid "Jump URL List" +msgstr "Liste d'URL de sauts" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:508 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:525 +msgid "Custom options" +msgstr "Options personnelles" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:512 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:529 +msgid "NOTE: If tunnel is currently running, most changes will not take effect until tunnel is stopped and restarted." +msgstr "NOTE: si le tunnel est actif, la plupart des modifications ne prendront effet qu'après son redémarrage." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:514 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:531 +msgid "Cancel" +msgstr "Annuler" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:518 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:535 +msgid "Delete" +msgstr "Supprimer" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:520 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:537 +msgid "Save" +msgstr "Enregistrer" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:73 +msgid "I2P Tunnel Manager - Edit Server Tunnel" +msgstr "Gestionnaire de tunnels I2P: modifier le tunnel serveur" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:93 +msgid "Edit server settings" +msgstr "Modifier les paramètres du serveur" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:101 +msgid "New server settings" +msgstr "Paramètres de nouveau serveur" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:199 +msgid "Website name" +msgstr "Nom du site web" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:203 +msgid "(leave blank for outproxies)" +msgstr "(laisser vide pour les mandataires sortants)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:208 +msgid "Private key file" +msgstr "Fichier de clé privée" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:230 +msgid "Add to local addressbook" +msgstr "Ajouter au carnet d'adresses local" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:237 +msgid "Hostname Signature" +msgstr "Signature du nom d'hôte" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:417 +msgid "Encrypt Leaseset" +msgstr "Jeu de baux crypté" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:423 +msgid "Encryption Key" +msgstr "Clé de cryptage" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:427 +msgid "Generate New Key" +msgstr "Générer une nouvelle clé" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:429 +msgid "Generate" +msgstr "Générer" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:431 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:523 +msgid "(Tunnel must be stopped first)" +msgstr "(Le tunnel doit préalablement être arrêté)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:433 +msgid "Restricted Access List" +msgstr "Contrôle d'accès" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:439 +msgid "Whitelist" +msgstr "Liste blanche" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:443 +msgid "Blacklist" +msgstr "Liste noire" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:447 +msgid "Access List" +msgstr "Liste d'accès" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:451 +msgid "Inbound connection limits (0=unlimited)" +msgstr "Limite de connexions entrantes (0=pas de limite)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:453 +msgid "Per client" +msgstr "Par client" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:455 +msgid "Per minute" +msgstr "Par minute" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:459 +msgid "Per hour" +msgstr "Par heure" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:463 +msgid "Per day" +msgstr "Par jour" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:467 +msgid "Total" +msgstr "Total" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:475 +msgid "Max concurrent connections (0=unlimited)" +msgstr "Connexions simultanées maximum (0=pas de limite)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:493 +msgid "New Certificate type" +msgstr "Type de nouveau certificat" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:495 +msgid "None" +msgstr "Aucun" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:499 +msgid "Hashcash (effort)" +msgstr "Pénalité" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:505 +msgid "Hashcash Calc Time" +msgstr "Durée de calcul de pénalisation" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:507 +msgid "Estimate" +msgstr "Estimer" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:509 +msgid "Hidden" +msgstr "Masqué" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:513 +msgid "Signed (signed by)" +msgstr "Signé (signé par)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:519 +msgid "Modify Certificate" +msgstr "Modifier le certificat" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:521 +msgid "Modify" +msgstr "Modifier" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:74 +msgid "I2P Tunnel Manager - List" +msgstr "Gestionnaire de tunnels I2P - Liste" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:86 +msgid "Status Messages" +msgstr "Messages d'état" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:90 +msgid "Refresh" +msgstr "Actualiser" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:94 +msgid "Stop All" +msgstr "Arrêter tous" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:98 +msgid "Start All" +msgstr "Démarrer tous" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:102 +msgid "Restart All" +msgstr "Redémarrer tous" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:106 +msgid "Reload Config" +msgstr "Recharger la configuration" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:108 +msgid "I2P Server Tunnels" +msgstr "Tunnels serveurs I2P" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:112 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:133 +msgid "Points at" +msgstr "Pointe vers" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:114 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:156 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:160 +msgid "Preview" +msgstr "Aperçu" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:116 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:180 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:253 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:300 +msgid "Status" +msgstr "État" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:166 +msgid "Base32 Address" +msgstr "Adresse Base32" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:174 +msgid "No Preview" +msgstr "Aucun aperçu" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:187 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:307 +msgid "Starting..." +msgstr "Démarrage..." + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:194 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:208 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:314 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:328 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:342 +msgid "Stop" +msgstr "Arrêter" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:201 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:335 +msgid "Running" +msgstr "Actif" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:215 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:349 +msgid "Stopped" +msgstr "Arrêté" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:356 +msgid "Start" +msgstr "Démarrer" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:237 +msgid "New server tunnel" +msgstr "Nouveau tunnel serveur" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:399 +msgid "Standard" +msgstr "Standard" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:241 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:401 +msgid "Create" +msgstr "Créer" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:243 +msgid "I2P Client Tunnels" +msgstr "Tunnels clients I2P" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:251 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:286 +msgid "Interface" +msgstr "Interface" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:321 +msgid "Standby" +msgstr "Pause" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:366 +msgid "Outproxy" +msgstr "Mandataire sortant" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:370 +msgid "Destination" +msgstr "Destination" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:384 +msgid "none" +msgstr "aucun" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:397 +msgid "New client tunnel" +msgstr "Nouveau tunnel client" + diff --git a/apps/i2ptunnel/locale/messages_nl.po b/apps/i2ptunnel/locale/messages_nl.po index 90e5be16b176d0974852a54167b03f037aefeed3..e549639559c2a904ddb6dc08af6676be8908c896 100644 --- a/apps/i2ptunnel/locale/messages_nl.po +++ b/apps/i2ptunnel/locale/messages_nl.po @@ -6,36 +6,42 @@ # msgid "" msgstr "" -"Project-Id-Version: I2P i2ptunnel\n" +"Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-12-17 15:04+0000\n" -"PO-Revision-Date: 2010-06-15 14:09+0100\n" -"Last-Translator: duck <duck@mail.i2p>\n" -"Language-Team: duck <duck@mail.i2p>, monkeybrains <monkeybrains@mail.i2p>\n" +"POT-Creation-Date: 2011-03-03 18:29+0000\n" +"PO-Revision-Date: 2011-02-20 12:14+0000\n" +"Last-Translator: ducki2p <ducki2p@gmail.com>\n" +"Language-Team: Dutch <>\n" +"Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Poedit-Language: Dutch\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:475 +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:474 #, java-format msgid "" "To visit the destination in your host database, click <a href=\"{0}\">here</" -"a>. To visit the conflicting addresshelper destination, click <a href=\"{1}" -"\">here</a>." +"a>. To visit the conflicting addresshelper destination, click <a href=" +"\"{1}\">here</a>." msgstr "" -"Om de destination in je host database te bezoeken, klik <a href=\"{0}" -"\">hier</a>. Om de conflicterende adreshelper destination te bezoeken, klik " -"<a href=\"{1}\">hier</a>." +"Om de destination in je host database te bezoeken, klik <a href=" +"\"{0}\">hier</a>. Om de conflicterende adreshelper destination te bezoeken, " +"klik <a href=\"{1}\">hier</a>." -#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:932 +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:931 msgid "" "Click a link below to look for an address helper by using a \"jump\" service:" msgstr "" "Klik op een onderstaande link om te zoeken naar een adreshelper via een " "\"jump\" service:" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:170 +#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:326 +#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:336 +msgid "internal" +msgstr "intern" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:171 msgid "" "Invalid form submission, probably because you used the 'back' or 'reload' " "button on your browser. Please resubmit." @@ -43,72 +49,90 @@ msgstr "" "Ongeldige formulier verzonden, waarschijnlijk doordat je de 'back' of " "'reload' button van je browser hebt gebruikt. Verzend opnieuw." -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:217 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:218 msgid "Configuration reloaded for all tunnels" msgstr "Configuratie van alle tunnels opnieuw geladen" #. and give them something to look at in any case -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:229 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:230 msgid "Starting tunnel" msgstr "Opstarten van tunnel" #. and give them something to look at in any case -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:242 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:243 msgid "Stopping tunnel" msgstr "Stoppen van tunnel" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:389 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:311 +msgid "Configuration changes saved" +msgstr "Configuratie wijzigingen opgeslagen" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:314 +msgid "Failed to save configuration" +msgstr "Opslaan van de configuratie mislukt" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:398 msgid "New Tunnel" msgstr "Nieuwe Tunnel" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:409 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:418 msgid "Standard client" msgstr "Standaard client" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:410 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:419 msgid "HTTP client" msgstr "HTTP client" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:411 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:420 msgid "IRC client" msgstr "IRC client" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:412 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:421 msgid "Standard server" msgstr "Standaard server" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:413 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:422 msgid "HTTP server" msgstr "HTTP server" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:414 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:423 msgid "SOCKS 4/4a/5 proxy" msgstr "SOCKS 4/4a/5 proxy" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:415 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:424 msgid "SOCKS IRC proxy" msgstr "SOCKS IRC proxy" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:416 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:425 msgid "CONNECT/SSL/HTTPS proxy" msgstr "CONNECT/SSL/HTTPS proxy" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:417 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:426 msgid "IRC server" msgstr "IRC server" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:418 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:427 msgid "Streamr client" msgstr "Streamr client" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:419 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:428 msgid "Streamr server" msgstr "Streamr server" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:420 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:429 msgid "HTTP bidir" msgstr "HTTP bidir" +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:517 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:290 +msgid "Host not set" +msgstr "Host niet opgegeven" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:521 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:272 +msgid "Port not set" +msgstr "Poort niet opgegeven" + #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:73 msgid "I2P Tunnel Manager - Edit Client Tunnel" msgstr "I2P Tunnel Manager - Bewerk Client Tunnel" @@ -133,14 +157,14 @@ msgstr "Naam" #: ../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 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:279 msgid "Type" msgstr "Type" #: ../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:367 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:386 msgid "Description" msgstr "Omschrijving" @@ -151,66 +175,45 @@ msgstr "Doel" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:130 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:132 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:167 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:162 msgid "Access Point" msgstr "Toegangspunt" #: ../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:172 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:228 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:150 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:192 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:153 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:167 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:213 msgid "required" msgstr "vereist" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:150 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:183 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:159 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:178 msgid "Reachable by" msgstr "Bereikbaar voor" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:162 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:195 -msgid "Locally (127.0.0.1)" -msgstr "Lokaal (127.0.0.1)" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:166 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:199 -msgid "Everyone (0.0.0.0)" -msgstr "Iedereen (0.0.0.0)" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:170 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:203 -msgid "LAN Hosts (Please specify your LAN address)" -msgstr "LAN Hosts (Specificeer je LAN adres)" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:186 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:205 -msgid "Other" -msgstr "Anders" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:195 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:180 msgid "Outproxies" msgstr "Uitgaande proxies" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:202 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:187 msgid "Tunnel Destination" msgstr "Tunnel Destinations" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:214 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:199 msgid "name or destination" msgstr "naam of destination" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:217 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:202 msgid "b32 not recommended" msgstr "b32 niet aanbevolen" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:208 msgid "Shared Client" msgstr "Gedeelde Client" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:212 msgid "" "(Share tunnels with other clients and irc/httpclients? Change requires " "restart of client proxy)" @@ -218,22 +221,22 @@ msgstr "" "(Deel tunnels met andere clients en irc/httpclients? Wijziging vereist " "herstart van de client proxy)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:231 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:216 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:124 msgid "Auto Start" msgstr "Auto Start" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:220 #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:128 msgid "(Check the Box for 'YES')" msgstr "(Markeer de Box voor 'JA')" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:237 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:258 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:243 msgid "Advanced networking options" msgstr "Geavanceerde netwerk opties" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:224 msgid "" "(NOTE: when this client proxy is configured to share tunnels, then these " "options are for all the shared proxy clients!)" @@ -241,93 +244,93 @@ msgstr "" "(OPMERKING: wanneer deze client proxy is geconfigureerd om tunnels te delen, " "dan zijn deze opties van toepassing voor alle gedeelde proxy clients!)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:241 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:260 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:245 msgid "Tunnel Options" msgstr "Tunnel Opties" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:243 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:262 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:228 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:247 msgid "Length" msgstr "Lengte" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:250 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:269 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:254 msgid "0 hop tunnel (low anonymity, low latency)" msgstr "0 hop tunnel (lage anonimiteit, weinig vertraging)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:254 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:273 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:258 msgid "1 hop tunnel (medium anonymity, medium latency)" msgstr "1 hop tunnel (gemiddelde anonimiteit, gemiddelde vertraging)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:258 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:277 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:262 msgid "2 hop tunnel (high anonymity, high latency)" msgstr "2 hop tunnel (hoge anonimiteit, hoge vertraging)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:262 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:281 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:247 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:266 msgid "3 hop tunnel (very high anonymity, poor performance)" msgstr "3 hop tunnel (zeer hoge anonimiteit, slechte prestatie)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:271 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:290 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:256 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:275 msgid "hop tunnel (very poor performance)" msgstr "hop tunnel (zeer slechte prestatie)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:276 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:295 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:261 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:280 msgid "Variance" msgstr "Variantie" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:283 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:302 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:268 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:287 msgid "0 hop variance (no randomisation, consistant performance)" msgstr "0 hop variantie (geen randomisatie, consistente prestatie)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:287 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:306 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:272 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:291 msgid "" "+ 0-1 hop variance (medium additive randomisation, subtractive performance)" msgstr "" "+ 0-1 hop variantie (gemiddeld toegevoegde randomisatie, minder prestatie)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:291 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:310 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:276 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:295 msgid "" "+ 0-2 hop variance (high additive randomisation, subtractive performance)" msgstr "+ 0-2 hop variantie (hoge toegevoegde randomisatie, minder prestatie)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:295 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:314 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:280 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:299 msgid "+/- 0-1 hop variance (standard randomisation, standard performance)" msgstr "+/- 0-1 hop variantie (standaard randomisatie, standaard prestatie)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:299 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:318 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:284 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:303 msgid "+/- 0-2 hop variance (not recommended)" msgstr "+/- 0-2 hop variantie (niet aanbevolen)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:311 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:330 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:296 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:315 msgid "hop variance" msgstr "hop variantie" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:316 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:301 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:320 msgid "Count" msgstr "Aantal" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:323 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:342 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:308 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:327 msgid "1 inbound, 1 outbound tunnel (low bandwidth usage, less reliability)" msgstr "" "1 inkomende, 1 uitgaande tunnel (laag bandbreedte gebruik, minder " "betrouwbaar)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:327 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:346 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:312 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:331 msgid "" "2 inbound, 2 outbound tunnels (standard bandwidth usage, standard " "reliability)" @@ -335,185 +338,189 @@ msgstr "" "2 inkomende, 2 uitgaande tunnels (standaard bandbreedte gebruik, standaard " "betrouwbaarheid)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:331 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:350 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:316 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:335 msgid "" "3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)" msgstr "" "3 inkomende, 3 uitgaande tunnels (hoge bandbreedte gebruik, hogere " "betrouwbaarheid)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:340 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:359 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:325 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:344 msgid "tunnels" msgstr "tunnels" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:345 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:330 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:349 msgid "Backup Count" msgstr "Backup Aantal" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:352 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:371 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:337 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:356 msgid "0 backup tunnels (0 redundancy, no added resource usage)" msgstr "0 backup tunnels (0 redundantie, geen additionele bronnen gebruikt)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:356 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:375 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:341 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:360 msgid "1 backup tunnel each direction (low redundancy, low resource usage)" msgstr "" "1 backup tunnel in beide richting (lage redundantie, lage aantal bronnen " "gebruikt)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:360 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:379 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:345 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364 msgid "" "2 backup tunnels each direction (medium redundancy, medium resource usage)" msgstr "" "2 backup tunnels in beide richting (gemiddelde redundantie, gemiddeld aantal " "bronnen gebruikt)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:364 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:383 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:349 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:368 msgid "3 backup tunnels each direction (high redundancy, high resource usage)" msgstr "" "3 backup tunnels in beide richting (hoge redundantie, hoog aantal bronnen " "gebruikt)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:373 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:392 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:358 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:377 msgid "backup tunnels" msgstr "backup tunnels" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:380 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:399 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:365 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:384 msgid "Profile" msgstr "Profiel" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:387 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:406 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:372 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:391 msgid "interactive connection" msgstr "interactieve connectie" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:391 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:410 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:376 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:395 msgid "bulk connection (downloads/websites/BT)" msgstr "bulk connection (downloads/websites/BT)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:393 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:378 msgid "Delay Connect" msgstr "Vertraagde Connectie" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:397 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:382 msgid "for request/response connections" msgstr "voor request/response connecties" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:401 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:414 -msgid "I2CP Options" -msgstr "I2CP Opties" +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:386 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:399 +msgid "Router I2CP Address" +msgstr "Router I2CP Adres" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:403 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:146 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:416 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:388 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:401 msgid "Host" msgstr "Host" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:407 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:152 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:420 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:396 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:148 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:409 #: ../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 "Poort" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:413 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:452 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:406 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:479 msgid "Reduce tunnel quantity when idle" -msgstr "Verminder tunnel aantal wanneer in rust" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:415 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:429 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:437 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:449 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:459 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:479 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:493 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:426 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:442 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:454 +msgstr "Verminder tunnel aantal in ruststand" + +#: ../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/editClient_jsp.java:472 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:486 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:419 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:481 msgid "Enable" msgstr "Ingeschakeld" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:419 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:458 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:412 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:485 msgid "Reduced tunnel count" msgstr "Verminder tunnel aantal" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:423 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:443 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:462 +#: ../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:489 msgid "Idle minutes" msgstr "Rust minuten" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:427 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:420 msgid "Close tunnels when idle" msgstr "Sluit tunnels wanneer in rust" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:433 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:426 msgid "New Keys on Reopen" msgstr "Nieuwe Sleutels bij Heropenen" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:441 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:434 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:435 msgid "Disable" msgstr "Uitgeschakeld" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:447 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:440 msgid "Delay tunnel open until required" msgstr "Vertraag tunnel opening totdat het nodig is" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:457 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:450 msgid "Persistent private key" msgstr "Persistente private sleutel" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:463 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:456 msgid "File" msgstr "Bestand" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:467 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:460 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:220 msgid "Local destination" msgstr "Lokale destination" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:471 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:464 msgid "(if known)" msgstr "(indien bekend)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:477 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:470 msgid "Local Authorization" msgstr "Lokale Autorisatie" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:483 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:497 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:476 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:490 msgid "Username" msgstr "Gebruikersnaam" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:487 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:501 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:480 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:494 msgid "Password" msgstr "Wachtwoord" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:491 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:484 msgid "Outproxy Authorization" msgstr "Uitgaande Proxy Autorisatie" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:507 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:498 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:502 +msgid "Jump URL List" +msgstr "Spring URL Lijst" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:508 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:525 msgid "Custom options" msgstr "Aangepaste opties" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:511 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:502 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:512 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:529 msgid "" "NOTE: If tunnel is currently running, most changes will not take effect " "until tunnel is stopped and restarted." @@ -521,18 +528,18 @@ msgstr "" "OPMERKING: Indien de tunnel op dit moment draait, zullen de meeste " "wijzigingen pas effect hebben na het stoppen en herstarten van de tunnel." -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:513 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:504 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:514 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:531 msgid "Cancel" msgstr "Annuleer" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:517 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:508 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:518 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:535 msgid "Delete" msgstr "Verwijder" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:519 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:510 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:520 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:537 msgid "Save" msgstr "Opslaan" @@ -548,92 +555,124 @@ msgstr "Bewerk server instellingen" msgid "New server settings" msgstr "Nieuwe server instellingen" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:214 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:199 msgid "Website name" msgstr "Website naam" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:218 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:203 msgid "(leave blank for outproxies)" msgstr "(leeg laten voor uitgaande proxies)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:208 msgid "Private key file" msgstr "Private sleutel bestand" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:245 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:230 msgid "Add to local addressbook" msgstr "Toevoegen aan lokaal adresboek" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:252 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:237 msgid "Hostname Signature" msgstr "Hostnaam Handtekening" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:424 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:417 msgid "Encrypt Leaseset" msgstr "Versleutel Leaseset" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:430 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:423 msgid "Encryption Key" msgstr "Encryptie Sleutel" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:434 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:427 msgid "Generate New Key" msgstr "Genereer Nieuwe Sleutel" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:436 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:429 msgid "Generate" msgstr "Genereer" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:438 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:496 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:431 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:523 msgid "(Tunnel must be stopped first)" msgstr "(Tunnel moet eerst gestopt worden)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:440 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:433 msgid "Restricted Access List" msgstr "Beperkte Toegangs Lijst" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:446 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:439 +msgid "Whitelist" +msgstr "Wittelijst" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:443 +msgid "Blacklist" +msgstr "Zwartelijst" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:447 msgid "Access List" -msgstr "Toegangs Lijst" +msgstr "Toegangslijst" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:451 +msgid "Inbound connection limits (0=unlimited)" +msgstr "Inkomende connectie limieten (0=onbeperkt)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:453 +msgid "Per client" +msgstr "Per client" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:455 +msgid "Per minute" +msgstr "Per minuut" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:450 -msgid "(Restrict to these clients only)" -msgstr "(Beperkt tot slechts deze clients)" +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:459 +msgid "Per hour" +msgstr "Per uur" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:466 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:463 +msgid "Per day" +msgstr "Per dag" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:467 +msgid "Total" +msgstr "Totaal" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:475 +msgid "Max concurrent connections (0=unlimited)" +msgstr "Maximum gelijktijdige connecties (0=onbeperkt)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:493 msgid "New Certificate type" msgstr "Nieuw Certificaat type" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:468 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:495 msgid "None" msgstr "Geen" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:472 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:499 msgid "Hashcash (effort)" msgstr "Hashcash (effort)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:478 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:505 msgid "Hashcash Calc Time" msgstr "Hashcash Reken Tijd" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:480 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:507 msgid "Estimate" msgstr "Inschatten" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:482 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:509 msgid "Hidden" msgstr "Verborgen" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:486 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:513 msgid "Signed (signed by)" msgstr "Ondertekend (ondertekend door)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:492 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:519 msgid "Modify Certificate" msgstr "Wijzig Certificaat" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:494 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:521 msgid "Modify" msgstr "Wijzig" @@ -683,7 +722,7 @@ msgstr "Preview" #: ../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 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:297 msgid "Status" msgstr "Status" @@ -696,30 +735,30 @@ msgid "No Preview" msgstr "Geen Preview" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:184 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:285 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:304 msgid "Starting..." msgstr "Starten..." #: ../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 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:311 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:325 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:339 msgid "Stop" msgstr "Stop" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:198 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:313 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:332 msgid "Running" msgstr "Draait" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:212 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:327 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:346 msgid "Stopped" msgstr "Gestopt" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:334 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:353 msgid "Start" msgstr "Start" @@ -728,12 +767,12 @@ msgid "New server tunnel" msgstr "Nieuwe server tunnel" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:236 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:377 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:396 msgid "Standard" msgstr "Standaard" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:238 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:379 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:398 msgid "Create" msgstr "Creëer" @@ -742,26 +781,26 @@ msgid "I2P Client Tunnels" msgstr "I2P Client Tunnels" #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:248 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:274 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:283 msgid "Interface" msgstr "Interface" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:299 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:318 msgid "Standby" msgstr "Stand-by" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:344 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:363 msgid "Outproxy" msgstr "Uitgaande proxy" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:348 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:367 msgid "Destination" msgstr "Destination" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:362 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:381 msgid "none" msgstr "geen" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:375 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:394 msgid "New client tunnel" msgstr "Nieuwe client tunnel" diff --git a/apps/i2ptunnel/locale/messages_ru.po b/apps/i2ptunnel/locale/messages_ru.po index 718e82e9ff745deddcbbc7ef8e0c252e6f898372..d9075fa847924db8d15c451f41c3a5393f896c44 100644 --- a/apps/i2ptunnel/locale/messages_ru.po +++ b/apps/i2ptunnel/locale/messages_ru.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: I2P i2ptunnel\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-12-13 19:43+0000\n" -"PO-Revision-Date: 2010-12-14 00:54+0500\n" +"POT-Creation-Date: 2011-02-14 18:14+0000\n" +"PO-Revision-Date: 2011-02-14 23:24+0500\n" "Last-Translator: Hidden Z <hiddenz@mail.i2p>\n" "Language-Team: foo <foo@bar>\n" "Language: \n" @@ -18,85 +18,108 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Russian\n" -#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:475 +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:474 #, java-format msgid "To visit the destination in your host database, click <a href=\"{0}\">here</a>. To visit the conflicting addresshelper destination, click <a href=\"{1}\">here</a>." msgstr "Ð”Ð»Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð° по ÑÑылке из локальной адреÑной книги, нажмите <a href=\"{0}\">здеÑÑŒ</a>. Ð”Ð»Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð° по новой addresshelper-ÑÑылке, нажмите <a href=\"{1}\">здеÑÑŒ</a>." -#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:932 +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:931 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:170 +#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:326 +#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:336 +msgid "internal" +msgstr "внутренний" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:171 msgid "Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit." msgstr "Ðеправильно Ð¿ÐµÑ€ÐµÐ´Ð°Ð½Ð½Ð°Ñ Ñ„Ð¾Ñ€Ð¼Ð°, возможно вы иÑпользовали дейÑтвие браузера \"назад\" или \"обновить\". ПожалуйÑта повторите попытку." -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:217 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:218 msgid "Configuration reloaded for all tunnels" msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð´Ð»Ñ Ð²Ñех туннелей перечитана" #. and give them something to look at in any case -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:229 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:230 msgid "Starting tunnel" msgstr "ЗапуÑк туннелÑ" #. and give them something to look at in any case -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:242 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:243 msgid "Stopping tunnel" msgstr "ОÑтановка туннелÑ" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:389 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:311 +msgid "Configuration changes saved" +msgstr "ÐаÑтройки Ñохранены" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:314 +msgid "Failed to save configuration" +msgstr "Ðе удалоÑÑŒ Ñохранить наÑтройки" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:398 msgid "New Tunnel" msgstr "Ðовый туннель" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:409 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:418 msgid "Standard client" msgstr "Обычный клиент" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:410 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:419 msgid "HTTP client" msgstr "HTTP-клиент" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:411 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:420 msgid "IRC client" msgstr "IRC-клиент" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:412 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:421 msgid "Standard server" msgstr "Обычный Ñервер" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:413 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:422 msgid "HTTP server" msgstr "HTTP-Ñервер" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:414 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:423 msgid "SOCKS 4/4a/5 proxy" msgstr "SOCKS 4/4a/5 прокÑи" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:415 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:424 msgid "SOCKS IRC proxy" msgstr "SOCKS IRC прокÑи" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:416 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:425 msgid "CONNECT/SSL/HTTPS proxy" msgstr "CONNECT/SSL/HTTPS прокÑи" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:417 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:426 msgid "IRC server" msgstr "IRC-Ñервер" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:418 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:427 msgid "Streamr client" msgstr "Streamr-клиент" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:419 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:428 msgid "Streamr server" msgstr "Streamr-Ñервер" -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:420 +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:429 msgid "HTTP bidir" msgstr "HTTP bidir (ÑкÑпериментальный двунаправленный режим, инÑтрукцию Ñпрашивайте у sponge)" +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:517 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:290 +msgid "Host not set" +msgstr "ХоÑÑ‚ не задан" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:521 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:272 +msgid "Port not set" +msgstr "Порт не задан" + #: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:73 msgid "I2P Tunnel Manager - Edit Client Tunnel" msgstr "Менеджер Туннелей I2P — Редактирование КлиентÑкого ТуннелÑ" @@ -121,14 +144,14 @@ 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 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:279 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:367 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:386 msgid "Description" msgstr "ОпиÑание" @@ -139,357 +162,340 @@ 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 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:167 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:162 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:172 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:228 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:150 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:192 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:153 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:167 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:213 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 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:183 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:159 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:178 msgid "Reachable by" msgstr "Кому будет доÑтупно (Сетевой интерфейÑ)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:162 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:195 -msgid "Locally (127.0.0.1)" -msgstr "Только в пределах Ñтого компьютера (127.0.0.1)" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:166 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:199 -msgid "Everyone (0.0.0.0)" -msgstr "Ð’Ñем (0.0.0.0)" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:170 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:203 -msgid "LAN Hosts (Please specify your LAN address)" -msgstr "Только из локальной Ñети (Введите Ñвой LAN-адреÑ)" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:186 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:205 -msgid "Other" -msgstr "ÐÐ´Ñ€ÐµÑ Ñетевого интерфейÑа" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:195 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:180 msgid "Outproxies" msgstr "СпиÑок outproxy" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:202 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:187 msgid "Tunnel Destination" msgstr "ÐÐ´Ñ€ÐµÑ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñ‚ÑƒÐ½Ð½ÐµÐ»Ñ" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:214 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:199 msgid "name or destination" msgstr "Ð¸Ð¼Ñ Ð¸Ð»Ð¸ адреÑ" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:217 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:202 msgid "b32 not recommended" msgstr "b32 не рекомендуетÑÑ" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:208 msgid "Shared Client" msgstr "Коллективный клиент" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:212 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:231 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:216 #: ../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:235 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:220 #: ../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:237 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:258 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:243 msgid "Advanced networking options" msgstr "РаÑширенные Ñетевые наÑтройки" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:224 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:241 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:260 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:245 msgid "Tunnel Options" msgstr "Параметры туннелÑ" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:243 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:262 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:228 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:247 msgid "Length" msgstr "Длина" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:250 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:269 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:254 msgid "0 hop tunnel (low anonymity, low latency)" msgstr "0 хопов (Ð½Ð¸Ð·ÐºÐ°Ñ Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½Ð¾ÑÑ‚ÑŒ, малые задержки)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:254 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:273 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:258 msgid "1 hop tunnel (medium anonymity, medium latency)" msgstr "1 хоп (ÑƒÐ¼ÐµÑ€ÐµÐ½Ð½Ð°Ñ Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½Ð¾ÑÑ‚ÑŒ, умеренные задержки)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:258 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:277 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:262 msgid "2 hop tunnel (high anonymity, high latency)" msgstr "2 хопа (выÑÐ¾ÐºÐ°Ñ Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½Ð¾ÑÑ‚ÑŒ, выÑокие задержки)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:262 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:281 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:247 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:266 msgid "3 hop tunnel (very high anonymity, poor performance)" msgstr "3 хопа (очень выÑÐ¾ÐºÐ°Ñ Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½Ð¾ÑÑ‚ÑŒ, Ð½Ð¸Ð·ÐºÐ°Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾ÑÑ‚ÑŒ)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:271 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:290 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:256 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:275 msgid "hop tunnel (very poor performance)" msgstr "хопов (очень Ð½Ð¸Ð·ÐºÐ°Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾ÑÑ‚ÑŒ)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:276 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:295 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:261 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:280 msgid "Variance" msgstr "РазброÑ" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:283 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:302 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:268 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:287 msgid "0 hop variance (no randomisation, consistant performance)" msgstr "нулевой Ñ€Ð°Ð·Ð±Ñ€Ð¾Ñ (без рандомизации, фикÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾ÑÑ‚ÑŒ)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:287 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:306 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:272 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:291 msgid "+ 0-1 hop variance (medium additive randomisation, subtractive performance)" msgstr "+ 0-1 Ñ€Ð°Ð·Ð±Ñ€Ð¾Ñ (умеренно Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð½Ð°Ñ Ñ€Ð°Ð½Ð´Ð¾Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ñ, Ð¿Ð¾Ð½Ð¸Ð¶ÐµÐ½Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾ÑÑ‚ÑŒ)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:291 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:310 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:276 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:295 msgid "+ 0-2 hop variance (high additive randomisation, subtractive performance)" msgstr "+ 0-2 Ñ€Ð°Ð·Ð±Ñ€Ð¾Ñ (Ñильно Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð½Ð°Ñ Ñ€Ð°Ð½Ð´Ð¾Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ñ, Ð¿Ð¾Ð½Ð¸Ð¶ÐµÐ½Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾ÑÑ‚ÑŒ)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:295 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:314 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:280 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:299 msgid "+/- 0-1 hop variance (standard randomisation, standard performance)" msgstr "+/- 0-1 Ñ€Ð°Ð·Ð±Ñ€Ð¾Ñ (ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð°Ñ Ñ€Ð°Ð½Ð´Ð¾Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ñ, ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾ÑÑ‚ÑŒ)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:299 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:318 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:284 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:303 msgid "+/- 0-2 hop variance (not recommended)" 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:330 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:296 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:315 msgid "hop variance" msgstr "разброÑ" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:316 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:301 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:320 msgid "Count" msgstr "КоличеÑтво" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:323 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:342 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:308 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:327 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:327 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:346 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:312 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:331 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:331 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:350 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:316 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:335 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:340 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:359 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:325 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:344 msgid "tunnels" msgstr "туннелей" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:345 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:330 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:349 msgid "Backup Count" msgstr "Резервное количеÑтво" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:352 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:371 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:337 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:356 msgid "0 backup tunnels (0 redundancy, no added resource usage)" msgstr "без резервных туннелей (отÑутÑтвие избыточноÑти, отÑутÑтвие дополнительной нагрузки на ÑиÑтему)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:356 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:375 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:341 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:360 msgid "1 backup tunnel each direction (low redundancy, low resource usage)" msgstr "1 резервный туннель в каждом направлении (Ð½Ð¸Ð·ÐºÐ°Ñ Ð¸Ð·Ð±Ñ‹Ñ‚Ð¾Ñ‡Ð½Ð¾ÑÑ‚ÑŒ, Ð½Ð¸Ð·ÐºÐ°Ñ Ð½Ð°Ð³Ñ€ÑƒÐ·ÐºÐ° на ÑиÑтему)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:360 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:379 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:345 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364 msgid "2 backup tunnels each direction (medium redundancy, medium resource usage)" msgstr "2 резервных Ñ‚ÑƒÐ½Ð½ÐµÐ»Ñ Ð² каждом направлении (ÑƒÐ¼ÐµÑ€ÐµÐ½Ð½Ð°Ñ Ð¸Ð·Ð±Ñ‹Ñ‚Ð¾Ñ‡Ð½Ð¾ÑÑ‚ÑŒ, ÑƒÐ¼ÐµÑ€ÐµÐ½Ð½Ð°Ñ Ð½Ð°Ð³Ñ€ÑƒÐ·ÐºÐ° на ÑиÑтему)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:364 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:383 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:349 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:368 msgid "3 backup tunnels each direction (high redundancy, high resource usage)" msgstr "3 резервных Ñ‚ÑƒÐ½Ð½ÐµÐ»Ñ Ð² каждом направлении (выÑÐ¾ÐºÐ°Ñ Ð¸Ð·Ð±Ñ‹Ñ‚Ð¾Ñ‡Ð½Ð¾ÑÑ‚ÑŒ, выÑÐ¾ÐºÐ°Ñ Ð½Ð°Ð³Ñ€ÑƒÐ·ÐºÐ° на ÑиÑтему)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:373 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:392 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:358 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:377 msgid "backup tunnels" msgstr "резервных туннелей" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:380 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:399 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:365 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:384 msgid "Profile" msgstr "Режим" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:387 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:406 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:372 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:391 msgid "interactive connection" msgstr "оптимизировать Ð´Ð»Ñ Ð¼Ð°Ð»Ñ‹Ñ… задержек (irc)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:391 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:410 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:376 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:395 msgid "bulk connection (downloads/websites/BT)" msgstr "оптимизировать Ð´Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¾Ð³Ð¾ обьема (www/bittorrent)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:393 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:378 msgid "Delay Connect" msgstr "Задержка ÑоединениÑ" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:397 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:382 msgid "for request/response connections" msgstr "Ð¾Ð¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð´Ð»Ñ Ñоединений, начинающихÑÑ Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа клиента/ответа Ñервера" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:401 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:414 -msgid "I2CP Options" -msgstr "Параметры I2CP" +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:386 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:399 +msgid "Router I2CP Address" +msgstr "I2CP ÐÐ´Ñ€ÐµÑ Ð Ð¾ÑƒÑ‚ÐµÑ€Ð°" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:403 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:146 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:416 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:388 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:401 msgid "Host" msgstr "ÐдреÑ" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:407 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:152 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:420 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:396 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:148 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:409 #: ../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:413 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:452 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:406 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:479 msgid "Reduce tunnel quantity when idle" msgstr "Снижать количеÑтво туннелей при проÑтое" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:415 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:429 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:437 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:449 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:459 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:479 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:493 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:426 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:442 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:454 +#: ../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/editClient_jsp.java:472 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:486 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:419 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:481 msgid "Enable" msgstr "Включить" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:419 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:458 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:412 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:485 msgid "Reduced tunnel count" msgstr "КоличеÑтво туннелей" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:423 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:443 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:462 +#: ../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:489 msgid "Idle minutes" msgstr "Минут проÑтоÑ" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:427 +#: ../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:433 +#: ../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:441 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:434 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:435 msgid "Disable" msgstr "Выключить" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:447 +#: ../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:457 +#: ../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:463 +#: ../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:467 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:460 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:220 msgid "Local destination" msgstr "Локальный Ð°Ð´Ñ€ÐµÑ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:471 +#: ../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:477 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:470 msgid "Local Authorization" msgstr "Ð›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:483 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:497 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:476 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:490 msgid "Username" msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:487 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:501 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:480 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:494 msgid "Password" msgstr "Пароль" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:491 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:484 msgid "Outproxy Authorization" msgstr "ÐÐ²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ outproxy" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:507 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:498 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:502 +msgid "Jump URL List" +msgstr "СпиÑок адреÑов jump-ÑервиÑов" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:508 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:525 msgid "Custom options" msgstr "Дополнительные параметры" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:511 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:502 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:512 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:529 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:513 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:504 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:514 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:531 msgid "Cancel" msgstr "Отмена" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:517 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:508 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:518 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:535 msgid "Delete" msgstr "Удалить" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:519 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:510 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:520 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:537 msgid "Save" msgstr "Сохранить" @@ -505,92 +511,124 @@ msgstr "Редактирование наÑтроек Ñерверного ту msgid "New server settings" msgstr "ÐаÑтройки нового Ñерверного туннелÑ" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:214 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:199 msgid "Website name" msgstr "Ð˜Ð¼Ñ Ð²ÐµÐ±-Ñайта" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:218 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:203 msgid "(leave blank for outproxies)" msgstr "(не заполнÑÑ‚ÑŒ Ð´Ð»Ñ outproxy)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:208 msgid "Private key file" msgstr "Файл Ñекретного ключа" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:245 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:230 msgid "Add to local addressbook" msgstr "Добавить в локальную адреÑную книгу" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:252 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:237 msgid "Hostname Signature" msgstr "ПодпиÑÑŒ хоÑта" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:424 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:417 msgid "Encrypt Leaseset" msgstr "Шифровать LeaseSet" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:430 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:423 msgid "Encryption Key" msgstr "Ключ шифрованиÑ" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:434 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:427 msgid "Generate New Key" msgstr "Сгенерировать новый ключ" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:436 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:429 msgid "Generate" msgstr "Сгенерировать" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:438 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:496 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:431 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:523 msgid "(Tunnel must be stopped first)" msgstr "(Туннель перед Ñтим Ñледует оÑтановить)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:440 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:433 msgid "Restricted Access List" msgstr "Ограниченный доÑтуп" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:446 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:439 +msgid "Whitelist" +msgstr "Белый ÑпиÑок" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:443 +msgid "Blacklist" +msgstr "Чёрный ÑпиÑок" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:447 msgid "Access List" msgstr "СпиÑок доÑтупа" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:450 -msgid "(Restrict to these clients only)" -msgstr "(Разрешить доÑтуп только перечиÑленным клиентам)" +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:451 +msgid "Inbound connection limits (0=unlimited)" +msgstr "Ограничение входÑщих Ñоединений (0=неограниченно)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:453 +msgid "Per client" +msgstr "Ðа клиента" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:455 +msgid "Per minute" +msgstr "Ð’ минуту" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:459 +msgid "Per hour" +msgstr "Ð’ чаÑ" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:463 +msgid "Per day" +msgstr "Ð’ Ñутки" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:467 +msgid "Total" +msgstr "Ð’Ñего" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:466 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:475 +msgid "Max concurrent connections (0=unlimited)" +msgstr "МакÑимум одновременных Ñоединений (0=неограниченно)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:493 msgid "New Certificate type" msgstr "Создать новый Ñертификат. Тип" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:468 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:495 msgid "None" msgstr "Без" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:472 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:499 msgid "Hashcash (effort)" msgstr "Hashcash (ÑкÑпериментальный)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:478 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:505 msgid "Hashcash Calc Time" msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸ hashcash-Ñертификата" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:480 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:507 msgid "Estimate" msgstr "Прогноз" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:482 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:509 msgid "Hidden" msgstr "Скрытый" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:486 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:513 msgid "Signed (signed by)" msgstr "ПодпиÑанный (указать кем подпиÑан)" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:492 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:519 msgid "Modify Certificate" msgstr "Изменить Ñертификат" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:494 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:521 msgid "Modify" msgstr "Изменить" @@ -640,7 +678,7 @@ 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 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:297 msgid "Status" msgstr "СоÑтоÑние" @@ -653,30 +691,30 @@ 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 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:304 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 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:311 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:325 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:339 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 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:332 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 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:346 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 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:353 msgid "Start" msgstr "ЗапуÑтить" @@ -685,12 +723,12 @@ 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:377 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:396 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:379 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:398 msgid "Create" msgstr "Создать" @@ -699,30 +737,48 @@ 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 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:283 msgid "Interface" msgstr "Сетевой интерфейÑ" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:299 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:318 msgid "Standby" msgstr "Режим ожиданиÑ" # This term intentionally left in English -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:344 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:363 msgid "Outproxy" msgstr "Outproxy" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:348 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:367 msgid "Destination" msgstr "ÐÐ´Ñ€ÐµÑ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:362 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:381 msgid "none" msgstr "нет" -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:375 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:394 msgid "New client tunnel" msgstr "Ðовый клиентÑкий туннель" +#~ msgid "Locally (127.0.0.1)" +#~ msgstr "Только в пределах Ñтого компьютера (127.0.0.1)" + +#~ msgid "Everyone (0.0.0.0)" +#~ msgstr "Ð’Ñем (0.0.0.0)" + +#~ msgid "LAN Hosts (Please specify your LAN address)" +#~ msgstr "Только из локальной Ñети (Введите Ñвой LAN-адреÑ)" + +#~ msgid "Other" +#~ msgstr "ÐÐ´Ñ€ÐµÑ Ñетевого интерфейÑа" + +#~ msgid "I2CP Options" +#~ msgstr "Параметры I2CP" + +#~ msgid "(Restrict to these clients only)" +#~ msgstr "(Разрешить доÑтуп только перечиÑленным клиентам)" + #~ msgid "Unimplemented" #~ msgstr "не реализовано" diff --git a/apps/i2ptunnel/locale/messages_zh.po b/apps/i2ptunnel/locale/messages_zh.po index f6efbfd3b85d751f2990a4d213be4875d6dfdc5e..e08390836cc569098ec066e04dfb12ffffefe9ad 100644 --- a/apps/i2ptunnel/locale/messages_zh.po +++ b/apps/i2ptunnel/locale/messages_zh.po @@ -1,701 +1,814 @@ -# 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-10-04 02:45+0000\n" -"PO-Revision-Date: 2010-05-29 10:57+0800\n" -"Last-Translator: walking <walking@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: Chinese\n" - -#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:492 -#, java-format -msgid "" -"To visit the destination in your host database, click <a href=\"{0}\">here</" -"a>. To visit the conflicting addresshelper destination, click <a href=\"{1}" -"\">here</a>." -msgstr "" -"域å冲çªï¼šè¦è®¿é—®æ‚¨æœ¬åœ°ã€åœ°å€ç°¿ã€‘ä¸è®¾ç½®çš„ç›®æ ‡ä¸»æœº(相当与IP),请点击<a href=" -"\"{0}\">这里</a>。è¦è®¿é—®ã€åœ°å€åŠ©æ‰‹ã€‘è¿”å›žçš„ç›®æ ‡ä¸»æœºè¯·ç‚¹<a href=\"{1}\">这里</" -"a>。" - -#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:909 -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:372 -msgid "New Tunnel" -msgstr "新建隧é“" - -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:392 -msgid "Standard client" -msgstr "æ ‡å‡†å®¢æˆ·ç«¯" - -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:393 -msgid "HTTP client" -msgstr "HTTP 客户端" - -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:394 -msgid "IRC client" -msgstr "IRC 客户端" - -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:395 -msgid "Standard server" -msgstr "æ ‡å‡†æœåŠ¡å™¨" - -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:396 -msgid "HTTP server" -msgstr "HTTP æœåŠ¡å™¨" - -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:397 -msgid "SOCKS 4/4a/5 proxy" -msgstr "SOCKS4/4A/5 代ç†" - -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:398 -msgid "SOCKS IRC proxy" -msgstr "SOCKS IRC 代ç†" - -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:399 -msgid "CONNECT/SSL/HTTPS proxy" -msgstr "CONNECT/SSL/HTTPS 代ç†" - -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:400 -msgid "IRC server" -msgstr "IRC æœåŠ¡å™¨" - -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:401 -msgid "Streamr client" -msgstr "Streamr 客户端" - -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:402 -msgid "Streamr server" -msgstr "Streamr æœåŠ¡å™¨" - -#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:403 -msgid "HTTP bidir" -msgstr "åŒå‘http" - -#: ../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:358 -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 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:167 -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:172 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:228 -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 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:183 -msgid "Reachable by" -msgstr "访问地å€" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:162 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:195 -msgid "Locally (127.0.0.1)" -msgstr "本地(127.0.0.1)" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:166 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:199 -msgid "Everyone (0.0.0.0)" -msgstr "任何人(0.0.0.0)" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:170 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:203 -msgid "LAN Hosts (Please specify your LAN address)" -msgstr "局域网(请指定LAN地å€)" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:186 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:205 -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 -msgid "Shared Client" -msgstr "共享客户端" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:224 -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:228 -#: ../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:232 -#: ../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:234 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:249 -msgid "Advanced networking options" -msgstr "高级网络设置" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:236 -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:238 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:251 -msgid "Tunnel Options" -msgstr "隧é“选项" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:240 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:253 -msgid "Length" -msgstr "长度" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:247 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:260 -msgid "0 hop tunnel (low anonymity, low latency)" -msgstr "ç›´è¿ž(匿åæ€§æ— ,延迟低)" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:251 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:264 -msgid "1 hop tunnel (medium anonymity, medium latency)" -msgstr "隧é“跳点x1(匿å性ä¸,延迟ä¸)" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:255 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:268 -msgid "2 hop tunnel (high anonymity, high latency)" -msgstr "隧é“跳点x2(匿å性高,延迟高)" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:259 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:272 -msgid "3 hop tunnel (very high anonymity, poor performance)" -msgstr "隧é“跳点x3(匿å性优,å½±å“性能)" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:268 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:281 -msgid "hop tunnel (very poor performance)" -msgstr "跳点隧é“(严é‡å½±å“性能)" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:273 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:286 -msgid "Variance" -msgstr "éšæœºå˜åŒ–" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:280 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:293 -msgid "0 hop variance (no randomisation, consistant performance)" -msgstr "隧é“长度æ’定(éšæœºæ€§æ— ,性能稳定)" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:284 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:297 -msgid "" -"+ 0-1 hop variance (medium additive randomisation, subtractive performance)" -msgstr "隧é“长度+ 0-1(éšæœºæ€§ä¸,å½±å“性能)" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:288 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:301 -msgid "" -"+ 0-2 hop variance (high additive randomisation, subtractive performance)" -msgstr "隧é“长度+ 0-2(éšæœºæ€§é«˜,å½±å“性能)" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:292 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:305 -msgid "+/- 0-1 hop variance (standard randomisation, standard performance)" -msgstr "隧é“长度+/- 0-1(éšæœºæ€§æ ‡å‡†,æ£å¸¸æ€§èƒ½)" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:296 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:309 -msgid "+/- 0-2 hop variance (not recommended)" -msgstr "隧é“程度+/- 0-2(ä¸æŽ¨è)" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:308 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:321 -msgid "hop variance" -msgstr "节点数é‡" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:313 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:326 -msgid "Count" -msgstr "计数" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:320 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:333 -msgid "1 inbound, 1 outbound tunnel (low bandwidth usage, less reliability)" -msgstr "出/入站隧é“x1(带宽低,低å¯é 性)" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:324 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:337 -msgid "" -"2 inbound, 2 outbound tunnels (standard bandwidth usage, standard " -"reliability)" -msgstr "出/入站隧é“x2(å¸¦å®½æ ‡å‡†,æ ‡å‡†ç¨³å®šæ€§)" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:328 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:341 -msgid "" -"3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)" -msgstr "出/入站隧é“x3(带宽高,高稳定性)" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:337 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:350 -msgid "tunnels" -msgstr "隧é“" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:342 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:355 -msgid "Backup Count" -msgstr "备用数é‡" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:349 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:362 -msgid "0 backup tunnels (0 redundancy, no added resource usage)" -msgstr "æ— å¤‡ç”¨éš§é“(æ— å†—ä½™,ä¸å¢žåŠ 资æºå 用)" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:353 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:366 -msgid "1 backup tunnel each direction (low redundancy, low resource usage)" -msgstr "备用隧é“对x1 (低冗余,低资æºå 用)" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:357 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:370 -msgid "" -"2 backup tunnels each direction (medium redundancy, medium resource usage)" -msgstr "备用隧é“对x2 (ä¸å†—ä½™,ä¸èµ„æºå 用)" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:361 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:374 -msgid "3 backup tunnels each direction (high redundancy, high resource usage)" -msgstr "备用隧é“对x3 (高冗余,高资æºå 用)" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:370 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:383 -msgid "backup tunnels" -msgstr "备用隧é“" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:377 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:390 -msgid "Profile" -msgstr "连接类型" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:384 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:397 -msgid "interactive connection" -msgstr "速度连接" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:388 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:401 -msgid "bulk connection (downloads/websites/BT)" -msgstr "效率连接(下载/WEB/BT)" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:390 -msgid "Delay Connect" -msgstr "连接延迟æ–å¼€" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:394 -msgid "for request/response connections" -msgstr "å•è¯·æ±‚/å“应连接" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:398 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:405 -msgid "I2CP Options" -msgstr "I2CP选项" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:400 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:146 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:407 -msgid "Host" -msgstr "主机" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:404 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:152 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:411 -#: ../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:410 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:443 -msgid "Reduce tunnel quantity when idle" -msgstr "空闲时缩å‡éš§é“æ•°é‡" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:412 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:426 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:434 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:446 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:456 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:417 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:433 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:445 -msgid "Enable" -msgstr "å¯ç”¨" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:416 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:449 -msgid "Reduced tunnel count" -msgstr "削å‡åŽçš„隧é“æ•°é‡" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:420 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:440 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:453 -msgid "Idle minutes" -msgstr "空闲时间(分钟)" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:424 -msgid "Close tunnels when idle" -msgstr "空闲时关é—隧é“" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:430 -msgid "New Keys on Reopen" -msgstr "é‡æ–°æ‰“开隧é“时使用新密钥" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:438 -msgid "Disable" -msgstr "ç¦ç”¨" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:444 -msgid "Delay tunnel open until required" -msgstr "仅在请求时打开" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:454 -msgid "Persistent private key" -msgstr "永久ç§æœ‰å¯†é’¥" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:460 -msgid "File" -msgstr "文件" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:464 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:235 -msgid "Local destination" -msgstr "æœ¬åœ°ç›®æ ‡" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:468 -msgid "(if known)" -msgstr "(如果已知)" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:472 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:489 -msgid "Custom options" -msgstr "自定义选项" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:476 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:493 -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:478 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:495 -msgid "Cancel" -msgstr "å–消" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:482 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:499 -msgid "Delete" -msgstr "åˆ é™¤" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:484 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:501 -msgid "Save" -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:214 -msgid "Website name" -msgstr "网站å称" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:218 -msgid "(leave blank for outproxies)" -msgstr "(出å£ä»£ç†è¿™é‡Œè¯·ç½®ç©º)" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:223 -msgid "Private key file" -msgstr "ç§é’¥æ–‡ä»¶" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:245 -msgid "Add to local addressbook" -msgstr "æ·»åŠ è‡³æœ¬åœ°åœ°å€ç°¿" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:415 -msgid "Encrypt Leaseset" -msgstr "åŠ å¯†èµé›†" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:421 -msgid "Encryption Key" -msgstr "åŠ å¯†å¯†é’¥" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:425 -msgid "Generate New Key" -msgstr "生æˆæ–°å¯†é’¥" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:427 -msgid "Generate" -msgstr "生æˆ" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:429 -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:487 -msgid "(Tunnel must be stopped first)" -msgstr "(必须先åœæ¢éš§é“)" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:431 -msgid "Restricted Access List" -msgstr "é™åˆ¶è®¿é—®åˆ—表" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:437 -msgid "Access List" -msgstr "访问列表" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:441 -msgid "(Restrict to these clients only)" -msgstr "(ä»…å…许这些客户访问)" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:457 -msgid "New Certificate type" -msgstr "新建è¯ä¹¦ç±»åž‹" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:459 -msgid "None" -msgstr "æ— " - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:463 -msgid "Hashcash (effort)" -msgstr "Hashcash (强度)" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:469 -msgid "Hashcash Calc Time" -msgstr "Hashcash 计算时间" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:471 -msgid "Estimate" -msgstr "ä¼°ç®—" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:473 -msgid "Hidden" -msgstr "éšè—" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:477 -msgid "Signed (signed by)" -msgstr "ç¾å(ç¾å者)" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:483 -msgid "Modify Certificate" -msgstr "修改è¯ä¹¦" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:485 -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:368 -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:370 -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:346 -msgid "Outproxy" -msgstr "出å£ä»£ç†" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:350 -msgid "Destination" -msgstr "ç›®æ ‡" - -#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:366 -msgid "New client tunnel" -msgstr "新建客户隧é“" - -#~ msgid "Unimplemented" -#~ msgstr "尚未实现" +# 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: 2011-03-03 18:29+0000\n" +"PO-Revision-Date: 2011-02-12 20:07+0800\n" +"Last-Translator: \n" +"Language-Team: foo <foo@bar>\n" +"Language: \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:474 +#, java-format +msgid "" +"To visit the destination in your host database, click <a href=\"{0}\">here</" +"a>. To visit the conflicting addresshelper destination, click <a href=" +"\"{1}\">here</a>." +msgstr "" +"域å冲çªï¼šè¦è®¿é—®æ‚¨æœ¬åœ°ã€åœ°å€ç°¿ã€‘ä¸è®¾ç½®çš„ç›®æ ‡ä¸»æœº(相当与IP),请点击<a href=" +"\"{0}\">这里</a>。è¦è®¿é—®ã€åœ°å€åŠ©æ‰‹ã€‘è¿”å›žçš„ç›®æ ‡ä¸»æœºè¯·ç‚¹<a href=\"{1}\">这里</" +"a>。" + +#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:931 +msgid "" +"Click a link below to look for an address helper by using a \"jump\" service:" +msgstr "" +"请点击下é¢çš„链接通过ã€è·³è½¬(Jump)】æœåŠ¡æ供的ã€åœ°å€åŠ©æ‰‹ã€‘链接跳转至域å对应的" +"主机:" + +#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:326 +#: ../java/src/net/i2p/i2ptunnel/web/EditBean.java:336 +msgid "internal" +msgstr "内部" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:171 +msgid "" +"Invalid form submission, probably because you used the 'back' or 'reload' " +"button on your browser. Please resubmit." +msgstr "" +"网页æäº¤æ— æ•ˆï¼Œå¯èƒ½çš„åŽŸå› æ˜¯æ‚¨ä½¿ç”¨äº†æµè§ˆå™¨çš„“åŽé€€â€å’Œâ€œåˆ·æ–°â€æŒ‰é’®ï¼Œå¯¼è‡´è¡¨å•è¿‡æœŸï¼Œ" +"请é‡æ–°æ交。" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:218 +msgid "Configuration reloaded for all tunnels" +msgstr "所有隧é“éƒ½å·²æ ¹æ®å½“å‰é…ç½®é‡å¯" + +#. and give them something to look at in any case +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:230 +msgid "Starting tunnel" +msgstr "æ£åœ¨å¯åŠ¨éš§é“" + +#. and give them something to look at in any case +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:243 +msgid "Stopping tunnel" +msgstr "æ£åœ¨å…³é—隧é“" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:311 +msgid "Configuration changes saved" +msgstr "é…置修改æˆåŠŸ" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:314 +msgid "Failed to save configuration" +msgstr "é…ç½®ä¿å˜å¤±è´¥" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:398 +msgid "New Tunnel" +msgstr "新建隧é“" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:418 +msgid "Standard client" +msgstr "æ ‡å‡†å®¢æˆ·ç«¯" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:419 +msgid "HTTP client" +msgstr "HTTP 客户端" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:420 +msgid "IRC client" +msgstr "IRC 客户端" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:421 +msgid "Standard server" +msgstr "æ ‡å‡†æœåŠ¡å™¨" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:422 +msgid "HTTP server" +msgstr "HTTP æœåŠ¡å™¨" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:423 +msgid "SOCKS 4/4a/5 proxy" +msgstr "SOCKS4/4A/5 代ç†" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:424 +msgid "SOCKS IRC proxy" +msgstr "SOCKS IRC 代ç†" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:425 +msgid "CONNECT/SSL/HTTPS proxy" +msgstr "CONNECT/SSL/HTTPS 代ç†" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:426 +msgid "IRC server" +msgstr "IRC æœåŠ¡å™¨" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:427 +msgid "Streamr client" +msgstr "Streamr 客户端" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:428 +msgid "Streamr server" +msgstr "Streamr æœåŠ¡å™¨" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:429 +msgid "HTTP bidir" +msgstr "åŒå‘http" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:517 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:290 +msgid "Host not set" +msgstr "主机未设置" + +#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:521 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:272 +msgid "Port not set" +msgstr "端å£æœªè®¾ç½®" + +#: ../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:279 +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:386 +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 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:162 +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:150 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:192 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:153 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:167 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:213 +msgid "required" +msgstr "å¿…è¦" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:159 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:178 +msgid "Reachable by" +msgstr "访问地å€" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:180 +msgid "Outproxies" +msgstr "出å£ä»£ç†" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:187 +msgid "Tunnel Destination" +msgstr "隧é“ç›®æ ‡" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:199 +msgid "name or destination" +msgstr "å称或æè¿°" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:202 +msgid "b32 not recommended" +msgstr "请é¿å…使用b32地å€ã€‚" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:208 +msgid "Shared Client" +msgstr "共享客户端" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:212 +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:216 +#: ../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:220 +#: ../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:222 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:243 +msgid "Advanced networking options" +msgstr "高级网络设置" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:224 +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:226 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:245 +msgid "Tunnel Options" +msgstr "隧é“选项" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:228 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:247 +msgid "Length" +msgstr "长度" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:254 +msgid "0 hop tunnel (low anonymity, low latency)" +msgstr "ç›´è¿ž(匿åæ€§æ— ,延迟低)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:258 +msgid "1 hop tunnel (medium anonymity, medium latency)" +msgstr "隧é“跳点x1(匿å性ä¸,延迟ä¸)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:262 +msgid "2 hop tunnel (high anonymity, high latency)" +msgstr "隧é“跳点x2(匿å性高,延迟高)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:247 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:266 +msgid "3 hop tunnel (very high anonymity, poor performance)" +msgstr "隧é“跳点x3(匿å性优,å½±å“性能)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:256 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:275 +msgid "hop tunnel (very poor performance)" +msgstr "跳点隧é“(严é‡å½±å“性能)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:261 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:280 +msgid "Variance" +msgstr "éšæœºå˜åŒ–" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:268 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:287 +msgid "0 hop variance (no randomisation, consistant performance)" +msgstr "隧é“长度æ’定(éšæœºæ€§æ— ,性能稳定)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:272 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:291 +msgid "" +"+ 0-1 hop variance (medium additive randomisation, subtractive performance)" +msgstr "隧é“长度+ 0-1(éšæœºæ€§ä¸,å½±å“性能)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:276 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:295 +msgid "" +"+ 0-2 hop variance (high additive randomisation, subtractive performance)" +msgstr "隧é“长度+ 0-2(éšæœºæ€§é«˜,å½±å“性能)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:280 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:299 +msgid "+/- 0-1 hop variance (standard randomisation, standard performance)" +msgstr "隧é“长度+/- 0-1(éšæœºæ€§æ ‡å‡†,æ£å¸¸æ€§èƒ½)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:284 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:303 +msgid "+/- 0-2 hop variance (not recommended)" +msgstr "隧é“程度+/- 0-2(ä¸æŽ¨è)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:296 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:315 +msgid "hop variance" +msgstr "节点数é‡" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:301 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:320 +msgid "Count" +msgstr "计数" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:308 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:327 +msgid "1 inbound, 1 outbound tunnel (low bandwidth usage, less reliability)" +msgstr "出/入站隧é“x1(带宽低,低å¯é 性)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:312 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:331 +msgid "" +"2 inbound, 2 outbound tunnels (standard bandwidth usage, standard " +"reliability)" +msgstr "出/入站隧é“x2(å¸¦å®½æ ‡å‡†,æ ‡å‡†ç¨³å®šæ€§)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:316 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:335 +msgid "" +"3 inbound, 3 outbound tunnels (higher bandwidth usage, higher reliability)" +msgstr "出/入站隧é“x3(带宽高,高稳定性)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:325 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:344 +msgid "tunnels" +msgstr "隧é“" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:330 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:349 +msgid "Backup Count" +msgstr "备用数é‡" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:337 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:356 +msgid "0 backup tunnels (0 redundancy, no added resource usage)" +msgstr "æ— å¤‡ç”¨éš§é“(æ— å†—ä½™,ä¸å¢žåŠ 资æºå 用)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:341 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:360 +msgid "1 backup tunnel each direction (low redundancy, low resource usage)" +msgstr "备用隧é“对x1 (低冗余,低资æºå 用)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:345 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:364 +msgid "" +"2 backup tunnels each direction (medium redundancy, medium resource usage)" +msgstr "备用隧é“对x2 (ä¸å†—ä½™,ä¸èµ„æºå 用)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:349 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:368 +msgid "3 backup tunnels each direction (high redundancy, high resource usage)" +msgstr "备用隧é“对x3 (高冗余,高资æºå 用)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:358 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:377 +msgid "backup tunnels" +msgstr "备用隧é“" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:365 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:384 +msgid "Profile" +msgstr "连接类型" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:372 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:391 +msgid "interactive connection" +msgstr "速度连接" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:376 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:395 +msgid "bulk connection (downloads/websites/BT)" +msgstr "效率连接(下载/WEB/BT)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:378 +msgid "Delay Connect" +msgstr "连接延迟æ–å¼€" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:382 +msgid "for request/response connections" +msgstr "å•è¯·æ±‚/å“应连接" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:386 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:399 +msgid "Router I2CP Address" +msgstr "路由器I2CP地å€" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:388 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:142 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:401 +msgid "Host" +msgstr "主机" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:396 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:148 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:409 +#: ../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:479 +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/editClient_jsp.java:472 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:486 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:419 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:481 +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:485 +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:489 +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 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:435 +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:220 +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:470 +msgid "Local Authorization" +msgstr "本地认è¯" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:476 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:490 +msgid "Username" +msgstr "用户å" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:480 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:494 +msgid "Password" +msgstr "密ç " + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:484 +msgid "Outproxy Authorization" +msgstr "出å£ä»£ç†è®¤è¯" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:502 +msgid "Jump URL List" +msgstr "跳转æœåŠ¡åˆ—表" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:508 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:525 +msgid "Custom options" +msgstr "自定义选项" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:512 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:529 +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:514 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:531 +msgid "Cancel" +msgstr "å–消" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:518 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:535 +msgid "Delete" +msgstr "åˆ é™¤" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editClient_jsp.java:520 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:537 +msgid "Save" +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:199 +msgid "Website name" +msgstr "网站å称" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:203 +msgid "(leave blank for outproxies)" +msgstr "(出å£ä»£ç†è¿™é‡Œè¯·ç½®ç©º)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:208 +msgid "Private key file" +msgstr "ç§é’¥æ–‡ä»¶" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:230 +msgid "Add to local addressbook" +msgstr "æ·»åŠ è‡³æœ¬åœ°åœ°å€ç°¿" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:237 +msgid "Hostname Signature" +msgstr "主机åç¾å" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:417 +msgid "Encrypt Leaseset" +msgstr "åŠ å¯†èµé›†" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:423 +msgid "Encryption Key" +msgstr "åŠ å¯†å¯†é’¥" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:427 +msgid "Generate New Key" +msgstr "生æˆæ–°å¯†é’¥" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:429 +msgid "Generate" +msgstr "生æˆ" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:431 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:523 +msgid "(Tunnel must be stopped first)" +msgstr "(必须先åœæ¢éš§é“)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:433 +msgid "Restricted Access List" +msgstr "é™åˆ¶è®¿é—®åˆ—表" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:439 +msgid "Whitelist" +msgstr "白åå•" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:443 +msgid "Blacklist" +msgstr "黑åå•" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:447 +msgid "Access List" +msgstr "访问列表" + +# disable=>noLimit +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:451 +msgid "Inbound connection limits (0=unlimited)" +msgstr "入站连接é™åˆ¶(0=æ— é™åˆ¶)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:453 +msgid "Per client" +msgstr "按客户端" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:455 +msgid "Per minute" +msgstr "按分钟" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:459 +msgid "Per hour" +msgstr "按å°æ—¶" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:463 +msgid "Per day" +msgstr "按天" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:467 +msgid "Total" +msgstr "总数" + +# disable=>noLimit +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:475 +msgid "Max concurrent connections (0=unlimited)" +msgstr "最大并å‘连接数(0=æ— é™åˆ¶)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:493 +msgid "New Certificate type" +msgstr "新建è¯ä¹¦ç±»åž‹" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:495 +msgid "None" +msgstr "æ— " + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:499 +msgid "Hashcash (effort)" +msgstr "Hashcash (强度)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:505 +msgid "Hashcash Calc Time" +msgstr "Hashcash 计算时间" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:507 +msgid "Estimate" +msgstr "ä¼°ç®—" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:509 +msgid "Hidden" +msgstr "éšè—" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:513 +msgid "Signed (signed by)" +msgstr "ç¾å(ç¾å者)" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:519 +msgid "Modify Certificate" +msgstr "修改è¯ä¹¦" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/editServer_jsp.java:521 +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:297 +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:304 +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:311 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:325 +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:339 +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:332 +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:346 +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:353 +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:396 +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:398 +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:283 +msgid "Interface" +msgstr "网络接å£" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:318 +msgid "Standby" +msgstr "ç‰å¾…" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:363 +msgid "Outproxy" +msgstr "出å£ä»£ç†" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:367 +msgid "Destination" +msgstr "ç›®æ ‡" + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:381 +msgid "none" +msgstr "æ— " + +#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:394 +msgid "New client tunnel" +msgstr "新建客户隧é“" + +#~ msgid "Locally (127.0.0.1)" +#~ msgstr "本地(127.0.0.1)" + +#~ msgid "Everyone (0.0.0.0)" +#~ msgstr "任何人(0.0.0.0)" + +#~ msgid "LAN Hosts (Please specify your LAN address)" +#~ msgstr "局域网(请指定LAN地å€)" + +#~ msgid "Other" +#~ msgstr "其他" + +#~ msgid "I2CP Options" +#~ msgstr "I2CP选项" + +#~ msgid "(Restrict to these clients only)" +#~ msgstr "(ä»…å…许这些客户访问)" + +#~ msgid "Unimplemented" +#~ msgstr "尚未实现" diff --git a/apps/jetty/build.xml b/apps/jetty/build.xml index a45f9df6217a599307cf0b47c6de4f24038e2d4e..a4ba71e07b3e0a0f4671b57e175abc3a2f6910e1 100644 --- a/apps/jetty/build.xml +++ b/apps/jetty/build.xml @@ -96,14 +96,39 @@ srcdir="./java/src" debug="true" source="1.5" target="1.5" destdir="./build/obj" + includeAntRuntime="false" classpath="./jettylib/commons-logging.jar:./jettylib/javax.servlet.jar:./jettylib/org.mortbay.jetty.jar" > <compilerarg line="${javac.compilerargs}" /> </javac> </target> - <target name="jar" depends="compile"> + + <target name="jar" depends="compile, jarUpToDate" unless="jar.uptodate" > + <exec executable="mtn" outputproperty="workspace.changes" errorproperty="mtn.error2" failifexecutionfails="false" > + <arg value="list" /> + <arg value="changed" /> + <arg value="." /> + </exec> + <!-- \n in an attribute value generates an invalid manifest --> + <exec executable="tr" inputstring="${workspace.changes}" outputproperty="workspace.changes.tr" errorproperty="mtn.error2" failifexecutionfails="false" > + <arg value="-s" /> + <arg value="[:space:]" /> + <arg value="," /> + </exec> <jar destfile="./jettylib/org.mortbay.jetty.jar" basedir="./build/obj" includes="**/*.class" update="true" > + <manifest> + <attribute name="Build-Date" value="${build.timestamp}" /> + <attribute name="Base-Revision" value="${workspace.version}" /> + <attribute name="Workspace-Changes" value="${workspace.changes.tr}" /> + </manifest> </jar> </target> + + <target name="jarUpToDate"> + <uptodate property="jar.uptodate" targetfile="jettylib/org.mortbay.jetty.jar" > + <srcfiles dir= "build/obj" includes="**/*.class" /> + </uptodate> + </target> + <target name="clean" > <delete dir="./build" /> <delete file="${verified.filename}" /> diff --git a/apps/jetty/java/src/org/mortbay/http/handler/ResourceHandler.java b/apps/jetty/java/src/org/mortbay/http/handler/ResourceHandler.java index 5515df2269322b11b57a151b7bb78f3aa9f05b32..d1a57159bf0ab75ad44f4c1634f49975141cf3ea 100644 --- a/apps/jetty/java/src/org/mortbay/http/handler/ResourceHandler.java +++ b/apps/jetty/java/src/org/mortbay/http/handler/ResourceHandler.java @@ -47,7 +47,7 @@ import org.mortbay.util.URI; * HTTP/1.1 ranges are supported. * * @version $Id: ResourceHandler.java,v 1.66 2005/08/24 08:18:17 gregwilkins Exp $ - * @author Nuno Preguiça + * @author Nuno Pregui?a (sorry, wasn't UTF-8) * @author Greg Wilkins */ public class ResourceHandler extends AbstractHttpHandler diff --git a/apps/ministreaming/java/build.xml b/apps/ministreaming/java/build.xml index c22676d264b54b39d0768eee5c6972472be4d043..8fcd2d517c8aa9c16a5b98543b5083eb83209d4e 100644 --- a/apps/ministreaming/java/build.xml +++ b/apps/ministreaming/java/build.xml @@ -24,13 +24,40 @@ <mkdir dir="./build" /> <mkdir dir="./build/obj" /> <!-- half of this is deprecated classes so turn deprecation off --> - <javac srcdir="./src" debug="true" deprecation="off" source="1.5" target="1.5" destdir="./build/obj" classpath="../../../core/java/build/i2p.jar" > + <javac srcdir="./src" debug="true" deprecation="off" source="1.5" target="1.5" + includeAntRuntime="false" + destdir="./build/obj" classpath="../../../core/java/build/i2p.jar" > <compilerarg line="${javac.compilerargs}" /> </javac> </target> - <target name="jar" depends="compile"> - <jar destfile="./build/mstreaming.jar" basedir="./build/obj" includes="**/*.class" /> + + <target name="jar" depends="compile, jarUpToDate" unless="jar.uptodate" > + <exec executable="mtn" outputproperty="workspace.changes" errorproperty="mtn.error2" failifexecutionfails="false" > + <arg value="list" /> + <arg value="changed" /> + <arg value="." /> + </exec> + <!-- \n in an attribute value generates an invalid manifest --> + <exec executable="tr" inputstring="${workspace.changes}" outputproperty="workspace.changes.tr" errorproperty="mtn.error2" failifexecutionfails="false" > + <arg value="-s" /> + <arg value="[:space:]" /> + <arg value="," /> + </exec> + <jar destfile="./build/mstreaming.jar" basedir="./build/obj" includes="**/*.class" > + <manifest> + <attribute name="Build-Date" value="${build.timestamp}" /> + <attribute name="Base-Revision" value="${workspace.version}" /> + <attribute name="Workspace-Changes" value="${workspace.changes.tr}" /> + </manifest> + </jar> </target> + + <target name="jarUpToDate"> + <uptodate property="jar.uptodate" targetfile="build/mstreaming.jar" > + <srcfiles dir= "." includes="build/obj/**/*.class" /> + </uptodate> + </target> + <target name="javadoc"> <mkdir dir="./build" /> <mkdir dir="./build/javadoc" /> diff --git a/apps/ministreaming/java/src/net/i2p/client/streaming/ByteCollector.java b/apps/ministreaming/java/src/net/i2p/client/streaming/ByteCollector.java index 39249b449266897fadcefb03b2b82299987f1827..38d96ddb742a04edbd344abfb3fe48c65961dcf3 100644 --- a/apps/ministreaming/java/src/net/i2p/client/streaming/ByteCollector.java +++ b/apps/ministreaming/java/src/net/i2p/client/streaming/ByteCollector.java @@ -4,6 +4,7 @@ package net.i2p.client.streaming; * Like a StringBuffer, but for bytes. This class is not internally synchronized, * so care should be taken when using in a multithreaded environment. * + * @deprecated Only used by deprecated I2PSocketImpl */ class ByteCollector { byte[] contents; @@ -294,4 +295,4 @@ class ByteCollector { size = 0; return bb; } -} \ No newline at end of file +} diff --git a/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketEepGet.java b/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketEepGet.java index 834c52160c506e13f818e03f1200d9a5d7c97f69..d68270bc62aed4a90e3a1023141940ca2c547a3f 100644 --- a/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketEepGet.java +++ b/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketEepGet.java @@ -59,7 +59,6 @@ public class I2PSocketEepGet extends EepGet { // public EepGet(I2PAppContext ctx, boolean shouldProxy, String proxyHost, int proxyPort, int numRetries, long minSize, long maxSize, String outputFile, OutputStream outputStream, String url, boolean allowCaching, String etag, String postData) { super(ctx, false, null, -1, numRetries, minSize, maxSize, outputFile, outputStream, url, true, null, null); _socketManager = mgr; - _log = ctx.logManager().getLog(I2PSocketEepGet.class); } /** diff --git a/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManager.java b/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManager.java index 02bef1a0aebba569c7419491f6ab6ce1f0e384d9..1651d40d2cbbe2adee60c5bf5a66e1d53ea404cd 100644 --- a/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManager.java +++ b/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManager.java @@ -4,9 +4,12 @@ */ package net.i2p.client.streaming; +import java.io.IOException; import java.io.InterruptedIOException; import java.net.ConnectException; import java.net.NoRouteToHostException; +import java.net.ServerSocket; +import java.net.Socket; import java.util.Properties; import java.util.Set; @@ -84,7 +87,7 @@ public interface I2PSocketManager { * * @return a set of currently connected I2PSockets */ - public Set listSockets(); + public Set<I2PSocket> listSockets(); /** * Ping the specified peer, returning true if they replied to the ping within @@ -107,4 +110,25 @@ public interface I2PSocketManager { public static interface DisconnectListener { public void sessionDisconnected(); } + + /** + * Like getServerSocket but returns a real ServerSocket for easier porting of apps. + * @since 0.8.4 + */ + public ServerSocket getStandardServerSocket() throws IOException; + + /** + * Like connect() but returns a real Socket, and throws only IOE, + * for easier porting of apps. + * @since 0.8.4 + */ + public Socket connectToSocket(Destination peer) throws IOException; + + /** + * Like connect() but returns a real Socket, and throws only IOE, + * for easier porting of apps. + * @param timeout ms if > 0, forces blocking (disables connectDelay) + * @since 0.8.4 + */ + public Socket connectToSocket(Destination peer, int timeout) throws IOException; } diff --git a/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManagerImpl.java b/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManagerImpl.java index fb2589b52bdc5ec2ed1d0e2368e17f13845c3099..e0a5b022fec16a1e682a02924de8d39903cd0f31 100644 --- a/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManagerImpl.java +++ b/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManagerImpl.java @@ -10,6 +10,8 @@ import java.io.InterruptedIOException; import java.io.UnsupportedEncodingException; import java.net.ConnectException; import java.net.NoRouteToHostException; +import java.net.ServerSocket; +import java.net.Socket; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -461,6 +463,14 @@ class I2PSocketManagerImpl implements I2PSocketManager, I2PSessionListener { return _serverSocket; } + /** + * @throws UnsupportedOperationException + * @since 0.8.4 + */ + public ServerSocket getStandardServerSocket() { + throw new UnsupportedOperationException(); + } + /** * Create a new connected socket (block until the socket is created) * @@ -601,6 +611,22 @@ class I2PSocketManagerImpl implements I2PSocketManager, I2PSessionListener { return connect(peer, null); } + /** + * @throws UnsupportedOperationException + * @since 0.8.4 + */ + public Socket connectToSocket(Destination peer) { + throw new UnsupportedOperationException(); + } + + /** + * @throws UnsupportedOperationException + * @since 0.8.4 + */ + public Socket connectToSocket(Destination peer, int timeout) { + throw new UnsupportedOperationException(); + } + /** * Destroy the socket manager, freeing all the associated resources. This * method will block untill all the managed sockets are closed. @@ -660,7 +686,7 @@ class I2PSocketManagerImpl implements I2PSocketManager, I2PSessionListener { * Retrieve a set of currently connected I2PSockets, either initiated locally or remotely. * */ - public Set listSockets() { + public Set<I2PSocket> listSockets() { Set<I2PSocket> sockets = new HashSet<I2PSocket>(8); synchronized (lock) { sockets.addAll(_inSockets.values()); diff --git a/apps/routerconsole/java/bmsg.sh b/apps/routerconsole/java/bmsg.sh deleted file mode 100644 index b9d294b32336537241eb2f9953fb65673c93b524..0000000000000000000000000000000000000000 --- a/apps/routerconsole/java/bmsg.sh +++ /dev/null @@ -1,17 +0,0 @@ -# -# Update messages_xx.po and messages_xx.class files, -# from both java and jsp sources. -# Requires installed programs xgettext, msgfmt, msgmerge, and find. -# zzz - public domain -# - -## launching sh.exe with -login parameter will open a shell with the current path always pointing to \bin\ -## need to cd into our orignal path - where we call sh.exe from. - -cd $CALLFROM -## echo $PWD - -## except this everything is the same with bundle-message.sh -## walking - public domain :-D - -source bundle-messages.sh $PARAS \ No newline at end of file diff --git a/apps/routerconsole/java/build.xml b/apps/routerconsole/java/build.xml index d544e59aca580f961ad5bbf2d8d24d570bba654b..dc686d29c17c9ffaf73314f075d3c9e64a7d2e5c 100644 --- a/apps/routerconsole/java/build.xml +++ b/apps/routerconsole/java/build.xml @@ -24,6 +24,7 @@ <pathelement location="../../jetty/jettylib/javax.servlet.jar" /> <pathelement location="../../systray/java/build/obj" /> <pathelement location="../../systray/java/lib/systray4j.jar" /> + <pathelement location="../../desktopgui/build" /> <pathelement location="../../../installer/lib/wrapper/win32/wrapper.jar" /> <!-- we dont care if we're not on win32 --> <pathelement location="../../jrobin/jrobin-1.4.0.jar" /> </classpath> @@ -45,6 +46,7 @@ <javac srcdir="./src" debug="true" deprecation="on" source="1.5" target="1.5" + includeAntRuntime="false" destdir="./build/obj"> <compilerarg line="${javac.compilerargs}" /> <classpath> @@ -54,45 +56,74 @@ <pathelement location="../../jetty/jettylib/javax.servlet.jar" /> <pathelement location="../../systray/java/build/systray.jar" /> <pathelement location="../../systray/java/lib/systray4j.jar" /> + <pathelement location="../../desktopgui/dist/desktopgui.jar" /> <pathelement location="../../../installer/lib/wrapper/win32/wrapper.jar" /> <!-- we dont care if we're not on win32 --> <pathelement location="../../jrobin/jrobin-1.4.0.jar" /> </classpath> </javac> </target> - <target name="jar" depends="compile"> + + <!-- the jar with the latest message classes from the jsps, and the war too --> + <target name="jar" depends="jar1, war, bundle" /> + + <!-- the jar without the latest message classes from the jsps --> + <target name="jar1" depends="compile, jarUpToDate" unless="jar.uptodate" > + <exec executable="mtn" outputproperty="workspace.changes.j" errorproperty="mtn.error2" failifexecutionfails="false" > + <arg value="list" /> + <arg value="changed" /> + <arg value="." /> + <arg value="../locale" /> + </exec> + <!-- \n in an attribute value generates an invalid manifest --> + <exec executable="tr" inputstring="${workspace.changes.j}" outputproperty="workspace.changes.j.tr" errorproperty="mtn.error2" failifexecutionfails="false" > + <arg value="-s" /> + <arg value="[:space:]" /> + <arg value="," /> + </exec> <jar destfile="./build/routerconsole.jar" basedir="./build/obj" includes="**/*.class"> <manifest> <!-- top level installer will rename to jrobin.jar --> - <attribute name="Class-Path" value="i2p.jar router.jar jrobin.jar" /> + <!-- DTG added in 0.8.4, not in the classpath for very old installs, before we changed wrapper.config to specify * --> + <attribute name="Class-Path" value="i2p.jar router.jar jrobin.jar desktopgui.jar" /> + <attribute name="Build-Date" value="${build.timestamp}" /> + <attribute name="Base-Revision" value="${workspace.version}" /> + <attribute name="Workspace-Changes" value="${workspace.changes.j.tr}" /> </manifest> </jar> - <delete dir="./tmpextract" /> <!-- jrobin taken out of routerconsole.jar in 0.7.12 + <delete dir="./tmpextract" /> <unjar src="../../jrobin/jrobin-1.4.0.jar" dest="./tmpextract" /> <jar destfile="./build/routerconsole.jar" basedir="./tmpextract" update="true" /> <delete dir="./tmpextract" /> --> - - <ant target="war" /> + </target> + <!-- this is tricky because the message classes go in the jar, not in the war --> + <target name="bundle" depends="jar1, precompilejsp" > <!-- Update the messages_*.po files. We need to supply the bat file for windows, and then change the fail property to true --> - <exec executable="sh" osfamily="unix" failifexecutionfails="false" > + <exec executable="sh" osfamily="unix" failifexecutionfails="true" > <arg value="./bundle-messages.sh" /> </exec> - <exec executable="sh" osfamily="mac" failifexecutionfails="false" > + <exec executable="sh" osfamily="mac" failifexecutionfails="true" > <arg value="./bundle-messages.sh" /> </exec> - <exec executable="cmd" osfamily="windows" failifexecutionfails="false" > - <arg value="/c" /> - <arg value="bundle-messages.bat" /> + <!-- multi-lang is optional --> + <exec executable="sh" osfamily="windows" failifexecutionfails="false" > + <arg value="./bundle-messages.sh" /> </exec> <!-- jar again to get the latest messages_*.class files --> <jar destfile="./build/routerconsole.jar" basedir="./build/obj" includes="**/*.class" update="true" /> </target> - <target name="poupdate" depends="build"> - <ant target="war" /> + + <target name="jarUpToDate"> + <uptodate property="jar.uptodate" targetfile="build/routerconsole.jar" > + <srcfiles dir= "build/obj" includes="**/*.class" /> + </uptodate> + </target> + + <target name="poupdate" depends="precompilejsp"> <!-- Update the messages_*.po files. We need to supply the bat file for windows, and then change the fail property to true --> <exec executable="sh" osfamily="unix" failifexecutionfails="true" > @@ -103,19 +134,43 @@ <arg value="./bundle-messages.sh" /> <arg value="-p" /> </exec> - <exec executable="cmd" osfamily="windows" failifexecutionfails="true" > - <arg value="/c" /> - <arg value="bundle-messages.bat" /> + <exec executable="sh" osfamily="windows" failifexecutionfails="true" > + <arg value="./bundle-messages.sh" /> <arg value="-p" /> </exec> </target> - <target name="war" depends="precompilejsp"> + + <!-- does NOT update the message classes, as those go in the jar --> + <target name="war" depends="precompilejsp, warUpToDate" unless="war.uptodate" > + <exec executable="mtn" outputproperty="workspace.changes.w" errorproperty="mtn.error2" failifexecutionfails="false" > + <arg value="list" /> + <arg value="changed" /> + <arg value="../jsp" /> + </exec> + <!-- \n in an attribute value generates an invalid manifest --> + <exec executable="tr" inputstring="${workspace.changes.w}" outputproperty="workspace.changes.w.tr" errorproperty="mtn.error2" failifexecutionfails="false" > + <arg value="-s" /> + <arg value="[:space:]" /> + <arg value="," /> + </exec> <!-- Don't include the css in the war, the main build.xml will copy it to docs/themes/console/ --> <war destfile="build/routerconsole.war" webxml="../jsp/web-out.xml" basedir="../jsp/" excludes="web.xml, *.css, **/*.java, *.jsp, *.jsi, web-fragment.xml, web-out.xml"> + <manifest> + <attribute name="Build-Date" value="${build.timestamp}" /> + <attribute name="Base-Revision" value="${workspace.version}" /> + <attribute name="Workspace-Changes" value="${workspace.changes.w.tr}" /> + </manifest> </war> </target> - <target name="precompilejsp" unless="precompilejsp.uptodate"> + + <target name="warUpToDate"> + <uptodate property="war.uptodate" targetfile="build/routerconsole.war" > + <srcfiles dir= "../jsp" excludes="web.xml, web-fragment.xml, *.css, **/*.java, *.jsp, *.jsi" /> + </uptodate> + </target> + + <target name="precompilejsp" depends="jar1" unless="precompilejsp.uptodate"> <delete dir="../jsp/WEB-INF/" /> <delete file="../jsp/web-fragment.xml" /> <delete file="../jsp/web-out.xml" /> @@ -161,6 +216,7 @@ <pathelement location="../../jetty/jettylib/ant.jar" /> <pathelement location="../../systray/java/build/obj" /> <pathelement location="../../systray/java/lib/systray4j.jar" /> + <pathelement location="../../desktopgui/dist/desktopgui.jar" /> <pathelement location="../../../installer/lib/wrapper/win32/wrapper.jar" /> <pathelement location="build/routerconsole.jar" /> <pathelement location="build/" /> @@ -180,6 +236,7 @@ <javac debug="true" deprecation="on" source="1.5" target="1.5" encoding="UTF-8" + includeAntRuntime="false" destdir="../jsp/WEB-INF/classes/" srcdir="../jsp/WEB-INF/classes" includes="**/*.java"> <compilerarg line="${javac.compilerargs}" /> @@ -191,6 +248,7 @@ <pathelement location="../../jetty/jettylib/org.mortbay.jetty.jar" /> <pathelement location="../../systray/java/build/obj" /> <pathelement location="../../systray/java/lib/systray4j.jar" /> + <pathelement location="../../desktopgui/dist/desktopgui.jar" /> <pathelement location="../../../installer/lib/wrapper/win32/wrapper.jar" /> <pathelement location="build/routerconsole.jar" /> <pathelement location="build" /> @@ -213,14 +271,14 @@ </target> <uptodate property="precompilejsp.uptodate" targetfile="../jsp/web-out.xml"> - <srcfiles dir= "../jsp" includes="**/*.jsp, **/*.html, *.css, susimail/susimail, web.xml"/> + <srcfiles dir= "../jsp" includes="**/*.jsp, *.jsi, **/*.html, *.css, susimail/susimail, web.xml"/> </uptodate> <target name="javadoc"> <mkdir dir="./build" /> <mkdir dir="./build/javadoc" /> <javadoc - sourcepath="./src:../../../core/java/src:../../../router/java/src:../../systray/java/src" destdir="./build/javadoc" + sourcepath="./src:../../../core/java/src:../../../router/java/src:../../systray/java/src:../../desktopgui/src" destdir="./build/javadoc" packagenames="*" use="true" splitindex="true" diff --git a/apps/routerconsole/java/bundle-messages.bat b/apps/routerconsole/java/bundle-messages.bat deleted file mode 100644 index 90feca972a6457eebf97f9bdbea6028ac88d7789..0000000000000000000000000000000000000000 --- a/apps/routerconsole/java/bundle-messages.bat +++ /dev/null @@ -1,26 +0,0 @@ -@echo off -set Callfrom=%cd% -set Paras=%1 - -rem before calling make sure you have msys and mingw 's "bin" path -rem in your current searching path -rem type "set path" to check -if not exist ..\locale\*.only goto updateALL - -rem put a messages_xx.only(eg messages_zh.only) into locale folder -rem this script will only touch the po file(eg zh) you specified, leaving other po files untact. - -for %%i in (..\locale\*.only) do set PO=%%~ni -echo [Notice] Yu choose to Ony update the choosen file: %PO%.po -for %%i in (..\locale\*.po) do if not %%~ni==%PO% ren %%i %%~ni.po- - -call sh --login %cd%\bmsg.sh - -for %%i in (..\locale\*.po-) do if not %%~ni==%PO% ren %%i %%~ni.po -goto end - -:updateALL -call sh --login %cd%\bmsg.sh - -:end -echo End of Message Bundling \ No newline at end of file diff --git a/apps/routerconsole/java/bundle-messages.sh b/apps/routerconsole/java/bundle-messages.sh index dd422bf064c0251f0838e7acc51a3f7d31a60b3e..1f8ecc3a4715235ae081cea4b89e4ee28f3354c4 100755 --- a/apps/routerconsole/java/bundle-messages.sh +++ b/apps/routerconsole/java/bundle-messages.sh @@ -18,6 +18,14 @@ then POUPDATE=1 fi +# on windows, one must specify the path of commnad find +# since windows has its own retarded version of find. +if which find|grep -q -i windows ; then + export PATH=.:/bin:/usr/local/bin:$PATH +fi +# Fast mode - update ondemond +# set LG2 to the language you need in envrionment varibales to enable this + # # generate strings/Countries.java from ../../../installer/resources/countries.txt # @@ -44,7 +52,9 @@ ROUTERFILES="\ ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java \ ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java \ ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java \ - ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java" + ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java \ + ../../../router/java/src/net/i2p/router/transport/UPnP.java \ + ../../../router/java/src/net/i2p/router/transport/UPnPManager.java" # add ../java/ so the refs will work in the po file JPATHS="../java/src ../jsp/WEB-INF ../java/strings $JFILE $ROUTERFILES" @@ -53,6 +63,11 @@ do # get language LG=${i#../locale/messages_} LG=${LG%.po} + + # skip, if specified + if [ $LG2 ]; then + [ $LG != $LG2 ] && continue || echo INFO: Language update is set to [$LG2] only. + fi if [ "$POUPDATE" = "1" ] then @@ -106,15 +121,19 @@ do touch $i fi - echo "Generating ${CLASS}_$LG ResourceBundle..." + if [ "$LG" != "en" ] + then + # only generate for non-source language + echo "Generating ${CLASS}_$LG ResourceBundle..." - # convert to class files in build/obj - msgfmt --java --statistics -r $CLASS -l $LG -d build/obj $i - if [ $? -ne 0 ] - then - echo 'Warning - msgfmt failed, not updating translations' - break - fi + # convert to class files in build/obj + msgfmt --java --statistics -r $CLASS -l $LG -d build/obj $i + if [ $? -ne 0 ] + then + echo 'Warning - msgfmt failed, not updating translations' + break + fi + fi done rm -f $TMPFILE # todo: return failure diff --git a/apps/routerconsole/java/src/net/i2p/router/web/CSSHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/CSSHelper.java index 013216ad3248887fa47646116ff3d366b47bc385..7f6f9455fe1e227c144a1fde73bf860e1ebc3e31 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/CSSHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/CSSHelper.java @@ -28,10 +28,13 @@ public class CSSHelper extends HelperBase { return url; } - /** change default language for the router but don't save it */ + /** change default language for the router AND save it */ public void setLang(String lang) { - if (lang != null && lang.length() > 0) + // Protected with nonce in css.jsi + if (lang != null && lang.length() == 2 && !lang.equals(_context.getProperty(Messages.PROP_LANG))) { _context.router().setConfigSetting(Messages.PROP_LANG, lang); + _context.router().saveConfig(); + } } /** needed for conditional css loads for zh */ @@ -60,4 +63,32 @@ public class CSSHelper extends HelperBase { .append("</title>"); return buf.toString(); } + + /** + * Should we allow a refreshing IFrame? + * @since 0.8.5 + */ + public boolean allowIFrame(String ua) { + return ua == null || + // text + !(ua.startsWith("Lynx") || ua.startsWith("w3m") || + ua.startsWith("ELinks") || ua.startsWith("Links") || + ua.startsWith("Dillo") || + // mobile + // http://www.zytrax.com/tech/web/mobile_ids.html + ua.contains("Android") || ua.contains("iPhone") || + ua.contains("iPod") || ua.contains("iPad") || + ua.contains("Kindle") || ua.contains("Mobile") || + ua.contains("Nintendo Wii") || ua.contains("Opera Mini") || + ua.contains("Palm") || + ua.contains("PLAYSTATION") || ua.contains("Playstation") || + ua.contains("Profile/MIDP-") || ua.contains("SymbianOS") || + ua.contains("Windows CE") || ua.contains("Windows Phone") || + ua.startsWith("BlackBerry") || ua.startsWith("DoCoMo") || + ua.startsWith("Nokia") || ua.startsWith("OPWV-SDK") || + ua.startsWith("MOT-") || ua.startsWith("SAMSUNG-") || + ua.startsWith("nook") || ua.startsWith("SCH-") || + ua.startsWith("SEC-") || ua.startsWith("SonyEricsson") || + ua.startsWith("Vodafone")); + } } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java index 4ce5c5b99ac476dc09fc332c5e953deb5e918e56..352df72eedd731fce17254b3d9f61378fc01f1ee 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java @@ -105,7 +105,9 @@ public class ConfigClientsHelper extends HelperBase { for (int cur = 0; cur < clients.size(); cur++) { ClientAppConfig ca = clients.get(cur); renderForm(buf, ""+cur, ca.clientName, false, !ca.disabled, - "webConsole".equals(ca.clientName) || "Web console".equals(ca.clientName), + // dangerous, but allow editing the console args too + //"webConsole".equals(ca.clientName) || "Web console".equals(ca.clientName), + false, ca.className + ((ca.args != null) ? " " + ca.args : ""), (""+cur).equals(_edit), true, false, false, true, ca.disabled); } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHelper.java index 9388d06d2a45fc2ed5669b755d5f91e8ce9197fc..6dd3aa987ada615be2a89376107b6fe631e41f79 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHelper.java @@ -100,7 +100,7 @@ public class ConfigNetHelper extends HelperBase { } public String getTcpAutoIPChecked(int mode) { - boolean enabled = TransportManager.enableNTCP(_context); + boolean enabled = TransportManager.isNTCPEnabled(_context); String hostname = _context.getProperty(PROP_I2NP_NTCP_HOSTNAME); boolean specified = hostname != null && hostname.length() > 0; String auto = _context.getProperty(PROP_I2NP_NTCP_AUTO_IP, "false"); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigReseedHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigReseedHelper.java index ec5337cc5138d03ec8e0d86f2520a0cce0a40684..249f5de59bb1a981bb0e3820ee7f5868138c73a7 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigReseedHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigReseedHelper.java @@ -22,7 +22,7 @@ public class ConfigReseedHelper extends HelperBase { public String modeChecked(int mode) { boolean required = _context.getBooleanProperty(Reseeder.PROP_SSL_REQUIRED); - boolean disabled = _context.getBooleanProperty(Reseeder.PROP_SSL_DISABLE); + boolean disabled = _context.getBooleanPropertyDefaultTrue(Reseeder.PROP_SSL_DISABLE); if ((mode == 0 && (!disabled) && (!required)) || (mode == 1 && (!disabled) && required) || (mode == 2 && disabled)) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigServiceHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigServiceHandler.java index ce4dc8863d6e3f80526488bc3aa2b55b7a45e591..7b1d7bc629be1ed2a2405bfedacb94010b44285a 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigServiceHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigServiceHandler.java @@ -88,30 +88,6 @@ public class ConfigServiceHandler extends FormHandler { addFormError("Warning: unable to contact the service manager - " + t.getMessage()); } addFormNotice("Threads dumped to wrapper.log"); - } else if (_("Show systray icon").equals(_action)) { - try { - SysTray tray = SysTray.getInstance(); - if (tray != null) { - tray.show(); - addFormNotice(_("System tray icon enabled.")); - } else { - addFormNotice(_("System tray icon feature not supported on this platform. Sorry!")); - } - } catch (Throwable t) { - addFormError(_("Warning: unable to contact the systray manager") + " - " + t.getMessage()); - } - } else if (_("Hide systray icon").equals(_action)) { - try { - SysTray tray = SysTray.getInstance(); - if (tray != null) { - tray.hide(); - addFormNotice(_("System tray icon disabled.")); - } else { - addFormNotice(_("System tray icon feature not supported on this platform. Sorry!")); - } - } catch (Throwable t) { - addFormError(_("Warning: unable to contact the systray manager") + " - " + t.getMessage()); - } } else if (_("View console on startup").equals(_action)) { browseOnStartup(true); addFormNotice(_("Console is to be shown on startup")); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigTunnelsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigTunnelsHelper.java index d3579f17c56be33ef7f4a85ae8538c0933c6ac84..419725ee4241f6ca58456d8b786f042f02b9df71 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigTunnelsHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigTunnelsHelper.java @@ -18,17 +18,24 @@ public class ConfigTunnelsHelper extends HelperBase { public String getForm() { StringBuilder buf = new StringBuilder(1024); + // HTML: <input> cannot be inside a <table> + buf.append("<input type=\"hidden\" name=\"pool.0\" value=\"exploratory\" >\n"); + int cur = 1; + Set<Destination> clients = _context.clientManager().listClients(); + for (Destination dest : clients) { + buf.append("<input type=\"hidden\" name=\"pool.").append(cur).append("\" value=\""); + buf.append(dest.calculateHash().toBase64()).append("\" >\n"); + cur++; + } + buf.append("<table>\n"); TunnelPoolSettings exploratoryIn = _context.tunnelManager().getInboundSettings(); TunnelPoolSettings exploratoryOut = _context.tunnelManager().getOutboundSettings(); - buf.append("<input type=\"hidden\" name=\"pool.0\" value=\"exploratory\" >"); renderForm(buf, 0, "exploratory", _("Exploratory tunnels"), exploratoryIn, exploratoryOut); - int cur = 1; - Set clients = _context.clientManager().listClients(); - for (Iterator iter = clients.iterator(); iter.hasNext(); ) { - Destination dest = (Destination)iter.next(); + cur = 1; + for (Destination dest : clients) { TunnelPoolSettings in = _context.tunnelManager().getInboundSettings(dest.calculateHash()); TunnelPoolSettings out = _context.tunnelManager().getOutboundSettings(dest.calculateHash()); @@ -41,9 +48,7 @@ public class ConfigTunnelsHelper extends HelperBase { name = dest.calculateHash().toBase64().substring(0,6); String prefix = dest.calculateHash().toBase64().substring(0,4); - buf.append("<input type=\"hidden\" name=\"pool.").append(cur).append("\" value=\""); - buf.append(dest.calculateHash().toBase64()).append("\" >"); - renderForm(buf, cur, prefix, _("Client tunnels for") + " " + _(name), in, out); + renderForm(buf, cur, prefix, _("Client tunnels for {0}", _(name)), in, out); cur++; } @@ -191,12 +196,16 @@ public class ConfigTunnelsHelper extends HelperBase { // buf.append("<tr><td colspan=\"3\"><br></td></tr>\n"); } + /** to fool xgettext so the following isn't tagged */ + private static final String DUMMY1 = "1 "; + private static final String DUMMY2 = "{0} "; + private void renderOptions(StringBuilder buf, int min, int max, int now, String prefix, String name) { for (int i = min; i <= max; i++) { buf.append("<option value=\"").append(i).append("\" "); if (i == now) buf.append("selected=\"true\" "); - buf.append(">").append(_(i, "1 " + name, "{0} " + name + 's')); + buf.append(">").append(ngettext(DUMMY1 + name, DUMMY2 + name + 's', i)); buf.append("</option>\n"); } } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHelper.java index 845bb66a03e378bb6233da5ddede4f72df3c3e6d..cf9a17140dac8e180bf12c9dfebf2c2c604506cd 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHelper.java @@ -46,9 +46,10 @@ public class ConfigUIHelper extends HelperBase { return rv; } - private static final String langs[] = {"de", "en", "es", "fr", "nl", "pt", "ru", "sv", "zh"}; - private static final String flags[] = {"de", "us", "es", "fr", "nl", "pt", "ru", "se", "cn"}; - private static final String xlangs[] = {_x("German"), _x("English"), _x("Spanish"),_x("French"), + private static final String langs[] = {"ar", "de", "en", "es", "fr", "nl", "pt", "ru", "sv", "zh"}; + private static final String flags[] = {"lang_ar", "de", "us", "es", "fr", "nl", "pt", "ru", "se", "cn"}; + private static final String xlangs[] = {_x("Arabic"), + _x("German"), _x("English"), _x("Spanish"),_x("French"), _x("Dutch"), _x("Portuguese"), _x("Russian"), _x("Swedish"), _x("Chinese")}; diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHandler.java index 8a525180bc384930124b543760117d26346ba7f4..47f9eb242c5eb0223232b0fe4605a760b30480d3 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHandler.java @@ -50,12 +50,14 @@ public class ConfigUpdateHandler extends FormHandler { */ private static final String PACK200_URLS = "http://echelon.i2p/i2p/i2pupdate.su2\r\n" + + "http://inr.i2p/i2p/i2pupdate.su2\r\n" + "http://stats.i2p/i2p/i2pupdate.su2\r\n" + "http://www.i2p2.i2p/_static/i2pupdate.su2\r\n" + "http://update.postman.i2p/i2pupdate.su2" ; private static final String NO_PACK200_URLS = "http://echelon.i2p/i2p/i2pupdate.sud\r\n" + + "http://inr.i2p/i2p/i2pupdate.sud\r\n" + "http://stats.i2p/i2p/i2pupdate.sud\r\n" + "http://www.i2p2.i2p/_static/i2pupdate.sud\r\n" + "http://update.postman.i2p/i2pupdate.sud" ; diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHelper.java index 2e03ad93f8bf2942331ed700a758c5c41c9f530b..10b587db67f19a0356d4f6ae677a1f13de128a8a 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHelper.java @@ -82,7 +82,7 @@ public class ConfigUpdateHelper extends HelperBase { for (int i = 0; i < PERIODS.length; i++) { buf.append("<option value=\"").append(PERIODS[i]); if (PERIODS[i] == ms) - buf.append("\" selected=\"true\""); + buf.append("\" selected=\"true"); if (PERIODS[i] == -1) buf.append("\">" + _("Never") + "</option>\n"); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ContentHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ContentHelper.java index f9fe7377c8af70802227bfef3d9a77f690f239f4..b56108be389334f60af91d52016b17b6cc3c5d5c 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ContentHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ContentHelper.java @@ -18,7 +18,28 @@ public class ContentHelper extends HelperBase { public void setStartAtBeginning(String moo) { _startAtBeginning = Boolean.valueOf(""+moo).booleanValue(); } - public void setLang(String l) { _lang = l; } + public void setLang(String l) { +/***** + if((_lang == null || !_lang.equals(l)) && (l != null)) { + //Set language for router console + _lang = l; + TODO - Temporary for 0.8.4 + Needed for desktopgui. But there's no nonce protection. + Move the following to CSSHelper setLang(), or disable completely, + See comments in CSSHelper + if(_context == null) { + setContextId(null); + } + + if (_context.getBooleanProperty("desktopgui.enabled")) { + //Set language persistently throughout I2P + _context.router().setConfigSetting(Messages.PROP_LANG, _lang); + _context.router().saveConfig(); + _context.setProperty(Messages.PROP_LANG, _lang); + } + } +*****/ + } public void setMaxLines(String lines) { if (lines != null) { diff --git a/apps/routerconsole/java/src/net/i2p/router/web/FormHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/FormHandler.java index 71089ce7358c921f15d82981a27e41691d07a667..2f16cd359bc8d5e4f82aacc4689735c1814b0722 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/FormHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/FormHandler.java @@ -26,6 +26,8 @@ public class FormHandler { private final List<String> _notices; private boolean _processed; private boolean _valid; + private static final String NONCE_SUFFIX = ".nonce"; + private static final String PREV_SUFFIX = "Prev"; public FormHandler() { _errors = new ArrayList(); @@ -93,18 +95,18 @@ public class FormHandler { if (_errors.isEmpty() && _notices.isEmpty()) return ""; StringBuilder buf = new StringBuilder(512); - buf.append("<div class=\"messages\" id=\"messages\"><p>"); + buf.append("<div class=\"messages\" id=\"messages\">"); if (!_errors.isEmpty()) { - buf.append("<span class=\"error\">"); + buf.append("<div class=\"error\">"); buf.append(render(_errors)); - buf.append("</span>"); + buf.append("</div>"); } if (!_notices.isEmpty()) { - buf.append("<span class=\"notice\">"); + buf.append("<div class=\"notice\">"); buf.append(render(_notices)); - buf.append("</span>"); + buf.append("</div>"); } - buf.append("</p></div>"); + buf.append("</div>"); return buf.toString(); } @@ -162,8 +164,8 @@ public class FormHandler { return; } - String nonce = System.getProperty(getClass().getName() + ".nonce"); - String noncePrev = System.getProperty(getClass().getName() + ".noncePrev"); + String nonce = System.getProperty(getClass().getName() + NONCE_SUFFIX); + String noncePrev = nonce + PREV_SUFFIX; if ( ( (nonce == null) || (!_nonce.equals(nonce)) ) && ( (noncePrev == null) || (!_nonce.equals(noncePrev)) ) ) { @@ -201,6 +203,22 @@ public class FormHandler { } } + /** + * Generate a new nonce, store old and new in the system properties. + * Only call once per page! + * @return a new random long as a String + * @since 0.8.5 + */ + public String getNewNonce() { + String prop = getClass().getName() + NONCE_SUFFIX; + String prev = System.getProperty(prop); + if (prev != null) + System.setProperty(prop + PREV_SUFFIX, prev); + String rv = Long.toString(_context.random().nextLong()); + System.setProperty(prop, rv); + return rv; + } + /** translate a string */ public String _(String s) { return Messages.getString(s, _context); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/HelperBase.java b/apps/routerconsole/java/src/net/i2p/router/web/HelperBase.java index 8ceec1098b1a2acf44debf7b8cdfb94f66c51583..2bee07833bdc12b18c893aa782dd3aa6a2b3c565 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/HelperBase.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/HelperBase.java @@ -63,7 +63,7 @@ public abstract class HelperBase { } /** translate (ngettext) @since 0.7.14 */ - public String _(int n, String s, String p) { + public String ngettext(String s, String p, int n) { return Messages.getString(n, s, p, _context); } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java index 3ccd355c2dacba5784240a84013bfe2788881887..f4c42a23bf8a4a0381097fdf22fbee94a87d396c 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java @@ -53,7 +53,6 @@ public class LogsHelper extends HelperBase { boolean colorize = Boolean.valueOf(_context.getProperty("routerconsole.logs.color")).booleanValue(); StringBuilder buf = new StringBuilder(16*1024); buf.append("<ul>"); - buf.append("<code>\n"); for (int i = msgs.size(); i > 0; i--) { String msg = msgs.get(i - 1); msg = msg.replace("&", "&").replace("<", "<").replace(">", ">"); @@ -87,7 +86,7 @@ public class LogsHelper extends HelperBase { } buf.append("</li>\n"); } - buf.append("</code></ul>\n"); + buf.append("</ul>\n"); return buf.toString(); } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java index 7bd167a56fae11a9efc7804356d8801cc1abac1c..15ec901548346eff54eeb0e4727b05aabaa58f0b 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java @@ -24,7 +24,6 @@ import java.util.Properties; import java.util.Set; import java.util.TreeSet; -import net.i2p.crypto.TrustedUpdate; import net.i2p.data.DataHelper; import net.i2p.data.Destination; import net.i2p.data.Hash; @@ -174,18 +173,19 @@ public class NetDbRenderer { } if (debug) { buf.append("<p><b>Total Leasesets: " + leases.size()); - buf.append("<p><b>Published (RAP) Leasesets: " + _context.netDb().getKnownLeaseSets()); - buf.append("<p>Mod Data: " + HexDump.dump(_context.routingKeyGenerator().getModData()) + "<p>"); - buf.append("<p>Network data (only valid if floodfill):"); - buf.append("<p>Center of Key Space (router hash): " + ourRKey.toBase64() + "<p>"); + buf.append("</b></p><p><b>Published (RAP) Leasesets: " + _context.netDb().getKnownLeaseSets()); + buf.append("</b></p><p><b>Mod Data: " + HexDump.dump(_context.routingKeyGenerator().getModData())); + buf.append("</b></p><p><b>Network data (only valid if floodfill):"); + buf.append("</b></p><p><b>Center of Key Space (router hash): " + ourRKey.toBase64()); if (median != null) { double log2 = biLog2(median); - buf.append("<p>Median distance (bits): " + fmt.format(log2)); + buf.append("</b></p><p><b>Median distance (bits): " + fmt.format(log2)); // 3 for 8 floodfills... -1 for median int total = (int) Math.round(Math.pow(2, 3 + 256 - 1 - log2)); - buf.append("<p>Estimated total floodfills: " + total); - buf.append("<p>Estimated network total leasesets: " + (total * leases.size() / 8)); + buf.append("</b></p><p><b>Estimated total floodfills: " + total); + buf.append("</b></p><p><b>Estimated network total leasesets: " + (total * leases.size() / 8)); } + buf.append("</b></p>"); } out.write(buf.toString()); out.flush(); @@ -262,7 +262,9 @@ public class NetDbRenderer { } } - buf.append("<table border=\"0\" cellspacing=\"30\"><tr><th colspan=\"3\">").append(_("Network Database Router Statistics")).append("</th><tr><td>"); + buf.append("<table border=\"0\" cellspacing=\"30\"><tr><th colspan=\"3\">") + .append(_("Network Database Router Statistics")) + .append("</th></tr><tr><td style=\"vertical-align: top;\">"); // versions table List<String> versionList = new ArrayList(versions.objects()); if (!versionList.isEmpty()) { @@ -276,7 +278,7 @@ public class NetDbRenderer { } buf.append("</table>\n"); } - buf.append("</td><td>"); + buf.append("</td><td style=\"vertical-align: top;\">"); out.write(buf.toString()); buf.setLength(0); @@ -291,7 +293,7 @@ public class NetDbRenderer { } } buf.append("</table>\n"); - buf.append("</td><td>"); + buf.append("</td><td style=\"vertical-align: top;\">"); out.write(buf.toString()); buf.setLength(0); @@ -343,9 +345,9 @@ public class NetDbRenderer { } else { buf.append("<b>" + _("Peer info for") + ":</b> ").append(hash).append("\n"); if (full) { - buf.append("[<a href=\"netdb\" >Back</a>]</th></tr><td>\n"); + buf.append("[<a href=\"netdb\" >Back</a>]</th></tr><tr><td>\n"); } else { - buf.append("[<a href=\"netdb?r=").append(hash.substring(0, 6)).append("\" >").append(_("Full entry")).append("</a>]</th></tr><td>\n"); + buf.append("[<a href=\"netdb?r=").append(hash.substring(0, 6)).append("\" >").append(_("Full entry")).append("</a>]</th></tr><tr><td>\n"); } } @@ -391,9 +393,8 @@ public class NetDbRenderer { buf.append(DataHelper.stripHTML(key)).append(" = ").append(DataHelper.stripHTML(val)).append("<br>\n"); } buf.append("</code></td></tr>\n"); - } else { } - buf.append("</td></tr>\n"); + buf.append("</table>\n"); } private static final int SSU = 1; @@ -404,11 +405,10 @@ public class NetDbRenderer { /** * what transport types */ - private int classifyTransports(RouterInfo info) { + private static int classifyTransports(RouterInfo info) { int rv = 0; String hash = info.getIdentity().getHash().toBase64(); - for (Iterator iter = info.getAddresses().iterator(); iter.hasNext(); ) { - RouterAddress addr = (RouterAddress)iter.next(); + for (RouterAddress addr : info.getAddresses()) { String style = addr.getTransportStyle(); if (style.equals("NTCP")) { rv |= NTCP; diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NewsFetcher.java b/apps/routerconsole/java/src/net/i2p/router/web/NewsFetcher.java index adb2380777f90a62d60d9bae06020c52a0de291f..562c3e7cadb2d326785e7002d8b04ebe5490ad07 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/NewsFetcher.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/NewsFetcher.java @@ -3,11 +3,9 @@ package net.i2p.router.web; import java.io.File; import java.io.FileInputStream; import java.io.IOException; -import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; -import java.util.Locale; import net.i2p.I2PAppContext; import net.i2p.crypto.TrustedUpdate; @@ -15,6 +13,7 @@ import net.i2p.data.DataHelper; import net.i2p.router.Router; import net.i2p.router.RouterContext; import net.i2p.router.RouterVersion; +import net.i2p.router.util.RFC822Date; import net.i2p.util.EepGet; import net.i2p.util.EepHead; import net.i2p.util.FileUtil; @@ -73,7 +72,7 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener { if (_lastFetch == 0) _lastFetch = _lastUpdated; if (_lastModified == null) - _lastModified = to822Date(_lastFetch); + _lastModified = RFC822Date.to822Date(_lastFetch); } else { _lastUpdated = 0; _lastFetch = 0; @@ -212,7 +211,7 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener { String lastmod = get.getLastModified(); if (lastmod != null) { if (!(_context.isRouterContext())) return; - long modtime = parse822Date(lastmod); + long modtime = RFC822Date.parse822Date(lastmod); if (modtime <= 0) return; String lastUpdate = _context.getProperty(UpdateHandler.PROP_LAST_UPDATE_TIME); if (lastUpdate == null) { @@ -251,44 +250,6 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener { handler.update(); } - /** - * http://jimyjoshi.com/blog/2007/08/rfc822dateparsinginjava.html - * Apparently public domain - * Probably don't need all of these... - */ - private static final SimpleDateFormat rfc822DateFormats[] = new SimpleDateFormat[] { - new SimpleDateFormat("EEE, d MMM yy HH:mm:ss z", Locale.US), - new SimpleDateFormat("EEE, d MMM yy HH:mm z", Locale.US), - new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z", Locale.US), - new SimpleDateFormat("EEE, d MMM yyyy HH:mm z", Locale.US), - new SimpleDateFormat("d MMM yy HH:mm z", Locale.US), - new SimpleDateFormat("d MMM yy HH:mm:ss z", Locale.US), - new SimpleDateFormat("d MMM yyyy HH:mm z", Locale.US), - new SimpleDateFormat("d MMM yyyy HH:mm:ss z", Locale.US) - }; - - /** - * new Date(String foo) is deprecated, so let's do this the hard way - * - * @param s non-null - * @return -1 on failure - */ - public static long parse822Date(String s) { - for (int i = 0; i < rfc822DateFormats.length; i++) { - try { - Date date = rfc822DateFormats[i].parse(s); - if (date != null) - return date.getTime(); - } catch (ParseException pe) {} - } - return -1; - } - - /** @since 0.8.2 */ - private static String to822Date(long t) { - return (new SimpleDateFormat("d MMM yyyy HH:mm:ss z", Locale.US)).format(new Date(t)); - } - private static final String VERSION_STRING = "version=\"" + RouterVersion.VERSION + "\""; private static final String VERSION_PREFIX = "version=\""; private void checkForUpdates() { diff --git a/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java b/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java index 9e0a0c95128c8e0e9c9c10a566db5866df2756b6..d1835a32065f46168517b8eec9ec6cd46e0efc4b 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java @@ -95,7 +95,8 @@ public class PluginStarter implements Runnable { log.error("Cannot start nonexistent plugin: " + appName); return false; } - //log.error("Starting plugin: " + appName); + if (log.shouldLog(Log.INFO)) + log.info("Starting plugin: " + appName); // register themes File dir = new File(pluginDir, "console/themes"); @@ -139,7 +140,8 @@ public class PluginStarter implements Runnable { } String enabled = props.getProperty(RouterConsoleRunner.PREFIX + warName + ENABLED); if (! "false".equals(enabled)) { - //log.error("Starting webapp: " + warName); + if (log.shouldLog(Log.INFO)) + log.info("Starting webapp: " + warName); String path = new File(webappDir, fileNames[i]).getCanonicalPath(); WebAppStarter.startWebApp(ctx, server, warName, path); pluginWars.get(appName).add(warName); @@ -149,6 +151,8 @@ public class PluginStarter implements Runnable { } } } + } else { + log.error("No console web server to start plugins?"); } // add translation jars in console/locale diff --git a/apps/routerconsole/java/src/net/i2p/router/web/PluginUpdateHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/PluginUpdateHandler.java index 59d729ae7e9b01dd3ce6989fda16d0ff963bbdda..884a20bb5fcbf1dbd92871b41a59747310f77a3f 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/PluginUpdateHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/PluginUpdateHandler.java @@ -144,6 +144,7 @@ public class PluginUpdateHandler extends UpdateHandler { } buf.append(": "); buf.append(_("{0}B transferred", DataHelper.formatSize2(currentWrite + alreadyTransferred))); + buf.append("</b>"); updateStatus(buf.toString()); } @@ -212,10 +213,15 @@ public class PluginUpdateHandler extends UpdateHandler { if (up.haveKey(pubkey)) { // the key is already in the TrustedUpdate keyring // verify the sig and verify that it is signed by the signer in the plugin.config file + // Allow "" as the previously-known signer String signingKeyName = up.verifyAndGetSigner(f); - if (!signer.equals(signingKeyName)) { + if (!(signer.equals(signingKeyName) || "".equals(signingKeyName))) { f.delete(); to.delete(); + if (signingKeyName == null) + _log.error("Failed to verify plugin signature, corrupt plugin or bad signature, signed by: " + signer); + else + _log.error("Plugin signer \"" + signer + "\" does not match existing signer in plugin.config file \"" + signingKeyName + "\""); statusDone("<b>" + _("Plugin signature verification of {0} failed", url) + "</b>"); return; } @@ -225,6 +231,7 @@ public class PluginUpdateHandler extends UpdateHandler { // bad or duplicate key f.delete(); to.delete(); + _log.error("Bad key or key mismatch - Failed to add plugin key \"" + pubkey + "\" for plugin signer \"" + signer + "\""); statusDone("<b>" + _("Plugin signature verification of {0} failed", url) + "</b>"); return; } @@ -234,6 +241,11 @@ public class PluginUpdateHandler extends UpdateHandler { if (!signer.equals(signingKeyName)) { f.delete(); to.delete(); + if (signingKeyName == null) + _log.error("Failed to verify plugin signature, corrupt plugin or bad signature, signed by: " + signer); + else + // shouldn't happen + _log.error("Plugin signer \"" + signer + "\" does not match new signer in plugin.config file \"" + signingKeyName + "\""); statusDone("<b>" + _("Plugin signature verification of {0} failed", url) + "</b>"); return; } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ProfileOrganizerRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/ProfileOrganizerRenderer.java index f452df2ba85f4700d268bb7fd7d97e77b0e7116b..d83720d07901c172ca9c92165e8862888d92eeca 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ProfileOrganizerRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ProfileOrganizerRenderer.java @@ -70,11 +70,11 @@ class ProfileOrganizerRenderer { int failing = 0; StringBuilder buf = new StringBuilder(16*1024); buf.append("<h2>").append(_("Peer Profiles")).append("</h2>\n<p>"); - buf.append(_("Showing {0} recent profiles.", order.size())).append('\n'); + buf.append(ngettext("Showing 1 recent profile.", "Showing {0} recent profiles.", order.size())).append('\n'); if (older > 0) - buf.append(_("Hiding {0} older profiles.", older)).append('\n'); + buf.append(ngettext("Hiding 1 older profile.", "Hiding {0} older profiles.", older)).append('\n'); if (standard > 0) - buf.append("<a href=\"/profiles?f=1\">").append(_("Hiding {0} standard profiles.", standard)).append("</a>\n"); + buf.append("<a href=\"/profiles?f=1\">").append(ngettext("Hiding 1 standard profile.", "Hiding {0} standard profiles.", standard)).append("</a>\n"); buf.append("</p>"); buf.append("<table>"); buf.append("<tr>"); @@ -171,8 +171,10 @@ class ProfileOrganizerRenderer { buf.append(' ').append(fails).append('/').append(total).append(' ').append(_("Test Fails")); } buf.append(" </td>"); - buf.append("<td nowrap align=\"center\"><a target=\"_blank\" href=\"dumpprofile.jsp?peer=") - .append(peer.toBase64().substring(0,6)).append("\">").append(_("profile")).append("</a>"); + //buf.append("<td nowrap align=\"center\"><a target=\"_blank\" href=\"dumpprofile.jsp?peer=") + // .append(peer.toBase64().substring(0,6)).append("\">").append(_("profile")).append("</a>"); + buf.append("<td nowrap align=\"center\"><a href=\"viewprofile?peer=") + .append(peer.toBase64()).append("\">").append(_("profile")).append("</a>"); buf.append(" <a href=\"configpeer?peer=").append(peer.toBase64()).append("\">+-</a></td>\n"); buf.append("</tr>"); // let's not build the whole page in memory (~500 bytes per peer) @@ -213,7 +215,6 @@ class ProfileOrganizerRenderer { buf.append("<td align=\"center\">").append(DataHelper.stripHTML(info.getCapabilities())).append("</td>"); else buf.append("<td> </td>"); - buf.append("</code></td>"); buf.append("<td align=\"right\">").append(num(prof.getIntegrationValue())).append("</td>"); long time; time = now - prof.getLastHeardAbout(); @@ -261,7 +262,7 @@ class ProfileOrganizerRenderer { buf.append("<li><b>").append(_("capacity")).append("</b>: ").append(_("how many tunnels can we ask them to join in an hour?")).append("</li>"); buf.append("<li><b>").append(_("integration")).append("</b>: ").append(_("how many new peers have they told us about lately?")).append("</li>"); buf.append("<li><b>").append(_("status")).append("</b>: ").append(_("is the peer banned, or unreachable, or failing tunnel tests?")).append("</li>"); - buf.append("</ul></i>"); + buf.append("</ul>"); out.write(buf.toString()); out.flush(); } @@ -360,4 +361,10 @@ class ProfileOrganizerRenderer { private String _(String s, Object o) { return Messages.getString(s, o, _context); } + + /** translate (ngettext) @since 0.8.5 */ + public String ngettext(String s, String p, int n) { + return Messages.getString(n, s, p, _context); + } + } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java b/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java index d3b6ecc29fde763994072b39c2bf0358fe2eaf89..be46bdca0c477a34b75b9f4acd2a43cff6b90c0b 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java @@ -1,6 +1,7 @@ package net.i2p.router.web; import java.util.ArrayList; +import java.awt.GraphicsEnvironment; import java.io.File; import java.io.FilenameFilter; import java.io.IOException; @@ -13,17 +14,20 @@ import net.i2p.I2PAppContext; import net.i2p.apps.systray.SysTray; import net.i2p.data.Base32; import net.i2p.data.DataHelper; +import net.i2p.desktopgui.Main; import net.i2p.router.RouterContext; import net.i2p.util.FileUtil; import net.i2p.util.I2PAppThread; import net.i2p.util.SecureDirectory; import net.i2p.util.SecureFileOutputStream; import net.i2p.util.ShellCommand; +import net.i2p.util.VersionComparator; import org.mortbay.http.DigestAuthenticator; import org.mortbay.http.HashUserRealm; import org.mortbay.http.NCSARequestLog; import org.mortbay.http.SecurityConstraint; +import org.mortbay.http.SocketListener; import org.mortbay.http.SslListener; import org.mortbay.http.handler.SecurityHandler; import org.mortbay.jetty.Server; @@ -55,7 +59,6 @@ public class RouterConsoleRunner { static { System.setProperty("org.mortbay.http.Version.paranoid", "true"); - System.setProperty("java.awt.headless", "true"); } /** @@ -126,10 +129,34 @@ public class RouterConsoleRunner { } public static void main(String args[]) { + startTrayApp(); RouterConsoleRunner runner = new RouterConsoleRunner(args); runner.startConsole(); } + private static void startTrayApp() { + try { + //TODO: move away from routerconsole into a separate application. + //ApplicationManager? + VersionComparator v = new VersionComparator(); + boolean recentJava = v.compare(System.getProperty("java.runtime.version"), "1.6") >= 0; + // default false for now + boolean desktopguiEnabled = I2PAppContext.getGlobalContext().getBooleanProperty("desktopgui.enabled"); + if (recentJava && desktopguiEnabled) { + //Check if we are in a headless environment, set properties accordingly + System.setProperty("java.awt.headless", Boolean.toString(GraphicsEnvironment.isHeadless())); + String[] args = new String[0]; + net.i2p.desktopgui.Main.beginStartup(args); + } else { + // required true for jrobin to work + System.setProperty("java.awt.headless", "true"); + SysTray.getInstance(); + } + } catch (Throwable t) { + t.printStackTrace(); + } + } + public void startConsole() { File workDir = new SecureDirectory(I2PAppContext.getGlobalContext().getTempDir(), "jetty-work"); boolean workDirRemoved = FileUtil.rmdir(workDir, false); @@ -184,11 +211,21 @@ public class RouterConsoleRunner { while (tok.hasMoreTokens()) { String host = tok.nextToken().trim(); try { - if (host.indexOf(":") >= 0) // IPV6 - requires patched Jetty 5 - _server.addListener('[' + host + "]:" + _listenPort); - else - _server.addListener(host + ':' + _listenPort); + //if (host.indexOf(":") >= 0) // IPV6 - requires patched Jetty 5 + // _server.addListener('[' + host + "]:" + _listenPort); + //else + // _server.addListener(host + ':' + _listenPort); + Integer lport = Integer.parseInt(_listenPort); + InetAddrPort iap = new InetAddrPort(host, lport); + SocketListener lsnr = new SocketListener(iap); + lsnr.setMinThreads(1); // default 2 + lsnr.setMaxThreads(24); // default 256 + lsnr.setMaxIdleTimeMs(90*1000); // default 10 sec + lsnr.setName("ConsoleSocket"); // all with same name will use the same thread pool + _server.addListener(lsnr); boundAddresses++; + } catch (NumberFormatException nfe) { + System.err.println("Unable to bind routerconsole to " + host + " port " + _listenPort + ' ' + nfe); } catch (IOException ioe) { // this doesn't seem to work, exceptions don't happen until start() below System.err.println("Unable to bind routerconsole to " + host + " port " + _listenPort + ' ' + ioe); } @@ -220,6 +257,10 @@ public class RouterConsoleRunner { ssll.setPassword(ctx.getProperty(PROP_KEYSTORE_PASSWORD, DEFAULT_KEYSTORE_PASSWORD)); // the X.509 cert password (if not present, verifyKeyStore() returned false) ssll.setKeyPassword(ctx.getProperty(PROP_KEY_PASSWORD, "thisWontWork")); + ssll.setMinThreads(1); // default 2 + ssll.setMaxThreads(24); // default 256 + ssll.setMaxIdleTimeMs(90*1000); // default 10 sec + ssll.setName("ConsoleSocket"); // all with same name will use the same thread pool _server.addListener(ssll); boundAddresses++; } catch (Exception e) { // probably no exceptions at this point @@ -300,12 +341,6 @@ public class RouterConsoleRunner { } } - try { - SysTray tray = SysTray.getInstance(); - } catch (Throwable t) { - t.printStackTrace(); - } - NewsFetcher fetcher = NewsFetcher.getInstance(I2PAppContext.getGlobalContext()); Thread t = new I2PAppThread(fetcher, "NewsFetcher", true); t.start(); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ShitlistRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/ShitlistRenderer.java index 12c6678728b957a5accf86fc2aacbfd8e00d5b1c..967981130516b5154cf88c5cb1a946d41dcce8f5 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ShitlistRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ShitlistRenderer.java @@ -43,6 +43,11 @@ public class ShitlistRenderer { Map<Hash, Shitlist.Entry> entries = new TreeMap(new HashComparator()); entries.putAll(_context.shitlist().getEntries()); + if (entries.isEmpty()) { + buf.append("<i>").append(_("none")).append("</i>"); + out.write(buf.toString()); + return; + } buf.append("<ul>"); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/StatHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/StatHelper.java index 2b7e81fb41e63a59568a7bee4535fced155351c4..6cfc7bdcfca198f97ca0ee07013c7f70aef05c91 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/StatHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/StatHelper.java @@ -1,37 +1,73 @@ package net.i2p.router.web; -import java.util.Iterator; +import java.io.IOException; import java.util.Set; +import net.i2p.data.DataFormatException; import net.i2p.data.Hash; -import net.i2p.router.RouterContext; /** - * uuuugly. dump the peer profile data if given a peer. + * Dump the peer profile data if given a full B64 peer string or prefix. * */ public class StatHelper extends HelperBase { private String _peer; + /** + * Caller should strip HTML (XSS) + */ public void setPeer(String peer) { _peer = peer; } + /** + * Look up based on a b64 prefix or full b64. + * Prefix is inefficient. + */ public String getProfile() { - RouterContext ctx = (RouterContext)net.i2p.router.RouterContext.listContexts().get(0); - Set peers = ctx.profileOrganizer().selectAllPeers(); - for (Iterator iter = peers.iterator(); iter.hasNext(); ) { - Hash peer = (Hash)iter.next(); + if (_peer == null || _peer.length() <= 0) + return "No peer specified"; + if (_peer.length() >= 44) + return outputProfile(); + Set<Hash> peers = _context.profileOrganizer().selectAllPeers(); + for (Hash peer : peers) { if (peer.toBase64().startsWith(_peer)) { - try { - WriterOutputStream wos = new WriterOutputStream(_out); - ctx.profileOrganizer().exportProfile(peer, wos); - wos.flush(); - _out.flush(); - return ""; - } catch (Exception e) { - e.printStackTrace(); - } + return dumpProfile(peer); } } - return "Unknown"; + return "Unknown peer " + _peer; + } + + /** + * Look up based on the full b64 - efficient + * @since 0.8.5 + */ + private String outputProfile() { + Hash peer = new Hash(); + try { + peer.fromBase64(_peer); + return dumpProfile(peer); + } catch (DataFormatException dfe) { + return "Bad peer hash " + _peer; + } + } + + /** + * dump the profile + * @since 0.8.5 + */ + private String dumpProfile(Hash peer) { + try { + WriterOutputStream wos = new WriterOutputStream(_out); + boolean success = _context.profileOrganizer().exportProfile(peer, wos); + if (success) { + wos.flush(); + _out.flush(); + return ""; + } else { + return "Unknown peer " + _peer; + } + } catch (IOException e) { + e.printStackTrace(); + return "IO Error " + e; + } } } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/StatsGenerator.java b/apps/routerconsole/java/src/net/i2p/router/web/StatsGenerator.java index 6b6a8b616368105796439cb8b9edd3db252b661b..cd39b4a25d3aa974e3c5a92ae0b03638d18aae4a 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/StatsGenerator.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/StatsGenerator.java @@ -93,6 +93,7 @@ public class StatsGenerator { } out.write("</ul><br>\n"); } + out.write("</div>"); out.flush(); } @@ -140,7 +141,7 @@ public class StatsGenerator { buf.append("<li><b>").append(_("Lifetime average frequency")).append(":</b> "); buf.append(DataHelper.formatDuration2(freq.getFrequency())); buf.append(" ("); - buf.append(ngettext((int) freq.getEventCount(), "1 event", "{0} events")); + buf.append(ngettext("1 event", "{0} events", (int) freq.getEventCount())); buf.append(")</li></ul><br>\n"); } @@ -167,7 +168,7 @@ public class StatsGenerator { buf.append("<li>"); renderPeriod(buf, periods[i], _("rate")); if (curRate.getLastEventCount() > 0) { - buf.append(_("Average")).append(":</i> "); + buf.append(_("Average")).append(": "); buf.append(num(curRate.getAverageValue())); buf.append("; "); buf.append(_("Highest average")); @@ -197,9 +198,9 @@ public class StatsGenerator { buf.append("; "); } - buf.append(ngettext((int) curRate.getLastEventCount(), "There was 1 event", "There were {0} events")); + buf.append(ngettext("There was 1 event in this period.", "There were {0} events in this period.", (int)curRate.getLastEventCount())); buf.append(' '); - buf.append(_("in this period which ended {0} ago.", DataHelper.formatDuration2(now - curRate.getLastCoalesceDate()))); + buf.append(_("The period ended {0} ago.", DataHelper.formatDuration2(now - curRate.getLastCoalesceDate()))); } else { buf.append(" <i>").append(_("No events")).append("</i> "); } @@ -230,7 +231,7 @@ public class StatsGenerator { buf.append("<li><b>").append(_("Lifetime average value")).append(":</b> "); buf.append(num(rate.getLifetimeAverageValue())); buf.append(" ("); - buf.append(ngettext((int) rate.getLifetimeEventCount(), "1 event", "{0} events")); + buf.append(ngettext("1 event", "{0} events", (int) rate.getLifetimeEventCount())); buf.append(")<br></li>" + "</ul>" + "<br>\n"); @@ -261,7 +262,7 @@ public class StatsGenerator { } /** translate a string */ - private String ngettext(int n, String s, String p) { + private String ngettext(String s, String p, int n) { return Messages.getString(n, s, p, _context); } } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java index 55c7b009c5cc9ee657be9cadaecf2a8044276abc..e21102c7f7a3e5ef3c60e67a758e168dae95039e 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java @@ -224,25 +224,21 @@ 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("<p><form action=\"").append(uri).append("\" method=\"POST\">\n"); + buf.append("<form action=\"").append(uri).append("\" method=\"POST\">\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\" >") - .append(_("Download")) - .append(' ') - .append(_helper.getUpdateVersion()) - .append(' ') - .append(_("Update")) - .append("</button>\n"); + // Note to translators: parameter is a version, e.g. "0.8.4" + .append(_("Download {0} Update", _helper.getUpdateVersion())) + .append("</button><br>\n"); } if (_helper.unsignedUpdateAvailable()) { buf.append("<button type=\"submit\" name=\"updateAction\" value=\"Unsigned\" >") - .append(_("Download Unsigned")) - .append("<br>") - .append(_("Update")) - .append(' ') - .append(_helper.getUnsignedUpdateVersion()) - .append("</button>\n"); + // Note to translators: parameter is a date and time, e.g. "02-Mar 20:34 UTC" + // <br> is optional, to help the browser make the lines even in the button + // If the translation is shorter than the English, you should probably not include <br> + .append(_("Download Unsigned<br>Update {0}", _helper.getUnsignedUpdateVersion())) + .append("</button><br>\n"); } buf.append("</form>\n"); } @@ -251,10 +247,9 @@ public class SummaryBarRenderer { - buf.append("<p>") - .append(ConfigRestartBean.renderStatus(_helper.getRequestURI(), _helper.getAction(), _helper.getConsoleNonce())) + buf.append(ConfigRestartBean.renderStatus(_helper.getRequestURI(), _helper.getAction(), _helper.getConsoleNonce())) - .append("</p><hr><h3><a href=\"/peers\" target=\"_top\" title=\"") + .append("<hr><h3><a href=\"/peers\" target=\"_top\" title=\"") .append(_("Show all current peer connections")) .append("\">") .append(_("Peers")) @@ -456,4 +451,9 @@ public class SummaryBarRenderer { private String _(String s) { return Messages.getString(s, _context); } + + /** translate a string with a parameter */ + private String _(String s, Object o) { + return Messages.getString(s, o, _context); + } } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java index 7783bf8110460c423170ec291323751bdcf82694..e1c1b8d26840da69e7617b4f18ff9fb1a94f3327 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java @@ -384,7 +384,7 @@ public class SummaryHelper extends HelperBase { buf.append("client.png\" alt=\"Client\" title=\"" + _("Client") + "\">"); buf.append("</td><td align=\"left\"><b><a href=\"tunnels#").append(h.toBase64().substring(0,4)); buf.append("\" target=\"_top\" title=\"" + _("Show tunnels") + "\">"); - if (name.length() < 16) + if (name.length() < 18) buf.append(name); else buf.append(name.substring(0,15)).append("…"); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/UnsignedUpdateHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/UnsignedUpdateHandler.java index 8fcbd65c0ba3ce6344a56416a94a8c019f17491a..5a52ee883a3b6456278d61985097d4d23140414b 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/UnsignedUpdateHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/UnsignedUpdateHandler.java @@ -4,6 +4,7 @@ import java.io.File; import net.i2p.router.Router; import net.i2p.router.RouterContext; +import net.i2p.router.util.RFC822Date; import net.i2p.util.EepGet; import net.i2p.util.FileUtil; import net.i2p.util.I2PAppThread; @@ -101,7 +102,7 @@ public class UnsignedUpdateHandler extends UpdateHandler { String lastmod = _get.getLastModified(); long modtime = 0; if (lastmod != null) - modtime = NewsFetcher.parse822Date(lastmod); + modtime = RFC822Date.parse822Date(lastmod); if (modtime <= 0) modtime = _context.clock().now(); _context.router().setConfigSetting(PROP_LAST_UPDATE_TIME, "" + modtime); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java index 174704ba6774f976ec51b3b26d841c7c0fd60144..423b9e52ad20cbeb2d9ac234ed518f5f94d96ef7 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java @@ -15,6 +15,7 @@ import net.i2p.data.DataHelper; import net.i2p.router.Router; import net.i2p.router.RouterContext; import net.i2p.router.RouterVersion; +import net.i2p.router.util.RFC822Date; import net.i2p.util.EepGet; import net.i2p.util.I2PAppThread; import net.i2p.util.Log; @@ -271,7 +272,7 @@ public class UpdateHandler { String lastmod = _get.getLastModified(); long modtime = 0; if (lastmod != null) - modtime = NewsFetcher.parse822Date(lastmod); + modtime = RFC822Date.parse822Date(lastmod); if (modtime <= 0) modtime = _context.clock().now(); _context.router().setConfigSetting(PROP_LAST_UPDATE_TIME, "" + modtime); diff --git a/apps/routerconsole/jsp/config.jsp b/apps/routerconsole/jsp/config.jsp index 74f1bf4656eacd21986d6067023659e79b6f8578..df605ba1de761988ac48739ab895bdec6ff2a3ef 100644 --- a/apps/routerconsole/jsp/config.jsp +++ b/apps/routerconsole/jsp/config.jsp @@ -22,10 +22,7 @@ <jsp:getProperty name="formhandler" property="allMessages" /> <div class="configure"> <form action="" method="POST"> - <% String prev = System.getProperty("net.i2p.router.web.ConfigNetHandler.nonce"); - if (prev != null) System.setProperty("net.i2p.router.web.ConfigNetHandler.noncePrev", prev); - System.setProperty("net.i2p.router.web.ConfigNetHandler.nonce", new java.util.Random().nextLong()+""); %> - <input type="hidden" name="nonce" value="<%=System.getProperty("net.i2p.router.web.ConfigNetHandler.nonce")%>" > + <input type="hidden" name="nonce" value="<jsp:getProperty name="formhandler" property="newNonce" />" > <input type="hidden" name="action" value="blah" > <h3><%=intl._("Bandwidth limiter")%></h3><p> <b><%=intl._("I2P will work best if you configure your rates to match the speed of your internet connection.")%></b> @@ -168,7 +165,7 @@ <input type="radio" class="optbox" name="ntcpAutoPort" value="1" <%=nethelper.getTcpAutoPortChecked(1) %> > <%=intl._("Specify Port")%>: <input name ="ntcpport" type="text" size="5" maxlength="5" value="<jsp:getProperty name="nethelper" property="ntcpport" />" ><br> - </p><p><b><%=intl._("Note")%>: <%=intl._("Changing these settings will restart your router.")%></b></p> + </p><p><b><%=intl._("Notes")%>: <%=intl._("a) Do not reveal your port numbers to anyone! b) Changing these settings will restart your router.")%></b></p> <hr><div class="formaction"> <input type="reset" value="<%=intl._("Cancel")%>" > <input type="submit" name="save" value="<%=intl._("Save changes")%>" > diff --git a/apps/routerconsole/jsp/configadvanced.jsp b/apps/routerconsole/jsp/configadvanced.jsp index a327c02909843c0c998c3168e1b5c28b2afeda2a..9acfd65ec13fe439bc5234bc2da5d724492dd326 100644 --- a/apps/routerconsole/jsp/configadvanced.jsp +++ b/apps/routerconsole/jsp/configadvanced.jsp @@ -25,10 +25,7 @@ <div class="configure"> <div class="wideload"> <form action="" method="POST"> - <% String prev = System.getProperty("net.i2p.router.web.ConfigAdvancedHandler.nonce"); - if (prev != null) System.setProperty("net.i2p.router.web.ConfigAdvancedHandler.noncePrev", prev); - System.setProperty("net.i2p.router.web.ConfigAdvancedHandler.nonce", new java.util.Random().nextLong()+""); %> - <input type="hidden" name="nonce" value="<%=System.getProperty("net.i2p.router.web.ConfigAdvancedHandler.nonce")%>" > + <input type="hidden" name="nonce" value="<jsp:getProperty name="formhandler" property="newNonce" />" > <input type="hidden" name="action" value="blah" > <h3><%=intl._("Advanced I2P Configuration")%></h3> <textarea rows="32" cols="60" name="config" wrap="off" spellcheck="false"><jsp:getProperty name="advancedhelper" property="settings" /></textarea><br><hr> diff --git a/apps/routerconsole/jsp/configclients.jsp b/apps/routerconsole/jsp/configclients.jsp index ec34b1079d2c3049ca171879afc324d302dec5c1..9d74d49901f46fbc58847b8c83a4a55844fab174 100644 --- a/apps/routerconsole/jsp/configclients.jsp +++ b/apps/routerconsole/jsp/configclients.jsp @@ -27,18 +27,17 @@ button span.hide{ <jsp:setProperty name="formhandler" property="nonce" value="<%=request.getParameter("nonce")%>" /> <jsp:setProperty name="formhandler" property="settings" value="<%=request.getParameterMap()%>" /> <jsp:getProperty name="formhandler" property="allMessages" /> - <div class="configure"><form action="" method="POST"> - <% String prev = System.getProperty("net.i2p.router.web.ConfigClientsHandler.nonce"); - if (prev != null) System.setProperty("net.i2p.router.web.ConfigClientsHandler.noncePrev", prev); - System.setProperty("net.i2p.router.web.ConfigClientsHandler.nonce", new java.util.Random().nextLong()+""); %> - <input type="hidden" name="nonce" value="<%=System.getProperty("net.i2p.router.web.ConfigClientsHandler.nonce")%>" > - <% /* set hidden default */ %> - <button type="submit" name="action" value="" style="display:none" >Cancel</button> + <div class="configure"> +<% + String pageNonce = formhandler.getNewNonce(); +%> <h3><%=intl._("Client Configuration")%></h3><p> <%=intl._("The Java clients listed below are started by the router and run in the same JVM.")%> </p><div class="wideload"> - <p><jsp:getProperty name="clientshelper" property="form1" /> - </p><p><i><%=intl._("To change other client options, edit the file")%> +<form action="" method="POST"> +<input type="hidden" name="nonce" value="<%=pageNonce%>" > +<jsp:getProperty name="clientshelper" property="form1" /> +<p><i><%=intl._("To change other client options, edit the file")%> <%=net.i2p.router.startup.ClientAppConfig.configFile(net.i2p.I2PAppContext.getGlobalContext()).getAbsolutePath()%>. <%=intl._("All changes require restart to take effect.")%></i> </p><hr><div class="formaction"> @@ -47,9 +46,12 @@ button span.hide{ <input type="submit" name="edit" value="<%=intl._("Add Client")%>" /> <% } %> <input type="submit" name="action" value="<%=intl._("Save Client Configuration")%>" /> -</div></div> +</div></form></div> -<h3><a name="i2cp"></a><%=intl._("Advanced Client Interface Configuration")%></h3><p> +<h3><a name="i2cp"></a><%=intl._("Advanced Client Interface Configuration")%></h3> +<form action="" method="POST"> +<input type="hidden" name="nonce" value="<%=pageNonce%>" > +<p> <b><%=intl._("External I2CP (I2P Client Protocol) Interface Configuration")%></b><br> <input type="radio" class="optbox" name="mode" value="1" <%=clientshelper.i2cpModeChecked(1) %> > <%=intl._("Enabled without SSL")%><br> @@ -89,32 +91,41 @@ button span.hide{ </p><hr><div class="formaction"> <input type="submit" name="foo" value="<%=intl._("Cancel")%>" /> <input type="submit" name="action" value="<%=intl._("Save Interface Configuration")%>" /> -</div> +</div></form> <h3><a name="webapp"></a><%=intl._("WebApp Configuration")%></h3><p> <%=intl._("The Java web applications listed below are started by the webConsole client and run in the same JVM as the router. They are usually web applications accessible through the router console. They may be complete applications (e.g. i2psnark),front-ends to another client or application which must be separately enabled (e.g. susidns, i2ptunnel), or have no web interface at all (e.g. addressbook).")%> </p><p> <%=intl._("A web app may also be disabled by removing the .war file from the webapps directory; however the .war file and web app will reappear when you update your router to a newer version, so disabling the web app here is the preferred method.")%> - </p><div class="wideload"><p> + </p><div class="wideload"> +<form action="" method="POST"> +<input type="hidden" name="nonce" value="<%=pageNonce%>" > <jsp:getProperty name="clientshelper" property="form2" /> - </p><p> - <i><%=intl._("All changes require restart to take effect.")%></i> + <p><i><%=intl._("All changes require restart to take effect.")%></i> </p><hr><div class="formaction"> <input type="submit" name="action" value="<%=intl._("Save WebApp Configuration")%>" /> -</div></div> +</div></form></div> + <% if (clientshelper.showPlugins()) { %> <h3><a name="pconfig"></a><%=intl._("Plugin Configuration")%></h3><p> <%=intl._("The plugins listed below are started by the webConsole client.")%> - </p><div class="wideload"><p> + </p><div class="wideload"> +<form action="" method="POST"> +<input type="hidden" name="nonce" value="<%=pageNonce%>" > <jsp:getProperty name="clientshelper" property="form3" /> - </p><hr><div class="formaction"> +<hr><div class="formaction"> <input type="submit" name="action" value="<%=intl._("Save Plugin Configuration")%>" /> -</div></div><h3><a name="plugin"></a><%=intl._("Plugin Installation")%></h3><p> +</div></form></div> + +<h3><a name="plugin"></a><%=intl._("Plugin Installation")%></h3><p> <%=intl._("To install a plugin, enter the download URL:")%> - </p><div class="wideload"><p> + </p><div class="wideload"> +<form action="" method="POST"> +<input type="hidden" name="nonce" value="<%=pageNonce%>" > +<p> <input type="text" size="60" name="pluginURL" > </p><hr><div class="formaction"> <input type="submit" name="action" value="<%=intl._("Install Plugin")%>" /> - </div></div> + </div></form></div> <% } %> -</form></div></div></body></html> +</div></div></body></html> diff --git a/apps/routerconsole/jsp/configkeyring.jsp b/apps/routerconsole/jsp/configkeyring.jsp index 7438f558069b999383d00e1fea897c37bd591d57..9188f56dfac71a7eb9fc594ed877de66addad987 100644 --- a/apps/routerconsole/jsp/configkeyring.jsp +++ b/apps/routerconsole/jsp/configkeyring.jsp @@ -27,10 +27,7 @@ </p></div> <form action="" method="POST"> - <% String prev = System.getProperty("net.i2p.router.web.ConfigKeyringHandler.nonce"); - if (prev != null) System.setProperty("net.i2p.router.web.ConfigKeyringHandler.noncePrev", prev); - System.setProperty("net.i2p.router.web.ConfigKeyringHandler.nonce", new java.util.Random().nextLong()+""); %> - <input type="hidden" name="nonce" value="<%=System.getProperty("net.i2p.router.web.ConfigKeyringHandler.nonce")%>" > + <input type="hidden" name="nonce" value="<jsp:getProperty name="formhandler" property="newNonce" />" > <h3><%=intl._("Manual Keyring Addition")%></h3><p> <%=intl._("Enter keys for encrypted remote destinations here.")%> <%=intl._("Keys for local destinations must be entered on the")%> <a href="i2ptunnel/"><%=intl._("I2PTunnel page")%></a>. diff --git a/apps/routerconsole/jsp/configlogging.jsp b/apps/routerconsole/jsp/configlogging.jsp index c87fd367db1845f070a5f759ef1ba36b5471746e..4c5904a907c2e45e65c3b42234bffa1abdc77546 100644 --- a/apps/routerconsole/jsp/configlogging.jsp +++ b/apps/routerconsole/jsp/configlogging.jsp @@ -21,10 +21,7 @@ <jsp:getProperty name="formhandler" property="allMessages" /> <div class="configure"> <form action="" method="POST"> - <% String prev = System.getProperty("net.i2p.router.web.ConfigLoggingHandler.nonce"); - if (prev != null) System.setProperty("net.i2p.router.web.ConfigLoggingHandler.noncePrev", prev); - System.setProperty("net.i2p.router.web.ConfigLoggingHandler.nonce", new java.util.Random().nextLong()+""); %> - <input type="hidden" name="nonce" value="<%=System.getProperty("net.i2p.router.web.ConfigLoggingHandler.nonce")%>" > + <input type="hidden" name="nonce" value="<jsp:getProperty name="formhandler" property="newNonce" />" > <input type="hidden" name="action" value="blah" > <h3><%=intl._("Configure I2P Logging Options")%></h3> <div class="wideload"> @@ -41,7 +38,7 @@ <br> <i><%=intl._("('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' = millisecond)")%> </i></td> </tr><tr><td class="mediumtags" align="right"><b><%=intl._("Max log file size")%>:</b></td> - <td><input type="text" name="logfilesize" size="4" value="<jsp:getProperty name="logginghelper" property="maxFileSize" />" ><br></td> + <td><input type="text" name="logfilesize" size="10" value="<jsp:getProperty name="logginghelper" property="maxFileSize" />" ><br></td> </tr><tr><td class="mediumtags" align="right"><b><%=intl._("Default log level")%>:</b></td> <td><jsp:getProperty name="logginghelper" property="defaultLogLevelBox" /><br><i><%=intl._("(DEBUG and INFO are not recommended defaults, as they will drastically slow down your router)")%> </i></td> diff --git a/apps/routerconsole/jsp/configpeer.jsp b/apps/routerconsole/jsp/configpeer.jsp index 188ca56d4d9b68eb4f131a54e59cc6c3b263092f..f3a7097e6bd319411564f0733f98ae81827efe5a 100644 --- a/apps/routerconsole/jsp/configpeer.jsp +++ b/apps/routerconsole/jsp/configpeer.jsp @@ -29,10 +29,7 @@ %> <div class="configure"> <form action="configpeer" method="POST"> - <% String prev = System.getProperty("net.i2p.router.web.ConfigPeerHandler.nonce"); - if (prev != null) System.setProperty("net.i2p.router.web.ConfigPeerHandler.noncePrev", prev); - System.setProperty("net.i2p.router.web.ConfigPeerHandler.nonce", new java.util.Random().nextLong()+""); %> - <input type="hidden" name="nonce" value="<%=System.getProperty("net.i2p.router.web.ConfigPeerHandler.nonce")%>" /> + <input type="hidden" name="nonce" value="<jsp:getProperty name="formhandler" property="newNonce" />" > <a name="sh"> </a> <a name="unsh"> </a> <a name="bonus"> </a> diff --git a/apps/routerconsole/jsp/configreseed.jsp b/apps/routerconsole/jsp/configreseed.jsp index 593e410d374eea9cb09cb982035d2bb2e87a1a5c..87707444a25861655ff980cda45e9184efbee155 100644 --- a/apps/routerconsole/jsp/configreseed.jsp +++ b/apps/routerconsole/jsp/configreseed.jsp @@ -23,10 +23,7 @@ <jsp:setProperty name="formhandler" property="settings" value="<%=request.getParameterMap()%>" /> <jsp:getProperty name="formhandler" property="allMessages" /> <div class="configure"><form action="" method="POST"> -<% String prev = System.getProperty("net.i2p.router.web.ConfigReseedHandler.nonce"); - if (prev != null) System.setProperty("net.i2p.router.web.ConfigReseedHandler.noncePrev", prev); - System.setProperty("net.i2p.router.web.ConfigReseedHandler.nonce", new java.util.Random().nextLong()+""); %> -<input type="hidden" name="nonce" value="<%=System.getProperty("net.i2p.router.web.ConfigReseedHandler.nonce")%>" > +<input type="hidden" name="nonce" value="<jsp:getProperty name="formhandler" property="newNonce" />" > <h3><%=intl._("Reseeding Configuration")%></h3> <p><%=intl._("Reseeding is the bootstrapping process used to find other routers when you first install I2P, or when your router has too few router references remaining.")%> <%=intl._("If reseeding has failed, you should first check your network connection.")%> diff --git a/apps/routerconsole/jsp/configservice.jsp b/apps/routerconsole/jsp/configservice.jsp index f87479a92feca0339b59a678b3c5d8f18f178ab4..21990fc0f1e9b4f4568ed6214269a2a858061d72 100644 --- a/apps/routerconsole/jsp/configservice.jsp +++ b/apps/routerconsole/jsp/configservice.jsp @@ -19,10 +19,7 @@ <jsp:getProperty name="formhandler" property="allMessages" /> <div class="configure"> <form action="" method="POST"> - <% String prev = System.getProperty("net.i2p.router.web.ConfigServiceHandler.nonce"); - if (prev != null) System.setProperty("net.i2p.router.web.ConfigServiceHandler.noncePrev", prev); - System.setProperty("net.i2p.router.web.ConfigServiceHandler.nonce", new java.util.Random().nextLong()+""); %> - <input type="hidden" name="nonce" value="<%=System.getProperty("net.i2p.router.web.ConfigServiceHandler.nonce")%>" > + <input type="hidden" name="nonce" value="<jsp:getProperty name="formhandler" property="newNonce" />" > <h3><%=intl._("Shutdown the router")%></h3> <p><%=intl._("Graceful shutdown lets the router satisfy the agreements it has already made before shutting down, but may take a few minutes.")%> <%=intl._("If you need to kill the router immediately, that option is available as well.")%></p> @@ -49,7 +46,8 @@ <hr><div class="formaction"> <input type="submit" name="action" value="<%=intl._("Show systray icon")%>" > <input type="submit" name="action" value="<%=intl._("Hide systray icon")%>" > -</div><h3><%=intl._("Run on startup")%></h3> + </div> + <h3><%=intl._("Run on startup")%></h3> <p><%=intl._("You can control whether I2P is run on startup or not by selecting one of the following options - I2P will install (or remove) a service accordingly.")%> <%=intl._("If you prefer the command line, you can also run the ")%> <code>install_i2p_service_winnt.bat</code> (<%=intl._("or")%> <code>uninstall_i2p_service_winnt.bat</code>).</p> diff --git a/apps/routerconsole/jsp/configstats.jsp b/apps/routerconsole/jsp/configstats.jsp index fde10837db0c98212924fa8b488aa4e315367e37..d522f56d8756c695b62e640d92d99d4d38e5d6b2 100644 --- a/apps/routerconsole/jsp/configstats.jsp +++ b/apps/routerconsole/jsp/configstats.jsp @@ -15,15 +15,19 @@ function toggleAll(category) var inputs = document.getElementsByTagName("input"); for(index = 0; index < inputs.length; index++) { - if(inputs[index].id == category) + var classes = inputs[index].className.split(' '); + for (var idx = 0; idx < classes.length; idx++) { - if(inputs[index].checked == 0) + if(classes[idx] == category) { - inputs[index].checked = 1; - } - else if(inputs[index].checked == 1) - { - inputs[index].checked = 0; + if(inputs[index].checked == 0) + { + inputs[index].checked = 1; + } + else if(inputs[index].checked == 1) + { + inputs[index].checked = 0; + } } } if(category == '*') @@ -67,26 +71,23 @@ function toggleAll(category) <jsp:setProperty name="statshelper" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" /> <div class="configure"> <form id="statsForm" name="statsForm" action="" method="POST"> - <% String prev = System.getProperty("net.i2p.router.web.ConfigStatsHandler.nonce"); - if (prev != null) System.setProperty("net.i2p.router.web.ConfigStatsHandler.noncePrev", prev); - System.setProperty("net.i2p.router.web.ConfigStatsHandler.nonce", new java.util.Random().nextLong()+""); %> <input type="hidden" name="action" value="foo" > - <input type="hidden" name="nonce" value="<%=System.getProperty("net.i2p.router.web.ConfigStatsHandler.nonce")%>" > + <input type="hidden" name="nonce" value="<jsp:getProperty name="formhandler" property="newNonce" />" > <h3><%=intl._("Configure I2P Stat Collection")%></h3> <p><%=intl._("Enable full stats?")%> <input type="checkbox" class="optbox" name="isFull" value="true" <% if (statshelper.getIsFull()) { %>checked="true" <% } %> > (<%=intl._("change requires restart to take effect")%>)<br> <%=intl._("Stat file")%>: <input type="text" name="filename" value="<%=statshelper.getFilename()%>" ><br> -<%=intl._("Filter")%>: (<a href="javascript: void(null);" onclick="toggleAll('*')"><%=intl._("toggle all")%></a>)<br></p> +<%=intl._("Filter")%>: (<a href="javascript:void(null);" onclick="toggleAll('*')"><%=intl._("toggle all")%></a>)<br></p> <div class="wideload"> - <p><table> + <table> <% while (statshelper.hasMoreStats()) { while (statshelper.groupRequired()) { %> <tr class="tablefooter"> - <td align="left" colspan="3"> + <td align="left" colspan="3" id=<%=statshelper.getCurrentGroupName()%>> <b><%=statshelper.getCurrentGroupName()%></b> - (<a href="javascript: void(null);" onclick="toggleAll('<%=statshelper.getCurrentGroupName()%>')"><%=intl._("toggle all")%></a>) + (<a href="javascript:void(null);" onclick="toggleAll('<%=statshelper.getCurrentGroupName()%>')"><%=intl._("toggle all")%></a>) </td></tr> <tr class="tablefooter"> <td align="center"><b><%=intl._("Log")%></b></td> @@ -96,11 +97,11 @@ function toggleAll(category) } // end iterating over required groups for the current stat %> <tr><td align="center"> <a name="<%=statshelper.getCurrentStatName()%>"></a> - <input id="<%=statshelper.getCurrentGroupName()%>" type="checkbox" class="optbox" name="statList" value="<%=statshelper.getCurrentStatName()%>" <% + <input type="checkbox" class="optbox <%=statshelper.getCurrentGroupName()%>" name="statList" value="<%=statshelper.getCurrentStatName()%>" <% if (statshelper.getCurrentIsLogged()) { %>checked="true" <% } %> ></td> <td align="center"> <% if (statshelper.getCurrentCanBeGraphed()) { %> - <input id="<%=statshelper.getCurrentGroupName()%>" type="checkbox" class="optbox" name="graphList" value="<%=statshelper.getCurrentGraphName()%>" <% + <input type="checkbox" class="optbox <%=statshelper.getCurrentGroupName()%>" name="graphList" value="<%=statshelper.getCurrentGraphName()%>" <% if (statshelper.getCurrentIsGraphed()) { %>checked="true" <% } %> ><% } %></td> <td align="left"><b><%=statshelper.getCurrentStatName()%>:</b><br> <%=statshelper.getCurrentStatDescription()%></td></tr><% @@ -113,4 +114,4 @@ function toggleAll(category) <input type="reset" value="<%=intl._("Cancel")%>" > <input type="submit" name="shouldsave" value="<%=intl._("Save changes")%>" > </td></tr> - </table></p></div></form></div></div></body></html> +</table></div></form></div></div></body></html> diff --git a/apps/routerconsole/jsp/configtunnels.jsp b/apps/routerconsole/jsp/configtunnels.jsp index 1c1393280a549b76bc9f4686934230256cf358f9..15c266d8c1838b52497232e8a014a2728fd99ea9 100644 --- a/apps/routerconsole/jsp/configtunnels.jsp +++ b/apps/routerconsole/jsp/configtunnels.jsp @@ -31,10 +31,7 @@ <%=intl._("Change these settings with care, and adjust them if you have problems.")%> <div class="wideload"> <form action="" method="POST"> - <% String prev = System.getProperty("net.i2p.router.web.ConfigTunnelsHandler.nonce"); - if (prev != null) System.setProperty("net.i2p.router.web.ConfigTunnelsHandler.noncePrev", prev); - System.setProperty("net.i2p.router.web.ConfigTunnelsHandler.nonce", new java.util.Random().nextLong()+""); %> - <input type="hidden" name="nonce" value="<%=System.getProperty("net.i2p.router.web.ConfigTunnelsHandler.nonce")%>" > + <input type="hidden" name="nonce" value="<jsp:getProperty name="formhandler" property="newNonce" />" > <input type="hidden" name="action" value="blah" > <jsp:getProperty name="tunnelshelper" property="form" /> <%=intl._("Note")%>: <%=intl._("Exploratory tunnel setting changes are stored in the router.config file.")%> @@ -44,4 +41,4 @@ <input type="reset" value="<%=intl._("Cancel")%>" > <input type="submit" name="shouldsave" value="<%=intl._("Save changes")%>" > </div> - </form></p></div></div></div></body></html> + </form></div></div></div></body></html> diff --git a/apps/routerconsole/jsp/configui.jsp b/apps/routerconsole/jsp/configui.jsp index 9f3d32e4fada8cc7f0cb104b7895df1fdb02c14d..e67b113405c22979f0c68ee74822ce75f768ae78 100644 --- a/apps/routerconsole/jsp/configui.jsp +++ b/apps/routerconsole/jsp/configui.jsp @@ -24,10 +24,16 @@ <jsp:getProperty name="formhandler" property="allMessages" /> <div class="configure"><div class="topshimten"><h3><%=uihelper._("Router Console Theme")%></h3></div> <form action="" method="POST"> - <% String prev = System.getProperty("net.i2p.router.web.ConfigUIHandler.nonce"); - if (prev != null) System.setProperty("net.i2p.router.web.ConfigUIHandler.noncePrev", prev); - System.setProperty("net.i2p.router.web.ConfigUIHandler.nonce", new java.util.Random().nextLong()+""); %> - <input type="hidden" name="nonce" value="<%=System.getProperty("net.i2p.router.web.ConfigUIHandler.nonce")%>" > +<% + /** lang setting is done in css.jsi, not in ConfigUIHandler */ + String consoleNonce = System.getProperty("router.consoleNonce"); + if (consoleNonce == null) { + consoleNonce = Long.toString(new java.util.Random().nextLong()); + System.setProperty("router.consoleNonce", consoleNonce); + } +%> + <input type="hidden" name="consoleNonce" value="<%=consoleNonce%>" > + <input type="hidden" name="nonce" value="<jsp:getProperty name="formhandler" property="newNonce" />" > <input type="hidden" name="action" value="blah" > <% String userAgent = request.getHeader("User-Agent"); diff --git a/apps/routerconsole/jsp/configupdate.jsp b/apps/routerconsole/jsp/configupdate.jsp index 47b8b9310858344f0b520c526b28ad4531308441..4b1bf4bc60c6728c27d2765a8b5a099fc7f9b185 100644 --- a/apps/routerconsole/jsp/configupdate.jsp +++ b/apps/routerconsole/jsp/configupdate.jsp @@ -23,10 +23,7 @@ <i><jsp:getProperty name="updatehelper" property="newsStatus" /></i></div> <div class="configure"> <form action="" method="POST"> - <% String prev = System.getProperty("net.i2p.router.web.ConfigUpdateHandler.nonce"); - if (prev != null) System.setProperty("net.i2p.router.web.ConfigUpdateHandler.noncePrev", prev); - System.setProperty("net.i2p.router.web.ConfigUpdateHandler.nonce", new java.util.Random().nextLong()+""); %> - <input type="hidden" name="nonce" value="<%=System.getProperty("net.i2p.router.web.ConfigUpdateHandler.nonce")%>" > + <input type="hidden" name="nonce" value="<jsp:getProperty name="formhandler" property="newNonce" />" > <% /* set hidden default */ %> <input type="submit" name="action" value="" style="display:none" > <h3><%=intl._("Check for I2P and news updates")%></h3> diff --git a/apps/routerconsole/jsp/css.jsi b/apps/routerconsole/jsp/css.jsi index 613b32a6785538f0aa56feda521723e59c207638..8e133a1279dfd10370d78d17bf57fb693dc33197 100644 --- a/apps/routerconsole/jsp/css.jsi +++ b/apps/routerconsole/jsp/css.jsi @@ -10,9 +10,12 @@ if (request.getCharacterEncoding() == null) request.setCharacterEncoding("UTF-8"); - response.setHeader("Pragma", "no-cache"); - response.setHeader("Cache-Control","no-cache"); - response.setDateHeader("Expires", 0); + // Now that we use POST for most forms, these prevent the back button from working after a form submit + // Just let the browser do its thing + //response.setHeader("Pragma", "no-cache"); + //response.setHeader("Cache-Control","no-cache"); + //response.setDateHeader("Expires", 0); + // the above will b0rk if the servlet engine has already flushed // the response prior to including this file, so it should be // near the top @@ -26,7 +29,10 @@ <jsp:useBean class="net.i2p.router.web.CSSHelper" id="intl" scope="request" /> <jsp:setProperty name="intl" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" /> <% - intl.setLang(request.getParameter("lang")); + String conNonceParam = request.getParameter("consoleNonce"); + if (conNonceParam != null && conNonceParam.equals(System.getProperty("router.consoleNonce"))) { + intl.setLang(request.getParameter("lang")); + } %> <link href="<%=intl.getTheme(request.getHeader("User-Agent"))%>console.css" rel="stylesheet" type="text/css"> <% diff --git a/apps/routerconsole/jsp/dumpprofile.jsp b/apps/routerconsole/jsp/dumpprofile.jsp index dfdcc0b6e52ffb3687165dce6ff2af104797b8b1..af6c8de744c5319a1dbac503ebc66cce641375ef 100644 --- a/apps/routerconsole/jsp/dumpprofile.jsp +++ b/apps/routerconsole/jsp/dumpprofile.jsp @@ -1,5 +1,6 @@ <%@page contentType="text/plain" %><jsp:useBean id="helper" class="net.i2p.router.web.StatHelper" -/><jsp:setProperty name="helper" property="peer" value="<%=request.getParameter("peer")%>" +/><jsp:setProperty name="helper" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" +/><jsp:setProperty name="helper" property="peer" value="<%=net.i2p.data.DataHelper.stripHTML(request.getParameter("peer"))%>" /><% helper.storeWriter(out); %><jsp:getProperty name="helper" property="profile" /> diff --git a/apps/routerconsole/jsp/flags.jsp b/apps/routerconsole/jsp/flags.jsp index c736e8b469fb9ecc45144f7276707f02a39a3464..7148782e31bd00b0e7a0670d30994db52d8190fe 100644 --- a/apps/routerconsole/jsp/flags.jsp +++ b/apps/routerconsole/jsp/flags.jsp @@ -11,28 +11,49 @@ * flags.jsp?c=de => icons/flags/de.png * with headers set so the browser caches. */ -boolean rendered = false; String c = request.getParameter("c"); if (c != null && c.length() > 0) { java.io.OutputStream cout = response.getOutputStream(); - response.setContentType("image/png"); - response.setHeader("Cache-Control", "max-age=86400"); // cache for a day String base = net.i2p.I2PAppContext.getGlobalContext().getBaseDir().getAbsolutePath(); String file = "docs" + java.io.File.separatorChar + "icons" + java.io.File.separatorChar + "flags" + java.io.File.separatorChar + c + ".png"; + java.io.File ffile = new java.io.File(base, file); + long lastmod = ffile.lastModified(); + if (lastmod > 0) { + long iflast = request.getDateHeader("If-Modified-Since"); + // iflast is -1 if not present; round down file time + if (iflast >= ((lastmod / 1000) * 1000)) { + response.sendError(304, "Not Modified"); + return; + } + response.setDateHeader("Last-Modified", lastmod); + // cache for a day + response.setDateHeader("Expires", net.i2p.I2PAppContext.getGlobalContext().clock().now() + 86400000l); + response.setHeader("Cache-Control", "public, max-age=86400"); + } + long length = ffile.length(); + if (length > 0) + response.setHeader("Content-Length", Long.toString(length)); + response.setContentType("image/png"); try { net.i2p.util.FileUtil.readFile(file, base, cout); - rendered = true; - } catch (java.io.IOException ioe) {} - if (rendered) - cout.close(); + } catch (java.io.IOException ioe) { + // prevent 'Committed' IllegalStateException from Jetty + if (!response.isCommitted()) { + response.sendError(403, ioe.toString()); + } else { + net.i2p.I2PAppContext.getGlobalContext().logManager().getLog(getClass()).error("Error serving flags/" + c + ".png", ioe); + // Jetty doesn't log this + throw ioe; + } + } +} else { + /* + * Send a 403 instead of a 404, because the server sends error.jsp + * for 404 errors, complete with the summary bar, which would be + * a huge load for a page full of flags if the user didn't have the + * flags directory for some reason. + */ + response.sendError(403, "No flag specified"); } -/* - * Send a 403 instead of a 404, because the server sends error.jsp - * for 404 errors, complete with the summary bar, which would be - * a huge load for a page full of flags if the user didn't have the - * flags directory for some reason. - */ -if (!rendered) - response.sendError(403, "Flag not found"); %> \ No newline at end of file diff --git a/apps/routerconsole/jsp/help.jsp b/apps/routerconsole/jsp/help.jsp index 636e8800d12c9fabdddec7631d53bcfc77058140..d166532de27e323fd20bec44c6221111071056b0 100644 --- a/apps/routerconsole/jsp/help.jsp +++ b/apps/routerconsole/jsp/help.jsp @@ -47,7 +47,7 @@ This may range from 8-10 to several hundred, depending on your total bandwidth, shared bandwidth, and locally-generated traffic. The second number is the number of peers seen in the last hour or so. Do not be concerned if these numbers vary widely. -<a href="configstats.jsp#router.activePeers">[Enable graphing]</a>. +First enable all stats to <a href="configstats.jsp#router.activePeers">[Enable graphing]</a>. <li class="tidylist"><b>Fast:</b> This is the number of peers you use for building client tunnels. It is generally in the range 8-30. Your fast peers are shown on the <a href="profiles.jsp">profiles page</a>. @@ -56,7 +56,7 @@ range 8-30. Your fast peers are shown on the <a href="profiles.jsp">profiles pag This is the number of peers you use for building some of your exploratory tunnels. It is generally in the range 8-75. The fast peers are included in the high capacity tier. Your high capacity peers are shown on the <a href="profiles.jsp">profiles page</a>. -<a href="configstats.jsp#router.highCapacityPeers">[Enable graphing]</a>. +First enable all stats to <a href="configstats.jsp#router.highCapacityPeers">[Enable graphing]</a>. <li class="tidylist"><b>Well Integrated:</b> This is the number of peers you use for network database inquiries. These are usually the "floodfill" peers. diff --git a/apps/routerconsole/jsp/help_ar.jsp b/apps/routerconsole/jsp/help_ar.jsp new file mode 100644 index 0000000000000000000000000000000000000000..b1a4c6f9284ebd68697c8a6c18f52294c0b681a4 --- /dev/null +++ b/apps/routerconsole/jsp/help_ar.jsp @@ -0,0 +1,177 @@ +<%@page contentType="text/html"%> +<%@page pageEncoding="UTF-8"%> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<% + /* + * Do not tag this file for translation - copy it to help_xx.jsp and translate inline. + */ +%> +<html><head><title>I2P مساعدة لوØØ© التØكم</title> +<%@include file="css.jsi" %> +</head><body> +<%@include file="summary.jsi" %> +<h1>I2P مساعدة لوØØ© التØكم</h1> +<div class="main" id="main" dir="rtl" lang="ar"><p> +اذا رغبت ÙÙŠ المساعدة أو ترجمة الوثائق، أو المساعدة ÙÙŠ أشياء أخرى، انظر اسÙله + +<a href="http://www.i2p2.i2p/getinvolved.html">تطوع</a> +</p><p>المزيد من المساعدة هنا: +<ul class="links"> +<li class="tidylist"><a href="http://www.i2p2.i2p/faq.html">ابئلة شائعة www.i2p2.i2p</a> +<br>يمكن ايضا<a href="http://forum.i2p/">I2P منتدى</a> +او بالدردشة على IRC.</p> + +<h2>شريط المعلومات</h2><p> +يمكن للاØصائات أن +<a href="configstats.jsp">تتغير</a> لكي تظهر على شكل +<a href="graphs.jsp">رسم بياني</a> للمزيد من التØاليل +</p><h3>عام</h3><ul> +<li class="tidylist"><b>:هوية</b> +الØرو٠الأولى (24 bits) من 44-Øر٠(256-) Base64 hash. +The full hash is shown on your <a href="netdb.jsp?r=.">صÙØØ© معلومات الموجه</a>. +هذا لا يكش٠عن عنوان IP الخاص بك لأØد. +<li class="tidylist"><b>الاصدار</b> +اصدار I2P المستعمل +<li class="tidylist"><b>الآن</b> +الوقت الØالي (UTC)والانØرا٠الممكن. ÙŠØتاج I2P الى ساعة مضبوطة. اذا كان انØرا٠الساعة اكثر من بضع ثواني، قم بتصØÙŠØ Ø§Ù„Ø®Ù„Ù„. +<li class="tidylist"><b>إمكانية الوصول</b> +امكانية الاتصال الخارجي بالموجه +المزيد من التÙاصيل ÙÙŠ <a href="config.jsp#help">صÙØØ© الاعدادات</a>. +</ul><h3>النظائر</h3><ul> +<li class="tidylist"><b>Ù…Ùعل</b> +هذا هو عدد النظائر التي تم إرسال أو تلقيها رسالة ÙÙŠ الدقائق القليلة الماضية. +قد يكون هذا النطاق 8-10 الى عدة مئات، اعتمادا على عرض النطاق الترددي الإجمالي ØŒ +تقاسم عرض النطاق الترددي ØŒ ÙˆØركة المرور المولدة Ù…Øليا. +والرقم الثاني هو عدد من نظرائه ينظر ÙÙŠ آخر ساعة أو Ù†ØÙˆ ذلك. +لا تشعر بالقلق إذا كانت هذه الأرقام تختل٠على نطاق واسع. +<a href="configstats.jsp#router.activePeers">[تÙعيل الرسم البياني]</a>. +<li class="tidylist"><b>سريع</b> +هذا هو عدد النظائر التي تستعملها لانشاء أنÙاق جديدة. هي ÙÙŠ نطاق 8-30. النظائر السريعة ÙÙŠ + <a href="profiles.jsp">صÙØØ© البروÙايل</a>. +<a href="configstats.jsp#router.fastPeers">[تÙعيل الرسم البياني]</a>. +<li class="tidylist"><b>قدرة عالية</b> +هذا هو عدد النظائر التي تستعملها لانشاء أنÙاق الاكتشاÙ. هي ÙÙŠ نطاق 8-75. النظائر السريعة. النظائر القدرة عالية تظهر هنا. + <a href="profiles.jsp">صÙØØ© البروÙايل</a>. +<a href="configstats.jsp#router.highCapacityPeers">[تÙعيل الرسم البياني]</a>. +<li class="tidylist"><b>المندمجة جيدا</b> +هذا هو عدد النظائر المستعملة ÙÙŠ الاتصال بقاعدة البيانات. النظائر المندمجة جيدا موجودة ÙÙŠ أسÙÙ„ +<a href="profiles.jsp">صÙØØ© البروÙايل</a>. +<li class="tidylist"><b>المعروÙØ©</b> +هذا هو عدد الموجهات المعروÙØ©. +والظاهرة ÙÙŠ صÙØØ© <a href="netdb.jsp">قاعدة البيانات</a> +هي مابين 100 الى 1000 او أكثر. +هذا العدد ليس Øجم الاجمالي للشبكة، +يمكنه ان بتغيير Øسب سرعة الاتصال. + +</ul><h3>سرعة الاتصال الداخلي/خارجي</h3><div align="justify"> +السرعة ب بايت ÙÙŠ الثانية +غير السرعة ÙÙŠ <a href="config.jsp#help">صÙØØ© الاعدادات</a>. +السرعة <a href="graphs.jsp">مرسومة</a> </div> +<h3>الوجهات الداخلية</h3><div align="justify"> +الاتصالات الداخلية +البرامج المØلية المتصلة عبر الموجه +<a href="i2ptunnel/index.jsp">I2PTunnel</a> +او برامج خارجية متصلة SAM, BOB, او مباشرة بـ I2CP. +</div><h3>الأنÙاق الداخلة/خارجة</h3><div align="justify"> +الأنÙاق الØالية موجودة ÙÙŠ <a href="tunnels.jsp">صÙØØ© الأنÙاق</a>.</div><ul> +<li class="tidylist"><div align="justify"><b>تصÙØ</b> +الأنÙاق المستخدمة من طر٠الموجه تستعمل ÙÙŠ الاتصال مع النظائر، انشاء انÙاق جديدة. +</div> +<li class="tidylist"><b>المستخدمين</b> +الأنÙاق المستخدمة من طر٠الموجه +<li class="tidylist"><b>المشاركة</b> +الأنÙاق المنشئة من طر٠موجهات أخرى عبر موجهك. +هذا ينبني على درجة استخدام الشبكة، مقدار المشاركة... +يمكنك تغيير درجة المشاركة بـ <a href="config.jsp#help">صÙØØ© الاعدادات</a>. +You may also limit the total number by setting <tt>router.maxParticipatingTunnels=nnn</tt> on +the <a href="configadvanced.jsp">صÙØØ© الاعدادات المتقدمة</a>. <a href="configstats.jsp#tunnel.participatingTunnels">[تÙعيل الرسم البياني]</a>. +<li class="tidylist"><b>نسبة المشاركة</b> +عدد الانÙاق المشاركة، مقسوما على عدد اجمالي الانÙاق. +عدد أكبر من 1.00 يعني انك تساهم ÙÙŠ الشبكة بعدد اكبر مما تستهلك. +</ul> + +<h3>ازدØام</h3><div align="justify"> +بعض مشرات ازدØام الموجه</div><ul> +<li class="tidylist"><b>Job lag:</b> +How long jobs are waiting before execution. The job queue is listed on the <a href="jobs.jsp">jobs page</a>. +Unfortunately, there are several other job queues in the router that may be congested, +and their status is not available in the router console. +The job lag should generally be zero. +If it is consistently higher than 500ms, your computer is very slow, or the +router has serious problems. +<a href="configstats.jsp#jobQueue.jobLag">[تÙعيل الرسم البياني]</a>. +<li class="tidylist"><b>Message delay:</b> +How long an outbound message waits in the queue. +This should generally be a few hundred milliseconds or less. +If it is consistently higher than 1000ms, your computer is very slow, +or you should adjust your bandwidth limits, or your (bittorrent?) clients +may be sending too much data and should have their transmit bandwidth limit reduced. +<a href="configstats.jsp#transport.sendProcessingTime">[تÙعيل الرسم البياني]</a> (transport.sendProcessingTime). +<li class="tidylist"><b>Tunnel lag:</b> +This is the round trip time for a tunnel test, which sends a single message +out a client tunnel and in an exploratory tunnel, or vice versa. +It should usually be less than 5 seconds. +If it is consistently higher than that, your computer is very slow, +or you should adjust your bandwidth limits, or there are network problems. +<a href="configstats.jsp#tunnel.testSuccessTime">[تÙعيل الرسم البياني]</a> (tunnel.testSuccessTime). +<li class="tidylist"><b>Handle backlog:</b> +This is the number of pending requests from other routers to build a +participating tunnel through your router. +It should usually be close to zero. +If it is consistently high, your computer is too slow, +and you should reduce your share bandwidth limits. +<li class="tidylist"><b>Accepting/Rejecting:</b> +Your router's status on accepting or rejecting +requests from other routers to build a +participating tunnel through your router. +Your router may accept all requests, accept or reject a percentage of requests, +or reject all requests for a number of reasons, to control +the bandwidth and CPU demands and maintain capacity for +local clients.</ul> + +<h2>Legal stuff</h2><p>The I2P router (router.jar) and SDK (i2p.jar) are almost entirely public domain, with +a few notable exceptions:</p><ul> +<li class="tidylist">ElGamal and DSA code, under the BSD license, written by TheCrypto</li> +<li class="tidylist">SHA256 and HMAC-SHA256, under the MIT license, written by the Legion of the Bouncycastle</li> +<li class="tidylist">AES code, under the Cryptix (MIT) license, written by the Cryptix team</li> +<li class="tidylist">SNTP code, under the BSD license, written by Adam Buckley</li> +<li class="tidylist">The rest is outright public domain, written by jrandom, mihi, hypercubus, oOo, + ugha, duck, shendaras, and others.</li> +</ul> + +<p>On top of the I2P router are a series of client applications, each with their own set of +licenses and dependencies. This webpage is being served as part of the I2P routerconsole +client application, which is built off a trimmed down <a href="http://jetty.mortbay.com/jetty/index.html">Jetty</a> +instance (trimmed down, as in, we do not include the demo apps or other add-ons, and we simplify configuration), +allowing you to deploy standard JSP/Servlet web applications into your router. Jetty in turn makes use of +Apache's javax.servlet (javax.servlet.jar) implementation. +This product includes software developed by the Apache Software Foundation +(http://www.apache.org/). </p> + +<p>Another application you can see on this webpage is <a href="http://www.i2p2.i2p/i2ptunnel">I2PTunnel</a> +(your <a href="i2ptunnel/" target="_blank">web interface</a>) - a GPL'ed application written by mihi that +lets you tunnel normal TCP/IP traffic over I2P (such as the eepproxy and the irc proxy). There is also a +<a href="http://susi.i2p/">susimail</a> web based mail client <a href="susimail/susimail">available</a> on +the console, which is a GPL'ed application written by susi23. The addressbook application, written by +<a href="http://ragnarok.i2p/">Ragnarok</a> helps maintain your hosts.txt files (see ./addressbook/ for +more information).</p> + +<p>The router by default also includes human's public domain <a href="http://www.i2p2.i2p/sam">SAM</a> bridge, +which other client applications (such the <a href="http://duck.i2p/i2p-bt/">bittorrent port</a>) can use. +There is also an optimized library for doing large number calculations - jbigi - which in turn uses the +LGPL licensed <a href="http://swox.com/gmp/">GMP</a> library, tuned for various PC architectures. Launchers for windows users are built with <a href="http://launch4j.sourceforge.net/">Launch4J</a>, and the installer is built with <a href="http://www.izforge.com/izpack/">IzPack</a>. For +details on other applications available, as well as their licenses, please see the +<a href="http://www.i2p2.i2p/licenses">license policy</a>. Source for the I2P code and most bundled +client applications can be found on our <a href="http://www.i2p2.i2p/download">download page</a>. +.</p> + +<h2>Change Log</h2> + <jsp:useBean class="net.i2p.router.web.ContentHelper" id="contenthelper" scope="request" /> + <% java.io.File fpath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getBaseDir(), "history.txt"); %> + <jsp:setProperty name="contenthelper" property="page" value="<%=fpath.getAbsolutePath()%>" /> + <jsp:setProperty name="contenthelper" property="maxLines" value="256" /> + <jsp:setProperty name="contenthelper" property="startAtBeginning" value="true" /> + <jsp:getProperty name="contenthelper" property="textContent" /> + + <p><a href="/history.txt">View the full change log</a> + </p><hr></div></body></html> diff --git a/apps/routerconsole/jsp/help_fr.jsp b/apps/routerconsole/jsp/help_fr.jsp new file mode 100644 index 0000000000000000000000000000000000000000..cd3c3df9d1c8afcd0b01a1653a996325dbf5aa86 --- /dev/null +++ b/apps/routerconsole/jsp/help_fr.jsp @@ -0,0 +1,160 @@ +<%@page contentType="text/html"%> +<%@page pageEncoding="UTF-8"%> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<% + /* + * Do not tag this file for translation - copy it to help_xx.jsp and translate inline. + */ +%> +<html><head><title>Console du routeur I2P - Aide</title> +<%@include file="css.jsi" %> +</head><body> +<%@include file="summary.jsi" %> +Traduction de mars 2011 (magma@mail.i2p) +<h1>Aide et assistance du routeur I2P</h1> +<div class="main" id="main"><p> +Si vous souhaitez améliorer ou traduire la documentation ou d'autres versants du projet, merci de vous reporter à +la page consacrée aux <a href="http://www.i2p2.i2p/getinvolved_fr.html">volontaires</a>. +</p><p>D'autres détails sont disponibles ici: +<ul class="links"> +<li class="tidylist"><a href="http://www.i2p2.i2p/faq.html">FAQ en anglais sur www.i2p2.i2p</a> +<li class="tidylist"><a href="http://www.i2p2.i2p/faq_fr.html">les FAQ en français</a>.</ul> +<br>Il y a aussi le <a href="http://forum.i2p/">forum I2P</a> +et l'IRC.</p> + +<h2>Informations du panneau de surveillance</h2><p> +Plusieurs des statistiques affichées dans le panneau de surveillance peuvent être +<a href="configstats.jsp">configurées</a> pour être affichées sous forme de <a href="graphs.jsp">graphiques</a> pour +analyse sur la durée. +</p><h3>GÉNÉRAL</h3><ul> +<li class="tidylist"><b>Identité locale:</b> +Cliquez sur "Afficher" pour voir l'empreinte Base64 à 44 caractères (256 bits) de votre routeur. Le hachage +complet est affiché sur votre <a href="netdb.jsp?r=.">page d'infos routeur</a>. Ne la divulguez jamais à personne, +car l'info routeur contient votre adresse IP. +<li class="tidylist"><b>Version:</b> +La version d'I2P qui vous affiche actuellement cette page. +<li class="tidylist"><b>Lancé depuis:</b> +Indique depuis combien de temps le routeur tourne. +<li class="tidylist"><b>Réseau:</b> +Statut de joignabilité du routeur par les autres routeurs. +Plus d'infos sur la page de <a href="config.jsp#help">configuration</a>. +</ul><h3>Pairs</h3><ul> +<li class="tidylist"><b>Actifs:</b> +le premier nombre est celui des routeurs avec qui le votre a communiqué dans les dernières minutes. Ça peut varier de +8-10 à plusieurs centaines, selon votre bande passante et son rapport de partage, et le trafic généré localement. Le +second est celui des pairs vus dans les dernières heures. Ces nombres penvent varier sensiblement sans conséquence. +<a href="configstats.jsp#router.activePeers">[Activer le graphique]</a> (activer auparavant "toutes +les statistiques"). +<li class="tidylist"><b>Rapides:</b> +le nombre de pairs que vous mettez à contribution pour construire vos tunnels clients. En général dans une tranche de +8 à 30. Vos pairs rapides sont détaillés sur la page <a href="profiles.jsp">profils</a>. +<a href="configstats.jsp#router.fastPeers">[Activer le graphique]</a>. +<li class="tidylist"><b>Hautes capacités:</b> +nombre des pairs que vous utilisez pour construire quelques uns de vos tunnels exploratoires. Habituellement de 8 à 75. +Les pairs rapides font partie du groupe des "Hautes capacités". Vos pairs à hautes capacités sont aussi listés sur +la page <a href="profiles.jsp">profils</a>. +<a href="configstats.jsp#router.highCapacityPeers">[Activer le graphique]</a> (activer auparavant "toutes les +statistiques"). +<li class="tidylist"><b>Bien intégrés:</b> +vous utilisez ce groupe pour vos requêtes à la base de données du réseau. Ils sont souvent des pairs de remplissage par +diffusion ("floodfill"). Vos pairs "bien intégrés" sont affichés en bas de la même page +<a href="profiles.jsp">profils</a>. +<li class="tidylist"><b>Connus:</b> c'est tous les routeurs dont vous connaissez l'existance. Il sont listés sur la +page <a href="netdb.jsp">base de données du réseau</a>. De moins de 100 à 1000 ou plus. Ce nombre ne représente pas la +taille totale du réseau; il varie en fonction de votre bande passante totale et son rapport de partage, et du trafic +local. I2P n'a pas besoin que chaque routeur connaisse tous les autres. +</ul><h3>Bande passante entrée/sortie</h3><div align="justify"> +Ça parle tout seul. Toutes les valeurs sont en octets par seconde (o/s), pas en bits par seconde (b/s). Modifiez vos +limites de bande passante sur la page de <a href="config.jsp#help">configuration</a>. +Le <a href="graphs.jsp">graphique de bande passante</a> est activé par défaut.</div> + +<h3>Destinations locales</h3><div align="justify"> +C'est le nom I2P des applications qui se connectent par votre routeur. Elles peuvent être des clients lancés depuis +<a href="i2ptunnel/index.jsp">I2PTunnel</a> ou des programmes tiers qui se connectent via SAM, BOB ou directement à +I2CP. +</div><h3>TUNNELS:</h3><div align="justify"> +Les tunnels actuels sont affichés sur la page <a href="tunnels.jsp">tunnels</a>.</div><ul> +<li class="tidylist"><div align="justify"><b>Exploratoires:</b> tunnels créés par votre routeur et utilisés avec les +pairs diffuseurs pour la création des nouveaux tunnels et le test des tunnels existants.</div> +<li class="tidylist"><b>Clients:</b> tunnels créés par votre routeur pour chaque utilisation cliente. +<li class="tidylist"><b>Participants:</b> les tunnels créés par d'autres routeurs et qui passent par le votre. Leur +nombre dépend largement de la demande du réseau, de votre part de bande passante partagée, et du trafic local. +La méthode recommandée pour limiter leur nombre est de diminuer le rapport de bande passante partagée dans la +<a href="config.jsp#help">configuration</a>. Vous pouvez également limiter ce nombre en définissant la variable +<tt>router.maxParticipatingTunnels=nnn</tt> dans la <a href="configadvanced.jsp">configuration avancée</a>. +<a href="configstats.jsp#tunnel.participatingTunnels">[Activer le graphique]</a>. +<li class="tidylist"><b>Rapport de partage:</b> le nombre de tunnels participants que vous routez pour les autres, +divisé par le nombre total de sauts dans tous vos tunnels exploratoires et clients. S'il est supérieur à 1, cela +signifie que vous contribuez à plus de tunnels que vous n'en utilisez. +</ul> + +<h3>ENCOMBREMENT</h3><div align="justify"> +Indications de base sur la charge du routeur:</div><ul> +<li class="tidylist"><b>Retard de tâches:</b> temps d'attente des tâches avant exécution. La file d'attente est +présentée la pages des <a href="jobs.jsp">tâches</a>. Malheureusement, il y a dans le routeur plusieurs autres files +d'attentes qui ne peuvent être affichées dans la console. Le retard de tâches devrait rester à zéro en permamence. s'il +régulièrement supérieur à 500ms, soit votre PC est très lent, soit le routeur a de sérieux problèmes. +<a href="configstats.jsp#jobQueue.jobLag">[Activer le graphique]</a>. +<li class="tidylist"><b>Retard de messages:</b> temps de rétention des messages en file d'attente d'envois, normalement +quelques centaines de ms ou moins. Au dessus d'une seconde, votre PC est très lent, vous devriez fignoler vos réglages +de bande passante, ou vos clients (bittorrent, iMule...?) envoient trop de données et il faudrait voir à leur tenir +la bride. <a href="configstats.jsp#transport.sendProcessingTime">[Activer le graphique]</a> +(transport.sendProcessingTime). +<li class="tidylist"><b>Retard de tunnels:</b> le temps d'aller-retour pour un test de tunnel (envoi d'un seul message +par un tunnel client et dans un tunnel exploratoire ou vice versa. Normalement inférieur à 5s. Si c'est constamment +supérieur, votre PC est très lent, vous devriez retoucher vos limites de bande passante, ou il y a un problème réseau. +<a href="configstats.jsp#tunnel.testSuccessTime">[Activer le graphique]</a> (tunnel.testSuccessTime). +<li class="tidylist"><b>En attente:</b> nombre de requêtes de création de tunnels participants en attente provenant +d'autres routeurs. Normalement proche de zéro. Sinon, votre ordinateur est trop lent et vous devriez diminuer votre +limite de bande passante partagée. +<li class="tidylist"><b>Accepte/Refuse:</b> c'est le statut de votre routeur au regard de son comportement vis à vis +des demandes de création de tunnels participants provenant d'autres routeurs. Votre routeur peut accepter ou refuser +tout ou partie des requêtes, ou les refuser en totalité pour des raisons prévues telles que le contrôle de la bande +passante et des ressources CPU en vue de préserver les performances des clients locaux.</ul> + +<h2>Informations légales</h2><p>Le routeur I2P (router.jar) et le SDK (i2p.jar) sont presque entièrement dans le +domaine public, à quelques notobles exceptions près:</p><ul> +<li class="tidylist">Le code ElGamal et DSA, sous licence BSD, écrits par TheCrypto</li> +<li class="tidylist">SHA256 et HMAC-SHA256, sous licence MIT, écrits par the Legion of the Bouncycastle</li> +<li class="tidylist">Le code AES, sous licence Cryptix (MIT), écrit pas l'équipe the Cryptix</li> +<li class="tidylist">Le code SNTP, sous licence BSD, écrit par Adam Buckley</li> +<li class="tidylist">Le reste, directement issu du domaine public, est écrit par jrandom, mihi, hypercubus, oOo, + ugha, duck, shendaras, et d'autres.</li> +</ul> + +<p>Au-dessus du routeur I2P on a une série d'applications clientes, ayant chacune ses particularités en termes de +licences et de dépendances. Cette page est affichée en tant qu'élément de l'application cliente console du routeur I2P, +qui est une version allégée d'une instance <a href="http://jetty.mortbay.com/jetty/index.html">Jetty</a> (allégée en +ce que nous n'avons pas inclus les applications de démo et autres compléments, et que nous avons simplifié la +configuration), vous permettant de déployer dans votre routeur des applications web JSP/Servlet standards. De son côté +Jetty fait usage de l'implémentation javax.servlet d'Apache. Ce dispositif inclus du logiciel développé par la +fondation Apache Software (http://www.apache.org/). </p> + +<p>Une autre application visible sur cette page: <a href="http://www.i2p2.i2p/i2ptunnel">I2PTunnel</a> +(votre <a href="i2ptunnel/" target="_blank">interface web</a>) sous licence GPL écrite par mihi qui vous permet de +mettre en tunnels le trafic normal TCP/IP sur I2P (comme les proxy eep et le proxy irc). Il y a aussi un client webmail +<a href="http://susi.i2p/">susimail</a> <a href="susimail/susimail">disponible</a> dans la console, qui est sous +licence GPL et écrit par susi23. L'application carnet d'adresses, écrite par +<a href="http://ragnarok.i2p/">Ragnarok</a> gère votre fichier hosts.txt (voir ./addressbook/ pour plus de détails).</p> + +<p>Le routeur inclu aussi par défaut le pont <a href="http://www.i2p2.i2p/sam">SAM</a> du domaine public de l'humanité, +que les autres applications clientes (comme le <a href="http://duck.i2p/i2p-bt/">portage bittorrent</a>) peuvent à leur +tour utiliser. Il y a aussi une bibliothèque optimisée pour les calculs sur les grand nombres - jbigi - qui de son +côté utilise la bibliothèque sous licence LGPL <a href="http://swox.com/gmp/">GMP</a>, adaptée à diverses architectures +PC. Les lanceurs pour Windows sont faits avec <a href="http://launch4j.sourceforge.net/">Launch4J</a>, et l'installeur +avec <a href="http://www.izforge.com/izpack/">IzPack</a>. Les détails sur les autres applications disponibles comme sur +leurs licences respectives, référez-vous à notre <a href="http://www.i2p2.i2p/licenses">politique de licences</a>. +Les sources du code I2P et de la plupart des applications jointes est sur notre page de +<a href="http://www.i2p2.i2p/download_fr">téléchargements</a>. +.</p> + +<h2>Historique des évolutions</h2> + <jsp:useBean class="net.i2p.router.web.ContentHelper" id="contenthelper" scope="request" /> + <% java.io.File fpath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getBaseDir(), "history.txt"); %> + <jsp:setProperty name="contenthelper" property="page" value="<%=fpath.getAbsolutePath()%>" /> + <jsp:setProperty name="contenthelper" property="maxLines" value="256" /> + <jsp:setProperty name="contenthelper" property="startAtBeginning" value="true" /> + <jsp:getProperty name="contenthelper" property="textContent" /> + + <p><a href="/history.txt">Historique complet</a> + </p><hr></div></body></html> diff --git a/apps/routerconsole/jsp/index.jsp b/apps/routerconsole/jsp/index.jsp index 6f29573e65bf1edc8486ee6e4c3ea19534fe17f8..5aeeeea980b3ff8145644006948553153f87f002 100644 --- a/apps/routerconsole/jsp/index.jsp +++ b/apps/routerconsole/jsp/index.jsp @@ -7,9 +7,11 @@ <%=intl.title("home")%> </head><body> <% -if (System.getProperty("router.consoleNonce") == null) { - System.setProperty("router.consoleNonce", new java.util.Random().nextLong() + ""); -} + String consoleNonce = System.getProperty("router.consoleNonce"); + if (consoleNonce == null) { + consoleNonce = Long.toString(new java.util.Random().nextLong()); + System.setProperty("router.consoleNonce", consoleNonce); + } %> <%@include file="summary.jsi" %><h1><%=intl._("I2P Router Console")%></h1> @@ -26,10 +28,25 @@ if (System.getProperty("router.consoleNonce") == null) { <hr><i><jsp:getProperty name="updatehelper" property="newsStatus" /></i><br> </div><div class="main" id="main"> <jsp:useBean class="net.i2p.router.web.ContentHelper" id="contenthelper" scope="request" /> + <div class="welcome"> + <div class="langbox"> + <a href="/?lang=en&consoleNonce=<%=consoleNonce%>"><img src="/flags.jsp?c=us" title="English" alt="English"></a> + <a href="/?lang=ar&consoleNonce=<%=consoleNonce%>"><img src="/flags.jsp?c=lang_ar" title="عربية" alt="عربية"></a> + <a href="/?lang=zh&consoleNonce=<%=consoleNonce%>"><img src="/flags.jsp?c=cn" title="ä¸æ–‡" alt="ä¸æ–‡"></a> + <a href="/?lang=de&consoleNonce=<%=consoleNonce%>"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a> + <a href="/?lang=fr&consoleNonce=<%=consoleNonce%>"><img src="/flags.jsp?c=fr" title="Français" alt="Français"></a> + <a href="/?lang=es&consoleNonce=<%=consoleNonce%>"><img src="/flags.jsp?c=es" title="Español" alt="Español"></a> + <a href="/?lang=pt&consoleNonce=<%=consoleNonce%>"><img src="/flags.jsp?c=pt" title="Português" alt="Português"></a> + <a href="/?lang=nl&consoleNonce=<%=consoleNonce%>"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a> + <a href="/?lang=ru&consoleNonce=<%=consoleNonce%>"><img src="/flags.jsp?c=ru" title="РуÑÑкий" alt="РуÑÑкий"></a> + <a href="/?lang=sv&consoleNonce=<%=consoleNonce%>"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a> + </div> + <a name="top"></a> + <h2><%=intl._("Welcome to I2P")%></h2> + </div> <% fpath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getBaseDir(), "docs/readme.html"); %> <jsp:setProperty name="contenthelper" property="page" value="<%=fpath.getAbsolutePath()%>" /> <jsp:setProperty name="contenthelper" property="maxLines" value="300" /> - <jsp:setProperty name="contenthelper" property="lang" value="<%=request.getParameter("lang")%>" /> <jsp:setProperty name="contenthelper" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" /> <jsp:getProperty name="contenthelper" property="content" /> </div></body></html> diff --git a/apps/routerconsole/jsp/logs.jsp b/apps/routerconsole/jsp/logs.jsp index da33b9179c8f3d10fc19b9cb4eb06fb0a01a50f3..c2cbd2f71a7e38cfd6fa5085b33d82e033e9d2ce 100644 --- a/apps/routerconsole/jsp/logs.jsp +++ b/apps/routerconsole/jsp/logs.jsp @@ -18,7 +18,7 @@ <%=intl._("You may use the username \"guest\" and password \"guest\" if you do not wish to register.")%> <p><i><%=intl._("Please include this information in bug reports")%>:</i> <p> -<b>I2P version:</b> <jsp:getProperty name="helper" property="version" /><br> +<b>I2P version:</b> <%=net.i2p.router.RouterVersion.FULL_VERSION%><br> <b>Java version:</b> <%=System.getProperty("java.vendor")%> <%=System.getProperty("java.version")%> (<%=System.getProperty("java.runtime.name")%> <%=System.getProperty("java.runtime.version")%>)<br> <b>Platform:</b> <%=System.getProperty("os.name")%> <%=System.getProperty("os.arch")%> <%=System.getProperty("os.version")%><br> <b>Processor:</b> <%=net.i2p.util.NativeBigInteger.cpuModel()%> (<%=net.i2p.util.NativeBigInteger.cpuType()%>)<br> diff --git a/apps/routerconsole/jsp/summary.jsi b/apps/routerconsole/jsp/summary.jsi index 5a81e7af3dcd2cc457339a8b7593e211e1aa63f8..46cb366fe2713a52ff5b43021908a3713e073204 100644 --- a/apps/routerconsole/jsp/summary.jsi +++ b/apps/routerconsole/jsp/summary.jsi @@ -1,27 +1,41 @@ -<% // put width here too to prevent bad layout at startup %> -<% // let's remove that for now since we're no longer using percentage width here %> <div class="routersummaryouter"> <% - // skip the iframe if refresh disabled - String d = request.getParameter("refresh"); - String newDelay = ""; - if (d == null || "".equals(d)) - d = intl.getRefresh(); - else { - d = net.i2p.data.DataHelper.stripHTML(d); // XSS - // pass the new delay parameter to the iframe - newDelay = "?refresh=" + d; + // The refresh delay, 0 to disable + String d = "0"; + boolean allowIFrame = intl.allowIFrame(request.getHeader("User-Agent")); + if (allowIFrame) { + // skip the iframe if refresh disabled + d = request.getParameter("refresh"); + String newDelay = ""; + if (d == null || "".equals(d)) + 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"); } - if (!"0".equals(d)) - out.print("<iframe src=\"/summaryframe.jsp" + newDelay + "\" height=\"1500\" width=\"200\" scrolling=\"auto\" frameborder=\"0\" title=\"sidepanel\">\n"); %> <div class="routersummary"> +<% + if (allowIFrame) { + // Display the whole summary bar +%> <%@include file="summarynoframe.jsi" %> <% - // d defined above + } else { + // Text browsers don't render the two divs side-by-side, so just provide a link + out.print("<a href=\"/summaryframe\">"); + out.print(intl._("Summary Bar")); + out.print("</a>"); + } + + // d and allowIFrame defined above if (!"0".equals(d)) { out.print("</div></iframe>\n"); - } else { + } else if (allowIFrame) { // since we don't have an iframe this will reload the base page, and // the new delay will be passed to the iframe above out.print("<div class=\"refresh\"><form action=\"" + request.getRequestURI() + "\" method=\"POST\">\n"); @@ -34,6 +48,8 @@ out.print(intl._("Enable")); out.print("</button>\n"); out.print("</form></div></div>\n"); + } else { + out.print("</div>\n"); } %> </div> diff --git a/apps/routerconsole/jsp/summaryframe.jsp b/apps/routerconsole/jsp/summaryframe.jsp index 4b8d6b69ef86151e9c0fb4e4be720a9c8119aabf..d0eb8b72afdeb80f42aef069c92741f25a2105ea 100644 --- a/apps/routerconsole/jsp/summaryframe.jsp +++ b/apps/routerconsole/jsp/summaryframe.jsp @@ -15,7 +15,9 @@ String action = request.getParameter("action"); String d = request.getParameter("refresh"); // Normal browsers send value, IE sends button label - boolean shutdownSoon = "shutdownImmediate".equals(action) || "restartImmediate".equals(action) || + boolean allowIFrame = intl.allowIFrame(request.getHeader("User-Agent")); + boolean shutdownSoon = (!allowIFrame) || + "shutdownImmediate".equals(action) || "restartImmediate".equals(action) || "Shutdown immediately".equals(action) || "Restart immediately".equals(action); if (!shutdownSoon) { if (d == null || "".equals(d)) { @@ -59,7 +61,6 @@ 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"); @@ -70,9 +71,8 @@ } catch (NumberFormatException nfe) {} String refreshTime = net.i2p.data.DataHelper.formatDuration2(refreshMS); out.print(intl._("Disable {0} Refresh", refreshTime)); - out.print("</button></div>\n"); } - out.print("</form>\n"); + out.print("</button></form></div>\n"); } %> </div></body></html> diff --git a/apps/routerconsole/jsp/viewhistory.jsp b/apps/routerconsole/jsp/viewhistory.jsp index 14ee0bbffa644ab63c34bef0ceebe8aba0d16e66..aa3ce4d545d2a5664bc145baa587f0533e22d567 100644 --- a/apps/routerconsole/jsp/viewhistory.jsp +++ b/apps/routerconsole/jsp/viewhistory.jsp @@ -11,6 +11,13 @@ String base = net.i2p.I2PAppContext.getGlobalContext().getBaseDir().getAbsoluteP try { net.i2p.util.FileUtil.readFile("history.txt", base, response.getOutputStream()); } catch (java.io.IOException ioe) { - response.sendError(403, ioe.toString()); + // prevent 'Committed' IllegalStateException from Jetty + if (!response.isCommitted()) { + response.sendError(403, ioe.toString()); + } else { + net.i2p.I2PAppContext.getGlobalContext().logManager().getLog(getClass()).error("Error serving history.txt", ioe); + // Jetty doesn't log this + throw ioe; + } } %> \ No newline at end of file diff --git a/apps/routerconsole/jsp/viewprofile.jsp b/apps/routerconsole/jsp/viewprofile.jsp new file mode 100644 index 0000000000000000000000000000000000000000..36897d4a9aae345d19e760356554b406ca5f39b6 --- /dev/null +++ b/apps/routerconsole/jsp/viewprofile.jsp @@ -0,0 +1,30 @@ +<%@page contentType="text/html"%> +<%@page pageEncoding="UTF-8"%> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> + +<html><head> +<%@include file="css.jsi" %> +<%=intl.title("Peer Profile")%> +</head><body> +<%@include file="summary.jsi" %> +<h1><%=intl._("Peer Profile")%></h1> +<div class="main" id="main"><div class="wideload"> +<% + String peerB64 = request.getParameter("peer"); + if (peerB64 == null || peerB64.length() <= 0) { + out.print("No peer specified"); + } else { + peerB64 = net.i2p.data.DataHelper.stripHTML(peerB64); // XSS +%> +<jsp:useBean id="stathelper" class="net.i2p.router.web.StatHelper" /> +<jsp:setProperty name="stathelper" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" /> +<jsp:setProperty name="stathelper" property="peer" value="<%=peerB64%>" /> +<% stathelper.storeWriter(out); %> +<h2><%=intl._("Profile for peer {0}", peerB64)%></h2> +<pre> +<jsp:getProperty name="stathelper" property="profile" /> +</pre> +<% + } +%> +</div></div></body></html> diff --git a/apps/routerconsole/jsp/viewtheme.jsp b/apps/routerconsole/jsp/viewtheme.jsp index 723b0ec3278a1e25f0c24367968195e6ccf32bb6..ce1a6fe3807e065f58f6773f1e4afb8524130387 100644 --- a/apps/routerconsole/jsp/viewtheme.jsp +++ b/apps/routerconsole/jsp/viewtheme.jsp @@ -19,7 +19,6 @@ if (uri.endsWith(".css")) { } else if (uri.endsWith(".ico")) { response.setContentType("image/x-icon"); } -response.setHeader("Cache-Control", "max-age=86400"); // cache for a day /* * User or plugin themes * If the request is for /themes/console/foo/bar/baz, @@ -44,9 +43,33 @@ if (themePath != null) else base = net.i2p.I2PAppContext.getGlobalContext().getBaseDir().getAbsolutePath() + java.io.File.separatorChar + "docs"; +java.io.File file = new java.io.File(base, uri); +long lastmod = file.lastModified(); +if (lastmod > 0) { + long iflast = request.getDateHeader("If-Modified-Since"); + // iflast is -1 if not present; round down file time + if (iflast >= ((lastmod / 1000) * 1000)) { + response.sendError(304, "Not Modified"); + return; + } + response.setDateHeader("Last-Modified", lastmod); + // cache for a day + response.setDateHeader("Expires", net.i2p.I2PAppContext.getGlobalContext().clock().now() + 86400000l); + response.setHeader("Cache-Control", "public, max-age=86400"); +} +long length = file.length(); +if (length > 0) + response.setHeader("Content-Length", Long.toString(length)); try { net.i2p.util.FileUtil.readFile(uri, base, response.getOutputStream()); } catch (java.io.IOException ioe) { - response.sendError(403, ioe.toString()); + // prevent 'Committed' IllegalStateException from Jetty + if (!response.isCommitted()) { + response.sendError(403, ioe.toString()); + } else { + net.i2p.I2PAppContext.getGlobalContext().logManager().getLog(getClass()).error("Error serving " + uri, ioe); + // Jetty doesn't log this + throw ioe; + } } %> \ No newline at end of file diff --git a/apps/routerconsole/locale/messages_ar.po b/apps/routerconsole/locale/messages_ar.po new file mode 100644 index 0000000000000000000000000000000000000000..f66b0cd2c008e8509243fb77e34b7511480e3f61 --- /dev/null +++ b/apps/routerconsole/locale/messages_ar.po @@ -0,0 +1,5466 @@ +# I2P +# Copyright (C) 2009 The I2P Project +# This file is distributed under the same license as the routerconsole package. +# To contribute translations, see http://www.i2p2.de/newdevelopers +# foo <foo@bar>, 2009. +# Ahmed Mansour <atphalix@inbox.com>, 2011. +# hamada <hamada@mail.i2p>, 2011. +msgid "" +msgstr "" +"Project-Id-Version: I2P routerconsole\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-03-03 18:27+0000\n" +"PO-Revision-Date: 2011-03-04 14:02-0000\n" +"Last-Translator: hamada <hamada@mail.i2p>\n" +"Language-Team: hamada@mail.i2p\n" +"Language: ar\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" +"X-Generator: Virtaal 0.6.1\n" + +#. NOTE TO TRANSLATORS: Feel free to translate all these as you see fit, there are several options... +#. spaces or not, '.' or not, plural or not. Try not to make it too long, it is used in +#. a lot of tables. +#. milliseconds +#. Note to translators, may be negative or zero, 2999 maximum. +#. {0,number,####} prevents 1234 from being output as 1,234 in the English locale. +#. If you want the digit separator in your locale, translate as {0}. +#. alternates: msec, msecs +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1141 +#, java-format +msgid "1 ms" +msgid_plural "{0,number,####} ms" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#. seconds +#. Note to translators: quantity will always be greater than one. +#. alternates: secs, sec. 'seconds' is probably too long. +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1146 +#, java-format +msgid "1 sec" +msgid_plural "{0} sec" +msgstr[0] "" +msgstr[1] "" + +#. minutes +#. Note to translators: quantity will always be greater than one. +#. alternates: mins, min. 'minutes' is probably too long. +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1151 +#, java-format +msgid "1 min" +msgid_plural "{0} min" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#. hours +#. Note to translators: quantity will always be greater than one. +#. alternates: hrs, hr., hrs. +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1156 +#, java-format +msgid "1 hour" +msgid_plural "{0} hours" +msgstr[0] "" +msgstr[1] "{0} ساعات" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1158 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:313 +msgid "n/a" +msgstr "" + +#. days +#. Note to translators: quantity will always be greater than one. +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1162 +#, java-format +msgid "1 day" +msgid_plural "{0} days" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: ../../../router/java/src/net/i2p/router/Blocklist.java:122 +#, java-format +msgid "Banned by router hash: {0}" +msgstr "ممنوع من طر٠الموجه: {0}" + +#: ../../../router/java/src/net/i2p/router/Blocklist.java:124 +msgid "Banned by router hash" +msgstr "ممنوع من طر٠الموجه" + +#. Temporary reason, until the job finishes +#: ../../../router/java/src/net/i2p/router/Blocklist.java:669 +msgid "IP banned" +msgstr "IP ممنوع" + +#: ../../../router/java/src/net/i2p/router/Blocklist.java:739 +#, java-format +msgid "IP banned by blocklist.txt entry {0}" +msgstr " {0} عنوان ممنوع" + +#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:92 +msgid "Rejecting tunnels: Shutting down" +msgstr "جاري التوقيÙ" + +#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:141 +msgid "Rejecting tunnels: High message delay" +msgstr "توقي٠الأنÙاق" + +#. hard to do {0} from here +#. setTunnelStatus("Rejecting " + (100 - (int) probAccept*100) + "% of tunnels: High number of requests"); +#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:177 +msgid "Rejecting most tunnels: High number of requests" +msgstr "توقي٠غالبية الأنÙاق : " + +#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:233 +msgid "Rejecting tunnels: Limit reached" +msgstr "رÙض الانÙاق: وصل الى الØد" + +#. .067KBps +#. * also limited to 90% - see below +#. always leave at least 4KBps free when allowing +#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:301 +msgid "Rejecting tunnels: Bandwidth limit" +msgstr "رÙض الانÙاق: وصل Øد سرعة الاتصال" + +#. hard to do {0} from here +#. setTunnelStatus("Rejecting " + ((int)(100.0*probReject)) + "% of tunnels: Bandwidth limit"); +#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:371 +msgid "Rejecting most tunnels: Bandwidth limit" +msgstr "رÙض غالبية الانÙاق: وصل Øد سرعة الاتصال" + +#. hard to do {0} from here +#. setTunnelStatus("Accepting " + (100-(int)(100.0*probReject)) + "% of tunnels"); +#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:375 +msgid "Accepting most tunnels" +msgstr "قبول غالبية الأنÙاق" + +#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:377 +msgid "Accepting tunnels" +msgstr "قبول الأنÙاق" + +#. NPE, too early +#. if (_context.router().getRouterInfo().getBandwidthTier().equals("K")) +#. setTunnelStatus("Not expecting tunnel requests: Advertised bandwidth too low"); +#. else +#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:488 +msgid "Rejecting tunnels" +msgstr "رÙض الأنÙاق" + +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:105 +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:20 +msgid "Reseeding" +msgstr "اعادة التوزيع" + +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:128 +#, java-format +msgid "Reseed fetched only 1 router." +msgid_plural "Reseed fetched only {0} routers." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:135 +msgid "Reseed failed." +msgstr "Ùشل اعادة التوزيع" + +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:136 +#, java-format +msgid "See {0} for help." +msgstr "" + +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:137 +msgid "reseed configuration page" +msgstr "تم ØÙظ اعدادات اعادة التوزيع" + +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:239 +msgid "Reseeding: fetching seed URL." +msgstr "اعادة التوزيع: تØميل العنوان" + +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:281 +#, java-format +msgid "Reseeding: fetching router info from seed URL ({0} successful, {1} errors)." +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:512 +msgid "NetDb entry" +msgstr "" + +#. This used to be "no common transports" but it is almost always no transports at all +#: ../../../router/java/src/net/i2p/router/transport/GetBidsJob.java:70 +msgid "No transports (hidden or starting up?)" +msgstr "ï»» وسائل النقل (مخÙية أو جاري البدء؟)" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:450 +msgid "Unreachable on any transport" +msgstr "صعب الوصول بأية وسيلة" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:499 +msgid "Router Transport Addresses" +msgstr "عموان الموجه للنقل" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:504 +#, java-format +msgid "{0} is used for outbound connections only" +msgstr "{0} مستعملة للاتصال الخارجي Ùقط" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:518 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:123 +msgid "Help" +msgstr "مساعدة" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:519 +msgid "Your transport connection limits are automatically set based on your configured bandwidth." +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:521 +msgid "To override these limits, add the settings i2np.ntcp.maxConnections=nnn and i2np.udp.maxConnections=nnn on the advanced configuration page." +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:523 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:257 +msgid "Definitions" +msgstr "التعاريÙ" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:735 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1890 +#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:24 +#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:33 +#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:35 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:81 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:187 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:238 +msgid "Peer" +msgstr "مستخدم" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524 +msgid "The remote peer, identified by router hash" +msgstr "النظير البعيد" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:525 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:736 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1894 +msgid "Dir" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:526 +msgid "Inbound connection" +msgstr "اتصال داخلي" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:528 +msgid "Outbound connection" +msgstr "اتصال خارجي" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:530 +msgid "They offered to introduce us (help other peers traverse our firewall)" +msgstr "ساعد المستخدمين الآخرين ÙÙŠ عبور الجدار الناري" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:532 +msgid "We offered to introduce them (help other peers traverse their firewall)" +msgstr "عرضنا لمساعدتهم (مساعدة أقرانه الآخرين من اجتياز جدار الØماية)" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533 +msgid "How long since a packet has been received / sent" +msgstr "مدة تلقى / بعث Øزمة " + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:737 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1895 +msgid "Idle" +msgstr "خامل" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:738 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1900 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:156 +msgid "In/Out" +msgstr "داخل/خارج" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534 +msgid "The smoothed inbound / outbound transfer rate (KBytes per second)" +msgstr "سرعة الداخلة / الخارجة للتØويل (KBytes ÙÙŠ الثانية)" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535 +msgid "How long ago this connection was established" +msgstr "مدة استمرار هذا الاتصال" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:739 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1905 +msgid "Up" +msgstr "Ùوق" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:740 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1907 +msgid "Skew" +msgstr "الانØراÙ" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536 +msgid "The difference between the peer's clock and your own" +msgstr "الÙرق بين ساعة النظير Ùˆ ساعتك" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537 +msgid "The congestion window, which is how many bytes can be sent without an acknowledgement" +msgstr "ناÙذة الازدØام، هي كمية المرسلة دون ازدØام" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538 +msgid "The number of sent messages awaiting acknowledgement" +msgstr "عدد الرسائل المرسلة التي تنتظر المواÙقة" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539 +msgid "The maximum number of concurrent messages to send" +msgstr "الØد الأقصى لعدد الرسائل المتزامنة الارسال" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:540 +msgid "The number of pending sends which exceed congestion window" +msgstr "عدد المرسلات التي تتجاوز إطار الازدØام" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541 +msgid "The slow start threshold" +msgstr "عتبة بداية بطيئة" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:542 +msgid "The round trip time in milliseconds" +msgstr "الوقت الذهاب وإياب ÙÙŠ جزء ثانية" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1917 +msgid "Dev" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543 +msgid "The standard deviation of the round trip time in milliseconds" +msgstr "انØرا٠الوقت الذهاب وإياب ÙÙŠ جزء ثانية" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544 +msgid "The retransmit timeout in milliseconds" +msgstr "اعادة الارسال ÙÙŠ جزء ثانية" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545 +msgid "Current maximum send packet size / estimated maximum receive packet size (bytes)" +msgstr "الØد الأقصى الØالي إرسال Øجم الØزمة" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:741 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1924 +msgid "TX" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546 +msgid "The total number of packets sent to the peer" +msgstr "العدد الاجمالي للØزم المرسلة الى المستخدم" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:742 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1926 +msgid "RX" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547 +msgid "The total number of packets received from the peer" +msgstr "العدد الاجمالي للØزم المستقبلة" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1929 +msgid "Dup TX" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548 +msgid "The total number of packets retransmitted to the peer" +msgstr "العدد الاجمالي للØزم المرسلة الى النظائر" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1931 +msgid "Dup RX" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549 +msgid "The total number of duplicate packets received from the peer" +msgstr "إجمالي عدد الØزم المكررة الواردة من الزملاء" + +#: ../../../router/java/src/net/i2p/router/transport/ntcp/EstablishState.java:409 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/EstablishState.java:627 +#, java-format +msgid "Excessive clock skew: {0}" +msgstr "درجة انØرا٠الساعة: {0}" + +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:730 +msgid "NTCP connections" +msgstr "اتصال NTCP" + +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:731 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1886 +msgid "Limit" +msgstr "Øد" + +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:732 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1887 +msgid "Timeout" +msgstr "انتهى الوقت" + +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:743 +msgid "Out Queue" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:744 +msgid "Backlogged?" +msgstr "السجلات" + +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:758 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1949 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82 +msgid "Inbound" +msgstr "الداخل" + +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:760 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1951 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82 +msgid "Outbound" +msgstr "الخارج" + +#. buf.append("<tr> <td colspan=\"11\"><hr></td></tr>\n"); +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:807 +msgid "peers" +msgstr "نظير" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1885 +msgid "UDP connections" +msgstr "اتصال UDP" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1892 +msgid "Sort by peer hash" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1894 +msgid "Direction/Introduction" +msgstr "اتجاه/تقديم" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1896 +msgid "Sort by idle inbound" +msgstr "Øسب الاتصاب الوارد" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1898 +msgid "Sort by idle outbound" +msgstr "Øسب الاتصال الخارج" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1901 +msgid "Sort by inbound rate" +msgstr "Øسب معدل الداخل" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1903 +msgid "Sort by outbound rate" +msgstr "Øسب معدل الصادرة" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1906 +msgid "Sort by connection uptime" +msgstr "Øسب مدة الاتصال" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1908 +msgid "Sort by clock skew" +msgstr "Øسب انØرا٠الساعة" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1911 +msgid "Sort by congestion window" +msgstr "Øسب ناÙذة الازدØام" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1913 +msgid "Sort by slow start threshold" +msgstr "Øسب مدة الانطلاق" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1916 +msgid "Sort by round trip time" +msgstr "Øسب الوقت ذهابا وإيابا" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1918 +msgid "Sort by round trip time deviation" +msgstr "Øسب الوقت ذهابا وإيابا" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1920 +msgid "Sort by retransmission timeout" +msgstr "Øسب مهلة إعادة الإرسال" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1923 +msgid "Sort by outbound maximum transmit unit" +msgstr "Øسب أقصى مدة" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1925 +msgid "Sort by packets sent" +msgstr "Øسب الØزم المرسلة" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1927 +msgid "Sort by packets received" +msgstr "Øسب الØزم المستقبلة" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1930 +msgid "Sort by packets retransmitted" +msgstr "Øسب الØزم المعاد ارسالها" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1932 +msgid "Sort by packets received more than once" +msgstr "Øسب الØزم المستقبلة اكثر من مرة" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1953 +msgid "We offered to introduce them" +msgstr "عرضنا لتعريÙهم" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1955 +msgid "They offered to introduce us" +msgstr "عرصو علينا تقديمهم" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1959 +msgid "Choked" +msgstr "اختنق" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1967 +msgid "1 fail" +msgstr "Ùشل واØد" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1969 +#, java-format +msgid "{0} fails" +msgstr "{0} Ùشل" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1975 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:162 +msgid "Banned" +msgstr "ممنوع" + +#. buf.append("<tr><td colspan=\"16\"><hr></td></tr>\n"); +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2106 +msgid "SUMMARY" +msgstr "ملخص" + +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:124 +msgid "Dropping tunnel requests: Too slow" +msgstr "تجاوز النÙÙ‚: بطيئ جدا" + +#. don't even bother, since we are so overloaded locally +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:267 +msgid "Dropping tunnel requests: Overloaded" +msgstr "تجاوز النÙÙ‚: ازدØام" + +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:460 +msgid "Rejecting tunnels: Request overload" +msgstr "تجاوز النÙÙ‚: ازدØام" + +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:485 +msgid "Rejecting tunnels: Connection limit" +msgstr "تجاوز النÙÙ‚: Øد الاتصال" + +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:685 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:706 +msgid "Dropping tunnel requests: High load" +msgstr "تجاوز النÙÙ‚: ازدØام كبير" + +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:698 +msgid "Dropping tunnel requests: Queue time" +msgstr "تجاوز النÙÙ‚: وقت الانتظار" + +#. Automatically generated pseudo-java for xgettext - do not edit +#. Translators may wish to translate a few of these, do not bother to translate all of them!! +#: ../java/build/Countries.java:3 +msgid "Andorra" +msgstr "" + +#: ../java/build/Countries.java:4 +msgid "United Arab Emirates" +msgstr "" + +#: ../java/build/Countries.java:5 +msgid "Afghanistan" +msgstr "" + +#: ../java/build/Countries.java:6 +msgid "Antigua and Barbuda" +msgstr "" + +#: ../java/build/Countries.java:7 +msgid "Anguilla" +msgstr "" + +#: ../java/build/Countries.java:8 +msgid "Albania" +msgstr "" + +#: ../java/build/Countries.java:9 +msgid "Armenia" +msgstr "" + +#: ../java/build/Countries.java:10 +msgid "Netherlands Antilles" +msgstr "" + +#: ../java/build/Countries.java:11 +msgid "Angola" +msgstr "" + +#: ../java/build/Countries.java:12 +msgid "Antarctica" +msgstr "" + +#: ../java/build/Countries.java:13 +msgid "Argentina" +msgstr "" + +#: ../java/build/Countries.java:14 +msgid "American Samoa" +msgstr "" + +#: ../java/build/Countries.java:15 +msgid "Austria" +msgstr "" + +#: ../java/build/Countries.java:16 +msgid "Australia" +msgstr "" + +#: ../java/build/Countries.java:17 +msgid "Aruba" +msgstr "" + +#: ../java/build/Countries.java:19 +msgid "Azerbaijan" +msgstr "" + +#: ../java/build/Countries.java:20 +msgid "Bosnia and Herzegovina" +msgstr "" + +#: ../java/build/Countries.java:21 +msgid "Barbados" +msgstr "" + +#: ../java/build/Countries.java:22 +msgid "Bangladesh" +msgstr "" + +#: ../java/build/Countries.java:23 +msgid "Belgium" +msgstr "" + +#: ../java/build/Countries.java:24 +msgid "Burkina Faso" +msgstr "" + +#: ../java/build/Countries.java:25 +msgid "Bulgaria" +msgstr "" + +#: ../java/build/Countries.java:26 +msgid "Bahrain" +msgstr "" + +#: ../java/build/Countries.java:27 +msgid "Burundi" +msgstr "" + +#: ../java/build/Countries.java:28 +msgid "Benin" +msgstr "" + +#: ../java/build/Countries.java:29 +msgid "Bermuda" +msgstr "" + +#: ../java/build/Countries.java:30 +msgid "Brunei Darussalam" +msgstr "" + +#: ../java/build/Countries.java:31 +msgid "Bolivia" +msgstr "" + +#: ../java/build/Countries.java:32 +msgid "Brazil" +msgstr "" + +#: ../java/build/Countries.java:33 +msgid "Bahamas" +msgstr "" + +#: ../java/build/Countries.java:34 +msgid "Bhutan" +msgstr "" + +#: ../java/build/Countries.java:35 +msgid "Bouvet Island" +msgstr "" + +#: ../java/build/Countries.java:36 +msgid "Botswana" +msgstr "" + +#: ../java/build/Countries.java:37 +msgid "Belarus" +msgstr "" + +#: ../java/build/Countries.java:38 +msgid "Belize" +msgstr "" + +#: ../java/build/Countries.java:39 +msgid "Canada" +msgstr "" + +#: ../java/build/Countries.java:40 +msgid "The Democratic Republic of the Congo" +msgstr "" + +#: ../java/build/Countries.java:41 +msgid "Central African Republic" +msgstr "" + +#: ../java/build/Countries.java:42 +msgid "Congo" +msgstr "" + +#: ../java/build/Countries.java:43 +msgid "Switzerland" +msgstr "" + +#: ../java/build/Countries.java:44 +msgid "Cote D'Ivoire" +msgstr "" + +#: ../java/build/Countries.java:45 +msgid "Cook Islands" +msgstr "" + +#: ../java/build/Countries.java:46 +msgid "Chile" +msgstr "" + +#: ../java/build/Countries.java:47 +msgid "Cameroon" +msgstr "" + +#: ../java/build/Countries.java:48 +msgid "China" +msgstr "" + +#: ../java/build/Countries.java:49 +msgid "Colombia" +msgstr "" + +#: ../java/build/Countries.java:50 +msgid "Costa Rica" +msgstr "" + +#: ../java/build/Countries.java:51 +msgid "Serbia and Montenegro" +msgstr "" + +#: ../java/build/Countries.java:52 +msgid "Cuba" +msgstr "" + +#: ../java/build/Countries.java:53 +msgid "Cape Verde" +msgstr "" + +#: ../java/build/Countries.java:54 +msgid "Cyprus" +msgstr "" + +#: ../java/build/Countries.java:55 +msgid "Czech Republic" +msgstr "" + +#: ../java/build/Countries.java:56 +msgid "Germany" +msgstr "" + +#: ../java/build/Countries.java:57 +msgid "Djibouti" +msgstr "" + +#: ../java/build/Countries.java:58 +msgid "Denmark" +msgstr "" + +#: ../java/build/Countries.java:59 +msgid "Dominica" +msgstr "" + +#: ../java/build/Countries.java:60 +msgid "Dominican Republic" +msgstr "" + +#: ../java/build/Countries.java:61 +msgid "Algeria" +msgstr "" + +#: ../java/build/Countries.java:62 +msgid "Ecuador" +msgstr "" + +#: ../java/build/Countries.java:63 +msgid "Estonia" +msgstr "" + +#: ../java/build/Countries.java:64 +msgid "Egypt" +msgstr "" + +#: ../java/build/Countries.java:65 +msgid "Eritrea" +msgstr "" + +#: ../java/build/Countries.java:66 +msgid "Spain" +msgstr "" + +#: ../java/build/Countries.java:67 +msgid "Ethiopia" +msgstr "" + +#: ../java/build/Countries.java:68 +msgid "Finland" +msgstr "" + +#: ../java/build/Countries.java:69 +msgid "Fiji" +msgstr "" + +#: ../java/build/Countries.java:70 +msgid "Falkland Islands (Malvinas)" +msgstr "" + +#: ../java/build/Countries.java:71 +msgid "Federated States of Micronesia" +msgstr "" + +#: ../java/build/Countries.java:72 +msgid "Faroe Islands" +msgstr "" + +#: ../java/build/Countries.java:73 +msgid "France" +msgstr "" + +#: ../java/build/Countries.java:74 +msgid "Gabon" +msgstr "" + +#: ../java/build/Countries.java:75 +msgid "United Kingdom" +msgstr "" + +#: ../java/build/Countries.java:76 +msgid "Grenada" +msgstr "" + +#: ../java/build/Countries.java:77 +msgid "Georgia" +msgstr "" + +#: ../java/build/Countries.java:78 +msgid "French Guiana" +msgstr "" + +#: ../java/build/Countries.java:79 +msgid "Ghana" +msgstr "" + +#: ../java/build/Countries.java:80 +msgid "Gibraltar" +msgstr "" + +#: ../java/build/Countries.java:81 +msgid "Greenland" +msgstr "" + +#: ../java/build/Countries.java:82 +msgid "Gambia" +msgstr "" + +#: ../java/build/Countries.java:83 +msgid "Guinea" +msgstr "" + +#: ../java/build/Countries.java:84 +msgid "Guadeloupe" +msgstr "" + +#: ../java/build/Countries.java:85 +msgid "Equatorial Guinea" +msgstr "" + +#: ../java/build/Countries.java:86 +msgid "Greece" +msgstr "" + +#: ../java/build/Countries.java:87 +msgid "South Georgia and the South Sandwich Islands" +msgstr "" + +#: ../java/build/Countries.java:88 +msgid "Guatemala" +msgstr "" + +#: ../java/build/Countries.java:89 +msgid "Guam" +msgstr "" + +#: ../java/build/Countries.java:90 +msgid "Guinea-Bissau" +msgstr "" + +#: ../java/build/Countries.java:91 +msgid "Guyana" +msgstr "" + +#: ../java/build/Countries.java:92 +msgid "Hong Kong" +msgstr "" + +#: ../java/build/Countries.java:93 +msgid "Honduras" +msgstr "" + +#: ../java/build/Countries.java:94 +msgid "Croatia" +msgstr "" + +#: ../java/build/Countries.java:95 +msgid "Haiti" +msgstr "" + +#: ../java/build/Countries.java:96 +msgid "Hungary" +msgstr "" + +#: ../java/build/Countries.java:97 +msgid "Indonesia" +msgstr "" + +#: ../java/build/Countries.java:98 +msgid "Ireland" +msgstr "" + +#: ../java/build/Countries.java:99 +msgid "Israel" +msgstr "" + +#: ../java/build/Countries.java:101 +msgid "India" +msgstr "" + +#: ../java/build/Countries.java:102 +msgid "British Indian Ocean Territory" +msgstr "" + +#: ../java/build/Countries.java:103 +msgid "Iraq" +msgstr "" + +#: ../java/build/Countries.java:104 +msgid "Islamic Republic of Iran" +msgstr "" + +#: ../java/build/Countries.java:105 +msgid "Iceland" +msgstr "" + +#: ../java/build/Countries.java:106 +msgid "Italy" +msgstr "" + +#: ../java/build/Countries.java:108 +msgid "Jamaica" +msgstr "" + +#: ../java/build/Countries.java:109 +msgid "Jordan" +msgstr "" + +#: ../java/build/Countries.java:110 +msgid "Japan" +msgstr "" + +#: ../java/build/Countries.java:111 +msgid "Kenya" +msgstr "" + +#: ../java/build/Countries.java:112 +msgid "Kyrgyzstan" +msgstr "" + +#: ../java/build/Countries.java:113 +msgid "Cambodia" +msgstr "" + +#: ../java/build/Countries.java:114 +msgid "Kiribati" +msgstr "" + +#: ../java/build/Countries.java:115 +msgid "Comoros" +msgstr "" + +#: ../java/build/Countries.java:116 +msgid "Saint Kitts and Nevis" +msgstr "" + +#: ../java/build/Countries.java:117 +msgid "Republic of Korea" +msgstr "" + +#: ../java/build/Countries.java:118 +msgid "Kuwait" +msgstr "" + +#: ../java/build/Countries.java:119 +msgid "Cayman Islands" +msgstr "" + +#: ../java/build/Countries.java:120 +msgid "Kazakhstan" +msgstr "" + +#: ../java/build/Countries.java:121 +msgid "Lao People's Democratic Republic" +msgstr "" + +#: ../java/build/Countries.java:122 +msgid "Lebanon" +msgstr "" + +#: ../java/build/Countries.java:123 +msgid "Saint Lucia" +msgstr "" + +#: ../java/build/Countries.java:124 +msgid "Liechtenstein" +msgstr "" + +#: ../java/build/Countries.java:125 +msgid "Sri Lanka" +msgstr "" + +#: ../java/build/Countries.java:126 +msgid "Liberia" +msgstr "" + +#: ../java/build/Countries.java:127 +msgid "Lesotho" +msgstr "" + +#: ../java/build/Countries.java:128 +msgid "Lithuania" +msgstr "" + +#: ../java/build/Countries.java:129 +msgid "Luxembourg" +msgstr "" + +#: ../java/build/Countries.java:130 +msgid "Latvia" +msgstr "" + +#: ../java/build/Countries.java:131 +msgid "Libyan Arab Jamahiriya" +msgstr "" + +#: ../java/build/Countries.java:132 +msgid "Morocco" +msgstr "" + +#: ../java/build/Countries.java:133 +msgid "Monaco" +msgstr "" + +#: ../java/build/Countries.java:134 +msgid "Republic of Moldova" +msgstr "" + +#: ../java/build/Countries.java:137 +msgid "Madagascar" +msgstr "" + +#: ../java/build/Countries.java:138 +msgid "Marshall Islands" +msgstr "" + +#: ../java/build/Countries.java:139 +msgid "The Former Yugoslav Republic of Macedonia" +msgstr "" + +#: ../java/build/Countries.java:140 +msgid "Mali" +msgstr "" + +#: ../java/build/Countries.java:141 +msgid "Myanmar" +msgstr "" + +#: ../java/build/Countries.java:142 +msgid "Mongolia" +msgstr "" + +#: ../java/build/Countries.java:143 +msgid "Macao" +msgstr "" + +#: ../java/build/Countries.java:144 +msgid "Northern Mariana Islands" +msgstr "" + +#: ../java/build/Countries.java:145 +msgid "Martinique" +msgstr "" + +#: ../java/build/Countries.java:146 +msgid "Mauritania" +msgstr "" + +#: ../java/build/Countries.java:147 +msgid "Montserrat" +msgstr "" + +#: ../java/build/Countries.java:148 +msgid "Malta" +msgstr "" + +#: ../java/build/Countries.java:149 +msgid "Mauritius" +msgstr "" + +#: ../java/build/Countries.java:150 +msgid "Maldives" +msgstr "" + +#: ../java/build/Countries.java:151 +msgid "Malawi" +msgstr "" + +#: ../java/build/Countries.java:152 +msgid "Mexico" +msgstr "" + +#: ../java/build/Countries.java:153 +msgid "Malaysia" +msgstr "" + +#: ../java/build/Countries.java:154 +msgid "Mozambique" +msgstr "" + +#: ../java/build/Countries.java:155 +msgid "Namibia" +msgstr "" + +#: ../java/build/Countries.java:156 +msgid "New Caledonia" +msgstr "" + +#: ../java/build/Countries.java:157 +msgid "Niger" +msgstr "" + +#: ../java/build/Countries.java:158 +msgid "Norfolk Island" +msgstr "" + +#: ../java/build/Countries.java:159 +msgid "Nigeria" +msgstr "" + +#: ../java/build/Countries.java:160 +msgid "Nicaragua" +msgstr "" + +#: ../java/build/Countries.java:161 +msgid "Netherlands" +msgstr "" + +#: ../java/build/Countries.java:162 +msgid "Norway" +msgstr "" + +#: ../java/build/Countries.java:163 +msgid "Nepal" +msgstr "" + +#: ../java/build/Countries.java:164 +msgid "Nauru" +msgstr "" + +#: ../java/build/Countries.java:165 +msgid "Niue" +msgstr "" + +#: ../java/build/Countries.java:166 +msgid "New Zealand" +msgstr "" + +#: ../java/build/Countries.java:167 +msgid "Oman" +msgstr "" + +#: ../java/build/Countries.java:168 +msgid "Panama" +msgstr "" + +#: ../java/build/Countries.java:169 +msgid "Peru" +msgstr "" + +#: ../java/build/Countries.java:170 +msgid "French Polynesia" +msgstr "" + +#: ../java/build/Countries.java:171 +msgid "Papua New Guinea" +msgstr "" + +#: ../java/build/Countries.java:172 +msgid "Philippines" +msgstr "" + +#: ../java/build/Countries.java:173 +msgid "Pakistan" +msgstr "" + +#: ../java/build/Countries.java:174 +msgid "Poland" +msgstr "" + +#: ../java/build/Countries.java:175 +msgid "Saint Pierre and Miquelon" +msgstr "" + +#: ../java/build/Countries.java:176 +msgid "Puerto Rico" +msgstr "" + +#: ../java/build/Countries.java:177 +msgid "Palestinian Territory" +msgstr "" + +#: ../java/build/Countries.java:178 +msgid "Portugal" +msgstr "" + +#: ../java/build/Countries.java:179 +msgid "Palau" +msgstr "" + +#: ../java/build/Countries.java:180 +msgid "Paraguay" +msgstr "" + +#: ../java/build/Countries.java:181 +msgid "Qatar" +msgstr "" + +#: ../java/build/Countries.java:182 +msgid "Reunion" +msgstr "" + +#: ../java/build/Countries.java:183 +msgid "Romania" +msgstr "" + +#: ../java/build/Countries.java:184 +msgid "Serbia" +msgstr "" + +#: ../java/build/Countries.java:185 +msgid "Russian Federation" +msgstr "" + +#: ../java/build/Countries.java:186 +msgid "Rwanda" +msgstr "" + +#: ../java/build/Countries.java:187 +msgid "Saudi Arabia" +msgstr "" + +#: ../java/build/Countries.java:188 +msgid "Solomon Islands" +msgstr "" + +#: ../java/build/Countries.java:189 +msgid "Seychelles" +msgstr "" + +#: ../java/build/Countries.java:190 +msgid "Sudan" +msgstr "" + +#: ../java/build/Countries.java:191 +msgid "Sweden" +msgstr "" + +#: ../java/build/Countries.java:192 +msgid "Singapore" +msgstr "" + +#: ../java/build/Countries.java:193 +msgid "Slovenia" +msgstr "" + +#: ../java/build/Countries.java:194 +msgid "Slovakia" +msgstr "" + +#: ../java/build/Countries.java:195 +msgid "Sierra Leone" +msgstr "" + +#: ../java/build/Countries.java:196 +msgid "San Marino" +msgstr "" + +#: ../java/build/Countries.java:197 +msgid "Senegal" +msgstr "" + +#: ../java/build/Countries.java:198 +msgid "Somalia" +msgstr "" + +#: ../java/build/Countries.java:199 +msgid "Suriname" +msgstr "" + +#: ../java/build/Countries.java:200 +msgid "Sao Tome and Principe" +msgstr "" + +#: ../java/build/Countries.java:201 +msgid "El Salvador" +msgstr "" + +#: ../java/build/Countries.java:202 +msgid "Syrian Arab Republic" +msgstr "" + +#: ../java/build/Countries.java:203 +msgid "Swaziland" +msgstr "" + +#: ../java/build/Countries.java:204 +msgid "Turks and Caicos Islands" +msgstr "" + +#: ../java/build/Countries.java:205 +msgid "Chad" +msgstr "" + +#: ../java/build/Countries.java:206 +msgid "French Southern Territories" +msgstr "" + +#: ../java/build/Countries.java:207 +msgid "Togo" +msgstr "" + +#: ../java/build/Countries.java:208 +msgid "Thailand" +msgstr "" + +#: ../java/build/Countries.java:209 +msgid "Tajikistan" +msgstr "" + +#: ../java/build/Countries.java:210 +msgid "Tokelau" +msgstr "" + +#: ../java/build/Countries.java:211 +msgid "Timor-Leste" +msgstr "" + +#: ../java/build/Countries.java:212 +msgid "Turkmenistan" +msgstr "" + +#: ../java/build/Countries.java:213 +msgid "Tunisia" +msgstr "" + +#: ../java/build/Countries.java:214 +msgid "Tonga" +msgstr "" + +#: ../java/build/Countries.java:215 +msgid "Turkey" +msgstr "" + +#: ../java/build/Countries.java:216 +msgid "Trinidad and Tobago" +msgstr "" + +#: ../java/build/Countries.java:217 +msgid "Tuvalu" +msgstr "" + +#: ../java/build/Countries.java:218 +msgid "Taiwan" +msgstr "" + +#: ../java/build/Countries.java:219 +msgid "United Republic of Tanzania" +msgstr "" + +#: ../java/build/Countries.java:220 +msgid "Ukraine" +msgstr "" + +#: ../java/build/Countries.java:221 +msgid "Uganda" +msgstr "" + +#: ../java/build/Countries.java:222 +msgid "United States Minor Outlying Islands" +msgstr "" + +#: ../java/build/Countries.java:223 +msgid "United States" +msgstr "" + +#: ../java/build/Countries.java:224 +msgid "Uruguay" +msgstr "" + +#: ../java/build/Countries.java:225 +msgid "Uzbekistan" +msgstr "" + +#: ../java/build/Countries.java:226 +msgid "Holy See (Vatican City State)" +msgstr "" + +#: ../java/build/Countries.java:227 +msgid "Saint Vincent and the Grenadines" +msgstr "" + +#: ../java/build/Countries.java:228 +msgid "Venezuela" +msgstr "" + +#: ../java/build/Countries.java:229 +#: ../java/build/Countries.java:230 +msgid "Virgin Islands" +msgstr "" + +#: ../java/build/Countries.java:231 +msgid "Viet Nam" +msgstr "" + +#: ../java/build/Countries.java:232 +msgid "Vanuatu" +msgstr "" + +#: ../java/build/Countries.java:233 +msgid "Wallis and Futuna" +msgstr "" + +#: ../java/build/Countries.java:234 +msgid "Samoa" +msgstr "" + +#: ../java/build/Countries.java:235 +msgid "Yemen" +msgstr "" + +#: ../java/build/Countries.java:236 +msgid "Mayotte" +msgstr "" + +#: ../java/build/Countries.java:237 +msgid "South Africa" +msgstr "" + +#: ../java/build/Countries.java:238 +msgid "Zambia" +msgstr "" + +#: ../java/build/Countries.java:239 +msgid "Zimbabwe" +msgstr "" + +#: ../java/src/net/i2p/router/web/CSSHelper.java:58 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:35 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:37 +#: ../java/strings/Strings.java:29 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:119 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:233 +msgid "I2P Router Console" +msgstr "مركز تØكم I2P" + +#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:57 +msgid "Error updating the configuration - please see the error logs" +msgstr "خطأ ÙÙŠ ترقية الإعدادات - انظر التÙاصيل" + +#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:69 +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:266 +msgid "Configuration saved successfully" +msgstr "تم ØÙظ الإعدادات بنجاØ" + +#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:71 +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:268 +msgid "Error saving the configuration (applied but not saved) - please see the error logs" +msgstr "خطأ ÙÙŠ تسجيل الاعدادات" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:35 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:335 +msgid "Save Client Configuration" +msgstr "ØÙظ اعدادات المستخدم" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:39 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:405 +msgid "Save Interface Configuration" +msgstr "ØÙظ اعدادات الواجهة" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:43 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:417 +msgid "Save WebApp Configuration" +msgstr "ØÙظ اعدادات تطبيق الويب" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:47 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:427 +msgid "Save Plugin Configuration" +msgstr "ØÙظ اعدادات الملØÙ‚" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:51 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:433 +msgid "Install Plugin" +msgstr "تثبيت الملØÙ‚" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:87 +#, java-format +msgid "Deleted plugin {0}" +msgstr "تم Øذ٠الملØÙ‚ {0}" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:89 +#, java-format +msgid "Error deleting plugin {0}" +msgstr "خطأ ÙÙŠ Øذ٠الملØÙ‚ {0}" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:101 +#, java-format +msgid "Stopped plugin {0}" +msgstr "توقي٠الملØÙ‚ {0}" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:103 +#, java-format +msgid "Error stopping plugin {0}" +msgstr "خطأ ÙÙŠ توقي٠الملØÙ‚ {0}" + +#. label (IE) +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:124 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:255 +msgid "Start" +msgstr "إبدأ" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:143 +#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:49 +#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:61 +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:33 +msgid "Unsupported" +msgstr "غير مدعومة" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:189 +msgid "New client added" +msgstr "اضاÙØ© مستخدم جديد" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:193 +msgid "Client configuration saved successfully - restart required to take effect." +msgstr "تم ØÙظ العدادات Ø¨Ù†Ø¬Ø§Ø - يجب اعادة التشغيل لأخذها بالاعتبار" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:207 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:218 +msgid "Bad client index." +msgstr " مؤشر سيء للعميل." + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:212 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:223 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:397 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:384 +msgid "Client" +msgstr "مستخدم" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:212 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:271 +msgid "started" +msgstr "إنطلق" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:223 +msgid "deleted" +msgstr "ØØ°Ù" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:240 +msgid "WebApp configuration saved." +msgstr "تم ØÙظ اعدادات تطبيق ويب." + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:256 +msgid "Plugin configuration saved." +msgstr "تم ØÙظ اعدادات الملØÙ‚ ويب." + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:271 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124 +msgid "WebApp" +msgstr "تطبيق ويب" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:273 +msgid "Failed to start" +msgstr "Ùشل ÙÙŠ الإنطلاق" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:278 +msgid "Failed to find server." +msgstr "Ùشل ÙÙŠ العثور على الخادم." + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:284 +msgid "No plugin URL specified." +msgstr "لم ÙŠØدد عنوان الملØÙ‚." + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:294 +#, java-format +msgid "No update URL specified for {0}" +msgstr "لا توجد تØديثات لـ {0}" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:302 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:307 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:320 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:325 +msgid "Plugin or update download already in progress." +msgstr "جارية تØميل التØديث" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:311 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:118 +#, java-format +msgid "Downloading plugin from {0}" +msgstr "تØميل الملØÙ‚ من {0}" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:329 +#, java-format +msgid "Checking plugin {0} for updates" +msgstr "بØØ« عن اصدارات جديدة للملØÙ‚{0} " + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:339 +#, java-format +msgid "Started plugin {0}" +msgstr "الملØÙ‚ {0} يعمل" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:341 +#, java-format +msgid "Error starting plugin {0}" +msgstr "خطأ ÙÙŠ تطلاق الملØÙ‚ {0}" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:376 +msgid "Interface configuration saved successfully - restart required to take effect." +msgstr "تم ØÙظ العدادات Ø¨Ù†Ø¬Ø§Ø - يجب اعادة التشغيل لأخذها بالاعتبار" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:85 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:258 +msgid "Edit" +msgstr "Øرر" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:94 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:331 +msgid "Add Client" +msgstr "أض٠مستخدم" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102 +msgid "Class and arguments" +msgstr "الÙئة" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148 +msgid "Control" +msgstr "تØكم" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148 +msgid "Run at Startup?" +msgstr "تشغيل عند البداية؟" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:197 +msgid "Description" +msgstr "وصÙ" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148 +msgid "Plugin" +msgstr "الملØÙ‚" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:161 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:271 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:185 +msgid "Version" +msgstr "إصدار" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:163 +msgid "Signed by" +msgstr "موقع من طرÙ" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:180 +msgid "Date" +msgstr "تاريخ" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:186 +msgid "Author" +msgstr "المؤلÙ" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:202 +msgid "License" +msgstr "رخصة" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:207 +msgid "Website" +msgstr "موقع" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:212 +msgid "Update link" +msgstr "وصلة الترقية" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:260 +msgid "Stop" +msgstr "توقÙ" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:262 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:78 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:313 +msgid "Check for updates" +msgstr "بØØ« عن الترقية" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:263 +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:235 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:242 +msgid "Update" +msgstr "ترقية" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:268 +#, java-format +msgid "Are you sure you want to delete {0}?" +msgstr "هل انت متأكد أنك ترغب ÙÙŠ ØØ°Ù {0}ØŸ" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:270 +msgid "Delete" +msgstr "ØØ°Ù" + +#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:18 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:325 +msgid "Add key" +msgstr "أض٠مÙتاØ" + +#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:19 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:323 +msgid "Delete key" +msgstr "ØØ°Ù Ù…ÙتاØ" + +#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:21 +msgid "You must enter a destination" +msgstr "يجب ادخال وجهة" + +#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:23 +msgid "You must enter a key" +msgstr "عليك ادخال Ù…ÙتاØ" + +#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:34 +#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:41 +#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:43 +msgid "Key for" +msgstr "Ù…ÙØªØ§Ø Ù„Ù€" + +#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:34 +msgid "added to keyring" +msgstr "أض٠الى المÙاتيØ" + +#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:36 +msgid "Invalid destination or key" +msgstr "وجهة أو Ù…ÙØªØ§Ø ØºÙŠØ± صØÙŠØ" + +#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:41 +msgid "removed from keyring" +msgstr "Øذ٠المÙتاØ" + +#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:43 +msgid "not found in keyring" +msgstr "لم يتم العثور على المÙتاØ" + +#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:45 +msgid "Invalid destination" +msgstr "عنوان غير موجود" + +#: ../java/src/net/i2p/router/web/ConfigLoggingHandler.java:82 +msgid "Log overrides updated" +msgstr "اعدا كتابة السجلات" + +#: ../java/src/net/i2p/router/web/ConfigLoggingHandler.java:160 +msgid "Log configuration saved" +msgstr "تم ØÙظ السجلات" + +#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:48 +msgid "Add additional logging statements above. Example: net.i2p.router.tunnel=WARN" +msgstr "اض٠اعدادات سجل اعلاه. مثلا: net.i2p.router.tunnel=WARN" + +#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:49 +msgid "Or put entries in the logger.config file. Example: logger.record.net.i2p.router.tunnel=WARN" +msgstr "أو أض٠ÙÙŠ مل٠logger.config. مثلا logger.record.net.i2p.router.tunnel=WARN" + +#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:50 +msgid "Valid levels are DEBUG, INFO, WARN, ERROR, CRIT" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68 +msgid "CRIT" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68 +msgid "DEBUG" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68 +msgid "ERROR" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68 +msgid "INFO" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68 +msgid "WARN" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:88 +msgid "Remove" +msgstr "ØØ°Ù" + +#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:125 +msgid "Select a class to add" +msgstr "اختر Ùئة لإضاÙتها" + +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:204 +msgid "Network" +msgstr "شبكة" + +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18 +msgid "Service" +msgstr "خدمة" + +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:101 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:386 +#: ../java/strings/Strings.java:72 +msgid "Tunnels" +msgstr "Ù†ÙÙ‚" + +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18 +msgid "UI" +msgstr "واجهة مستخدم" + +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19 +msgid "Clients" +msgstr "مستخدم" + +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:293 +msgid "Keyring" +msgstr "المÙاتيØ" + +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19 +msgid "Logging" +msgstr "تسجيل" + +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:107 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:260 +#: ../java/strings/Strings.java:67 +msgid "Peers" +msgstr "المستخدمين" + +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:387 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:143 +msgid "Stats" +msgstr "اØصائات" + +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:20 +msgid "Advanced" +msgstr "متقدم" + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:48 +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:264 +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:29 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:34 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:360 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:516 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:307 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:341 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:352 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:377 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:344 +msgid "Save changes" +msgstr "ØÙظ التغييرات" + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:121 +msgid "Rechecking router reachability..." +msgstr "إعادة تØديد إمكانية الوصول للموجه..." + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:153 +msgid "Updating IP address" +msgstr "جاري تعديل عنوان IP" + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:171 +msgid "Disabling TCP completely" +msgstr "الغاء الكامل TCP " + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:175 +msgid "Updating inbound TCP address to" +msgstr "تØديث عنوان TCP الى" + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:179 +msgid "Disabling inbound TCP" +msgstr "الغاء الاتصال TCP الداخلي" + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:181 +msgid "Updating inbound TCP address to auto" +msgstr "تØديث عنوان TCP الى ذاتي" + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:190 +msgid "Updating inbound TCP port to" +msgstr "تØديث عنوان TCP الى" + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:193 +msgid "Updating inbound TCP port to auto" +msgstr "تØديث عنوان TCP الى ذاتي" + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:205 +msgid "Updating UDP port from" +msgstr "تØديث عنوان UDP من" + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:205 +msgid "to" +msgstr "إلى" + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:221 +msgid "Gracefully restarting into Hidden Router Mode" +msgstr "اعادة التشغيل على نظام الموجه المتخÙÙŠ" + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:223 +msgid "Gracefully restarting to exit Hidden Router Mode" +msgstr "اعادة التشغيل على نظام الموجه المتخÙÙŠ " + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:232 +msgid "Enabling UPnP, restart required to take effect" +msgstr "تÙعيل UPnPØŒ يجب اعادة التشغيل للØصول على النتيجة" + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:234 +msgid "Disabling UPnP, restart required to take effect" +msgstr " الغاء تÙعيل UPnPØŒ يجب اعادة التشغيل للØصول على النتيجة" + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:242 +msgid "Enabling laptop mode" +msgstr "تÙعيل نظام الØاسوب المØمول" + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:244 +msgid "Disabling laptop mode" +msgstr "الغاء تÙعيل نظام الØاسوب المØمول" + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:250 +msgid "Requiring SSU introducers" +msgstr "بØاجة الى SSU" + +#. 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. +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:291 +msgid "Gracefully restarting I2P to change published router address" +msgstr "إعادة تشغيل جهاز التوجيه I2P لتغيير عنوان النشر" + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:314 +msgid "Updating bandwidth share percentage" +msgstr "تØديث سرعة الاتصال المشاركة" + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:397 +msgid "Updated bandwidth limits" +msgstr "Øد سرعة الاتصال " + +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:41 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:49 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:52 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:59 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:62 +msgid "unknown" +msgstr "غير معروÙ" + +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:172 +msgid "bits per second" +msgstr "بايت ÙÙŠ الثانية" + +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:173 +#, java-format +msgid "or {0} bytes per month maximum" +msgstr "أو {0} بايت لكل شهر" + +#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:20 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:315 +msgid "Ban peer until restart" +msgstr "منع Øتى اعادة التشغيل" + +#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:23 +#, java-format +msgid "Manually banned via {0}" +msgstr "ممنوع يدويا من طر٠{0}" + +#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:24 +msgid "banned until restart" +msgstr "ممنوع Øتى إعادة التشغيل" + +#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:27 +#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:38 +#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:59 +msgid "Invalid peer" +msgstr "نظير غير صØÙŠØ" + +#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:28 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:317 +msgid "Unban peer" +msgstr "الغاء منع المستخدم" + +#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:33 +msgid "unbanned" +msgstr "الغاء المنع" + +#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:35 +msgid "is not currently banned" +msgstr "غير ممنوع" + +#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:39 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:343 +msgid "Adjust peer bonuses" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:47 +msgid "Bad speed value" +msgstr " سرعة غير جيدة" + +#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:52 +msgid "Bad capacity value" +msgstr "قدرة غير جيدة" + +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:17 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:350 +msgid "Save changes and reseed now" +msgstr "ØÙظ التغييرات" + +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:21 +msgid "Reseeding is already in progress" +msgstr "جاري اعادة التوزيع" + +#. skip the nonce checking in ReseedHandler +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:24 +msgid "Starting reseed process" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:66 +msgid "Configuration saved successfully." +msgstr "تم ØÙظ الإعدادات بنجاØ" + +#. Normal browsers send value, IE sends button label +#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:32 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:57 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:293 +msgid "Shutdown immediately" +msgstr "توقي٠Øالا" + +#. ctx.router().shutdown(Router.EXIT_HARD); // never returns +#. give the UI time to respond +#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:36 +msgid "Cancel shutdown" +msgstr "الغاء التوقيÙ" + +#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:37 +msgid "Cancel restart" +msgstr "الغاء اعادة التشغيل" + +#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:39 +msgid "Restart immediately" +msgstr "أعد التشغيل الآن" + +#. ctx.router().shutdown(Router.EXIT_HARD_RESTART); // never returns +#. give the UI time to respond +#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:43 +msgid "Restart" +msgstr "أعد التشغيل" + +#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:46 +msgid "Shutdown" +msgstr "إيقاÙ" + +#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:59 +msgid "Restart imminent" +msgstr "أعد التشغيل الآن" + +#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:61 +msgid "Shutdown imminent" +msgstr "إغلاق وشيك" + +#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:65 +#, java-format +msgid "Shutdown in {0}" +msgstr "توق٠ÙÙŠ مدة {0}" + +#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:70 +#, java-format +msgid "Restart in {0}" +msgstr "اعادة التشغيل ÙÙŠ مدة {0}" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:53 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:291 +msgid "Shutdown gracefully" +msgstr "توق٠تدريجيا" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:56 +msgid "Graceful shutdown initiated" +msgstr "بدأ التوق٠تدريجيا" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:60 +msgid "Shutdown immediately! boom bye bye bad bwoy" +msgstr "توق٠الآن !" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:61 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:295 +msgid "Cancel graceful shutdown" +msgstr "ألغي التوق٠التدريجي" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:63 +msgid "Graceful shutdown cancelled" +msgstr "ألغي التوق٠التدريجي" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:64 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:307 +msgid "Graceful restart" +msgstr "أعد التشغيل التدريجي" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:67 +msgid "Graceful restart requested" +msgstr "اعادة التشغبل تدريجية" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:68 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:309 +msgid "Hard restart" +msgstr "إعادة التشغيل Ùوري" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:71 +msgid "Hard restart requested" +msgstr "طلب إعادة التشغيل Ùوري" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:72 +msgid "Rekey and Restart" +msgstr "غير المÙØªØ§Ø ÙˆØ§Ø¹Ø¯ التشغيل" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:73 +msgid "Rekeying after graceful restart" +msgstr "تغير المÙØªØ§Ø Ø¨Ø¹Ø¯ اعادة التشغيل" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:76 +msgid "Rekey and Shutdown" +msgstr "غير المÙØªØ§Ø ÙˆØªÙˆÙ‚Ù" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:77 +msgid "Rekeying after graceful shutdown" +msgstr "تغير المÙØªØ§Ø Ø¨Ø¹Ø¯ التوقÙ" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:80 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:335 +msgid "Run I2P on startup" +msgstr "اطلاق I2P عند البداية" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:82 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:337 +msgid "Don't run I2P on startup" +msgstr "لا تقوم باطلاق I2P عند البداية" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:84 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:355 +msgid "Dump threads" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:91 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:363 +msgid "View console on startup" +msgstr "أظهر شاشة التØكم عند البداية" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:93 +msgid "Console is to be shown on startup" +msgstr "سبتم إظهار شاشة التØكم عند البداية" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:94 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:365 +msgid "Do not view console on startup" +msgstr "لا تظهر شاشة التØكم عند البداية" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:96 +msgid "Console is not to be shown on startup" +msgstr "لن يتم إظهار شاشة التØكم عند البداية" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:105 +msgid "Service installed" +msgstr "تم تثبيت الخدمة" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:107 +msgid "Warning: unable to install the service" +msgstr "تØذير: Ùشل ÙÙŠ تثبيت الخدمة" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:113 +msgid "Service removed" +msgstr "تم Øذ٠الخدمة" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:115 +msgid "Warning: unable to remove the service" +msgstr "تØذير: Ùشل ÙÙŠ Øذ٠الخدمة" + +#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:111 +msgid "Stat filter and location updated successfully to" +msgstr "القانون الأساسي لتصÙية وتØديث الموقع بنجاØ" + +#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:113 +msgid "Failed to update the stat filter and location" +msgstr "Ùشل ÙÙŠ لتصÙية وتØديث الموقع بنجاØ" + +#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:114 +msgid "Graph list updated, may take up to 60s to be reflected here and on the <a href=\"graphs.jsp\">Graphs Page</a>" +msgstr " لقد تم تØديث الرسم البياني، يستغرق Ùترة تصل الى 60s أن تنعكس هنا، وعلى<a href=\"graphs.jsp\">صÙØØ© الرسوم البيانية</a>" + +#. the count isn't really correct anyway, since we don't check for actual changes +#. addFormNotice("Updated settings for " + updated + " pools."); +#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:135 +msgid "Updated settings for all pools." +msgstr "تØديث إعدادات للجميع." + +#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:140 +msgid "Exploratory tunnel configuration saved successfully." +msgstr "تم ØÙظ إعدادات النÙÙ‚ بنجاØ." + +#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:142 +#: ../java/src/net/i2p/router/web/ConfigUIHandler.java:36 +msgid "Error saving the configuration (applied but not saved) - please see the error logs." +msgstr "خطأ ÙÙŠ ØÙظ الاعدادات (مطبقة لكنها غير Ù…ØÙوظة) أنظر الاخطاء." + +#. * dummies for translation +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:14 +#, java-format +msgid "1 hop" +msgid_plural "{0} hops" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:15 +#, java-format +msgid "1 tunnel" +msgid_plural "{0} tunnels" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:26 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:41 +msgid "Exploratory tunnels" +msgstr "استكشا٠الأنÙاق" + +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:46 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:61 +msgid "Client tunnels for" +msgstr "Ù†ÙÙ‚ لـ" + +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:69 +msgid "ANONYMITY WARNING - Settings include 0-hop tunnels." +msgstr "تØذير Øول درجة المجهولية: تتضمن إعدادات الأنÙاق 0 - نظير." + +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:74 +msgid "ANONYMITY WARNING - Settings include 1-hop tunnels." +msgstr "تØذير Øول درجة المجهولية: الاعدادات تØتوي على Ù†ÙÙ‚ واØد." + +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:77 +msgid "PERFORMANCE WARNING - Settings include very long tunnels." +msgstr "تØذير الأداء: وتتضمن الإعدادات أنÙاق طويلة جدا." + +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:80 +msgid "PERFORMANCE WARNING - Settings include high tunnel quantities." +msgstr "تØذير الأداء: وتتضمن الإعدادات عدد كبير من أنÙاق طويلة جدا." + +#. buf.append("<tr><th></th><th>Inbound</th><th>Outbound</th></tr>\n"); +#. tunnel depth +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:87 +msgid "Length" +msgstr "طول" + +#. tunnel depth variance +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:104 +msgid "Randomization" +msgstr "عشوائي" + +#. tunnel quantity +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:128 +msgid "Quantity" +msgstr "الكمية" + +#. tunnel backup quantity +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:145 +msgid "Backup quantity" +msgstr "قدر نسخ الاØتياط" + +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:167 +msgid "Inbound options" +msgstr "اتصال داخلي" + +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:180 +msgid "Outbound options" +msgstr "اتصال خارجي" + +#: ../java/src/net/i2p/router/web/ConfigUIHandler.java:31 +msgid "Theme change saved." +msgstr "تم ØÙظ تغيير التيمة." + +#: ../java/src/net/i2p/router/web/ConfigUIHandler.java:33 +msgid "Refresh the page to view." +msgstr "أنعش الصÙØØ©" + +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51 +msgid "Arabic" +msgstr "عربية" + +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 +msgid "English" +msgstr "انجليزية" + +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 +msgid "French" +msgstr "Ùرنسية" + +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 +msgid "German" +msgstr "الألمانية" + +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 +msgid "Spanish" +msgstr "اسبانية" + +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53 +msgid "Dutch" +msgstr "الهولندية" + +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53 +msgid "Portuguese" +msgstr "برتغالية" + +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53 +msgid "Russian" +msgstr "الروسية" + +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:54 +msgid "Chinese" +msgstr "الصينية" + +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:54 +msgid "Swedish" +msgstr "السويدية" + +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:85 +msgid "Update available, attempting to download now" +msgstr "يوجد اصدار جديد " + +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:87 +msgid "Update available, click button on left to download" +msgstr "توجد تØديثات، انقر زر على اليسار للتØميل" + +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:93 +msgid "No update available" +msgstr "ﻻتوجد تØديثات" + +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:101 +msgid "Updating news URL to" +msgstr "تØديث عنوان جديد الى" + +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:109 +msgid "Updating proxy host to" +msgstr "تØديث بروكسي الى" + +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:117 +msgid "Updating proxy port to" +msgstr "تØديث منÙØ° بروكسي الى" + +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:130 +msgid "Updating refresh frequency to" +msgstr "تØديث نسبة التردد" + +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:137 +msgid "Updating update policy to" +msgstr "تØديث لسياسة التØديث" + +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:146 +msgid "Updating update URLs." +msgstr "تØديث العناوين" + +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:155 +msgid "Updating trusted keys." +msgstr "تØديث المÙØ§ØªÙŠØ Ø§Ù„Ù…ÙˆØ«ÙˆÙ‚Ø©." + +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:163 +msgid "Updating unsigned update URL to" +msgstr "تØديث العنوان" + +#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:88 +#: ../java/src/net/i2p/router/web/GraphHelper.java:167 +msgid "Never" +msgstr "أبد" + +#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:90 +msgid "Every" +msgstr "كل" + +#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:108 +msgid "Notify only" +msgstr "إعلام Ùقط" + +#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:115 +msgid "Download and verify only" +msgstr "Øمل Ùقط" + +#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:123 +msgid "Download, verify, and restart" +msgstr "Øمل، تØقق Ùˆ أعد تشغيل" + +#: ../java/src/net/i2p/router/web/FormHandler.java:174 +msgid "Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit." +msgstr "خطأ ÙÙŠ الارسال، ربما لاستعمالك زر 'الرجوع' او 'انعش' ÙÙŠ المتصÙØ. Øاول اعادة الارسال." + +#: ../java/src/net/i2p/router/web/GraphHelper.java:93 +msgid "Combined bandwidth graph" +msgstr "رسم بياني لسرعة الاتصال" + +#. e.g. "statname for 60m" +#: ../java/src/net/i2p/router/web/GraphHelper.java:107 +#, java-format +msgid "{0} for {1}" +msgstr "{0} لكل {1}" + +#: ../java/src/net/i2p/router/web/GraphHelper.java:146 +msgid "Configure Graph Display" +msgstr "اعدادات الرسم بياني" + +#: ../java/src/net/i2p/router/web/GraphHelper.java:146 +msgid "Select Stats" +msgstr "Øدد الإØصائيات" + +#: ../java/src/net/i2p/router/web/GraphHelper.java:150 +msgid "Periods" +msgstr "مدة" + +#: ../java/src/net/i2p/router/web/GraphHelper.java:151 +msgid "Plot averages" +msgstr "ارسم المتوسط" + +#: ../java/src/net/i2p/router/web/GraphHelper.java:152 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:417 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:333 +msgid "or" +msgstr "أو" + +#: ../java/src/net/i2p/router/web/GraphHelper.java:152 +msgid "plot events" +msgstr "ارسم الأØداث" + +#: ../java/src/net/i2p/router/web/GraphHelper.java:153 +msgid "Image sizes" +msgstr "خجم الصور" + +#: ../java/src/net/i2p/router/web/GraphHelper.java:153 +msgid "width" +msgstr "العرض" + +#: ../java/src/net/i2p/router/web/GraphHelper.java:154 +msgid "height" +msgstr "الإرتÙاع" + +#: ../java/src/net/i2p/router/web/GraphHelper.java:154 +#: ../java/src/net/i2p/router/web/GraphHelper.java:155 +msgid "pixels" +msgstr "البيكسل" + +#: ../java/src/net/i2p/router/web/GraphHelper.java:156 +msgid "Refresh delay" +msgstr "وثيرة التØديث" + +#: ../java/src/net/i2p/router/web/GraphHelper.java:171 +msgid "Redraw" +msgstr "اعد رسم" + +#: ../java/src/net/i2p/router/web/GraphHelper.java:203 +msgid "Graph settings saved" +msgstr "ØÙظ اعدادات الرسم البياني" + +#: ../java/src/net/i2p/router/web/LogsHelper.java:13 +#: ../java/src/net/i2p/router/web/LogsHelper.java:37 +msgid "File location" +msgstr "عنوان الملÙ" + +#: ../java/src/net/i2p/router/web/LogsHelper.java:34 +msgid "File not found" +msgstr "مل٠غير موجود" + +#: ../java/src/net/i2p/router/web/LogsHelper.java:52 +msgid "No log messages" +msgstr "لا تسجيل الرسائل" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:80 +msgid "Network Database RouterInfo Lookup" +msgstr "قاعدة بيانات الشبكة" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:95 +#: ../java/strings/Strings.java:68 +msgid "Router" +msgstr "موجه" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:95 +msgid "not found in network database" +msgstr "غير موجود ÙÙŠ قاعدة الشبكة" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:107 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:215 +msgid "Network Database Contents" +msgstr "Ù…Øتويات قاعدة الشبكة" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:108 +msgid "View RouterInfo" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:109 +msgid "LeaseSets" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:131 +msgid "LeaseSet" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:133 +msgid "Local" +msgstr "Ù…Øلي" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:135 +msgid "Unpublished" +msgstr "غير منشور" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:136 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:143 +msgid "Destination" +msgstr "الغاية" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:153 +#, java-format +msgid "Expires in {0}" +msgstr "ينتهي ÙÙŠ مدة {0}" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:155 +#, java-format +msgid "Expired {0} ago" +msgstr "انتهى {0} منذ" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:167 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:156 +msgid "Gateway" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:167 +msgid "Lease" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:169 +msgid "Tunnel" +msgstr "Ù†ÙÙ‚" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:215 +msgid "View LeaseSets" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:217 +msgid "Not initialized" +msgstr "لم تتم تهيئة" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:226 +msgid "Routers" +msgstr "الموجه" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:228 +msgid "Show all routers" +msgstr "أظهر جميع الموجهات" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:230 +msgid "Show all routers with full stats" +msgstr "أظهر جميع الموجهات" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:265 +msgid "Network Database Router Statistics" +msgstr "اØصائيات قاعدة البيانات I2P" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:271 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:285 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:303 +msgid "Count" +msgstr "عدد" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:285 +msgid "Transports" +msgstr "نقل" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:303 +msgid "Country" +msgstr "البلد" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:342 +msgid "Our info" +msgstr "المعلومات" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:344 +msgid "Peer info for" +msgstr "معلومات النظائر" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:348 +msgid "Full entry" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:354 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:115 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:601 +msgid "Hidden" +msgstr "مختÙÙŠ" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:354 +msgid "Updated" +msgstr "تØديث" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:355 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:358 +#, java-format +msgid "{0} ago" +msgstr "{0} مدة" + +#. shouldnt happen +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:357 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:361 +msgid "Published" +msgstr "تم نشره منذ" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:363 +msgid "Address(es)" +msgstr "عناوين" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:376 +msgid "cost" +msgstr "ثمن" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402 +msgid "Hidden or starting up" +msgstr "مختÙÙŠ" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402 +msgid "SSU" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402 +msgid "SSU with introducers" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 +msgid "NTCP" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 +msgid "NTCP and SSU" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 +msgid "NTCP and SSU with introducers" +msgstr "" + +#: ../java/src/net/i2p/router/web/NewsFetcher.java:93 +#, java-format +msgid "News last updated {0} ago." +msgstr "آخر تØديث للأخبار {0} " + +#: ../java/src/net/i2p/router/web/NewsFetcher.java:99 +#, java-format +msgid "News last checked {0} ago." +msgstr "آخر تØديث للأخبار {0} " + +#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:77 +#, java-format +msgid "Cannot check, plugin {0} is not installed" +msgstr "لا يمكن التÙعيل، الملØÙ‚ {0} غير مثبت" + +#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:129 +#, java-format +msgid "Checking for update of plugin {0}" +msgstr "تØÙ‚ من اصداؤ جديد للملØÙ‚ {0}" + +#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:154 +#, java-format +msgid "New plugin version {0} is available" +msgstr "يوجد اصدار جديد {0} للملØÙ‚" + +#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:156 +#, java-format +msgid "No new version is available for plugin {0}" +msgstr "ﻻيوجد اصدار جديد {0} للملØÙ‚" + +#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:165 +#, java-format +msgid "Update check failed for plugin {0}" +msgstr "Ùشل البØØ« عم ترقية للملØÙ‚ {0}" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:139 +msgid "Downloading plugin" +msgstr "تØميل ملØÙ‚" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:146 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:244 +#, java-format +msgid "{0}B transferred" +msgstr "{0}B منقول" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:153 +msgid "Plugin downloaded" +msgstr "تم تØميل الملØÙ‚" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:158 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:356 +#, java-format +msgid "Cannot create plugin directory {0}" +msgstr "Ùشل ÙÙŠ انشاء مجلد الملØÙ‚ {0}" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:167 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:298 +#, java-format +msgid "from {0}" +msgstr "من {0}" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:177 +#, java-format +msgid "Plugin from {0} is corrupt" +msgstr "الملØÙ‚ من {0} غير كامل" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:188 +#, java-format +msgid "Plugin from {0} does not contain the required configuration file" +msgstr "الملØÙ‚ {0} لا ÙŠØتوي على مل٠الإعدادات" + +#. updateStatus("<b>" + "Plugin contains an invalid key" + ' ' + pubkey + ' ' + signer + "</b>"); +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:201 +#, java-format +msgid "Plugin from {0} contains an invalid key" +msgstr "الملØÙ‚ من {0} ÙŠØتوي على Ù…ÙØªØ§Ø ØºÙŠØ± صالØ" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:225 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:235 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:249 +#, java-format +msgid "Plugin signature verification of {0} failed" +msgstr "Ùشل ÙÙŠ التØقق من امضاء {0} الملØÙ‚" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:264 +#, java-format +msgid "Plugin from {0} has invalid name or version" +msgstr "الملØÙ‚ {0} له اصدار او اسم غير مقبول" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:269 +#, java-format +msgid "Plugin {0} has mismatched versions" +msgstr "الملØÙ‚ {0} له اصدار غير متواÙÙ‚" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:277 +#, java-format +msgid "This plugin requires I2P version {0} or higher" +msgstr "هذا الملØÙ‚ ÙŠØتاج الى اصدار {0} أو اكبر" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:285 +#, java-format +msgid "This plugin requires Java version {0} or higher" +msgstr "هذا الملØÙ‚ ÙŠØتاج الى اصدار جاÙا {0} او أعلى" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:293 +msgid "Downloaded plugin is for new installs only, but the plugin is already installed" +msgstr "تØميل البرنامج المساعد لتثبيت جديد Ùقط، ولكن تم بالÙعل تثبيت البرنامج المساعد" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:305 +msgid "Installed plugin does not contain the required configuration file" +msgstr "الملØÙ‚ لا ÙŠØتوي على مل٠الاعدادات" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:313 +msgid "Signature of downloaded plugin does not match installed plugin" +msgstr "توقيع الملØÙ‚ المØمل لا يطابق الملØÙ‚ المثبت" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:320 +#, java-format +msgid "Downloaded plugin version {0} is not newer than installed plugin" +msgstr "اصدار الملØÙ‚ {0} ليس اكثر Øداثة من الملØÙ‚ المثبت" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:327 +#, java-format +msgid "Plugin update requires installed plugin version {0} or higher" +msgstr "تØديث الملØÙ‚ {0} ÙŠØتاج الى اصدار" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:334 +#, java-format +msgid "Plugin update requires installed plugin version {0} or lower" +msgstr "تØديث الملØÙ‚ ÙŠØتاج الى اصدار {0} او اقل" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:351 +msgid "Plugin is for upgrades only, but the plugin is not installed" +msgstr "الملØÙ‚ للتØديث Ùقط لكنه غير مثبت" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:364 +#, java-format +msgid "Failed to install plugin in {0}" +msgstr "Ùشل ÙÙŠ تثبيت الملØÙ‚ {0}" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:371 +#, java-format +msgid "Plugin {0} installed, router restart required" +msgstr "الملØÙ‚ {0} تم تثبيته" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:373 +#, java-format +msgid "Plugin {0} installed" +msgstr "الملØÙ‚ {0} مثبت" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:391 +#, java-format +msgid "Plugin {0} installed and started" +msgstr "الملØÙ‚ {0} مثبت ومشغل" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:394 +#, java-format +msgid "Plugin {0} installed but failed to start, check logs" +msgstr "الملØÙ‚ {0} مثيت لكن Ùشل ÙÙŠ البداية، تØقق من السجلات" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:396 +#, java-format +msgid "Plugin {0} installed but failed to start" +msgstr "الملØÙ‚ {0} مثبت لكنه Ùشل ÙÙŠ انطلاق" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:406 +#, java-format +msgid "Failed to download plugin from {0}" +msgstr "Ùشل ÙÙŠ تØميل الملØÙ‚ من {0}" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:72 +msgid "Peer Profiles" +msgstr "بروÙايل المستخدمين" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:73 +#, java-format +msgid "Showing {0} recent profiles." +msgstr "اظهار {0} البروÙايلات الجديدة." + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:75 +#, java-format +msgid "Hiding {0} older profiles." +msgstr "اخÙاء {0} البروÙايلات القديمة." + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:77 +#, java-format +msgid "Hiding {0} standard profiles." +msgstr "اخÙاء {0} البروÙايل الطبيعي." + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:82 +msgid "Groups (Caps)" +msgstr "المجموعات" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:83 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:251 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:335 +msgid "Speed" +msgstr "سرعة" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:84 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:253 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:339 +msgid "Capacity" +msgstr "القدرة" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:85 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:255 +msgid "Integration" +msgstr "دمج" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:86 +msgid "Status" +msgstr "الØالة" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:126 +msgid "Fast, High Capacity" +msgstr "سريع ØŒ قدرة عالية" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:127 +msgid "High Capacity" +msgstr "قدرة عالية" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:128 +msgid "Standard" +msgstr "عادي" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:129 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:163 +msgid "Failing" +msgstr "Ùشل" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:131 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:287 +msgid "Integrated" +msgstr "مدمج" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:164 +msgid "Unreachable" +msgstr "" + +#. hide if < 10% +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:171 +msgid "Test Fails" +msgstr "Ùشل التجربة" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:175 +msgid "profile" +msgstr "بروÙايل" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:184 +msgid "Floodfill and Integrated Peers" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:188 +msgid "Caps" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:189 +msgid "Integ. Value" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:190 +msgid "Last Heard About" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:191 +msgid "Last Heard From" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:192 +msgid "Last Good Send" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:193 +msgid "Last Bad Send" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:194 +msgid "10m Resp. Time" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:195 +msgid "1h Resp. Time" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:196 +msgid "1d Resp. Time" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:197 +msgid "Last Good Lookup" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:198 +msgid "Last Bad Lookup" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:199 +msgid "Last Good Store" +msgstr "آخر ØÙظ جيد" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:200 +msgid "Last Bad Store" +msgstr "آخر ØÙظ غير جيد" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:201 +msgid "1h Fail Rate" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:202 +msgid "1d Fail Rate" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:250 +msgid "Thresholds" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:252 +msgid "fast peers" +msgstr "نظير سريع" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:254 +msgid "high capacity peers" +msgstr "نظير ذو قدرة عالية" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:256 +msgid " well integrated peers" +msgstr "نظير مندمج" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258 +msgid "as determined by the profile organizer" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258 +msgid "groups" +msgstr "مجموعات" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259 +msgid "capabilities in the netDb, not used to determine profiles" +msgstr "" + +#. capabilities +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259 +#: ../java/strings/Strings.java:81 +msgid "caps" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260 +msgid "peak throughput (bytes per second) over a 1 minute period that the peer has sustained in a single tunnel" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260 +msgid "speed" +msgstr "سرعة" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261 +msgid "capacity" +msgstr "القدرة" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261 +msgid "how many tunnels can we ask them to join in an hour?" +msgstr "كم من الانÙاق نطلب منهم الانضمام ÙÙŠ ساعة؟" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262 +msgid "how many new peers have they told us about lately?" +msgstr "كم من النظائر موجودة مؤخرا؟" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262 +msgid "integration" +msgstr "انضمام" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263 +msgid "is the peer banned, or unreachable, or failing tunnel tests?" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263 +msgid "status" +msgstr "الØالة" + +#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:57 +#, java-format +msgid "Temporary ban expiring in {0}" +msgstr "منع مؤقت {0}" + +#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:59 +#, java-format +msgid "Banned until restart or in {0}" +msgstr "ممنوع الى اعادة تشغيل {0}" + +#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:71 +msgid "unban now" +msgstr "الغاء المنع الآن" + +#. Note to translators: all runtime zh translation disabled in this file, no font available in RRD +#: ../java/src/net/i2p/router/web/StatSummarizer.java:223 +msgid "Bandwidth usage" +msgstr "استعمال الشيكة" + +#: ../java/src/net/i2p/router/web/StatSummarizer.java:230 +msgid "Outbound bytes/sec" +msgstr "اتصال خارجي bytes/sec" + +#. def.line(sendName, Color.BLUE, "Outbound bytes/sec", 3); +#: ../java/src/net/i2p/router/web/StatSummarizer.java:232 +msgid "Inbound bytes/sec" +msgstr "اتصال داخلي bytes/sec" + +#: ../java/src/net/i2p/router/web/StatSummarizer.java:235 +#: ../java/src/net/i2p/router/web/StatSummarizer.java:236 +#: ../java/src/net/i2p/router/web/StatSummarizer.java:237 +#: ../java/src/net/i2p/router/web/StatSummarizer.java:238 +msgid "bytes/sec" +msgstr "بايت/ثانية" + +#: ../java/src/net/i2p/router/web/StatSummarizer.java:235 +msgid "out average" +msgstr "متوسط الاتصال الخارجي" + +#: ../java/src/net/i2p/router/web/StatSummarizer.java:236 +#: ../java/src/net/i2p/router/web/StatSummarizer.java:238 +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:115 +msgid "max" +msgstr "" + +#: ../java/src/net/i2p/router/web/StatSummarizer.java:237 +msgid "in average" +msgstr "متوسط الاتصال الداخلي" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:57 +msgid "GO" +msgstr "اذهب" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:60 +msgid "Statistics gathered during this router's uptime" +msgstr "تجمع الاØصاءات العامة خلال خدمة الموجه" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:63 +msgid "The data gathered is quantized over a 1 minute period, so should just be used as an estimate." +msgstr "" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:64 +msgid "These statistics are primarily used for development and debugging." +msgstr "هذه الاØصائيات مستعملة ÙÙŠ التطوير." + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:105 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:156 +msgid "No lifetime events" +msgstr "" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:116 +msgid "frequency" +msgstr "التردد" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:120 +msgid "Rolling average events per period" +msgstr "" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:124 +msgid "Highest events per period" +msgstr "" + +#. if (showAll && (curFreq.getMaxAverageEventsPerPeriod() > 0) && (curFreq.getAverageEventsPerPeriod() > 0) ) { +#. buf.append("(current is "); +#. buf.append(pct(curFreq.getAverageEventsPerPeriod()/curFreq.getMaxAverageEventsPerPeriod())); +#. buf.append(" of max)"); +#. } +#. buf.append(" <i>avg interval between updates:</i> (").append(num(curFreq.getAverageInterval())).append("ms, min "); +#. buf.append(num(curFreq.getMinAverageInterval())).append("ms)"); +#: ../java/src/net/i2p/router/web/StatsGenerator.java:135 +msgid "Lifetime average events per period" +msgstr "" + +#. Display the strict average +#: ../java/src/net/i2p/router/web/StatsGenerator.java:140 +msgid "Lifetime average frequency" +msgstr "متوسط مدى الØياة" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:168 +msgid "rate" +msgstr "النسبة" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:170 +msgid "Average" +msgstr "متوسط" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:173 +msgid "Highest average" +msgstr "أعلى متوسط" + +#. breaking the sentence like before makes translation in my language impossible. +#: ../java/src/net/i2p/router/web/StatsGenerator.java:201 +#, java-format +msgid "There were {0} event(s) in this period" +msgstr "هناك {0} Øدث ÙÙŠ هذه المدة" + +#. buf.append(' '); +#: ../java/src/net/i2p/router/web/StatsGenerator.java:203 +#, java-format +msgid " which ended {0} ago." +msgstr "انتهت منذ {0} " + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:205 +msgid "No events" +msgstr "لا Øدث" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:211 +msgid "Average event count" +msgstr "متوسط عدد الأØداث" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:213 +msgid "Events in peak period" +msgstr "" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:221 +msgid "Graph Data" +msgstr "رسم بياني" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:223 +msgid "Graph Event Count" +msgstr "الرسم البياني" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:226 +msgid "Export Data as XML" +msgstr "تصدير البيانات XML" + +#. Display the strict average +#: ../java/src/net/i2p/router/web/StatsGenerator.java:231 +msgid "Lifetime average value" +msgstr "متوسط الØياة" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:41 +msgid "I2P Router Help & FAQ" +msgstr "مساعدة Øول I2P" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:43 +msgid "Help & FAQ" +msgstr "مساعدة" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:55 +msgid "Configure startup of clients and webapps (services); manually start dormant services" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:57 +msgid "I2P Services" +msgstr "خدمات I2P" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:63 +msgid "Manage your I2P hosts file here (I2P domain name resolution)" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:65 +msgid "Addressbook" +msgstr "دÙتر العناوين" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:69 +msgid "Built-in anonymous BitTorrent Client" +msgstr "برنامج تورنت مجهول" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:71 +msgid "Torrents" +msgstr "تورنت" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:75 +msgid "Anonymous webmail client" +msgstr "بريد الكتروني مجهول" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:77 +msgid "Webmail" +msgstr "بريد الكتروني" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:81 +msgid "Anonymous resident webserver" +msgstr "خادم ويب مجهول" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:83 +msgid "Webserver" +msgstr "سيرÙر ويب" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:91 +msgid "Configure I2P Router" +msgstr "I2P اعدادات موجه" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:93 +msgid "I2P Internals" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:99 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:384 +msgid "View existing tunnels and tunnel build status" +msgstr "أظهر الأنÙاق الموجودة ÙˆØالة الانÙاق " + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:105 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:258 +msgid "Show all current peer connections" +msgstr "أظهر اتصالات المشاركين" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:111 +msgid "Show recent peer performance profiles" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:113 +msgid "Profiles" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:117 +msgid "Show list of all known I2P routers" +msgstr "أظهر قائمة بكل I2P المعروÙØ©" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:119 +msgid "NetDB" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:123 +msgid "Health Report" +msgstr "تقرير" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:125 +msgid "Logs" +msgstr "يجلات" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:135 +msgid "Graph router performance" +msgstr "أظهر اشتغال الموجه بريم بياني" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:137 +msgid "Graphs" +msgstr "رسم بياني" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:141 +msgid "Textual router performance statistics" +msgstr "اØصائات نصية للموجه" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:147 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:370 +msgid "Local Destinations" +msgstr "الوجهات المØلية" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:149 +#: ../java/strings/Strings.java:62 +msgid "I2PTunnel" +msgstr "الأنÙاق I2P" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:164 +msgid "I2P Router Help" +msgstr "مساعدة روتر I2P" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:166 +msgid "General" +msgstr "عام" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:171 +msgid "Local Identity" +msgstr "هوية Ù…Øلية" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:175 +msgid "Your unique I2P router identity is" +msgstr "هوية موجهك I2P هو" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:179 +msgid "never reveal it to anyone" +msgstr "لاتظهر لأØد" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:181 +msgid "show" +msgstr "أظهر" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:192 +msgid "How long we've been running for this session" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:195 +msgid "Uptime" +msgstr "مدة الاشتغال" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:202 +msgid "Help with configuring your firewall and router for optimal I2P performance" +msgstr "مساعدة ÙÙŠ اعدادات الجدار الناري لزيادة Ùعالية I2P" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:231 +msgid "Download" +msgstr "تØميل" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:240 +msgid "Download Unsigned" +msgstr "تØميل" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:266 +msgid "Active" +msgstr "Ù…Ùعل" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:275 +msgid "Fast" +msgstr "سريع" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:281 +msgid "High capacity" +msgstr "قدرة عالية" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:293 +msgid "Known" +msgstr "معروÙ" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:308 +msgid "Help with firewall configuration" +msgstr "مساعدة خول اعدادات الجدار الناري" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:310 +msgid "Check NAT/firewall" +msgstr "تأكد من NAT/جدار ناري" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:330 +msgid "Reseed" +msgstr "اعادة توزيع" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:347 +msgid "Configure router bandwidth allocation" +msgstr "Øدد سرعة الموجه" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:349 +msgid "Bandwidth in/out" +msgstr "الاتصال الداخلي/خارجي" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:369 +msgid "Total" +msgstr "مجموع" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:376 +msgid "Used" +msgstr "مستعمل" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:391 +msgid "Exploratory" +msgstr "تصÙØ" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:403 +msgid "Participating" +msgstr "مشارك" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:409 +msgid "Share ratio" +msgstr "نسبة المشاركة" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:415 +msgid "What's in the router's job queue?" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:417 +msgid "Congestion" +msgstr "ازدØام" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:422 +msgid "Job lag" +msgstr "تأخر" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:428 +msgid "Message delay" +msgstr "تأخر الرسالة" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:434 +msgid "Tunnel lag" +msgstr "تأخر النÙÙ‚" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:440 +msgid "Backlog" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:106 +msgid "ERR-Client Manager I2CP Error - check logs" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:113 +#, java-format +msgid "ERR-Clock Skew of {0}" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:122 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:577 +msgid "OK" +msgstr "مواÙÙ‚" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:123 +msgid "ERR-Private TCP Address" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:125 +msgid "ERR-SymmetricNAT" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:128 +msgid "WARN-Firewalled with Inbound TCP Enabled" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:130 +msgid "WARN-Firewalled and Floodfill" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:132 +msgid "WARN-Firewalled and Fast" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:133 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:581 +msgid "Firewalled" +msgstr "ممنوع من الجدار الناري" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:135 +msgid "ERR-UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:141 +msgid "ERR-No Active Peers, Check Network Connection and Firewall" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:144 +msgid "ERR-UDP Disabled and Inbound TCP host/port not set" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:146 +msgid "WARN-Firewalled with UDP Disabled" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:148 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:597 +msgid "Testing" +msgstr "جاري التجريب" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:370 +msgid "Add/remove/edit & control your client and server tunnels" +msgstr "أضÙ/ØØ°Ù/Øرر & المستخدم والانÙاق" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:382 +msgid "Server" +msgstr "خادم" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:386 +msgid "Show tunnels" +msgstr "أظهر الانÙاق" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:397 +msgid "Leases expired" +msgstr "" + +#. red or yellow light +#: ../java/src/net/i2p/router/web/SummaryHelper.java:397 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:398 +msgid "Rebuilding" +msgstr "اعادة بناية" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:398 +msgid "ago" +msgstr "هناك" + +#. green light +#: ../java/src/net/i2p/router/web/SummaryHelper.java:401 +msgid "Ready" +msgstr "مستعد" + +#. yellow light +#: ../java/src/net/i2p/router/web/SummaryHelper.java:405 +msgid "Building" +msgstr "بناء" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:405 +msgid "Building tunnels" +msgstr "جاري بناء النÙÙ‚" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:410 +msgid "none" +msgstr "ﻻشيئ" + +#. tunnel nicknames, taken from i2ptunnel.config so they will display +#. nicely under 'local destinations' in the summary bar +#. note that if the wording changes in i2ptunnel.config, we have to +#. keep the old string here as well for existing installs +#: ../java/src/net/i2p/router/web/SummaryHelper.java:421 +#: ../java/strings/Strings.java:36 +msgid "shared clients" +msgstr "المستخدمين المشتركين" + +#. Note to translators: all runtime zh translation disabled in this file, no font available in RRD +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:89 +#, java-format +msgid "events in {0}" +msgstr "أعادة التشغيل ÙÙŠ {0}" + +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:91 +#, java-format +msgid "averaged for {0}" +msgstr "متوسط {0}" + +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:101 +msgid "Events per period" +msgstr "عدد الأØداث ÙÙŠ المدة" + +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:114 +msgid "avg" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:116 +msgid "now" +msgstr "الآن" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:41 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:63 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:287 +msgid "configure" +msgstr "إعدادات" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:65 +msgid "dead" +msgstr "ميت" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:71 +msgid "Participating tunnels" +msgstr "الأنÙاق المشاركة" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:72 +msgid "From" +msgstr "من" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:72 +msgid "Receive on" +msgstr "استقبل ÙÙŠ" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:73 +msgid "Expiration" +msgstr "انتهاء" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:73 +msgid "Send on" +msgstr "ارسال الى" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:73 +msgid "To" +msgstr "إلى" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:74 +msgid "Rate" +msgstr "معدل" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:74 +msgid "Role" +msgstr "دور" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:74 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:156 +msgid "Usage" +msgstr "استعمال" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:107 +msgid "grace period" +msgstr "Ùترة السماØ" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:117 +msgid "Outbound Endpoint" +msgstr "نقطة الخروج" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:119 +msgid "Inbound Gateway" +msgstr "نقطة الدخول" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:121 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:162 +msgid "Participant" +msgstr "المشارك" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:126 +msgid "Inactive participating tunnels" +msgstr "انÙاق غير مساهمة" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:127 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:218 +msgid "Lifetime bandwidth usage" +msgstr "درجة استعمال الشبكة" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:156 +msgid "Expiry" +msgstr "المدة" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:159 +msgid "Participants" +msgstr "المشاركون" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:165 +msgid "Endpoint" +msgstr "نقطة النهاية" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:205 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:212 +msgid "Build in progress" +msgstr "جاري إنشاء النÙÙ‚" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:205 +msgid "inbound" +msgstr "الداخل" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:212 +msgid "outbound" +msgstr "الخارج" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:217 +msgid "No tunnels; waiting for the grace period to end." +msgstr "لا يوجد Ù†ÙÙ‚ØŒ ÙÙŠ انتظار مدة لتوقÙ" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:219 +msgid "in" +msgstr "دخل" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:220 +msgid "out" +msgstr "خرج" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:237 +msgid "Tunnel Counts By Peer" +msgstr "عدد الأنÙاق لكل زوج" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:238 +msgid "% of total" +msgstr "% من المجموع" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:238 +msgid "Our Tunnels" +msgstr "أنÙاق" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:238 +msgid "Participating Tunnels" +msgstr "الأنÙاق المشاركة" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:256 +msgid "Totals" +msgstr "المجموع" + +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:66 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:142 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:237 +msgid "Updating" +msgstr "ترقية" + +#. Process the .sud/.su2 file +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:88 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:111 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:116 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:261 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:286 +msgid "Update downloaded" +msgstr "طريقة الترقية" + +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:91 +#, java-format +msgid "Unsigned update file from {0} is corrupt" +msgstr "مل٠التØديث غير كامل {0} " + +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:111 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:281 +msgid "Restarting" +msgstr "أعد التشغيل" + +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:118 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:288 +msgid "Click Restart to install" +msgstr "أنقر اعادة التشغبل للتثبيت" + +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:120 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:290 +msgid "Click Shutdown and restart to install" +msgstr "انقر زر التوق٠وأعد التشغيل للتثبيت" + +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:121 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:292 +#, java-format +msgid "Version {0}" +msgstr "اصدار {0}" + +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:126 +#, java-format +msgid "Failed copy to {0}" +msgstr "Ùشل ÙÙŠ نسخ {0}" + +#: ../java/src/net/i2p/router/web/UpdateHandler.java:184 +#, java-format +msgid "Updating from {0}" +msgstr "تØديث من {0}" + +#: ../java/src/net/i2p/router/web/UpdateHandler.java:253 +#, java-format +msgid "No new version found at {0}" +msgstr "ﻻيوجد اصدار جديد {0} " + +#: ../java/src/net/i2p/router/web/UpdateHandler.java:281 +msgid "Update verified" +msgstr "انتهى التØديث" + +#: ../java/src/net/i2p/router/web/UpdateHandler.java:307 +#, java-format +msgid "Transfer failed from {0}" +msgstr "Ùشل ÙÙŠ النقل {0}" + +#. wars for ConfigClientsHelper +#: ../java/strings/Strings.java:12 +msgid "addressbook" +msgstr "دÙتر العناوين" + +#: ../java/strings/Strings.java:13 +msgid "i2psnark" +msgstr "تورنت" + +#: ../java/strings/Strings.java:14 +msgid "i2ptunnel" +msgstr "Ù†ÙÙ‚i2p" + +#: ../java/strings/Strings.java:15 +msgid "susimail" +msgstr "البريد" + +#: ../java/strings/Strings.java:16 +msgid "susidns" +msgstr "" + +#: ../java/strings/Strings.java:17 +msgid "routerconsole" +msgstr "موجه" + +#. clients, taken from clients.config, for ConfigClientsHelper +#. note that if the wording changes in clients.config, we have to +#. keep the old string here as well for existing installs +#: ../java/strings/Strings.java:22 +msgid "Web console" +msgstr "شاشة التØكم" + +#: ../java/strings/Strings.java:23 +msgid "SAM application bridge" +msgstr "" + +#: ../java/strings/Strings.java:24 +msgid "Application tunnels" +msgstr "Ù†ÙÙ‚ البرامج" + +#: ../java/strings/Strings.java:25 +msgid "My eepsite web server" +msgstr " eepsite خادم ويب" + +#: ../java/strings/Strings.java:26 +msgid "I2P webserver (eepsite)" +msgstr "I2P خادم ويب (eepsite)" + +#: ../java/strings/Strings.java:27 +msgid "Browser launch at startup" +msgstr "اطلاق المتصÙØ Ø¹Ù†Ø¯ البداية" + +#: ../java/strings/Strings.java:28 +msgid "BOB application bridge" +msgstr "" + +#: ../java/strings/Strings.java:30 +msgid "Open Router Console in web browser at startup" +msgstr "ÙØªØ Ø´Ø§Ø´Ø© التØكم ÙÙŠ المتصÙØ Ø¹Ù†Ø¯ البداية" + +#: ../java/strings/Strings.java:37 +msgid "IRC proxy" +msgstr "IRC بروكسي" + +#: ../java/strings/Strings.java:38 +msgid "eepsite" +msgstr "" + +#: ../java/strings/Strings.java:39 +msgid "I2P webserver" +msgstr "I2P خادم ويب" + +#: ../java/strings/Strings.java:40 +msgid "HTTP Proxy" +msgstr "" + +#. older names for pre-0.7.4 installs +#: ../java/strings/Strings.java:42 +msgid "eepProxy" +msgstr "" + +#: ../java/strings/Strings.java:43 +msgid "ircProxy" +msgstr "" + +#. hardcoded in i2psnark +#: ../java/strings/Strings.java:45 +msgid "I2PSnark" +msgstr "" + +#. hardcoded in iMule? +#: ../java/strings/Strings.java:47 +msgid "iMule" +msgstr "" + +#. standard themes for ConfigUIHelper +#: ../java/strings/Strings.java:51 +msgid "classic" +msgstr "" + +#: ../java/strings/Strings.java:52 +msgid "dark" +msgstr "داكن" + +#: ../java/strings/Strings.java:53 +msgid "light" +msgstr "ÙاتØ" + +#: ../java/strings/Strings.java:54 +msgid "midnight" +msgstr "ليل" + +#. stat groups for stats.jsp +#: ../java/strings/Strings.java:57 +msgid "Bandwidth" +msgstr "سرعة الاتصال" + +#: ../java/strings/Strings.java:58 +msgid "BandwidthLimiter" +msgstr "تØديد سرعة الاتصال" + +#: ../java/strings/Strings.java:59 +msgid "ClientMessages" +msgstr "" + +#: ../java/strings/Strings.java:60 +msgid "Encryption" +msgstr "التشÙير" + +#: ../java/strings/Strings.java:61 +msgid "i2cp" +msgstr "" + +#: ../java/strings/Strings.java:63 +msgid "InNetPool" +msgstr "" + +#: ../java/strings/Strings.java:64 +msgid "JobQueue" +msgstr "" + +#: ../java/strings/Strings.java:65 +msgid "NetworkDatabase" +msgstr "شبكة" + +#: ../java/strings/Strings.java:66 +msgid "ntcp" +msgstr "" + +#: ../java/strings/Strings.java:69 +msgid "Stream" +msgstr "" + +#: ../java/strings/Strings.java:70 +msgid "Throttle" +msgstr "" + +#: ../java/strings/Strings.java:71 +msgid "Transport" +msgstr "نقل" + +#: ../java/strings/Strings.java:73 +msgid "udp" +msgstr "" + +#. parameters in transport addresses (netdb.jsp) +#. may or may not be worth translating +#: ../java/strings/Strings.java:77 +msgid "host" +msgstr "" + +#: ../java/strings/Strings.java:78 +msgid "key" +msgstr "Ù…ÙتاØ" + +#: ../java/strings/Strings.java:79 +msgid "port" +msgstr "منÙØ°" + +#. introducer host +#: ../java/strings/Strings.java:83 +msgid "ihost0" +msgstr "" + +#: ../java/strings/Strings.java:84 +msgid "ihost1" +msgstr "" + +#: ../java/strings/Strings.java:85 +msgid "ihost2" +msgstr "" + +#. introducer port +#: ../java/strings/Strings.java:87 +msgid "iport0" +msgstr "" + +#: ../java/strings/Strings.java:88 +msgid "iport1" +msgstr "" + +#: ../java/strings/Strings.java:89 +msgid "iport2" +msgstr "" + +#. introducer key +#: ../java/strings/Strings.java:91 +msgid "ikey0" +msgstr "" + +#: ../java/strings/Strings.java:92 +msgid "ikey1" +msgstr "" + +#: ../java/strings/Strings.java:93 +msgid "ikey2" +msgstr "" + +#. introducer tag +#: ../java/strings/Strings.java:95 +msgid "itag0" +msgstr "" + +#: ../java/strings/Strings.java:96 +msgid "itag1" +msgstr "" + +#: ../java/strings/Strings.java:97 +msgid "itag2" +msgstr "" + +#. Descriptions for the stats that are graphed by default +#. There are over 500 stats currently defined, we aren't going to tag them all +#: ../java/strings/Strings.java:101 +msgid "Low-level bandwidth receive rate" +msgstr "" + +#. bw.recvRate +#: ../java/strings/Strings.java:102 +msgid "Low-level bandwidth send rate" +msgstr "" + +#. bw.sendRate +#: ../java/strings/Strings.java:103 +msgid "How many peers we are actively talking with" +msgstr "كم من المستخدمين نتØاور معهم" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:106 +msgid "config networking" +msgstr "اعدادت الشبكة" + +#. We have intl defined when this is included, but not when compiled standalone. +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:216 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:217 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:216 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:216 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:230 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:216 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:216 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:216 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:217 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:216 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:216 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:216 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:219 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:216 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:219 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:219 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:219 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:219 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:215 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:215 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:215 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:219 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:219 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:215 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:215 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:215 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:234 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:215 +msgid "Refresh (s)" +msgstr "أنعش" + +#. ditto +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:221 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:234 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:221 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:231 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:219 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:219 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:219 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:219 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:219 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:219 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:237 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:219 +msgid "Enable" +msgstr "Ùعل" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:240 +msgid "I2P Network Configuration" +msgstr "اعدادات شبكة I2P" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:298 +msgid "Bandwidth limiter" +msgstr "مخدد سرعة الشبكة" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:300 +msgid "I2P will work best if you configure your rates to match the speed of your internet connection." +msgstr "سيشتغلI2P بÙعالية أكبر اذا Øددت سرعة الاتصال." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:304 +msgid "KBps In" +msgstr "KBps الداخلة" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:318 +msgid "KBps Out" +msgstr "KBps الخارجة" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:334 +msgid "Share" +msgstr "شارك" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:341 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:309 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:304 +msgid "NOTE" +msgstr "ملاØظة" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:343 +#, java-format +msgid "You have configured I2P to share only {0} KBps." +msgstr "لقد قمت باعداد I2P لمشاركة {0} KOps." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:346 +msgid "I2P requires at least 12KBps to enable sharing. " +msgstr "ÙŠØتاج I2P على الاقل الى 12KBps لتÙعيل المشاركة." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:347 +msgid "Please enable sharing (participating in tunnels) by configuring more bandwidth. " +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:348 +msgid "It improves your anonymity by creating cover traffic, and helps the network." +msgstr "هذا يزيد من مجهولية المستخدم Ùˆ يساعد الشبكة بشكل عام." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:351 +#, java-format +msgid "You have configured I2P to share {0} KBps." +msgstr "قمت باعداد I2P لمشاركة {0} KOps." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:354 +msgid "The higher the share bandwidth the more you improve your anonymity and help the network." +msgstr "كلما ارتÙر سرعة الشبكة التي تشاركها، كلما زادت نسبة المجهولية ÙˆÙعالية الشبكة." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:358 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:514 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:305 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:327 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:403 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:321 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:339 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:348 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:375 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:342 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:322 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:365 +msgid "Cancel" +msgstr "ألغي" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:375 +msgid "IP and Transport Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:377 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:395 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:306 +msgid "The default settings will work for most people." +msgstr "الاعدادات التي تشتغل غالبية الوقت." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:379 +msgid "There is help below." +msgstr "أنظر التعليمات أسÙله." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:381 +msgid "UPnP Configuration" +msgstr "اعدادات UPnP" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:385 +msgid "Enable UPnP to open firewall ports" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:387 +msgid "UPnP status" +msgstr "UPnP Øالة" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:389 +msgid "IP Configuration" +msgstr "اعدادات IP" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:391 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:461 +msgid "Externally reachable hostname or IP address" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:395 +msgid "Use all auto-detect methods" +msgstr "استعمال جميع طرق الاكتشا٠التلقائي" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:399 +msgid "Disable UPnP IP address detection" +msgstr "الغاء UPnP IP اكتشا٠عنوان " + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:403 +msgid "Ignore local interface IP address" +msgstr "تجاهل عنوان IP المØلي" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:407 +msgid "Use SSU IP address detection only" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:411 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:479 +msgid "Specify hostname or IP" +msgstr "Øدد hostname او IP" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:417 +msgid "Select Interface" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:431 +msgid "Hidden mode - do not publish IP" +msgstr "لا تنشر عنوان IP" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:433 +msgid "(prevents participating traffic)" +msgstr "(منع مشاركة الاتصال)" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:435 +msgid "Action when IP changes" +msgstr "عمل عند تغيير IP" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:439 +msgid "Laptop mode - Change router identity and UDP port when IP changes for enhanced anonymity" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:441 +msgid "Experimental" +msgstr "تجريبي" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:443 +msgid "UDP Configuration:" +msgstr "اعدادات UDP :" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:445 +msgid "UDP port:" +msgstr "منÙØ° UDP :" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:459 +msgid "TCP Configuration" +msgstr "اعدادات TCP" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:465 +msgid "Use auto-detected IP address" +msgstr "استعمل دائما عنوان IP المكتش٠" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:467 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:499 +msgid "currently" +msgstr "Øاليا" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:471 +msgid "if we are not firewalled" +msgstr "لايوجد جدار ناري" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:475 +msgid "Always use auto-detected IP address (Not firewalled)" +msgstr "استعمل دائما عنوان IP المكتش٠(لا يوجد جدار ناري)" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:485 +msgid "Disable inbound (Firewalled)" +msgstr "الغاء الاتصال الداخلي (وراء جدار ناري)" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:489 +msgid "Completely disable" +msgstr "الغاء" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:491 +msgid "(select only if behind a firewall that throttles or blocks outbound TCP)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:493 +msgid "Externally reachable TCP port" +msgstr "منÙØ° TCP يمكن الوصول إليها خارجيا" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:497 +msgid "Use the same port configured for UDP" +msgstr "استعمل Ù†Ùس المنÙØ° المخصص لمنÙØ° UDP" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:505 +msgid "Specify Port" +msgstr "إختر المنÙØ°" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:509 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:339 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:330 +msgid "Note" +msgstr "ملاØظة" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:512 +msgid "Changing these settings will restart your router." +msgstr "تغيير ÙÙŠ الإعدادات يقتضي اعادة تشغيل الموجه." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:518 +msgid "Configuration Help" +msgstr "مساعدة Øول الاعدادات" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:520 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:569 +msgid "While I2P will work fine behind most firewalls, your speeds and network integration will generally improve if the I2P port is forwarded for both UDP and TCP." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:522 +msgid "If you can, please poke a hole in your firewall to allow unsolicited UDP and TCP packets to reach you." +msgstr "ان توÙرت الامكانية قم بÙØªØ Ù…Ù†ÙØ° ÙÙŠ الجدار الناري Ù„Ø³Ù…Ø§Ø Ø¨ÙˆØµÙˆÙ„ اتصال UDP Ùˆ TCP" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:524 +msgid "If you can't, I2P supports UPnP (Universal Plug and Play) and UDP hole punching with \"SSU introductions\" to relay traffic." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:526 +msgid "Most of the options above are for special situations, for example where UPnP does not work correctly, or a firewall not under your control is doing harm." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:528 +msgid "Certain firewalls such as symmetric NATs may not work well with I2P." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:537 +msgid "UPnP is used to communicate with Internet Gateway Devices (IGDs) to detect the external IP address and forward ports." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:539 +msgid "UPnP support is beta, and may not work for any number of reasons" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:541 +msgid "No UPnP-compatible device present" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:543 +msgid "UPnP disabled on the device" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:545 +msgid "Software firewall interference with UPnP" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:547 +msgid "Bugs in the device's UPnP implementation" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:549 +msgid "Multiple firewall/routers in the internet connection path" +msgstr "هناك عدة موجهات Ùˆ جدار ناري ÙÙŠ طريق الاتصال بالانترنت" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:551 +msgid "UPnP device change, reset, or address change" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:553 +msgid "Review the UPnP status here." +msgstr "راجع Øالة UPnP هنا." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:555 +msgid "UPnP may be enabled or disabled above, but a change requires a router restart to take effect." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:557 +msgid "Hostnames entered above will be published in the network database." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:559 +msgid "They are <b>not private</b>." +msgstr "انها <b>غير خاصة</b>." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:561 +msgid "Also, <b>do not enter a private IP address</b> like 127.0.0.1 or 192.168.1.1." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:563 +msgid "If you specify the wrong IP address or hostname, or do not properly configure your NAT or firewall, your network performance will degrade substantially." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:565 +msgid "When in doubt, leave the settings at the defaults." +msgstr "ان لم تكن متأكدا دع الاعدادات كما هي." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:567 +msgid "Reachability Help" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:572 +msgid "If you think you have opened up your firewall and I2P still thinks you are firewalled, remember that you may have multiple firewalls, for example both software packages and external hardware routers." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:575 +msgid "If there is an error, the <a href=\"logs.jsp\">logs</a> may also help diagnose the problem." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:579 +msgid "Your UDP port does not appear to be firewalled." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:583 +msgid "Your UDP port appears to be firewalled." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:585 +msgid "As the firewall detection methods are not 100% reliable, this may occasionally be displayed in error." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:587 +msgid "However, if it appears consistently, you should check whether both your external and internal firewalls are open for your port." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:589 +msgid "I2P will work fine when firewalled, there is no reason for concern. When firewalled, the router uses \"introducers\" to relay inbound connections." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:591 +msgid "However, you will get more participating traffic and help the network more if you can open your firewall(s)." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:593 +msgid "If you think you have already done so, remember that you may have both a hardware and a software firewall, or be behind an additional, institutional firewall you cannot control." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:595 +msgid "Also, some routers cannot correctly forward both TCP and UDP on a single port, or may have other limitations or bugs that prevent them from passing traffic through to I2P." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:599 +msgid "The router is currently testing whether your UDP port is firewalled." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:603 +msgid "The router is not configured to publish its address, therefore it does not expect incoming connections." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:605 +msgid "WARN - Firewalled and Fast" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:607 +msgid "You have configured I2P to share more than 128KBps of bandwidth, but you are firewalled." +msgstr "قمت باعداد I2P لمشاركة أكثر من 128KBpsØŒ لكنك وراء جدار ناري." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:609 +msgid "While I2P will work fine in this configuration, if you really have over 128KBps of bandwidth to share, it will be much more helpful to the network if you open your firewall." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:611 +msgid "WARN - Firewalled and Floodfill" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:613 +msgid "You have configured I2P to be a floodfill router, but you are firewalled." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:615 +msgid "For best participation as a floodfill router, you should open your firewall." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:617 +msgid "WARN - Firewalled with Inbound TCP Enabled" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:619 +msgid "You have configured inbound TCP, however your UDP port is firewalled, and therefore it is likely that your TCP port is firewalled as well." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:621 +msgid "If your TCP port is firewalled with inbound TCP enabled, routers will not be able to contact you via TCP, which will hurt the network." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:623 +msgid "Please open your firewall or disable inbound TCP above." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:625 +msgid "WARN - Firewalled with UDP Disabled" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:627 +msgid "You have configured inbound TCP, however you have disabled UDP." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:629 +msgid "You appear to be firewalled on TCP, therefore your router cannot accept inbound connections." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:631 +msgid "Please open your firewall or enable UDP." +msgstr "غير اعدادات الجدار الناري Ù„ÙØªØ Ù…Ù†ÙØ° UDP." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:633 +msgid "ERR - Clock Skew" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:635 +msgid "Your system's clock is skewed, which will make it difficult to participate in the network." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:637 +msgid "Correct your clock setting if this error persists." +msgstr "غير اعدادات الساعة اذا استمر هذا الخطأ." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:639 +msgid "ERR - Private TCP Address" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:641 +msgid "You must never advertise an unroutable IP address such as 127.0.0.1 or 192.168.1.1 as your external address." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:643 +msgid "Correct the address or disable inbound TCP above." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:645 +msgid "ERR - SymmetricNAT" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:647 +msgid "I2P detected that you are firewalled by a Symmetric NAT." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:649 +msgid "I2P does not work well behind this type of firewall. You will probably not be able to accept inbound connections, which will limit your participation in the network." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:651 +msgid "ERR - UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:653 +msgid "I2P was unable to bind to port 8887 or other configured port." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:655 +msgid "Check to see if another program is using the configured port. If so, stop that program or configure I2P to use a different port." +msgstr "تØقق من انه لا يوجد برنامج آخر يستعمل Ù†Ùس المنÙØ°. قم بتوقي٠البرنامج وتغيير اعدادات I2P." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:657 +msgid "This may be a transient error, if the other program is no longer using the port." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:659 +msgid "However, a restart is always required after this error." +msgstr "اعادة تشغيل ضرورية بعد هذا الخطأ." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:661 +msgid "ERR - UDP Disabled and Inbound TCP host/port not set" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:663 +msgid "You have not configured inbound TCP with a hostname and port above, however you have disabled UDP." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:665 +msgid "Therefore your router cannot accept inbound connections." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:667 +msgid "Please configure a TCP host and port above or enable UDP." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:669 +msgid "ERR - Client Manager I2CP Error - check logs" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:671 +msgid "This is usually due to a port 7654 conflict. Check the logs to verify." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:673 +msgid "Do you have another I2P instance running? Stop the conflicting program and restart I2P." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:107 +msgid "config advanced" +msgstr "اعدادات متقدمة" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:241 +msgid "I2P Advanced Configuration" +msgstr "اعدادات I2P متقدمة" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:301 +msgid "Advanced I2P Configuration" +msgstr "اعدادات I2P متقدمة" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:311 +msgid "Some changes may require a restart to take effect." +msgstr "بعض التغييرات تØتاج اعادة التشغيل لتÙعيلها" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:106 +msgid "config clients" +msgstr "إعدادات المستخدم" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:243 +msgid "I2P Client Configuration" +msgstr "اعدادات I2P " + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:312 +msgid "Client Configuration" +msgstr "اعدادات المستخدم" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:314 +msgid "The Java clients listed below are started by the router and run in the same JVM." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:318 +msgid "To change other client options, edit the file" +msgstr "لتغيير خضائص المستخدم غير الملÙ" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:325 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:401 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:415 +msgid "All changes require restart to take effect." +msgstr "جيمع التغييرات تØتاج اعادة التشغيل ليتم تطبيقها" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:337 +msgid "Advanced Client Interface Configuration" +msgstr "اعدادات I2P متقدمة" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:339 +msgid "External I2CP (I2P Client Protocol) Interface Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:345 +msgid "Enabled without SSL" +msgstr "Ùعل بدون SSL" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:351 +msgid "Enabled with SSL required" +msgstr "تÙعيل SSL ضروري" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:357 +msgid "Disabled - Clients outside this Java process may not connect" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:359 +msgid "I2CP Port" +msgstr "I2CP منÙØ°" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:363 +msgid "I2CP Interface" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:379 +msgid "Authorization" +msgstr "الصلاØية" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:385 +msgid "Require username and password" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:387 +msgid "Username" +msgstr "اسم المستخدم" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:391 +msgid "Password" +msgstr "كلمة السر" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:397 +msgid "Any changes made here must also be configured in the external client." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:399 +msgid "Many clients do not support SSL or authorization." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:407 +msgid "WebApp Configuration" +msgstr "اعدادات تطبيق ويب" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:409 +msgid "The Java web applications listed below are started by the webConsole client and run in the same JVM as the router. They are usually web applications accessible through the router console. They may be complete applications (e.g. i2psnark),front-ends to another client or application which must be separately enabled (e.g. susidns, i2ptunnel), or have no web interface at all (e.g. addressbook)." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:411 +msgid "A web app may also be disabled by removing the .war file from the webapps directory; however the .war file and web app will reappear when you update your router to a newer version, so disabling the web app here is the preferred method." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:421 +msgid "Plugin Configuration" +msgstr "إعدادات الملØÙ‚" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:423 +msgid "The plugins listed below are started by the webConsole client." +msgstr "الملØقال التالية يتم تشغيلها من طر٠شاشة التØكم" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:429 +msgid "Plugin Installation" +msgstr "تثبيت الملØÙ‚" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:431 +msgid "To install a plugin, enter the download URL:" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:106 +msgid "config keyring" +msgstr "اعدادات المÙاتيØ" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:227 +msgid "I2P Keyring Configuration" +msgstr "اعدادات المÙØ§ØªÙŠØ I2P" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:295 +msgid "The router keyring is used to decrypt encrypted leaseSets." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:298 +msgid "The keyring may contain keys for local or remote encrypted destinations." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:308 +msgid "Manual Keyring Addition" +msgstr "اضاÙØ© المÙØ§ØªÙŠØ ÙŠØ¯ÙˆÙŠØ§" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:310 +msgid "Enter keys for encrypted remote destinations here." +msgstr "ادخل Ù…ÙØ§ØªÙŠØ Ø§Ù„ÙˆØ¬Ù‡Ø§Øª المشÙرة هنا" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:313 +msgid "Keys for local destinations must be entered on the" +msgstr "يجب ادخال Ù…ÙØ§ØªÙŠØ Ø§Ù„ÙˆØ¬Ù‡Ø§Øª المØلية ÙÙŠ" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:315 +msgid "I2PTunnel page" +msgstr "صÙØØ© النÙÙ‚ I2P" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:317 +msgid "Dest. name, hash, or full key" +msgstr "نقطة الوصول، اسم، بصمة، او Ù…ÙØªØ§Ø ÙƒØ§Ù…Ù„" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:319 +msgid "Encryption Key" +msgstr "Ù…ÙØªØ§Ø Ø§Ù„ØªØ´Ùير" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:107 +msgid "config logging" +msgstr "اعدادت السجلات" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:241 +msgid "I2P Logging Configuration" +msgstr "اعدادت السجلات I2P" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:301 +msgid "Configure I2P Logging Options" +msgstr "اعدادت السجلات I2P" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:303 +msgid "Logging filename" +msgstr "مل٠السجل" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:307 +msgid "(the symbol '@' will be replaced during log rotation)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:309 +msgid "Log record format" +msgstr "بيانات السجل" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:313 +msgid "(use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, 'm' = message)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:315 +msgid "Log date format" +msgstr "تاريخ السجل" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:319 +msgid "('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' = millisecond)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:321 +msgid "Max log file size" +msgstr "أقصى Øجم لمل٠السجل" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:325 +msgid "Default log level" +msgstr "نوع السجل" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:329 +msgid "(DEBUG and INFO are not recommended defaults, as they will drastically slow down your router)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:331 +msgid "Log level overrides" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:335 +msgid "New override" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:106 +msgid "config peers" +msgstr "اعدادات النظائر" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:227 +msgid "I2P Peer Configuration" +msgstr "اعدادات مستخدمي I2P" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:305 +msgid "Manual Peer Controls" +msgstr "تØكم يدوي ÙÙŠ النظائر" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:307 +msgid "Router Hash" +msgstr "بصمة الموجه" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:311 +msgid "Manually Ban / Unban a Peer" +msgstr "منع / الغاء منع يدويا لنظير" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:313 +msgid "Banning will prevent the participation of this peer in tunnels you create." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:323 +msgid "Adjust Profile Bonuses" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:325 +msgid "Bonuses may be positive or negative, and affect the peer's inclusion in Fast and High Capacity tiers. Fast peers are used for client tunnels, and High Capacity peers are used for some exploratory tunnels. Current bonuses are displayed on the" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:327 +msgid "profiles page" +msgstr "صÙØØ© البروÙايل" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:345 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:251 +msgid "Banned Peers" +msgstr "مستخدمون ممنوعون" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:366 +msgid "Banned IPs" +msgstr "عناوين IP الممنوعة" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:106 +msgid "config reseeding" +msgstr "اعدادات اعادة التوزيع" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:240 +msgid "I2P Reseeding Configuration" +msgstr "اعدادات اعادة التوزيع" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:300 +msgid "Reseeding Configuration" +msgstr "اعدادات اعادة التوزيع" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:302 +msgid "Reseeding is the bootstrapping process used to find other routers when you first install I2P, or when your router has too few router references remaining." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:304 +msgid "If reseeding has failed, you should first check your network connection." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:308 +msgid "Change these only if HTTP is blocked by a restrictive firewall, reseed has failed, and you have access to an HTTP proxy." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:310 +#, java-format +msgid "See {0} for instructions on reseeding manually." +msgstr "أنظر {0} التعليمات لاعادة التوزيع اليدوي." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:310 +msgid "the FAQ" +msgstr "الأسئلة الشائعة" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:312 +msgid "Reseed URL Selection" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:318 +msgid "Try SSL first then non-SSL" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:324 +msgid "Use SSL only" +msgstr "استعمل SSL Ùقط" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:330 +msgid "Use non-SSL only" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:332 +msgid "Reseed URLs" +msgstr "اعادة توزيع العناوين" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:336 +msgid "Enable HTTP proxy (not used for SSL)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:340 +msgid "HTTP Proxy Host" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:344 +msgid "HTTP Proxy Port" +msgstr "HTTP Proxy منÙØ°" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:106 +msgid "config service" +msgstr "اعدادات الخدمة" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:227 +msgid "I2P Service Configuration" +msgstr "اعدادات خدمة I2P" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:285 +msgid "Shutdown the router" +msgstr "توقي٠الموجه" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:287 +msgid "Graceful shutdown lets the router satisfy the agreements it has already made before shutting down, but may take a few minutes." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:289 +msgid "If you need to kill the router immediately, that option is available as well." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:299 +msgid "If you want the router to restart itself after shutting down, you can choose one of the following." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:301 +msgid "This is useful in some situations - for example, if you changed some settings that client applications only read at startup, such as the routerconsole password or the interface it listens on." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:303 +msgid "A graceful restart will take a few minutes (but your peers will appreciate your patience), while a hard restart does so immediately." +msgstr "اعادة التشغيل ستتم بعد بضع دقائق (لمساعدة النظائر)ØŒ بينما اعادة التشغبل الÙورية تعيد التشغيل Ùورا." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:305 +msgid "After tearing down the router, it will wait 1 minute before starting back up again." +msgstr "عند توقي٠الموجه، سيتم تشغيله مرة أخرى بعد دقيقة." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:315 +msgid "Systray integration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:317 +msgid "On the windows platform, there is a small application to sit in the system tray, allowing you to view the router's status" +msgstr "ÙÙŠ نظام ويندوز، هناك برنامج صغير يمكنك من خلال ايقونة معرÙØ© Øالة اشتغال الموجه" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:319 +msgid "(later on, I2P client applications will be able to integrate their own functionality into the system tray as well)." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:321 +msgid "If you are on windows, you can either enable or disable that icon here." +msgstr "اذا كنت من مستعملي ويندوز يمكنك تÙعيل او الغاء تÙعيل الايقونة هنا." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:323 +msgid "Show systray icon" +msgstr "أظهر الأيقونة" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:325 +msgid "Hide systray icon" +msgstr "إخÙاء أيقونة" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:327 +msgid "Run on startup" +msgstr "شغل عند انطلاق" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:329 +msgid "You can control whether I2P is run on startup or not by selecting one of the following options - I2P will install (or remove) a service accordingly." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:331 +msgid "If you prefer the command line, you can also run the " +msgstr "اذا كنت تÙضل استعمال سطر الأوامر، يمكنك تطبيق" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:341 +msgid "If you are running I2P as service right now, removing it will shut down your router immediately." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:343 +msgid "You may want to consider shutting down gracefully, as above, then running uninstall_i2p_service_winnt.bat." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:347 +msgid "Debugging" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:349 +msgid "View the job queue" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:353 +msgid "At times, it may be helpful to debug I2P by getting a thread dump. To do so, please select the following option and review the thread dumped to <a href=\"logs.jsp#servicelogs\">wrapper.log</a>." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:359 +msgid "Launch browser on router startup?" +msgstr "أطلق المتصÙØ Ø¹Ù†Ø¯ البداية؟" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:361 +msgid "I2P's main configuration interface is this web console, so for your convenience I2P can launch a web browser on startup pointing at" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:107 +msgid "config stats" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:228 +msgid "I2P Stats Configuration" +msgstr "اعدادات اØصائيات I2P" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:302 +msgid "Configure I2P Stat Collection" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:304 +msgid "Enable full stats?" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:311 +msgid "change requires restart to take effect" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:313 +msgid "Stat file" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:317 +msgid "Filter" +msgstr "مرشØ" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:319 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:328 +msgid "toggle all" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:330 +msgid "Log" +msgstr "سجل" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:332 +msgid "Graph" +msgstr "رسم بياني" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:371 +msgid "Advanced filter" +msgstr "اعدادات متقدمة" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:106 +msgid "config tunnels" +msgstr "اعدادات الأنÙاق" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:240 +msgid "I2P Tunnel Configuration" +msgstr "اعدادات أنÙاق I2P" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:306 +msgid "The default settings work for most people." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:310 +msgid "There is a fundamental tradeoff between anonymity and performance." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:313 +msgid "Tunnels longer than 3 hops (for example 2 hops + 0-2 hops, 3 hops + 0-1 hops, 3 hops + 0-2 hops), or a high quantity + backup quantity, may severely reduce performance or reliability." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:316 +msgid "High CPU and/or high outbound bandwidth usage may result." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:319 +msgid "Change these settings with care, and adjust them if you have problems." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:333 +msgid "Exploratory tunnel setting changes are stored in the router.config file." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:336 +msgid "Client tunnel changes are temporary and are not saved." +msgstr "تغييرات النÙÙ‚ هي مؤقتة وغير Ù…ØÙوظة" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:338 +msgid "To make permanent client tunnel changes see the" +msgstr "للقيام بتغييرات دائمة أنظر" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:340 +msgid "i2ptunnel page" +msgstr "i2ptunnel صÙØØ©" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:106 +msgid "config UI" +msgstr "اعدادات واجهة المستخدم" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:240 +msgid "I2P UI Configuration" +msgstr "I2P اعدادات واجهة المستخدم" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:292 +msgid "Router Console Theme" +msgstr "تيمة واجهة المستخدم" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:310 +msgid "Theme selection disabled for Internet Explorer, sorry." +msgstr "إختيار التيمة لأنترنت اكسبلورر." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:312 +msgid "If you're not using IE, it's likely that your browser is pretending to be IE; please configure your browser (or proxy) to use a different User Agent string if you'd like to access the console themes." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:316 +msgid "Router Console Language" +msgstr "لغة لوØØ© التØكم" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:320 +msgid "Please contribute to the router console translation project! Contact the developers on IRC #i2p to help." +msgstr "ساهم ÙÙŠ ترجمة واجهة الاستخدام بالاتصال بالمطورين على IRC #i2p لطلب المساعدة." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:324 +msgid "Apply" +msgstr "طبق" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:106 +msgid "config update" +msgstr "ترقية الاعدادات" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:227 +msgid "I2P Update Configuration" +msgstr "اعدادات الترقية I2P" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:303 +msgid "Check for I2P and news updates" +msgstr "تØقق من اصدارات جديدة لـ I2P" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:305 +msgid "News & I2P Updates" +msgstr "اخبار I2P واصدارات جديدة" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:309 +msgid "Update In Progress" +msgstr "جاري التØديث" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:317 +msgid "News URL" +msgstr "عنوان الأخبار" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:321 +msgid "Refresh frequency" +msgstr "تردد الانعاش" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:327 +msgid "Update policy" +msgstr "طريقة الترقية" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:331 +msgid "Update through the eepProxy?" +msgstr "ترقية باستعمال eepProxyØŸ" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:335 +msgid "eepProxy host" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:339 +msgid "eepProxy port" +msgstr "eepProxy منÙØ°" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:343 +msgid "Update URLs" +msgstr "تØديث العناوين" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:347 +msgid "Trusted keys" +msgstr "المÙØ§ØªÙŠØ Ø§Ù„Ù…ÙˆØ«ÙˆÙ‚Ø©" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:351 +msgid "Update with unsigned development builds?" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:355 +msgid "Unsigned Build URL" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:361 +msgid "I2P updates are disabled because you do not have write permission for the install directory." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:367 +msgid "Save" +msgstr "ØÙظ" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:115 +msgid "Internal Error" +msgstr "مشكل داخلي" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:117 +msgid "Router Console" +msgstr "مركز تØكم I2P" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:121 +msgid "Configuration" +msgstr "اعدادات" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:129 +msgid "Sorry! There has been an internal error." +msgstr "خطأ هذا مشكل داخلي" + +#. note to translators - both parameters are URLs +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:133 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:232 +#, java-format +msgid "Please report bugs on {0} or {1}." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:137 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:236 +msgid "You may use the username \"guest\" and password \"guest\" if you do not wish to register." +msgstr "بمكنك استعمال كلمة مستخدم guest Ùˆ كلمة سر guest اذا لم ترغب ÙÙŠ التسجيل" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:139 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:238 +msgid "Please include this information in bug reports" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:141 +msgid "Error Details" +msgstr "تÙاصيل الخطأ" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:143 +#, java-format +msgid "Error {0}" +msgstr "خطأ {0}" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:163 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:228 +msgid "I2P Version and Running Environment" +msgstr "رقم اصدار I2P" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:191 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:266 +msgid "Note that system information, log timestamps, and log messages may provide clues to your location; please review everything you include in a bug report." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:117 +msgid "Page Not Found" +msgstr "صÙØØ© غير موجودة" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:242 +msgid "Sorry! You appear to be requesting a non-existent Router Console page or resource." +msgstr "معذرة، انت تقوم بطلب صÙØØ© غير موجودة" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:244 +msgid "Error 404" +msgstr "خطأ 404" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:249 +msgid "not found" +msgstr "غير موجود" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:106 +msgid "graphs" +msgstr "رسم بياني" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:227 +msgid "I2P Performance Graphs" +msgstr "رسم بياني لأداء I2P" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:105 +msgid "home" +msgstr "منزل" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:105 +msgid "job queue" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:226 +msgid "I2P Router Job Queue" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:105 +msgid "logs" +msgstr "السجلات" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:226 +msgid "I2P Router Logs" +msgstr "I2P سجل الموجه" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:281 +msgid "Critical Logs" +msgstr "سجلات هامة" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:285 +msgid "Router Logs" +msgstr "سجلات الموجه" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:291 +msgid "Service (Wrapper) Logs" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:105 +msgid "network database summary" +msgstr "قاعدة البيانات" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:226 +msgid "I2P Network Database Summary" +msgstr "اØصائيات قاعدة بيانات الشبكة" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:109 +msgid "WebApp Not Found" +msgstr "صÙØØ© غير موجودة" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:230 +msgid "Web Application Not Running" +msgstr "تطبيق الويب لا يشتغل" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:232 +msgid "The requested web application is not running." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:234 +msgid "Please visit the <a href=\"/configclients.jsp#webapp\">config clients page</a> to start it." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:105 +msgid "peer connections" +msgstr "الإتصال بالمستخدمين" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:226 +msgid "I2P Network Peers" +msgstr "I2P شبكة المستخدمين" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:105 +msgid "peer profiles" +msgstr "بروÙايل المستخدمين" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:226 +msgid "I2P Network Peer Profiles" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:105 +msgid "statistics" +msgstr "اØصائيات" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:243 +msgid "I2P Router Statistics" +msgstr "اØصائيات شبكة I2P" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:247 +#, java-format +msgid "Disable {0} Refresh" +msgstr "الغاء {0} الانعاش" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:105 +msgid "tunnel summary" +msgstr "Ùهرس الأنÙاق" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:226 +msgid "I2P Tunnel Summary" +msgstr "Ùهرس أنÙاق I2P" + +#~ msgid "" +#~ "Ensure that nothing blocks outbound HTTP, check <a target=\"_top\" href=" +#~ "\"logs.jsp\">logs</a> and if nothing helps, read the <a target=\"_top\" " +#~ "href=\"http://www.i2p2.de/faq.html\">FAQ</a> about reseeding manually." +#~ msgstr "" +#~ "تØقق من <a target=\"_top\" href=\"logs.jsp\">logs</a> and if nothing " +#~ "helpsØŒ read the <a target=\"_top\" href=\"http://www.i2p2.de/faq.html" +#~ "\">FAQ</a> about reseeding manually." + +#~ msgid "Last reseed failed fully (failed reading seed URL)." +#~ msgstr "Ùشل آخر توزيع ( تØميل العنوان)" + +#~ msgid "Last reseed failed fully (exception caught)." +#~ msgstr "Ùشل آخر توزيع" + +#~ msgid "System tray icon enabled." +#~ msgstr "تم تÙعيل ابقونة" + +#~ msgid "System tray icon feature not supported on this platform. Sorry!" +#~ msgstr "إظهار الأيقونة غير مدعوم" + +#~ msgid "Warning: unable to contact the systray manager" +#~ msgstr "خطأ: Ùشل ÙÙŠ الاتصال بمتØكم الأيقونة" + +#~ msgid "System tray icon disabled." +#~ msgstr "أيقونة النظام غير Ù…Ùعلة." + +#~ msgid "hour" +#~ msgstr "ساعة" + +#~ msgid "minute" +#~ msgstr "دقيقة" + +#~ msgid "minutes" +#~ msgstr "دقائق" + +#~ msgid "This is useful in some situations" +#~ msgstr "C'est utile dans certains cas" + +#~ msgid "Start Now" +#~ msgstr "Démarrer tout de suite" + +#~ msgid "Depth" +#~ msgstr "Profondeur" + +#~ msgid "view without" +#~ msgstr "montrer sans" + +#~ msgid "view with" +#~ msgstr "montrer avec" + +#~ msgid "Show the router's workload, and how it's performing" +#~ msgstr "Montrer les tâches en cours" + +#~ msgid "Jobs" +#~ msgstr "Tâches" + +#~ msgid "Tunnels in/out" +#~ msgstr "Tunnels entrants/sortants" diff --git a/apps/routerconsole/locale/messages_de.po b/apps/routerconsole/locale/messages_de.po index 4c323cd8e533ade505d6ac3b50350c82493c7d87..074daa5aa85dded9f13ec6c05d69c4182b25e2a9 100644 --- a/apps/routerconsole/locale/messages_de.po +++ b/apps/routerconsole/locale/messages_de.po @@ -8,10 +8,11 @@ msgid "" msgstr "" "Project-Id-Version: I2P routerconsole\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-12-28 00:08+0000\n" -"PO-Revision-Date: 2011-01-01 21:19+0100\n" +"POT-Creation-Date: 2011-03-25 12:46+0000\n" +"PO-Revision-Date: 2011-04-16 02:57+0100\n" "Last-Translator: mixxy <m1xxy@mail.i2p>\n" "Language-Team: echelon <echelon@mail.i2p>, Sperreingang <sperrbezirk@mail.i2p>\n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -26,7 +27,7 @@ msgstr "" #. {0,number,####} prevents 1234 from being output as 1,234 in the English locale. #. If you want the digit separator in your locale, translate as {0}. #. alternates: msec, msecs -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1103 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1141 #, java-format msgid "1 ms" msgid_plural "{0,number,####} ms" @@ -36,7 +37,7 @@ msgstr[1] "{0,number,####} ms" #. seconds #. Note to translators: quantity will always be greater than one. #. alternates: secs, sec. 'seconds' is probably too long. -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1108 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1146 #, java-format msgid "1 sec" msgid_plural "{0} sec" @@ -46,7 +47,7 @@ msgstr[1] "{0} s" #. minutes #. Note to translators: quantity will always be greater than one. #. alternates: mins, min. 'minutes' is probably too long. -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1113 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1151 #, java-format msgid "1 min" msgid_plural "{0} min" @@ -56,42 +57,42 @@ msgstr[1] "{0} Minuten" #. hours #. Note to translators: quantity will always be greater than one. #. alternates: hrs, hr., hrs. -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1118 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1156 #, java-format msgid "1 hour" msgid_plural "{0} hours" msgstr[0] "1 Stunde" msgstr[1] "{0} Stunden" -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1120 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:313 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1158 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:314 msgid "n/a" msgstr "k.A." #. days #. Note to translators: quantity will always be greater than one. -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1124 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1162 #, java-format msgid "1 day" msgid_plural "{0} days" msgstr[0] "1 Tag" msgstr[1] "{0} Tage" -#: ../../../router/java/src/net/i2p/router/Blocklist.java:126 +#: ../../../router/java/src/net/i2p/router/Blocklist.java:122 #, java-format msgid "Banned by router hash: {0}" msgstr "Gesperrt über Routerprüfsumme: {0}" -#: ../../../router/java/src/net/i2p/router/Blocklist.java:128 +#: ../../../router/java/src/net/i2p/router/Blocklist.java:124 msgid "Banned by router hash" msgstr "Gesperrt über Routerprüfsumme" #. Temporary reason, until the job finishes -#: ../../../router/java/src/net/i2p/router/Blocklist.java:673 +#: ../../../router/java/src/net/i2p/router/Blocklist.java:669 msgid "IP banned" msgstr "IP gesperrt" -#: ../../../router/java/src/net/i2p/router/Blocklist.java:743 +#: ../../../router/java/src/net/i2p/router/Blocklist.java:739 #, java-format msgid "IP banned by blocklist.txt entry {0}" msgstr "IP gesperrt wegen blocklist.txt-Eintrags {0}" @@ -145,35 +146,41 @@ msgstr "Akzeptiere Tunnelanfragen" msgid "Rejecting tunnels" msgstr "Weise Tunnelanfragen zurück" -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:68 -msgid "Ensure that nothing blocks outbound HTTP, check <a target=\"_top\" href=\"logs.jsp\">logs</a> and if nothing helps, read the <a target=\"_top\" href=\"http://www.i2p2.de/faq.html\">FAQ</a> about reseeding manually." -msgstr "Stellen Sie bitte sicher, dass nichts ausgehenden HTTP-Transfer blockiert, überprüfen Sie die <a target=\"_top\" href=\"logs.jsp\">Berichte</a>, und wenn gar nichts hilft, lesen Sie die <a target=\"_top\" href=\"http://www.i2p2.de/faq.html\">FAQ</a> über das manuelle Reseeden." - -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:101 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:125 +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:20 msgid "Reseeding" msgstr "Reseeden" -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:124 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:141 #, java-format msgid "Reseed fetched only 1 router." msgid_plural "Reseed fetched only {0} routers." -msgstr[0] "Nur Daten eines Routers per Ressed erhalten" +msgstr[0] "Nur Daten eines Routers per Reseed erhalten" msgstr[1] "Nur {0} Routerinformationen per Reseed erhalten" -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:131 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:148 msgid "Reseed failed." msgstr "Reseed fehlgeschlagen" -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:232 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:149 +#, java-format +msgid "See {0} for help." +msgstr "Für Hilfe, siehe {0}!" + +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:150 +msgid "reseed configuration page" +msgstr "Einstellungen für den Reseed" + +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:293 msgid "Reseeding: fetching seed URL." msgstr "Reseed: Hole die Seed-URL" -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:273 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:335 #, java-format msgid "Reseeding: fetching router info from seed URL ({0} successful, {1} errors)." msgstr "Reseed: Holen der Router-Informationen von Seed-URL ({0} erfolgreich, {1} Fehler)." -#: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:513 +#: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:512 msgid "NetDb entry" msgstr "NetzDB-Eintrag" @@ -182,191 +189,192 @@ msgstr "NetzDB-Eintrag" msgid "No transports (hidden or starting up?)" msgstr "Keine Transporte (Versteckter Modus oder Start?)" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:452 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:450 msgid "Unreachable on any transport" msgstr "Unerreichbar auf allen Transporten" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:501 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:499 msgid "Router Transport Addresses" msgstr "Router-Transport-Adresse" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:506 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:504 #, java-format msgid "{0} is used for outbound connections only" msgstr "{0} wird nur für ausgehende Verbindungen genutzt" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:520 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:518 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:129 msgid "Help" msgstr "Hilfe" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:521 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:519 msgid "Your transport connection limits are automatically set based on your configured bandwidth." msgstr "Ihre Verbindungseinstellungen werden, basierend auf der von Ihnen zur Verfügung gestellten Bandbreite, automatisch vorgenommen." -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:523 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:521 msgid "To override these limits, add the settings i2np.ntcp.maxConnections=nnn and i2np.udp.maxConnections=nnn on the advanced configuration page." msgstr "Um diese Einstellungen zu umgehen, fügen Sie folgende Einstellungen der Seite \"Erweiterte Einstellungen\" hinzu: i2np.ntcp.maxConnections=nnn und i2np.udp.maxConnections=nnn" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:525 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:257 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:523 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258 msgid "Definitions" msgstr "Definitionen" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:526 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:735 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1891 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:737 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1890 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:24 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:33 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:35 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:81 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:187 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:189 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:238 msgid "Peer" msgstr "Teilnehmer" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:526 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524 msgid "The remote peer, identified by router hash" msgstr "Der entfernte Teilnehmer, über seine Router-Prüfsumme erkannt" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:527 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:736 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1895 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:525 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:738 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1894 msgid "Dir" msgstr "Richtung" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:528 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:526 msgid "Inbound connection" msgstr "Eingehende Verbindungen" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:530 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:528 msgid "Outbound connection" msgstr "Ausgehende Verbindungen" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:532 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:530 msgid "They offered to introduce us (help other peers traverse our firewall)" msgstr "Sie boten an, uns bekannt zu machen (anderen Teilnehmern helfen, unsere Firewall zu überwinden)" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:532 msgid "We offered to introduce them (help other peers traverse their firewall)" msgstr "Wir bieten an, sie bekannt zu machen (anderen Teilnehmern helfen, ihre Firewall zu überwinden)" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533 msgid "How long since a packet has been received / sent" msgstr "Vergangene Zeit seit ein Paket empfangen/gesendet wurde" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:737 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1896 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:739 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1895 msgid "Idle" msgstr "Untätig" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:738 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1901 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:740 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1900 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:156 msgid "In/Out" msgstr "Ein-/Ausgehend" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534 msgid "The smoothed inbound / outbound transfer rate (KBytes per second)" msgstr "Die geglättete ein-/ausgehende Transferrate (KBytes pro Sekunde)" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535 msgid "How long ago this connection was established" msgstr "Wie lange die Verbindung schon besteht" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:739 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1906 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:741 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1905 msgid "Up" msgstr "Verbunden" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:740 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1908 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:742 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1907 msgid "Skew" msgstr "Differenz" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536 msgid "The difference between the peer's clock and your own" msgstr "Der Unterschied zwischen Ihrer und der Uhr des Teilnehmers" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537 msgid "The congestion window, which is how many bytes can be sent without an acknowledgement" msgstr "Der Pufferspeicher, der angibt, wieviele Bytes Sie ohne Bestätigung senden können" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:540 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538 msgid "The number of sent messages awaiting acknowledgement" msgstr "Die Anzahl der gesendeten Nachrichten, die auf Bestätigung warten" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539 msgid "The maximum number of concurrent messages to send" msgstr "Die maximale Anzahl von gleichzeitig sendbaren Nachrichten" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:542 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:540 msgid "The number of pending sends which exceed congestion window" msgstr "Die Anzahl der ausstehenden Sendeanforderungen, die den Pufferspeicher überschreiten." -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541 msgid "The slow start threshold" msgstr "Der Grenzwert zum verzögertem Starten" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:542 msgid "The round trip time in milliseconds" msgstr "Die Rundenzeit zum Server und zurück in Millisekunden" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1918 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1917 msgid "Dev" msgstr "Abweichung" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543 msgid "The standard deviation of the round trip time in milliseconds" msgstr "Standardabweichung der Rundenzeit (in Millisekunden)" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544 msgid "The retransmit timeout in milliseconds" msgstr "Der Timeout beim erneuten Senden (in Millisekunden)" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545 msgid "Current maximum send packet size / estimated maximum receive packet size (bytes)" msgstr "Derzeit maximale Größe der gesendeten Pakete / geschätzte maximale Größe der empfangenen Pakete (Bytes)" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:741 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1925 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:743 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1924 msgid "TX" msgstr "Gesendet" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546 msgid "The total number of packets sent to the peer" msgstr "Gesamtanzahl der an den Teilnehmer gesendeten Pakete" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:742 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1927 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:744 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1926 msgid "RX" msgstr "Empfangen" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547 msgid "The total number of packets received from the peer" msgstr "Gesamtanzahl der vom Teilnehmer empfangenen Pakete" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:550 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1930 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1929 msgid "Dup TX" msgstr "Mehrfach gesendet" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:550 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548 msgid "The total number of packets retransmitted to the peer" msgstr "Gesamtanzahl der an den Teilnehmer erneut gesendeten Pakete" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:551 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1932 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1931 msgid "Dup RX" msgstr "Mehrfach empfangen" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:551 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549 msgid "The total number of duplicate packets received from the peer" msgstr "Gesamtanzahl der vom Teilnehmer erneut empfangenen Pakete" @@ -376,174 +384,175 @@ msgstr "Gesamtanzahl der vom Teilnehmer erneut empfangenen Pakete" msgid "Excessive clock skew: {0}" msgstr "Zu hohe Abweichung der Uhrzeit: {0}" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:730 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:732 msgid "NTCP connections" msgstr "NTCP-Verbindungen" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:731 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1887 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:733 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1886 msgid "Limit" msgstr "Obere Grenze" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:732 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1888 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:734 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1887 msgid "Timeout" msgstr "Timeout" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:743 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:745 msgid "Out Queue" msgstr "Ausgehende Warteschlange" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:744 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:746 msgid "Backlogged?" msgstr "Rückstau" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:758 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1950 -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:760 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1949 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:87 msgid "Inbound" msgstr "ankommend" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:760 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1952 -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:762 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1951 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:87 msgid "Outbound" msgstr "abgehend" #. buf.append("<tr> <td colspan=\"11\"><hr></td></tr>\n"); -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:807 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:809 msgid "peers" msgstr "Teilnehmer" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1886 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1885 msgid "UDP connections" msgstr "UDP-Verbindungen" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1893 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1892 msgid "Sort by peer hash" msgstr "Nach Router Prüfsumme sortieren" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1895 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1894 msgid "Direction/Introduction" msgstr "Richtung/Bekanntmachung" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1897 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1896 msgid "Sort by idle inbound" msgstr "Sortieren nach untätigen eingehenden Verbindungen" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1899 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1898 msgid "Sort by idle outbound" msgstr "Sortieren nach untätigen ausgehenden Verbindungen" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1902 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1901 msgid "Sort by inbound rate" msgstr "Sortieren nach eingehender Transferrate" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1904 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1903 msgid "Sort by outbound rate" msgstr "Sortieren nach ausgehender Transferrate" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1907 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1906 msgid "Sort by connection uptime" msgstr "Sortieren nach Lebensdauer der Verbindung" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1909 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1908 msgid "Sort by clock skew" msgstr "Sortieren nach Zeitunterschied" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1912 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1911 msgid "Sort by congestion window" msgstr "Sortieren nach Größe des Pufferspeichers" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1914 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1913 msgid "Sort by slow start threshold" msgstr "Sortieren nach Grenzwert des verzögerten Startens" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1917 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1916 msgid "Sort by round trip time" msgstr "Sortieren nach Rundenzeit" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1919 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1918 msgid "Sort by round trip time deviation" msgstr "Sortieren nach Abweichung der Rundenzeit" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1921 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1920 msgid "Sort by retransmission timeout" msgstr "Sortieren nach Timeout beim erneuten Senden" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1924 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1923 msgid "Sort by outbound maximum transmit unit" msgstr "Sortieren nach maximaler ausgehender Transferpaketgröße" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1926 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1925 msgid "Sort by packets sent" msgstr "Sortieren nach Anzahl gesendeter Pakete" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1928 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1927 msgid "Sort by packets received" msgstr "Sortieren nach Anzahl empfangener Pakete" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1931 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1930 msgid "Sort by packets retransmitted" msgstr "Sortieren nach Anzahl erneut gesendeter Pakete" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1933 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1932 msgid "Sort by packets received more than once" msgstr "Sortieren nach Anzahl mehrfach empfangener Pakete" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1954 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1953 msgid "We offered to introduce them" msgstr "Wir bieten an, diese bekannt zu machen" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1956 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1955 msgid "They offered to introduce us" msgstr "Diese boten an, uns bekannt zu machen" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1960 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1959 msgid "Choked" msgstr "gedrosselt" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1968 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1967 msgid "1 fail" msgstr "1 Fehler" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1970 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1969 #, java-format msgid "{0} fails" msgstr "{0} fehlgeschlagen" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1976 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1975 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:162 msgid "Banned" msgstr "Gesperrt" #. buf.append("<tr><td colspan=\"16\"><hr></td></tr>\n"); -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2107 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2106 msgid "SUMMARY" msgstr "ZUSAMMENFASSUNG" -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:145 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:124 msgid "Dropping tunnel requests: Too slow" msgstr "Ignoriere Tunnelanfragen: zu langsam" #. don't even bother, since we are so overloaded locally -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:352 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:267 msgid "Dropping tunnel requests: Overloaded" msgstr "Ignoriere Tunnelanfragen: überlastet" -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:525 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:470 msgid "Rejecting tunnels: Request overload" msgstr "Weise Tunnelanfragen zurück: Ãœberlast an Anfragen" -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:550 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:495 msgid "Rejecting tunnels: Connection limit" msgstr "Weise Tunnelanfragen zurück: Verbindungslimit erreicht" -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:744 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:695 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:716 msgid "Dropping tunnel requests: High load" msgstr "Ignoriere Tunnelanfragen: Hohe Last" -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:753 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:708 msgid "Dropping tunnel requests: Queue time" msgstr "Ignoriere Tunnelanfragen: zu lange Warteschlange" @@ -1474,11 +1483,12 @@ msgstr "Sambia" msgid "Zimbabwe" msgstr "Simbabwe" -#: ../java/src/net/i2p/router/web/CSSHelper.java:57 +#: ../java/src/net/i2p/router/web/CSSHelper.java:60 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:35 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:37 #: ../java/strings/Strings.java:29 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:233 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:125 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:257 msgid "I2P Router Console" msgstr "I2P-Routerkonsole" @@ -1497,28 +1507,27 @@ msgid "Error saving the configuration (applied but not saved) - please see the e msgstr "Fehler beim Speichern der Einstellungen (angewendet aber nicht gespeichert) - Bitte schau in die Fehlerberichte!" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:35 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:355 msgid "Save Client Configuration" msgstr "Speichere Klienteneinstellungen" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:39 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:405 -#, fuzzy +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:427 msgid "Save Interface Configuration" -msgstr "Speichere Klient-Einstellungen" +msgstr "Speichere Interface-Einstellungen" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:43 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:417 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:441 msgid "Save WebApp Configuration" msgstr "Speichere WebApplikations-Einstellungen" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:47 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:427 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:453 msgid "Save Plugin Configuration" msgstr "Speichere Einstellungen des Zusatzprogrammes" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:51 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:433 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:461 msgid "Install Plugin" msgstr "Zusatzprogramm installieren" @@ -1544,13 +1553,14 @@ msgstr "Fehler beim Stoppen des Zusatzprogramms {0}" #. label (IE) #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:124 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:253 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:255 msgid "Start" msgstr "Starten" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:143 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:49 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:61 +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:33 msgid "Unsupported" msgstr "Nicht unterstützt" @@ -1570,7 +1580,7 @@ msgstr "Falscher Index für den Klienten" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:212 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:223 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:397 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:392 #: ../java/src/net/i2p/router/web/SummaryHelper.java:384 msgid "Client" msgstr "Klient" @@ -1593,7 +1603,7 @@ msgid "Plugin configuration saved." msgstr "Einstellungen des Zusatzprogramms gespeichert." #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:271 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:122 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124 msgid "WebApp" msgstr "WebApplikation" @@ -1643,17 +1653,16 @@ msgid "Error starting plugin {0}" msgstr "Fehler beim Starten des Zusatzprogramms {0}" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:376 -#, fuzzy msgid "Interface configuration saved successfully - restart required to take effect." -msgstr "Klient-Einstellungen erfolgreich gespeichert - Neustart zum Ãœbernehmen erforderlich" +msgstr "Interface-Einstellungen erfolgreich gespeichert - Neustart zum Ãœbernehmen erforderlich" #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:85 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:256 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:258 msgid "Edit" msgstr "Bearbeiten" #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:94 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:331 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:351 msgid "Add Client" msgstr "Klienten hinzufügen" @@ -1662,90 +1671,88 @@ msgid "Class and arguments" msgstr "Klasse und Argumente" #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:122 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:146 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148 msgid "Control" msgstr "Kontrolle" #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:122 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:146 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148 msgid "Run at Startup?" msgstr "Beim Starten des Systems mitstarten?" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:122 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:146 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:195 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:197 msgid "Description" msgstr "Beschreibung" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:146 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148 msgid "Plugin" msgstr "Zusatzprogramm" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:159 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:271 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:161 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:273 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:185 msgid "Version" msgstr "Version" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:161 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:163 msgid "Signed by" msgstr "unterschrieben von" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:178 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:180 msgid "Date" msgstr "Datum" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:184 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:186 msgid "Author" msgstr "Autor" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:200 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:202 msgid "License" msgstr "Lizenz" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:205 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:207 msgid "Website" msgstr "Webseite" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:210 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:212 msgid "Update link" msgstr "Adresse des Updates" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:258 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:260 msgid "Stop" msgstr "Stopp" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:260 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:262 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:78 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:313 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:331 msgid "Check for updates" msgstr "Auf Aktualisierungen prüfen" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:261 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:263 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:235 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:242 msgid "Update" msgstr "Aktualisierung" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:266 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:268 #, java-format msgid "Are you sure you want to delete {0}?" msgstr "Sind Sie sicher, dass Sie {0} löschen wollen?" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:268 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:270 msgid "Delete" msgstr "löschen" #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:18 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:325 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:343 msgid "Add key" msgstr "Schlüssel hinzufügen" #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:19 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:323 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:341 msgid "Delete key" msgstr "Schlüssel löschen" @@ -1842,7 +1849,7 @@ msgstr "Service" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:101 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:386 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:381 #: ../java/strings/Strings.java:72 msgid "Tunnels" msgstr "Tunnel" @@ -1856,7 +1863,7 @@ msgid "Clients" msgstr "Klienten" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:293 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:315 msgid "Keyring" msgstr "Schlüsselbund" @@ -1866,13 +1873,13 @@ msgstr "Statusmitschnitt" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:107 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:260 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:255 #: ../java/strings/Strings.java:67 msgid "Peers" msgstr "Teilnehmer" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:387 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:389 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:143 msgid "Stats" msgstr "Statistiken" @@ -1883,13 +1890,15 @@ msgstr "Erweitert" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:48 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:264 +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:29 #: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:34 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:360 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:516 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:307 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:341 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:377 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:344 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:378 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:534 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:325 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:359 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:370 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:397 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:362 msgid "Save changes" msgstr "Änderungen speichern" @@ -1993,7 +2002,7 @@ msgid "or {0} bytes per month maximum" msgstr "oder maximal {0} Bytes im Monat" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:20 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:315 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:333 msgid "Ban peer until restart" msgstr "Den Teilnehmer bis zum Neustart sperren" @@ -2013,7 +2022,7 @@ msgid "Invalid peer" msgstr "ungültiger Teilnehmer" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:28 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:317 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:335 msgid "Unban peer" msgstr "Sperrung des Teilnehmers aufheben" @@ -2026,7 +2035,7 @@ msgid "is not currently banned" msgstr "ist zur Zeit nicht gesperrt" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:39 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:343 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:361 msgid "Adjust peer bonuses" msgstr "Teilnehmer-Boni anpassen" @@ -2038,10 +2047,28 @@ msgstr "ungültige Geschwindigkeitsangabe" msgid "Bad capacity value" msgstr "ungültiger Wert für die Kapazität" +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:17 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:368 +msgid "Save changes and reseed now" +msgstr "Änderungen speichern und Reseed beginnen" + +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:21 +msgid "Reseeding is already in progress" +msgstr "Reseed läuft bereits" + +#. skip the nonce checking in ReseedHandler +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:24 +msgid "Starting reseed process" +msgstr "Beginne den Reseed" + +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:66 +msgid "Configuration saved successfully." +msgstr "Einstellungen erfolgreich gespeichert" + #. Normal browsers send value, IE sends button label #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:32 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:57 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:293 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:311 msgid "Shutdown immediately" msgstr "Beende I2P sofort" @@ -2088,7 +2115,7 @@ msgid "Restart in {0}" msgstr "Neustart in {0}" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:53 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:291 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:309 msgid "Shutdown gracefully" msgstr "Kontrolliert ausschalten" @@ -2101,7 +2128,7 @@ msgid "Shutdown immediately! boom bye bye bad bwoy" msgstr "Unverzüglich ausschalten! - Und tschüss!" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:61 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:295 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:313 msgid "Cancel graceful shutdown" msgstr "Kontrolliertes Ausschalten abbrechen" @@ -2110,7 +2137,7 @@ msgid "Graceful shutdown cancelled" msgstr "Kontrolliertes Ausschalten abgebrochen" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:64 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:307 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:325 msgid "Graceful restart" msgstr "Kontrollierter Neustart" @@ -2119,7 +2146,7 @@ msgid "Graceful restart requested" msgstr "Kontrollierter Neustart angefordert" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:68 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:309 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:327 msgid "Hard restart" msgstr "Harter Neustart" @@ -2144,79 +2171,51 @@ msgid "Rekeying after graceful shutdown" msgstr "Neue RouterID nach sanftem Herunterfahren" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:80 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:353 msgid "Run I2P on startup" msgstr "Starte I2P beim Systemstart" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:82 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:337 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:355 msgid "Don't run I2P on startup" msgstr "Starte I2P nicht beim Systemstart" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:84 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:355 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:373 msgid "Dump threads" msgstr "Threadliste ausgeben" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:91 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:323 -msgid "Show systray icon" -msgstr "Systemtray-Icon anzeigen" - -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:96 -msgid "System tray icon enabled." -msgstr "Systemtray-Icon aktiviert" - -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:98 -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:110 -msgid "System tray icon feature not supported on this platform. Sorry!" -msgstr "Systemtry-Icon wird auf diesem System leider nicht unterstützt." - -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:101 -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:113 -msgid "Warning: unable to contact the systray manager" -msgstr "Warnung: kann den Systemtray-Manager nicht erreichen" - -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:103 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:325 -msgid "Hide systray icon" -msgstr "Systemtray-Icon deaktivieren" - -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:108 -msgid "System tray icon disabled." -msgstr "Systemtry-Icon deaktiviert" - -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:115 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:363 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:381 msgid "View console on startup" msgstr "Zeige die Konsole nach dem Starten" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:117 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:93 msgid "Console is to be shown on startup" msgstr "Konsole wird nach dem Starten angezeigt" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:118 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:365 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:94 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:383 msgid "Do not view console on startup" msgstr "Zeige Konsole beim Starten nicht" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:120 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:96 msgid "Console is not to be shown on startup" msgstr "Konsole wird beim Starten nicht gezeigt" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:129 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:105 msgid "Service installed" msgstr "Service wurde installiert" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:131 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:107 msgid "Warning: unable to install the service" msgstr "Warnung: Service konnte nicht installiert werden" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:137 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:113 msgid "Service removed" msgstr "Service wurde entfernt" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:139 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:115 msgid "Warning: unable to remove the service" msgstr "Warnung: Service konnte nicht entfernt werden" @@ -2264,58 +2263,58 @@ msgid_plural "{0} tunnels" msgstr[0] "1 Tunnel" msgstr[1] "{0} Tunnel" -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:26 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:35 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:41 msgid "Exploratory tunnels" msgstr "Erkundungstunnel" -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:46 -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:61 -msgid "Client tunnels for" -msgstr "Kliententunnel für" +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:51 +#, java-format +msgid "Client tunnels for {0}" +msgstr "Kliententunnel für {0}" -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:69 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:74 msgid "ANONYMITY WARNING - Settings include 0-hop tunnels." msgstr "ANONYMITÄTSWARNUNG - Einstellungen beinhalten Tunnel ohne Zwischenstationen" -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:74 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:79 msgid "ANONYMITY WARNING - Settings include 1-hop tunnels." msgstr "ANONYMITÄTSWARNUNG - Einstellungen beinhalten Tunnel mit nur einer Zwischenstation" -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:77 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82 msgid "PERFORMANCE WARNING - Settings include very long tunnels." msgstr "LEISTUNGSWARNUNG - Einstellungen beinhalten sehr lange Tunnel" -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:80 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:85 msgid "PERFORMANCE WARNING - Settings include high tunnel quantities." msgstr "LEISTUNGSWARNUNG - Einstellungen beinhalten sehr viele Tunnel" #. buf.append("<tr><th></th><th>Inbound</th><th>Outbound</th></tr>\n"); #. tunnel depth -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:87 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:92 msgid "Length" msgstr "Länge" #. tunnel depth variance -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:104 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:109 msgid "Randomization" msgstr "Zufallskomponente" #. tunnel quantity -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:128 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:133 msgid "Quantity" msgstr "Anzahl" #. tunnel backup quantity -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:145 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:150 msgid "Backup quantity" msgstr "Anzahl der Ersatztunnel" -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:167 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:172 msgid "Inbound options" msgstr "Optionen für eingehende Tunnel" -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:180 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:185 msgid "Outbound options" msgstr "Optionen für ausgehende Tunnel" @@ -2328,38 +2327,42 @@ msgid "Refresh the page to view." msgstr "Laden Sie die Seite neu, damit die Änderungen sichtbar werden!" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51 +msgid "Arabic" +msgstr "Arabisch" + +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 msgid "English" msgstr "Englisch" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 msgid "French" msgstr "Französisch" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 msgid "German" msgstr "Deutsch" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 msgid "Spanish" msgstr "Spanisch" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53 msgid "Dutch" msgstr "Niederländisch" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53 msgid "Portuguese" msgstr "Portugiesisch" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53 msgid "Russian" msgstr "Russisch" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:54 msgid "Chinese" msgstr "Chinesisch" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:54 msgid "Swedish" msgstr "Schwedisch" @@ -2428,7 +2431,7 @@ msgstr "Nur herunterladen und überprüfen" msgid "Download, verify, and restart" msgstr "Herunterladen, überprüfen und neustarten" -#: ../java/src/net/i2p/router/web/FormHandler.java:174 +#: ../java/src/net/i2p/router/web/FormHandler.java:176 msgid "Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit." msgstr "Ungültige Ãœbertragung der eingegebenen Daten, möglicherweise da Sie den 'Zurück'- oder 'Neu Laden'-Knopf in Ihrem Browser gedrückt haben. Bitte erneut senden." @@ -2459,8 +2462,8 @@ msgid "Plot averages" msgstr "Zeichne Mittelwerte" #: ../java/src/net/i2p/router/web/GraphHelper.java:152 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:417 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:333 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:435 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:351 msgid "or" msgstr "oder" @@ -2596,96 +2599,96 @@ msgstr "Zeige alle Router" msgid "Show all routers with full stats" msgstr "Zeige alle Router mit vollständigen Statistiken" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:265 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:266 msgid "Network Database Router Statistics" msgstr "Netzwerkdatenbank Routerstatistiken" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:271 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:285 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:303 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:273 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:287 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:305 msgid "Count" msgstr "Anzahl" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:285 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:287 msgid "Transports" msgstr "Transporte" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:303 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:305 msgid "Country" msgstr "Land" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:342 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:344 msgid "Our info" msgstr "Informationen über uns" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:344 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:346 msgid "Peer info for" msgstr "Informationen über den Teilnehmer" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:348 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:350 msgid "Full entry" msgstr "Ganzer Eintrag" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:354 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:356 #: ../java/src/net/i2p/router/web/SummaryHelper.java:115 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:601 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:619 msgid "Hidden" msgstr "Versteckt" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:354 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:356 msgid "Updated" msgstr "Aktualisiert" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:355 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:358 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:357 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:360 #, java-format msgid "{0} ago" msgstr "vor {0}" #. shouldnt happen -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:357 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:361 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:359 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:363 msgid "Published" msgstr "Veröffentlicht" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:363 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:365 msgid "Address(es)" msgstr "Adresse(n)" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:376 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:378 msgid "cost" msgstr "Kosten" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 msgid "Hidden or starting up" msgstr "Versteckt oder Startphase" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 msgid "SSU" msgstr "SSU" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 msgid "SSU with introducers" msgstr "SSU mit Hilfsrouter" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404 msgid "NTCP" msgstr "NTCP" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404 msgid "NTCP and SSU" msgstr "NTCP und SSU" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404 msgid "NTCP and SSU with introducers" msgstr "NTCP und SSU mit Hilfsrouter" -#: ../java/src/net/i2p/router/web/NewsFetcher.java:93 +#: ../java/src/net/i2p/router/web/NewsFetcher.java:92 #, java-format msgid "News last updated {0} ago." msgstr "Zeit seit letzter Aktualisierung der Nachrichten: {0};" -#: ../java/src/net/i2p/router/web/NewsFetcher.java:99 +#: ../java/src/net/i2p/router/web/NewsFetcher.java:98 #, java-format msgid "News last checked {0} ago." msgstr "Zeit seit letzter Prüfung auf neue Nachrichten: {0}" @@ -2703,7 +2706,7 @@ msgstr "Auf Aktualisierungen des Zusatzprogramms {0} prüfen" #: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:154 #, java-format msgid "New plugin version {0} is available" -msgstr "Neue Version des Zusatzprogramms {0} ist verfügbar" +msgstr "Neue Version des Zusatzprogramms ist verfügbar ({0})" #: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:156 #, java-format @@ -2720,132 +2723,132 @@ msgid "Downloading plugin" msgstr "Lade Zusatzprogramm herunter" #: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:146 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:244 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:245 #, java-format msgid "{0}B transferred" msgstr "{0}Bytes übertragen" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:152 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:153 msgid "Plugin downloaded" msgstr "Zusatzprogramm heruntergeladen" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:157 -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:344 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:158 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:356 #, java-format msgid "Cannot create plugin directory {0}" msgstr "Kann kein Verzeichnis für das Zusatzprogramm {0} anlegen" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:166 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:298 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:167 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:299 #, java-format msgid "from {0}" msgstr "von {0}" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:176 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:177 #, java-format msgid "Plugin from {0} is corrupt" msgstr "Zusatzprogramm von {0} ist beschädigt." -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:187 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:188 #, java-format msgid "Plugin from {0} does not contain the required configuration file" msgstr "Zusatzprogramm von {0} enthält nicht die benötigte Konfigurationsdatei" #. updateStatus("<b>" + "Plugin contains an invalid key" + ' ' + pubkey + ' ' + signer + "</b>"); -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:200 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:201 #, java-format msgid "Plugin from {0} contains an invalid key" msgstr "Zusatzprogramm von {0} enthält einen ungültigen Schlüssel" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:219 -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:228 -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:237 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:225 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:235 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:249 #, java-format msgid "Plugin signature verification of {0} failed" msgstr "Ãœberprüfung der Signatur des Zusatzprogramms {0} ist fehlgeschlagen" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:252 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:264 #, java-format msgid "Plugin from {0} has invalid name or version" msgstr "Zusatzprogramm von {0} hat einen ungültigen Namen oder Version" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:257 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:269 #, java-format msgid "Plugin {0} has mismatched versions" msgstr "Zusatzprogramm {0} hat keine passende Version" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:265 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:277 #, java-format msgid "This plugin requires I2P version {0} or higher" msgstr "Dieses Zusatzprogramm benötigt I2P-Version {0} oder höher" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:273 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:285 #, java-format msgid "This plugin requires Java version {0} or higher" msgstr "Dieses Zusatzprogramm benötigt Java-Version {0} oder neuer" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:281 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:293 msgid "Downloaded plugin is for new installs only, but the plugin is already installed" msgstr "Heruntergeladenes Zusatzprogramm lässt sich nur neu installieren, jedoch ist es ist bereits installiert." -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:293 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:305 msgid "Installed plugin does not contain the required configuration file" msgstr "Das installierte Zusatzprogramm enthält nicht die benötigte Konfigurationsdatei" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:301 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:313 msgid "Signature of downloaded plugin does not match installed plugin" msgstr "Die Signatur des heruntergeladenen Zusatzprogramms stimmt nicht mit dem installierten Zusatzprogramm überein." -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:308 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:320 #, java-format msgid "Downloaded plugin version {0} is not newer than installed plugin" msgstr "Version {0} des heruntergeladenen Zusatzprogramms ist nicht neuer als die installierte Version" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:315 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:327 #, java-format msgid "Plugin update requires installed plugin version {0} or higher" msgstr "Aktualisierung des Zusatzprogramms benötigt Version {0} oder höher des Zusatzprogramms" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:322 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:334 #, java-format msgid "Plugin update requires installed plugin version {0} or lower" msgstr "Aktualisierung des Zusatzprogramms benötigt installierte Version {0} oder älter des Zusatzprogramms" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:339 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:351 msgid "Plugin is for upgrades only, but the plugin is not installed" msgstr "Dieses Zusatzprogramm ist nur für Aktualisierungen, aber das Zusatzprogramm ist noch nicht installiert" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:352 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:364 #, java-format msgid "Failed to install plugin in {0}" msgstr "Installation des Zusatzprogramms in {0} ist fehlgeschlagen" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:359 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:371 #, java-format msgid "Plugin {0} installed, router restart required" msgstr "Zusatzprogramm {0} installiert, Neustart des Routers erforderlich" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:361 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:373 #, java-format msgid "Plugin {0} installed" msgstr "Zusatzprogramm {0} wurde installiert" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:379 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:391 #, java-format msgid "Plugin {0} installed and started" msgstr "Zusatzprogramm {0} installiert und gestartet" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:382 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:394 #, java-format msgid "Plugin {0} installed but failed to start, check logs" msgstr "Zusatzprogramm {0} wurde installiert konnte jedoch nicht gestartet werden. Ãœberprüfen Sie die Berichte!" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:384 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:396 #, java-format msgid "Plugin {0} installed but failed to start" msgstr "Zusatzprogramm {0} ist installiert, startet jedoch nicht" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:394 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:406 #, java-format msgid "Failed to download plugin from {0}" msgstr "Konnte Zusatzprogramm von {0} nicht herunterladen" @@ -2856,37 +2859,43 @@ msgstr "Teilnehmerprofile" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:73 #, java-format -msgid "Showing {0} recent profiles." -msgstr "Zeige {0} aktuelle Profile." +msgid "Showing 1 recent profile." +msgid_plural "Showing {0} recent profiles." +msgstr[0] "Zeige ein aktuelles Profil an." +msgstr[1] "Zeige {0} aktuelle Profile." #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:75 #, java-format -msgid "Hiding {0} older profiles." -msgstr "Zeige {0} alte Profile nicht an." +msgid "Hiding 1 older profile." +msgid_plural "Hiding {0} older profiles." +msgstr[0] "Zeige ein altes Profil nicht an." +msgstr[1] "Zeige {0} alte Profile nicht an." #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:77 #, java-format -msgid "Hiding {0} standard profiles." -msgstr "Zeige {0} Standardprofile nicht an." +msgid "Hiding 1 standard profile." +msgid_plural "Hiding {0} standard profiles." +msgstr[0] "Zeige ein Standardprofil nicht an." +msgstr[1] "Zeige {0} Standardprofile nicht an." #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:82 msgid "Groups (Caps)" msgstr "Gruppen (Kategorien)" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:83 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:251 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:335 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:252 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:353 msgid "Speed" msgstr "Geschwindigkeit" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:84 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:253 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:339 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:254 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:357 msgid "Capacity" msgstr "Kapazität" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:85 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:255 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:256 msgid "Integration" msgstr "Integration" @@ -2912,7 +2921,7 @@ msgid "Failing" msgstr "fehlgeschlagen" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:131 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:287 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:282 msgid "Integrated" msgstr "integriert" @@ -2925,151 +2934,156 @@ msgstr "Unerreichbar" msgid "Test Fails" msgstr "Test fehlgeschlagen" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:175 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:177 msgid "profile" msgstr "Profil" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:184 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:186 msgid "Floodfill and Integrated Peers" msgstr "Floodfill und integrierte Teilnhemer" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:188 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:190 msgid "Caps" msgstr "Kategorien" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:189 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:191 msgid "Integ. Value" msgstr "Integrationswert" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:190 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:192 msgid "Last Heard About" msgstr "Zuletzt etwas über ihn gehört" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:191 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:193 msgid "Last Heard From" msgstr "Letzte Nachricht empfangen" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:192 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:194 msgid "Last Good Send" msgstr "Letzte geglückte Sendung" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:193 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:195 msgid "Last Bad Send" msgstr "Letzte fehlgeschlagene Sendung" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:194 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:196 msgid "10m Resp. Time" msgstr "10 Min. Antwortzeit" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:195 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:197 msgid "1h Resp. Time" msgstr "1 Std. Antwortzeit" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:196 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:198 msgid "1d Resp. Time" msgstr "1 Tag Antwortzeit" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:197 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:199 msgid "Last Good Lookup" msgstr "Letzte erfolgreiche Suche" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:198 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:200 msgid "Last Bad Lookup" msgstr "Letzte fehlgeschlagene Suche" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:199 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:201 msgid "Last Good Store" msgstr "Letztes erfolgreiches Speichern" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:200 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:202 msgid "Last Bad Store" msgstr "Letztes fehlgeschlagene Speichern" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:201 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:203 msgid "1h Fail Rate" msgstr "stündl. Fehlerrate" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:202 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:204 msgid "1d Fail Rate" msgstr "tägl. Fehlerrate" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:250 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:251 msgid "Thresholds" msgstr "Grenzwerte" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:252 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:253 msgid "fast peers" msgstr "schnelle Teilnehmer" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:254 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:255 msgid "high capacity peers" msgstr "Teilnehmer hoher Kapazität" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:256 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:257 msgid " well integrated peers" msgstr "gut integrierte Teilnehmer" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259 msgid "as determined by the profile organizer" msgstr "wie vom Profilorganisator ermittelt" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259 msgid "groups" msgstr "Gruppen" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260 msgid "capabilities in the netDb, not used to determine profiles" msgstr "Werte in der Netzwerkdatenbank, nicht zum Ermitteln der Profile verwendet" #. capabilities -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260 #: ../java/strings/Strings.java:81 msgid "caps" msgstr "Kategorien" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261 msgid "peak throughput (bytes per second) over a 1 minute period that the peer has sustained in a single tunnel" msgstr "maximaler Durchsatz (Bytes je Tunnel) innerhalb einer Minute, den ein Teilnehmer in einem einzelnen Tunnel erreicht hat" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261 msgid "speed" msgstr "Geschwindigkeit" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262 msgid "capacity" msgstr "Kapazität" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262 msgid "how many tunnels can we ask them to join in an hour?" msgstr "Wie viele Tunnel können wir bei diesem Teilnehmer innerhalb einer Stunde bekommen?" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263 msgid "how many new peers have they told us about lately?" msgstr "Wie viele neue Kontakte hat dieser Teilnehmer uns kürzlich mitgeteilt?" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263 msgid "integration" msgstr "Integration" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:264 msgid "is the peer banned, or unreachable, or failing tunnel tests?" msgstr "Ist der Teilnehmer gesperrt, unerreichbar, oder schlagen die Tunneltests fehl?" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:264 msgid "status" msgstr "Status" -#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:57 +#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:47 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:410 +msgid "none" +msgstr "keine" + +#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:62 #, java-format msgid "Temporary ban expiring in {0}" msgstr "vorübergehende Sperrung endet in {0}" -#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:59 +#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:64 #, java-format msgid "Banned until restart or in {0}" msgstr "Gesperrt bis zum Neustart oder in {0}" -#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:71 +#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:76 msgid "unban now" msgstr "Bann aufheben" @@ -3124,20 +3138,20 @@ msgstr "Die Daten werden über jeweils 1 Minute erhoben und repräsentieren dahe msgid "These statistics are primarily used for development and debugging." msgstr "Diese Statistiken dienen vorrangig der Entwicklung und Fehlerbeseitigung." -#: ../java/src/net/i2p/router/web/StatsGenerator.java:105 -#: ../java/src/net/i2p/router/web/StatsGenerator.java:156 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:106 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:157 msgid "No lifetime events" msgstr "Bisher keine Ereignisse" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:116 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:117 msgid "frequency" msgstr "Häufigkeit" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:120 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:121 msgid "Rolling average events per period" msgstr "Fortschreitender Durchschnittshäufigkeit von Ereignissen je Zeitintervall" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:124 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:125 msgid "Highest events per period" msgstr "höchste Anzahl an Ereignissen je Zeitintervall" @@ -3148,58 +3162,73 @@ msgstr "höchste Anzahl an Ereignissen je Zeitintervall" #. } #. buf.append(" <i>avg interval between updates:</i> (").append(num(curFreq.getAverageInterval())).append("ms, min "); #. buf.append(num(curFreq.getMinAverageInterval())).append("ms)"); -#: ../java/src/net/i2p/router/web/StatsGenerator.java:135 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:136 msgid "Lifetime average events per period" msgstr "Anzahl an Ereignissen je Zeitintervall über die Lebenszeit gemittelt" #. Display the strict average -#: ../java/src/net/i2p/router/web/StatsGenerator.java:140 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:141 msgid "Lifetime average frequency" msgstr "durchschnittliche Häufigkeit über Lebenszeit" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:168 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:144 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:234 +#, java-format +msgid "1 event" +msgid_plural "{0} events" +msgstr[0] "ein Ereignis" +msgstr[1] "{0} Ereignisse" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:169 msgid "rate" msgstr "Rate" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:170 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:171 msgid "Average" msgstr "Mittelwert" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:173 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:174 msgid "Highest average" msgstr "höchster Durchscnittslwert" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:202 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:201 +#, java-format +msgid "There was 1 event in this period." +msgid_plural "There were {0} events in this period." +msgstr[0] "Es gab ein Vorkommnis in dieser Zeitspanne" +msgstr[1] "Es gab {0} Vorkommnisse in dieser Zeitspanne." + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:203 #, java-format -msgid "in this period which ended {0} ago." -msgstr "innerhalb dieser Periode, welche vor {0} endete." +msgid "The period ended {0} ago." +msgstr "Die Zeitspanne endete vor {0}." -#: ../java/src/net/i2p/router/web/StatsGenerator.java:204 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:205 msgid "No events" msgstr "keine Ereignisse" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:210 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:211 msgid "Average event count" msgstr "druchschnittliche Anzahl an Ereignissen" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:212 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:213 msgid "Events in peak period" msgstr "Ereignisse im Spitzen-Zeitintervall" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:220 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:221 msgid "Graph Data" msgstr "Daten graphisch darstellen" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:222 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:223 msgid "Graph Event Count" msgstr "Ereignisse graphisch darstellen" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:225 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:226 msgid "Export Data as XML" msgstr "Daten als XML exportieren" #. Display the strict average -#: ../java/src/net/i2p/router/web/StatsGenerator.java:230 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:231 msgid "Lifetime average value" msgstr "Durchschnitt über Lebenszeit" @@ -3260,12 +3289,12 @@ msgid "I2P Internals" msgstr "Einstellungen" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:99 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:384 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:379 msgid "View existing tunnels and tunnel build status" msgstr "Betrachte die existierenden Tunnel und den Status des Tunnelaufbaus" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:105 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:258 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:253 msgid "Show all current peer connections" msgstr "Zeige alle bestehenden Verbindungen zu Teilnehmern" @@ -3351,93 +3380,97 @@ msgstr "Laufzeit" msgid "Help with configuring your firewall and router for optimal I2P performance" msgstr "Hilfe bei der Konfiguration Ihrer Firewall und Ihres Routers für eine optimale Leistung." -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:231 -msgid "Download" -msgstr "Herunterladen" +#. Note to translators: parameter is a version, e.g. "0.8.4" +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:232 +#, java-format +msgid "Download {0} Update" +msgstr "Aktualisierung herunterladen ({0})" +#. Note to translators: parameter is a date and time, e.g. "02-Mar 20:34 UTC" +#. <br> is optional, to help the browser make the lines even in the button +#. If the translation is shorter than the English, you should probably not include <br> #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:240 -msgid "Download Unsigned" -msgstr "unsignierte Aktualisierung herunterladen" +#, java-format +msgid "Download Unsigned<br>Update {0}" +msgstr "unsignierte Aktualisierung herunterladen: {0}" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:266 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:261 msgid "Active" msgstr "aktiv" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:275 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:270 msgid "Fast" msgstr "schnell" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:281 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:276 msgid "High capacity" msgstr "hohe Kapazität" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:293 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:288 msgid "Known" msgstr "bekannt" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:308 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:303 msgid "Help with firewall configuration" msgstr "Hilfe bei der Firewalleinstellung" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:310 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:305 msgid "Check NAT/firewall" msgstr "Ãœberprüfe NAT/Firewall!" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:330 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:325 msgid "Reseed" msgstr "Hole neue Teilnehmerinformationen" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:347 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:342 msgid "Configure router bandwidth allocation" msgstr "Konfigurieren der Bandbreitenzuweisung des Routers" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:349 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:344 msgid "Bandwidth in/out" msgstr "Bandbreite ein-/ausgehend" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:369 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:364 msgid "Total" msgstr "gesamt" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:376 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:371 msgid "Used" msgstr "genutzt" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:391 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:386 msgid "Exploratory" msgstr "Erkundung" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:403 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:398 msgid "Participating" msgstr "teilnehmend an" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:409 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:404 msgid "Share ratio" -msgstr "" -"Verhältnis \n" -" fremder/eigenen Hops" +msgstr "Kooperationsfaktor" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:415 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:410 msgid "What's in the router's job queue?" msgstr "Was ist in der Aufgabenliste des Routers?" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:417 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:412 msgid "Congestion" msgstr "Aufgaben" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:422 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:417 msgid "Job lag" msgstr "Aufgabenverzug" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:428 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:423 msgid "Message delay" msgstr "Nachrichtenverzug" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:434 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:429 msgid "Tunnel lag" msgstr "Tunnelverzug" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:440 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:435 msgid "Backlog" msgstr "Anfragenrückstau" @@ -3451,7 +3484,7 @@ msgid "ERR-Clock Skew of {0}" msgstr "FEHLER: Uhrzeitdifferenz von {0}" #: ../java/src/net/i2p/router/web/SummaryHelper.java:122 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:577 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:595 msgid "OK" msgstr "OK" @@ -3476,7 +3509,7 @@ msgid "WARN-Firewalled and Fast" msgstr "WARNUNG: Firewall aktiv und Schnell" #: ../java/src/net/i2p/router/web/SummaryHelper.java:133 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:581 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:599 msgid "Firewalled" msgstr "Firewall aktiv" @@ -3497,7 +3530,7 @@ msgid "WARN-Firewalled with UDP Disabled" msgstr "WARNUNG: Firewall aktiv und UDP deaktiviert" #: ../java/src/net/i2p/router/web/SummaryHelper.java:148 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:597 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:615 msgid "Testing" msgstr "Teste" @@ -3541,10 +3574,6 @@ msgstr "Baue auf" msgid "Building tunnels" msgstr "Baue Tunnel auf" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:410 -msgid "none" -msgstr "keine" - #. tunnel nicknames, taken from i2ptunnel.config so they will display #. nicely under 'local destinations' in the summary bar #. note that if the wording changes in i2ptunnel.config, we have to @@ -3579,10 +3608,14 @@ msgstr "Jetzt" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:41 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:63 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:287 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:309 msgid "configure" msgstr "ändern" +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:61 +msgid "Client tunnels for" +msgstr "Kliententunnel für" + #: ../java/src/net/i2p/router/web/TunnelRenderer.java:65 msgid "dead" msgstr "tot" @@ -3707,70 +3740,70 @@ msgstr "Fremde Tunnel" msgid "Totals" msgstr "Gesamt" -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:66 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:142 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:237 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:67 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:143 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:238 msgid "Updating" msgstr "Aktualisiere" #. Process the .sud/.su2 file -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:88 -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:111 -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:116 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:261 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:286 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:89 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:112 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:117 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:262 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:287 msgid "Update downloaded" msgstr "Aktualisierung heruntergeladen" -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:91 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:92 #, java-format msgid "Unsigned update file from {0} is corrupt" msgstr "Unsignierte Aktualisierungsdatei von {0} ist fehlerhaft" -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:111 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:281 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:112 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:282 msgid "Restarting" msgstr "Starte neu" -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:118 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:288 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:119 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:289 msgid "Click Restart to install" msgstr "Klicken Sie auf Neustart zum Installieren der" -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:120 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:290 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:121 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:291 msgid "Click Shutdown and restart to install" msgstr "Klicken Sie zum Installieren auf Herunterfahren und Neustarten" -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:121 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:292 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:122 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:293 #, java-format msgid "Version {0}" msgstr "Version {0}" -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:126 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:127 #, java-format msgid "Failed copy to {0}" msgstr "Kopieren nach {0} fehlgeschlagen" -#: ../java/src/net/i2p/router/web/UpdateHandler.java:184 -#, fuzzy, java-format +#: ../java/src/net/i2p/router/web/UpdateHandler.java:185 +#, java-format msgid "Updating from {0}" -msgstr "Aktualisiere UDP-Port von" +msgstr "Aktualisiere von {0}" -#: ../java/src/net/i2p/router/web/UpdateHandler.java:253 -#, fuzzy, java-format +#: ../java/src/net/i2p/router/web/UpdateHandler.java:254 +#, java-format msgid "No new version found at {0}" -msgstr "Keine neue Version des Zusatzprogrammes {0} verfügbar" +msgstr "Keine neue Version unter {0} gefunden" -#: ../java/src/net/i2p/router/web/UpdateHandler.java:281 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:282 msgid "Update verified" msgstr "Aktualisierung verifiziert" -#: ../java/src/net/i2p/router/web/UpdateHandler.java:307 -#, fuzzy, java-format +#: ../java/src/net/i2p/router/web/UpdateHandler.java:308 +#, java-format msgid "Transfer failed from {0}" -msgstr "Ãœbertragung fehlgeschlagen" +msgstr "Ãœbertragung von {0} fehlgeschlagen" #. wars for ConfigClientsHelper #: ../java/strings/Strings.java:12 @@ -4019,1297 +4052,1471 @@ msgstr "ausgehende Low-Level Ãœbertragungsrate" msgid "How many peers we are actively talking with" msgstr "Anzahl aktiver Teilnehmer mit denen wir reden" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:112 msgid "config networking" msgstr "Netzwerkeinstellungen" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:224 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:237 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:224 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:234 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:231 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:222 +msgid "Summary Bar" +msgstr "Schnellübersicht" + #. We have intl defined when this is included, but not when compiled standalone. -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:217 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:230 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:217 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:227 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:222 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:215 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:215 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:215 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:215 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:215 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:215 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:234 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:215 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:237 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:250 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:237 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:247 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:244 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:242 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:235 msgid "Refresh (s)" msgstr "Auffrischen {s}" #. ditto -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:221 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:234 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:221 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:223 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:231 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:223 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:223 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:223 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:226 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:223 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:223 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:237 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:219 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:241 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:254 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:241 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:251 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:248 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:245 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:239 msgid "Enable" msgstr "Aktiviere" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:262 msgid "I2P Network Configuration" msgstr "I2P-Netzwerkeinstellungen" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:298 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:316 msgid "Bandwidth limiter" msgstr "Bandbreitenbegrenzer" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:300 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:318 msgid "I2P will work best if you configure your rates to match the speed of your internet connection." msgstr "" "I2P funktioniert am besten, wenn Sie die Werte so konfigurieren, \n" "dass die Geschwindigkeit zu Ihrer Internetverbindung passt." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:304 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:322 msgid "KBps In" msgstr "kByte/s eingehend" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:318 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:336 msgid "KBps Out" msgstr "kByte/s ausgehend" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:334 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:352 msgid "Share" msgstr "für andere zur Benutzung freigegeben" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:341 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:309 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:304 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:359 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:327 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:326 msgid "NOTE" msgstr "HINWEIS" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:343 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:361 #, java-format msgid "You have configured I2P to share only {0} KBps." msgstr "Sie haben I2P angewiesen, nur {0} kbit/s mit anderen zu teilen." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:346 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:364 msgid "I2P requires at least 12KBps to enable sharing. " msgstr "I2P benötigt mindestens 12 kbit/s, um das Durchleiten zu ermöglichen. " -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:347 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:365 msgid "Please enable sharing (participating in tunnels) by configuring more bandwidth. " msgstr "" "Bitte aktivieren Sie die gemeinsame Nutzung (Teilnahme an Tunneln),\n" "indem Sie mehr Bandbreite freigeben. " -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:348 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:366 msgid "It improves your anonymity by creating cover traffic, and helps the network." msgstr "" "Es verbessert Ihre Anonymität durch Herstellen von s. g. Rauschen und \n" "es hilft zudem dem Netzwerk." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:351 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:369 #, java-format msgid "You have configured I2P to share {0} KBps." -msgstr "Sie haben I2P konfiguriert, {0} kbit/s durchzuleiten. " +msgstr "Sie haben I2P konfiguriert, {0} kBytes/s durchzuleiten. " -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:354 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:372 msgid "The higher the share bandwidth the more you improve your anonymity and help the network." msgstr "" "Je höher der Anteil an geteilter Bandbreite ist, desto mehr verbessert sich \n" "Ihre Anonymität, und darüber hinaus hilft es dem Netz. " -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:358 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:514 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:305 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:327 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:403 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:321 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:339 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:375 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:342 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:322 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:365 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:376 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:532 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:323 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:347 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:425 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:339 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:357 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:366 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:395 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:360 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:351 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:383 msgid "Cancel" msgstr "Abbruch" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:375 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:393 msgid "IP and Transport Configuration" msgstr "IP- und Transport-Einstellungen" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:377 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:395 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:395 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:417 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:324 msgid "The default settings will work for most people." msgstr "Die Standardeinstellungen funktionieren für die meisten Anwender." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:379 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:397 msgid "There is help below." msgstr "Weiter unten finden Sie eine Hilfe." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:381 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:399 msgid "UPnP Configuration" msgstr "UPnP-Einstellungen" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:385 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:403 msgid "Enable UPnP to open firewall ports" msgstr "Aktiviere UPnP, um Ports in der Firewall freizuschalten" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:387 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:405 msgid "UPnP status" msgstr "UPnP-Status" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:389 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:407 msgid "IP Configuration" msgstr "IP-Einstellungen" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:391 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:461 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:409 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:479 msgid "Externally reachable hostname or IP address" msgstr "Extern erreichbarer Hostname oder IP-Adresse" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:395 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:413 msgid "Use all auto-detect methods" msgstr "Alle automatisch erkannten Modi benutzen" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:399 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:417 msgid "Disable UPnP IP address detection" msgstr "UPnP IP-Adresserkennung deaktivieren" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:403 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:421 msgid "Ignore local interface IP address" msgstr "IP-Adresse der lokalen Schnittstelle ignorieren" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:407 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:425 msgid "Use SSU IP address detection only" msgstr "Nur die SSU-Adresserkennung benutzen" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:411 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:479 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:429 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:497 msgid "Specify hostname or IP" msgstr "Hostnamen oder IP angeben" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:417 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:435 msgid "Select Interface" msgstr "Schnittstelle auswählen" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:431 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:449 msgid "Hidden mode - do not publish IP" msgstr "Versteckter Modus - veröffentlicht die IP-Adresse nicht" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:433 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:451 msgid "(prevents participating traffic)" msgstr "(verhindert die Teilnahme an fremden Tunneln)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:435 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:453 msgid "Action when IP changes" msgstr "Aktion wenn sich die IP-Adresse ändert" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:439 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:457 msgid "Laptop mode - Change router identity and UDP port when IP changes for enhanced anonymity" msgstr "Laptop Modus - ändert zur Erhöhung der Anonymität Ihre Router-Identifikation und den UDP-Port, wenn sich Ihre IP ändert" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:441 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:459 msgid "Experimental" msgstr "experimentell" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:443 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:461 msgid "UDP Configuration:" msgstr "UDP-Einstellungen:" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:445 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:463 msgid "UDP port:" msgstr "UDP-Port:" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:459 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:477 msgid "TCP Configuration" msgstr "TCP-Einstellungen:" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:465 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:483 msgid "Use auto-detected IP address" msgstr "Automatisch erkannte IP-Adresse benutzen" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:467 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:499 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:485 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:517 msgid "currently" msgstr "derzeit" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:471 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:489 msgid "if we are not firewalled" msgstr "wenn keine Firewall aktiv ist" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:475 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:493 msgid "Always use auto-detected IP address (Not firewalled)" msgstr "Immer die automatisch erkannte IP-Adresse benutzen (bei inaktiver Firewall)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:485 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:503 msgid "Disable inbound (Firewalled)" msgstr "Deaktiviere eingehende Verbindungen (Firewall ist aktiv)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:489 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:507 msgid "Completely disable" msgstr "Komplett deaktivieren" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:491 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:509 msgid "(select only if behind a firewall that throttles or blocks outbound TCP)" msgstr "" "(nur auswählen, wenn dieser Router hinter einer Firewall ist, die ausgehenden \n" "TCP-Verkehr blokiertt oder begrenzt)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:493 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:511 msgid "Externally reachable TCP port" msgstr "Extern erreichbarer TCP-Port" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:497 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:515 msgid "Use the same port configured for UDP" msgstr "Den selben Port wie für UDP benutzen" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:505 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:523 msgid "Specify Port" msgstr "Gib den Port an" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:509 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:339 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:330 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:527 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:357 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:348 msgid "Note" msgstr "Hinweis" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:512 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:530 msgid "Changing these settings will restart your router." msgstr "Veränderungen an diesen Werten bewirken einen Neustart des Routers." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:518 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:536 msgid "Configuration Help" msgstr "Konfigurationshilfe" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:520 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:569 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:538 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:587 msgid "While I2P will work fine behind most firewalls, your speeds and network integration will generally improve if the I2P port is forwarded for both UDP and TCP." msgstr "I2P funktioniert auch hinter den meisten Firewalls, aber die Geschwindigkeit und Integration ins I2P-Netz erhöhen sich, wenn der I2P-Port in der Firewall für TCP und UDP freigegeben und auf Ihren Computer weitergeleitet wird." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:522 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:540 msgid "If you can, please poke a hole in your firewall to allow unsolicited UDP and TCP packets to reach you." msgstr "" "Falls es Ihnen möglich ist, richten Sie bitte Ihre Firewall so ein, dass \n" "TCP- und UDP-Pakete Ihren Computer unverändert erreichen." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:524 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:542 msgid "If you can't, I2P supports UPnP (Universal Plug and Play) and UDP hole punching with \"SSU introductions\" to relay traffic." msgstr "" "Falls Ihnen das nicht möglich ist, hat I2P UPnP-Unterstützung (Universelles \n" "Plug and Play) und UDP-Weiterleitung mit Hilfe der „SSU-Hilfsrouter“ eingebaut." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:526 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:544 msgid "Most of the options above are for special situations, for example where UPnP does not work correctly, or a firewall not under your control is doing harm." msgstr "" "Die meisten der obenstehenden Optionen sind für besondere Situationen,\n" "wenn z. B. UPnP nicht funktioniert oder die Firewall nicht geändert werden \n" "kann und Probleme bereitet." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:528 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:546 msgid "Certain firewalls such as symmetric NATs may not work well with I2P." msgstr "" "Bestimmte Firewalls, wie auch symmetrische NATs, arbeiten unter Umständen\n" "nicht gut mit I2P zusammen." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:537 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:555 msgid "UPnP is used to communicate with Internet Gateway Devices (IGDs) to detect the external IP address and forward ports." msgstr "" "UPnP kommuniziert normalerweise mit den Internet Gateway Devices (IGDs), um \n" "die extern erreichbare IP-Adresse zu ermitteln und die Ports weiterzuleiten." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:539 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:557 msgid "UPnP support is beta, and may not work for any number of reasons" msgstr "" "Die Unterstützung für UPnP ist noch in der Testphase und kann aus vielen\n" "Gründen nicht funktionieren" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:541 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:559 msgid "No UPnP-compatible device present" msgstr "Kein UPnP-fähiges Gerät gefunden" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:543 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:561 msgid "UPnP disabled on the device" msgstr "UPnP ist für dieses Gerät deaktiviert" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:545 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:563 msgid "Software firewall interference with UPnP" msgstr "Die Software-Firewall stört UPnP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:547 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:565 msgid "Bugs in the device's UPnP implementation" msgstr "Fehlerhafte UPnP-Integration im Gerät" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:549 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:567 msgid "Multiple firewall/routers in the internet connection path" msgstr "Mehrere Firewalls / Router in der Verbindung zum Internet" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:551 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:569 msgid "UPnP device change, reset, or address change" msgstr "UPnP-Gerät geändert, neugestartet oder mit geänderter Adresse" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:553 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:571 msgid "Review the UPnP status here." msgstr "Ãœberprüfen Sie hier den UPnP-Status." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:555 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:573 msgid "UPnP may be enabled or disabled above, but a change requires a router restart to take effect." msgstr "" "UPnP kann aktiviert oder deaktiviert werden, aber ein wechseln \n" "erfordert einen Routerneustart um wirksam zu werden." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:557 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:575 msgid "Hostnames entered above will be published in the network database." msgstr "Oben eingegebene Hostnamen werden in der Netzwerk-Datenbank veröffentlicht." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:559 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:577 msgid "They are <b>not private</b>." msgstr "Sie sind <b>nicht geheim</b>." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:561 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:579 msgid "Also, <b>do not enter a private IP address</b> like 127.0.0.1 or 192.168.1.1." msgstr "" "Geben Sie auch <b>keine IP-Adresse für den privaten Gebrauch</b> wie\n" "127.0.0.1 oder 192.168.1.1 an!" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:563 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:581 msgid "If you specify the wrong IP address or hostname, or do not properly configure your NAT or firewall, your network performance will degrade substantially." msgstr "" "Wenn Sie eine falsche IP-Adresse oder einen falschen Hostnamen angeben, oder Ihre Firewall oder NAT nicht richtig konfigurieren, \n" "wird sich Ihre Netzwerk-Performance erheblich verschlechtern." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:565 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:583 msgid "When in doubt, leave the settings at the defaults." msgstr "Wenn Sie Zweifel haben, lassen Sie die Einstellungen auf den Standardwerten." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:567 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:585 msgid "Reachability Help" msgstr "Hilfe zur Erreichbarkeit" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:572 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:590 msgid "If you think you have opened up your firewall and I2P still thinks you are firewalled, remember that you may have multiple firewalls, for example both software packages and external hardware routers." msgstr "" "Wenn Sie meinen, Sie haben Ihre Firewall geöffnet und I2P breichtet dennoch, es wäre\n" "hinter einer Firewall, dann prüfen Sie, ob Sie möglicherweise mehrere Firewalls\n" "- zum Beispiel sowohl Software- als auch externer Hardware-Router - haben." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:575 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:593 msgid "If there is an error, the <a href=\"logs.jsp\">logs</a> may also help diagnose the problem." msgstr "" "Wenn ein Fehler auftritt, können die <a href=\"logs.jsp\">Berichte</a> helfen, \n" "das Problem zu diagnostizieren." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:579 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:597 msgid "Your UDP port does not appear to be firewalled." msgstr "Ihr UDP-Port wird anscheinend nicht von der Firewall geblockt." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:583 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:601 msgid "Your UDP port appears to be firewalled." msgstr "Ihr UDP-Port wird anscheinend von der Firewall geblockt." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:585 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:603 msgid "As the firewall detection methods are not 100% reliable, this may occasionally be displayed in error." msgstr "" "Da die Firewall-Nachweismethoden nicht zu 100% zuverlässig sind, ist die \n" "Anzeige gelegentlich fehlerhaft." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:587 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:605 msgid "However, if it appears consistently, you should check whether both your external and internal firewalls are open for your port." msgstr "" "Wenn es allerdings dauerhaft angezeigt wird, sollten Sie überprüfen, ob Ihre Ports,\n" "sowohl der externen wie auch der internen Firewall, geöffnet sind." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:589 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:607 msgid "I2P will work fine when firewalled, there is no reason for concern. When firewalled, the router uses \"introducers\" to relay inbound connections." msgstr "" "I2P wird auch mit geschlossener Firewall gut funktionieren, es besteht kein \n" "Grund zur Besorgnis. Bei geschlossener Firewall verwendet der Router \n" "\"Hilfsrouter\", um eingehende Verbindungen zu übertragen." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:591 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:609 msgid "However, you will get more participating traffic and help the network more if you can open your firewall(s)." msgstr "Falls Sie Ihre Firewall(s) öffnen, helfen Sie dem Netzwerk mehr und gleichzeitig erhöhen Sie Ihre Anonymität durch die Teilnahme an fremden Tunneln." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:593 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:611 msgid "If you think you have already done so, remember that you may have both a hardware and a software firewall, or be behind an additional, institutional firewall you cannot control." msgstr "Falls Sie dies schon getan haben, denken Sie bitte daran, dass Sie eine Hardware- und eine Software-Firewall haben könnten, oder aber hinter einer Firewall sind, die Sie nicht ändern können (z.B. seitens Ihres Providers)." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:595 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:613 msgid "Also, some routers cannot correctly forward both TCP and UDP on a single port, or may have other limitations or bugs that prevent them from passing traffic through to I2P." msgstr "Auch können manche Router nicht TCP und UDP korrekt auf dem selben Port weiterleiten, oder haben andere Beschränkungen oder Fehler, die die Portweiterleitung an den I2P-Router behindern." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:599 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:617 msgid "The router is currently testing whether your UDP port is firewalled." msgstr "Der Router testet gerade, ob Ihr UDP-Port offen ist." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:603 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:621 msgid "The router is not configured to publish its address, therefore it does not expect incoming connections." msgstr "Die Einstellungen des Routers verhindern die Veröffentlichung der Adresse, deswegen akzeptiert er keine eingehenden Verbindungen." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:605 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:623 msgid "WARN - Firewalled and Fast" msgstr "WARNUNG: Firewall aktiv und schnell" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:607 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:625 msgid "You have configured I2P to share more than 128KBps of bandwidth, but you are firewalled." msgstr "Sie haben I2P angewiesen, mehr als 128 kbit/s Bandbreite zu teilen, aber leider sind Sie hinter einer Firewall." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:609 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:627 msgid "While I2P will work fine in this configuration, if you really have over 128KBps of bandwidth to share, it will be much more helpful to the network if you open your firewall." msgstr "I2P funktioniert zwar auch mit dieser Einstellung, falls Sie jedoch wirklich über mehr als 128 kbit/s Bandbreite zum Teilen verfügen, sind Sie mit einer offenen Firewall viel hilfreicher für das Netzwerk." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:611 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:629 msgid "WARN - Firewalled and Floodfill" msgstr "WARNUNG: Firewall und Floodfillfunktion aktiv" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:613 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:631 msgid "You have configured I2P to be a floodfill router, but you are firewalled." msgstr "Sie haben I2P als Floodfill-Router eingerichtet, jedoch sind sie hinter einer Firewall." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:615 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:633 msgid "For best participation as a floodfill router, you should open your firewall." msgstr "Für die beste Teilnahme als Floodfill-Router, sollten Sie Ihre Firewall öffnen." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:617 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:635 msgid "WARN - Firewalled with Inbound TCP Enabled" msgstr "WARNUNG: von Firewall geblockt und ankommendes TCP aktiviert" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:619 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:637 msgid "You have configured inbound TCP, however your UDP port is firewalled, and therefore it is likely that your TCP port is firewalled as well." msgstr "Sie haben eingehendes TCP konfiguriert, jedoch ist ihr UDP-Port hinter einer Firewall. Deswegen ist es wahrscheinlich, dass Ihr TCP-Port auch hinter einer Firewall ist." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:621 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:639 msgid "If your TCP port is firewalled with inbound TCP enabled, routers will not be able to contact you via TCP, which will hurt the network." msgstr "Falls Ihr TCP Port gesperrt ist und Sie \"eingehendes TCP\" aktiviert haben, werden andere Router Sie nicht via TCP erreichen können. Dies schadet dem Netzwerk." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:623 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:641 msgid "Please open your firewall or disable inbound TCP above." msgstr "Bitte öffnen Sie Ihre Firewall oder schalten Sie ankommendes TCP oben aus" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:625 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:643 msgid "WARN - Firewalled with UDP Disabled" msgstr "WARNUNG: Firewall aktiv und UDP deaktiviert" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:627 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:645 msgid "You have configured inbound TCP, however you have disabled UDP." msgstr "Sie haben eingehendes TCP aktiviert, jedoch UDP deaktiviert." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:629 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:647 msgid "You appear to be firewalled on TCP, therefore your router cannot accept inbound connections." msgstr "Sie scheinen auf TCP eine Firewall zu haben, deswegen kann Ihr Router keine eingehenden Verbindungen entgegennehmen." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:631 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:649 msgid "Please open your firewall or enable UDP." msgstr "Bitte öffnen Sie Ihre Firewall oder aktivieren Sie UDP!" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:633 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:651 msgid "ERR - Clock Skew" msgstr "FEHLER: Uhr nicht synchron" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:635 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:653 msgid "Your system's clock is skewed, which will make it difficult to participate in the network." msgstr "Ihre Uhrzeit ist nicht synchron mit dem Netzwerk, dies macht es schwierig, am Netzwerk teilzunehmen." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:637 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:655 msgid "Correct your clock setting if this error persists." msgstr "Korrigieren Sie Ihre Uhrzeit falls dieser Fehler bestehen bleibt!" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:639 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:657 msgid "ERR - Private TCP Address" msgstr "FEHLER: Private TCP-Adresse" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:641 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:659 msgid "You must never advertise an unroutable IP address such as 127.0.0.1 or 192.168.1.1 as your external address." msgstr "Sie dürfen nie eine nicht routebare IP wie 127.0.0.1 oder 192.168.1.1 als Ihre extern erreichbare Adresse angeben." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:643 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:661 msgid "Correct the address or disable inbound TCP above." msgstr "Korrigieren Sie die Adresse oder deaktivieren Sie eingehendes TCP oben!" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:645 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:663 msgid "ERR - SymmetricNAT" msgstr "FEHLER: symmetrische NAT" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:647 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:665 msgid "I2P detected that you are firewalled by a Symmetric NAT." msgstr "I2P hat erkannt, dass Sie hinter einer symmetrischen NAT gesperrt sind." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:649 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:667 msgid "I2P does not work well behind this type of firewall. You will probably not be able to accept inbound connections, which will limit your participation in the network." msgstr "I2P funktioniert hinter diesem Typ Firewall nicht gut. Sie können wahrscheinlich keine eingehenden Verbindungen akzeptieren, was Ihre Teilnahme am Netzwerk beeinträchtigt." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:651 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:669 msgid "ERR - UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart" msgstr "FEHLER: UDP-Port wird schon benutzt. Setzen Sie i2np.udp.internalPort=xxxx in den erweiterten Einstellungen und starten Sie neu!" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:653 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:671 msgid "I2P was unable to bind to port 8887 or other configured port." msgstr "I2P konnte sich nicht auf den konfigurierten Port binden." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:655 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:673 msgid "Check to see if another program is using the configured port. If so, stop that program or configure I2P to use a different port." msgstr "Ãœberprüfen Sie, ob ein anderes Programm den eingestellten Port benutzt. Falls ja, beenden Sie dieses Programm oder wählen Sie einen anderen Port für I2P!" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:657 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:675 msgid "This may be a transient error, if the other program is no longer using the port." msgstr "Dies kann ein vorübergehender Fehler sein, falls das andere Programm diesen Port nicht mehr nutzt." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:659 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:677 msgid "However, a restart is always required after this error." msgstr "Jedoch ist nach diesem Fehler immer ein Neustart erforderlich." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:661 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:679 msgid "ERR - UDP Disabled and Inbound TCP host/port not set" msgstr "FEHLER: UDP deaktiviert und eingehende TCP-Adresse/Port nicht konfiguriert" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:663 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:681 msgid "You have not configured inbound TCP with a hostname and port above, however you have disabled UDP." msgstr "Sie haben unter TCP eingehend keinen Hostnamen und Port eingetragen und dennoch UDP deaktiviert." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:665 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:683 msgid "Therefore your router cannot accept inbound connections." msgstr "Somit kann Ihr Router keine eigehenden Verbindungen akzeptieren." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:667 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:685 msgid "Please configure a TCP host and port above or enable UDP." msgstr "Bitte konfigurieren Sie eine Adresse und einen Port im oberen Bereich für TCP oder aktivieren Sie UDP!" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:669 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:687 msgid "ERR - Client Manager I2CP Error - check logs" msgstr "FEHLER: Klientenmanager I2CP Fehler - Schauen Sie in die Berichte!" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:671 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:689 msgid "This is usually due to a port 7654 conflict. Check the logs to verify." msgstr "Dies geschieht für gewöhnlich wegen eines Konflikts auf Port 7654. Prüfen Sie die Berichte, um dies zu verifizieren!" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:673 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:691 msgid "Do you have another I2P instance running? Stop the conflicting program and restart I2P." msgstr "Haben Sie eine zweite I2P-Instanz laufen? Beenden Sie das störende Programm und starten Sie I2P neu!" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:107 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:113 msgid "config advanced" msgstr "Erweiterte Einstellungen" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:241 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:263 msgid "I2P Advanced Configuration" msgstr "I2P - Erweiterte Einstellungen" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:301 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:319 msgid "Advanced I2P Configuration" msgstr "Erweiterte I2P-Einstellungen" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:311 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:329 msgid "Some changes may require a restart to take effect." msgstr "Einige Einstellungen benötigen einen Routerneustart, um aktiv zu werden." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:112 msgid "config clients" msgstr "Klienten einrichten" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:265 msgid "I2P Client Configuration" msgstr "Konfiguration der I2P-Klienten" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:312 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:330 msgid "Client Configuration" msgstr "Klienten-Konfiguration" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:314 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:332 msgid "The Java clients listed below are started by the router and run in the same JVM." msgstr "" "Die Java-Klienten unten werden durch den Router gestartet und laufen in der \n" "selben JVM." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:318 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:338 msgid "To change other client options, edit the file" msgstr "Bearbeiten Sie diese Datei, um andere Klienten-Optionen zu ändern:" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:325 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:401 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:415 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:345 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:423 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:439 msgid "All changes require restart to take effect." msgstr "Alle Änderungen erfordern einen Neustart, um aktiv zu werden." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:337 -#, fuzzy +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:357 msgid "Advanced Client Interface Configuration" -msgstr "Erweiterte I2P-Einstellungen" +msgstr "Erweiterte Einstellungen des Klienten-Interfaces" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:339 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:361 msgid "External I2CP (I2P Client Protocol) Interface Configuration" -msgstr "" +msgstr "Eintellungen des externen I2CP-Interfaces (I2P-Klienten-Protokoll)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:345 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:367 msgid "Enabled without SSL" -msgstr "" +msgstr "Aktiviert; ohne SSL" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:351 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:373 msgid "Enabled with SSL required" -msgstr "" +msgstr "Aktiviert, SSL erforderlich" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:357 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:379 msgid "Disabled - Clients outside this Java process may not connect" -msgstr "" +msgstr "Deaktiviert - Klienten außerhalb dieses Javaprozesses können sich nicht verbinden" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:359 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:381 msgid "I2CP Port" -msgstr "" +msgstr "I2CP-Port" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:363 -#, fuzzy +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:385 msgid "I2CP Interface" -msgstr "Einstellungen" +msgstr "I2CP-Interface" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:379 -#, fuzzy +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:401 msgid "Authorization" -msgstr "Autor" +msgstr "Autorisation" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:385 -msgid "Requre username and password" -msgstr "" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:407 +msgid "Require username and password" +msgstr "Zugangskontrolle per Benutzername und Passwort aktivieren" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:387 -#, fuzzy +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:409 msgid "Username" -msgstr "Surinam" +msgstr "Benutzername" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:391 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:413 msgid "Password" -msgstr "" +msgstr "Passwort" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:397 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:419 msgid "Any changes made here must also be configured in the external client." -msgstr "" +msgstr "Alle hier vorgenommenen Änderungen müssen auch in den externen Klienten vorgenommen werden." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:399 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:421 msgid "Many clients do not support SSL or authorization." -msgstr "" +msgstr "Vielle Klienten unterstützen kein SSL und/oder keine Authentifikation." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:407 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:429 msgid "WebApp Configuration" msgstr "WebApp-Einstellungen" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:409 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:431 msgid "The Java web applications listed below are started by the webConsole client and run in the same JVM as the router. They are usually web applications accessible through the router console. They may be complete applications (e.g. i2psnark),front-ends to another client or application which must be separately enabled (e.g. susidns, i2ptunnel), or have no web interface at all (e.g. addressbook)." msgstr "Untengenannte Java-Anwendungen werden vom WebKonsolen-Klienten gestartet und laufen in der selben JVM wie der Router. Es handelt sich dabei normalerweise Web-Anwendungen, die über die Routerkonsole erreichbar sind. Es können komplette Anwendungen (z.B. i2psnark), reine Oberflächen für andere Klienten, Anwendungen, die separat aktiviert werden müssen (z.B. susidns, i2ptunnel), oder Anwendungen ohne Oberfläche (Adressbuch) sein." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:411 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:433 msgid "A web app may also be disabled by removing the .war file from the webapps directory; however the .war file and web app will reappear when you update your router to a newer version, so disabling the web app here is the preferred method." msgstr "Eine Webanwendung kann auch durch das Entfernen der .war-Datei deaktiviert werden. Jedoch werden die .war-Datei und die Anwendung nach einer Aktualisierung des Routers wieder erscheinen. Somit ist das Deaktivieren der Web-Anwendung hier die bevorzugte Methode." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:421 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:445 msgid "Plugin Configuration" msgstr "Konfiguration der Zusatzprogramme" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:423 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:447 msgid "The plugins listed below are started by the webConsole client." msgstr "Die unten aufgelisteten Zusatzprogramme werden vom WebKonsolen-Klienten gestartet." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:429 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:455 msgid "Plugin Installation" msgstr "Installation von Zusatzprogrammen" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:431 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:457 msgid "To install a plugin, enter the download URL:" msgstr "Für die Installation eines Zusatzprogramms bitte die Download-URL eingeben:" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:112 msgid "config keyring" msgstr "Schlüsselbund einrichten" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:249 msgid "I2P Keyring Configuration" msgstr "Einstellungen des I2P-Schlüsselbunds" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:295 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:317 msgid "The router keyring is used to decrypt encrypted leaseSets." msgstr "Der Router-Schlüsselbund wird zum Entschlüsseln verschlüsselter LeaseSets verwendet." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:298 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:320 msgid "The keyring may contain keys for local or remote encrypted destinations." msgstr "Der Schlüsselbund kann Schlüssel für lokale oder entfernte verschlüsselte Leasesets enthalten." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:308 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:326 msgid "Manual Keyring Addition" msgstr "Manuelles Hinzufügen zum Schlüsselbund" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:310 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:328 msgid "Enter keys for encrypted remote destinations here." msgstr "Geben Sie hier die Schlüssel für entfernte verschlüsselte Ziele ein!" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:313 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:331 msgid "Keys for local destinations must be entered on the" msgstr "Schlüssel für lokale Ziele müssen dort eingegeben werden" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:315 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:333 msgid "I2PTunnel page" msgstr "I2PTunnel-Seite" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:317 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:335 msgid "Dest. name, hash, or full key" msgstr "Name des Ziels, Prüfsumme oder ganzer Schlüssel" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:319 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:337 msgid "Encryption Key" msgstr "Schlüssel zum Kodieren" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:107 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:113 msgid "config logging" msgstr "Berichte einrichten" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:241 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:263 msgid "I2P Logging Configuration" msgstr "Einstellungen der I2P-Berichte" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:301 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:319 msgid "Configure I2P Logging Options" msgstr "Richte I2P-Berichte ein" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:303 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:321 msgid "Logging filename" msgstr "Dateiname für Berichte" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:307 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:325 msgid "(the symbol '@' will be replaced during log rotation)" msgstr "(Das Zeichen '@' wird bei der Rotation der Berichtedatei ersetzt)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:309 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:327 msgid "Log record format" msgstr "Format der Berichtedatei" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:313 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:331 msgid "(use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, 'm' = message)" msgstr "(Benutzen Sie 'd' = Datum, 'c' = Klasse, 't' = Thread, 'p' = Priorität, 'm' = Nachricht)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:315 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:333 msgid "Log date format" msgstr "Datumsformat der Berichte" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:319 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:337 msgid "('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' = millisecond)" msgstr "('MM' = Monat, 'dd' = Tag, 'HH' = Stunde, 'mm' = Minute, 'ss' = Sekunde, 'SSS' = Millisekunde)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:321 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:339 msgid "Max log file size" msgstr "max. Dateigröße der Berichte" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:325 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:343 msgid "Default log level" msgstr "Standardlevel für Berichte" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:329 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:347 msgid "(DEBUG and INFO are not recommended defaults, as they will drastically slow down your router)" msgstr "(DEBUG und INFO sind nicht empfohlen, da diese den Router drastisch verlangsamen)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:331 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:349 msgid "Log level overrides" msgstr "Berichtelevel - Sonderoptionen" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:353 msgid "New override" msgstr "Neue Zusatzoption" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:112 msgid "config peers" msgstr "Teilnehmer einrichten" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:249 msgid "I2P Peer Configuration" msgstr "Einstellungen zu I2P-Teilnehmern" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:305 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:323 msgid "Manual Peer Controls" msgstr "Manuelles Verwalten der Teilnehmer" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:307 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:325 msgid "Router Hash" msgstr "Router-Prüfsumme" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:311 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:329 msgid "Manually Ban / Unban a Peer" msgstr "Einen Teilnehmer manuell sperren/entsperren" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:313 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:331 msgid "Banning will prevent the participation of this peer in tunnels you create." msgstr "Eine Sperrung verhindert, dass der Teilnehmer in von Ihnen aufgebauten Tunneln partizipiert." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:323 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:341 msgid "Adjust Profile Bonuses" msgstr "Profilboni anpassen" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:325 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:343 msgid "Bonuses may be positive or negative, and affect the peer's inclusion in Fast and High Capacity tiers. Fast peers are used for client tunnels, and High Capacity peers are used for some exploratory tunnels. Current bonuses are displayed on the" msgstr "Boni können positiv oder negativ sein. Sie beeinflussen die Aufnahme der Teilnehmer in die Klassen schneller Router und Router hoher Kapazität. Schnelle Teilnehmer werden für Klienten-Tunnel genutzt, Teilnehmer mit hoher Kapazität für einige Erkundungstunnel. Derzeitige Boni werden dargestellt auf der " -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:327 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:345 msgid "profiles page" msgstr "Profile-Seite" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:345 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:251 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:363 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:273 msgid "Banned Peers" msgstr "Gesperrte Teilnehmer" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:366 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:384 msgid "Banned IPs" msgstr "Gesperrte IPs" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:112 +msgid "config reseeding" +msgstr "Reseed-Einstellungen" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:262 +msgid "I2P Reseeding Configuration" +msgstr "I2P-Reseed-Einstellungen" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:318 +msgid "Reseeding Configuration" +msgstr "Reseed-Einstellungen" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:320 +msgid "Reseeding is the bootstrapping process used to find other routers when you first install I2P, or when your router has too few router references remaining." +msgstr "Der Reseed ist ein \"bootstrapping\"-Prozess, der das erstmalige Verbinden mit dem Netzwerk ermöglicht. Hierbei werden andere Netzwerkteilnehmer gefunden. Dies ist nötig nach der Installation oder wenn der Router aus anderen Gründen nur noch sehr wenige Kontakte gespeichert hat." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:322 +msgid "If reseeding has failed, you should first check your network connection." +msgstr "Schlägt der Reseed fehl, solltest du zuallererst deine Internetverbindung überprüfen." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:326 +msgid "Change these only if HTTP is blocked by a restrictive firewall, reseed has failed, and you have access to an HTTP proxy." +msgstr "Ändere diese Einstellungen nur wenn HTTP von einer restriktiven Firewall blockiert wird, der Reseed fehlschlägt, und dir ein HTTP-Proxy zur Verfügung steht." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:328 +#, java-format +msgid "See {0} for instructions on reseeding manually." +msgstr "Für einen manuellen Reseed, lies die Anleitung unter {0}!" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:328 +msgid "the FAQ" +msgstr "die FAQ" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:330 +msgid "Reseed URL Selection" +msgstr "Auswahl der Reseed-URL" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:336 +msgid "Try SSL first then non-SSL" +msgstr "Probiere zunächst SSL, dann nicht-SSL" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:342 +msgid "Use SSL only" +msgstr "nur SSL verwenden" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:348 +msgid "Use non-SSL only" +msgstr "kein SSL verwenden" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:350 +msgid "Reseed URLs" +msgstr "Reseed-URLs" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:354 +msgid "Enable HTTP proxy (not used for SSL)" +msgstr "HTTP-Proxy aktivieren (nicht für SSL)" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:358 +msgid "HTTP Proxy Host" +msgstr "IP der HTTP-Brücke" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:362 +msgid "HTTP Proxy Port" +msgstr "Port der HTTP-Brücke" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:112 msgid "config service" msgstr "Dienste einrichten" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:249 msgid "I2P Service Configuration" msgstr "I2P-Dienste-Einstellungen" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:285 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:303 msgid "Shutdown the router" msgstr "Router herunterfahren" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:287 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:305 msgid "Graceful shutdown lets the router satisfy the agreements it has already made before shutting down, but may take a few minutes." msgstr "Das kontrollierte Herunterfahren lässt dem Router Zeit, alle Zusagen, die er gemacht hat, noch zu erfüllen. Dafür benötigt er bis zu 11 Minuten." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:289 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:307 msgid "If you need to kill the router immediately, that option is available as well." msgstr "Es gibt auch eine Option zum sofortigen Beenden des Routers, falls Sie diese benötigen." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:299 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:317 msgid "If you want the router to restart itself after shutting down, you can choose one of the following." msgstr "Falls Sie den Router nach dem Herunterfahren automatisch wieder starten lassen wollen, wählen Sie eine der folgenden Optionen aus." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:301 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:319 msgid "This is useful in some situations - for example, if you changed some settings that client applications only read at startup, such as the routerconsole password or the interface it listens on." msgstr "Dies ist in manchen Situationen hilfreich - zum Beispiel wenn Sie einige Optionen geändert haben, die die Klienten-Anwendung nur beim Starten einliest (Routerkonsolen-Passwort oder das Interface auf dem es arbeitet)." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:303 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:321 msgid "A graceful restart will take a few minutes (but your peers will appreciate your patience), while a hard restart does so immediately." msgstr "Ein kontrollierter Neustart benötigt bis zu 11 Minuten (Ihre Teilnehmer sind für Ihre Geduld dankbar); ein harter Neustart erfolgt sofort." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:305 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:323 msgid "After tearing down the router, it will wait 1 minute before starting back up again." msgstr "Nachdem der Router heruntergefahren ist, wartet er eine Minute, bevor er wieder startet." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:315 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:333 msgid "Systray integration" msgstr "Systemtray-Integration" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:317 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:335 msgid "On the windows platform, there is a small application to sit in the system tray, allowing you to view the router's status" msgstr "Auf Windows-Systemen gibt es eine kleine Anwendung, die es Ihnen ermöglicht, den Routerstatus im Systemtray zu sehen." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:319 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:337 msgid "(later on, I2P client applications will be able to integrate their own functionality into the system tray as well)." msgstr "(Später werden I2P-Anwendungen auch ihre eigenen Funktionen in den Systemtray integrieren können)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:321 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:339 msgid "If you are on windows, you can either enable or disable that icon here." msgstr "Falls Sie Windows nutzen, können Sie hier dieses Symbol aktiveren oder deaktivieren." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:327 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:341 +msgid "Show systray icon" +msgstr "Systemtray-Icon anzeigen" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:343 +msgid "Hide systray icon" +msgstr "Systemtray-Icon deaktivieren" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:345 msgid "Run on startup" msgstr "Beim Hochfahren starten" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:329 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:347 msgid "You can control whether I2P is run on startup or not by selecting one of the following options - I2P will install (or remove) a service accordingly." msgstr "Sie können mit folgenden Optionen festlegen, ob I2P beim Hochfahren gestartet wird oder nicht - I2P wird dementsprechend einen Service einrichten (oder ggf. entfernen)." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:331 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:349 msgid "If you prefer the command line, you can also run the " msgstr "Falls Sie die Eingabeaufforderung bevorzugen, können Sie auch folgendes ausführen" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:341 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:359 msgid "If you are running I2P as service right now, removing it will shut down your router immediately." msgstr "Falls Sie I2P zurzeit als Service gestartet haben, wird ein Entfernen des Services den Router sofort beenden." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:343 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:361 msgid "You may want to consider shutting down gracefully, as above, then running uninstall_i2p_service_winnt.bat." msgstr "Sie sollten I2P, wie oben beschrieben, kontrolliert herunterfahren und dann uninstall_i2p_service_winnt.bat ausführen." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:347 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:365 msgid "Debugging" msgstr "Debuggen" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:349 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:367 msgid "View the job queue" msgstr "Die Auftragswarteschlange ansehen" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:353 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:371 msgid "At times, it may be helpful to debug I2P by getting a thread dump. To do so, please select the following option and review the thread dumped to <a href=\"logs.jsp#servicelogs\">wrapper.log</a>." msgstr "Manchmal ist es zur Fehlerbeseitigung in I2P hilfreich, eine Liste der aktiven Prozesse zu erzeugen. Dafür wählen Sie bitte folgende Option aus und überprüfen die Liste der aktiven Prozesse in der <a href=\"logs.jsp#servicelogs\">wrapper.log Datei</a>!" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:359 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:377 msgid "Launch browser on router startup?" msgstr "Beim Starten einen Browser aufrufen?" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:361 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:379 msgid "I2P's main configuration interface is this web console, so for your convenience I2P can launch a web browser on startup pointing at" msgstr "Die Web-Konsole ist I2Ps wichtigstes Interface für Einstellungen. I2P kann für Sie beim Starten einen Browser öffnen und die Routerkonsole anzeigen, unter" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:107 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:113 msgid "config stats" msgstr "Statistiken einrichten" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:228 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:250 msgid "I2P Stats Configuration" msgstr "I2P - Einstellungen zu den Statistiken" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:302 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:320 msgid "Configure I2P Stat Collection" msgstr "I2P-Statistiken anpassen" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:304 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:322 msgid "Enable full stats?" msgstr "Vollständige Statistiken aktivieren?" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:311 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:329 msgid "change requires restart to take effect" msgstr "Änderungen erfordern einen Routerneustart" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:313 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:331 msgid "Stat file" msgstr "Status Datei" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:317 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:335 msgid "Filter" msgstr "Filter" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:319 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:328 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:337 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:348 msgid "toggle all" msgstr "Wähle alle" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:330 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:350 msgid "Log" msgstr "Berichte" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:332 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:352 msgid "Graph" msgstr "Graphen" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:371 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:391 msgid "Advanced filter" msgstr "Erweiterte Filter" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:112 msgid "config tunnels" msgstr "Tunnel einrichten" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:262 msgid "I2P Tunnel Configuration" msgstr "Einstellungen der I2P-Tunnel" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:306 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:328 msgid "The default settings work for most people." msgstr "Die Standardeinstellungen funktionieren für die meisten." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:310 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:332 msgid "There is a fundamental tradeoff between anonymity and performance." msgstr "Es gibt einen grundsätzlichen Kompromiss zwischen Anonymität und Performance." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:313 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:335 msgid "Tunnels longer than 3 hops (for example 2 hops + 0-2 hops, 3 hops + 0-1 hops, 3 hops + 0-2 hops), or a high quantity + backup quantity, may severely reduce performance or reliability." msgstr "Tunnel mit mehr als 3 Zwischenstationen (z.B. 2+0-2, 3+0-1 oder 3+0-2) oder eine große Anzahl an Tunneln + Ersatztunneln kann die Performance oder Zuverlässigkeit erheblich verringern." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:316 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:338 msgid "High CPU and/or high outbound bandwidth usage may result." msgstr "Eine hohe CPU-Last und/oder hohe ausgehende Bandbreite können die Folge sein." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:319 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:341 msgid "Change these settings with care, and adjust them if you have problems." msgstr "Ändern Sie diese Einstellungen nur, wenn Sie Probleme haben, und stets mit besonderer Vorsicht!" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:333 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:351 msgid "Exploratory tunnel setting changes are stored in the router.config file." msgstr "Einstellungen der Erkundungstunnel sind in der Datei router.config gespeichert." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:336 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:354 msgid "Client tunnel changes are temporary and are not saved." msgstr "Änderungen an den Kliententunneln sind nur temporär und werden nicht gespeichert." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:338 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:356 msgid "To make permanent client tunnel changes see the" msgstr "Um permanente Änderungen an den Kliententunneln zu machen, gehen Sie auf die " -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:340 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:358 msgid "i2ptunnel page" msgstr "I2PTunnel-Seite" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:112 msgid "config UI" msgstr "konfiguriere UI" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:262 msgid "I2P UI Configuration" msgstr "I2P UI-Konfiguration" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:292 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:314 msgid "Router Console Theme" msgstr "Thema der Routerkonsole" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:310 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:339 msgid "Theme selection disabled for Internet Explorer, sorry." msgstr "Themenauswahl für den Internet Explorer ist ausgeschaltet, bedauere." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:312 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:341 msgid "If you're not using IE, it's likely that your browser is pretending to be IE; please configure your browser (or proxy) to use a different User Agent string if you'd like to access the console themes." msgstr "Falls Sie nicht den Internet Explorer (IE) benutzen, gibt Ihr Browser wahrscheinlich vor, IE zu sein. Wenn Sie die Konsolenthemen nutzen möchten, ändern Sie bitte Ihren Browser (oder Proxy) so, dass er einen anderen User-Agenten sendet!" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:316 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:345 msgid "Router Console Language" msgstr "Sprache der Routerkonsole" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:320 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:349 msgid "Please contribute to the router console translation project! Contact the developers on IRC #i2p to help." msgstr "" "Bitte tragen Sie zum Routerkonsolen-Ãœbersetzungsprojekt bei! Kontaktieren \n" "Sie hierzu die Entwickler über den IRC-Kanal #i2p!" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:324 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:353 msgid "Apply" msgstr "Anwenden" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:112 msgid "config update" msgstr "Aktualisierung der Konfiguration" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:249 msgid "I2P Update Configuration" msgstr "Einstellungen zu Aktualisierungen von I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:303 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:321 msgid "Check for I2P and news updates" msgstr "Ãœberprüfe auf Aktualisierungen von I2P und auf Nachrichten" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:305 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:323 msgid "News & I2P Updates" msgstr "Neuigkeiten & Aktualisierungen" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:309 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:327 msgid "Update In Progress" msgstr "Aktualisierung wird vorgenommen" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:317 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:335 msgid "News URL" msgstr "Nachrichten-URL" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:321 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:339 msgid "Refresh frequency" msgstr "Aktualisierungshäufigkeit" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:327 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:345 msgid "Update policy" msgstr "Aktualisierungsregeln" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:331 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:349 msgid "Update through the eepProxy?" msgstr "Aktualisierung durch den eepProxy?" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:353 msgid "eepProxy host" msgstr "eepProxy-Host" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:339 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:357 msgid "eepProxy port" msgstr "eepProxy-Port" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:343 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:361 msgid "Update URLs" msgstr "URLs aktualisieren" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:347 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:365 msgid "Trusted keys" msgstr "Vertraute Schlüssel" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:351 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:369 msgid "Update with unsigned development builds?" msgstr "Aktualisieren mit unsignierten Entwicklerversionen?" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:355 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:373 msgid "Unsigned Build URL" msgstr "URL für nicht signierte Aktualisierungen" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:361 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:379 msgid "I2P updates are disabled because you do not have write permission for the install directory." msgstr "Aktualisierungen für I2P sind deaktiviert, da Sie (I2P) keine Schreibberechtigung im Installationsverzeichnis haben." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:367 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:385 msgid "Save" msgstr "Speichern" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:117 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:121 +msgid "Internal Error" +msgstr "interner Fehler" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:123 +msgid "Router Console" +msgstr "I2P-Routerkonsole" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:127 +msgid "Configuration" +msgstr "Einstellungen" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:135 +msgid "Sorry! There has been an internal error." +msgstr "Entschuldigung! es gab einen internen Fehler." + +#. note to translators - both parameters are URLs +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:139 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:254 +#, java-format +msgid "Please report bugs on {0} or {1}." +msgstr "Bitte melden Sie Fehler unter {0} oder {1}!" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:143 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:258 +msgid "You may use the username \"guest\" and password \"guest\" if you do not wish to register." +msgstr "Sie können hierfür den Benutzernamen \"guest\" und das Passwort \"guest\" verwenden, wenn Sie sich nicht registrieren wollen." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:145 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:260 +msgid "Please include this information in bug reports" +msgstr "Bitte fügen Sie folgende Informationen dem Bugreport bei!" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:147 +msgid "Error Details" +msgstr "Fehlerdetails" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:149 +#, java-format +msgid "Error {0}" +msgstr "Fehler {0}" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:169 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:250 +msgid "I2P Version and Running Environment" +msgstr "I2P-Version & Laufzeitumgebung" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:197 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:288 +msgid "Note that system information, log timestamps, and log messages may provide clues to your location; please review everything you include in a bug report." +msgstr "Beachten Sie, dass Systeminformationen, Zeitstempel der Berichte sowie die Fehlerberichte selbst Hinweise auf Ihren Standort enthalten können. Bitte überprüfen Sie Fehlerberichte, die Sie einreichen wollen, diesbezüglich!" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:123 msgid "Page Not Found" msgstr "Seite nicht gefunden" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:242 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:264 msgid "Sorry! You appear to be requesting a non-existent Router Console page or resource." msgstr "" "Bedaure. Anscheinend haben Sie eine nicht vorhandene Routerkonsolenseite\n" "oder -Ressource angefordert." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:244 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:266 msgid "Error 404" msgstr "Fehler 404" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:249 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:271 msgid "not found" msgstr "nicht gefunden" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:112 msgid "graphs" msgstr "Diagramme" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:249 msgid "I2P Performance Graphs" msgstr "I2P-Leistungsdiagramme" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:111 msgid "home" msgstr "Heim" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:331 +msgid "Welcome to I2P" +msgstr "Willkommen im I2P!" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:111 msgid "job queue" msgstr "Auftragswarteschlange" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:248 msgid "I2P Router Job Queue" msgstr "I2P-Router-Auftragswarteschlange" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:111 msgid "logs" msgstr "Protokolle" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:248 msgid "I2P Router Logs" msgstr "I2P-Router-Protokolle" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:228 -msgid "I2P Version & Running Environment" -msgstr "I2P-Version & Laufzeitumgebung" - -#. note to translators - both parameters are URLs -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:232 -#, java-format -msgid "Please report bugs on {0} or {1}." -msgstr "Bitte melden Sie Fehler unter {0} oder {1}!" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:236 -msgid "You may use the username \"guest\" and password \"guest\" if you do not wish to register." -msgstr "Sie können hierfür den Benutzernamen \"guest\" und das Passwort \"guest\" verwenden, wenn Sie sich nicht registrieren wollen." - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:238 -msgid "Please include this information in bug reports" -msgstr "Bitte fügen Sie folgende Informationen dem Bugreport bei!" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:266 -msgid "Note that system information, log timestamps, and log messages may provide clues to your location; please review everything you include in a bug report." -msgstr "Beachten Sie, dass Systeminformationen, Zeitstempel der Berichte sowie die Fehlerberichte selbst Hinweise auf Ihren Standort enthalten können. Bitte überprüfen Sie Fehlerberichte, die Sie einreichen wollen, diesbezüglich!" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:281 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:303 msgid "Critical Logs" msgstr "Berichte kritischer Ereignisse" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:285 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:307 msgid "Router Logs" msgstr "Router-Berichte" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:291 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:313 msgid "Service (Wrapper) Logs" msgstr "Berichte des Services (Wrapper)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:111 msgid "network database summary" msgstr "Netzwerkdatenbank Zusammenfassung" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:248 msgid "I2P Network Database Summary" msgstr "I2P-Netzwerkdatenbank Zusammenfassung" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:109 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:115 msgid "WebApp Not Found" msgstr "WebApplikation nicht gefunden" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:230 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:252 msgid "Web Application Not Running" msgstr "Web Applikation ist nicht aktiv" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:232 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:254 msgid "The requested web application is not running." msgstr "Die angeforderte Web-Anwendung ist nicht aktiv." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:234 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:256 msgid "Please visit the <a href=\"/configclients.jsp#webapp\">config clients page</a> to start it." msgstr "Bitte besuchen Sie die <a href=\"/configclients.jsp#webapp\">Klienten-Konfigurations Seite</a>, um diese zu starten." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:111 msgid "peer connections" msgstr "Verbindungen zu Teilnehmern" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:248 msgid "I2P Network Peers" msgstr "I2P-Netzwerkteilnehmer" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:111 msgid "peer profiles" msgstr "Teilnehmerprofile" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:248 msgid "I2P Network Peer Profiles" msgstr "Profile der I2P-Netzwerkteilnehmer" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:111 msgid "statistics" msgstr "Statistiken" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:265 msgid "I2P Router Statistics" msgstr "I2P-Router-Statistiken" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:248 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:255 #, java-format msgid "Disable {0} Refresh" msgstr "Alle-{0}-Auffrischen<br>ausschalten" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:111 msgid "tunnel summary" msgstr "Tunnel Zusammenfassung" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:248 msgid "I2P Tunnel Summary" msgstr "I2P-Tunnel Zusammenfassung" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:111 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:248 +msgid "Peer Profile" +msgstr "Teilnehmerprofil" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:275 +#, java-format +msgid "Profile for peer {0}" +msgstr "Teilnehmerprofil von {0}" + +#~ msgid "Download" +#~ msgstr "Herunterladen" +#~ msgid "" +#~ "Ensure that nothing blocks outbound HTTP, check <a target=\"_top\" href=" +#~ "\"logs.jsp\">logs</a> and if nothing helps, read the <a target=\"_top\" " +#~ "href=\"http://www.i2p2.de/faq.html\">FAQ</a> about reseeding manually." +#~ msgstr "" +#~ "Stellen Sie bitte sicher, dass nichts ausgehenden HTTP-Transfer " +#~ "blockiert, überprüfen Sie die <a target=\"_top\" href=\"logs.jsp" +#~ "\">Berichte</a>, und wenn gar nichts hilft, lesen Sie die <a target=\"_top" +#~ "\" href=\"http://www.i2p2.de/faq.html\">FAQ</a> über das manuelle " +#~ "Reseeden." +#~ msgid "System tray icon enabled." +#~ msgstr "Systemtray-Icon aktiviert" +#~ msgid "System tray icon feature not supported on this platform. Sorry!" +#~ msgstr "Systemtry-Icon wird auf diesem System leider nicht unterstützt." +#~ msgid "Warning: unable to contact the systray manager" +#~ msgstr "Warnung: kann den Systemtray-Manager nicht erreichen" +#~ msgid "System tray icon disabled." +#~ msgstr "Systemtry-Icon deaktiviert" #~ msgid "hour" #~ msgstr "Stunde" #~ msgid "minute" @@ -5337,8 +5544,6 @@ msgstr "I2P-Tunnel Zusammenfassung" #~ "newticket\">trac.i2p2.i2p</a>!" #~ msgid "avg value" #~ msgstr "Durchschnitt" -#~ msgid "events" -#~ msgstr "Ereignisse" #~ msgid "lifetime average" #~ msgstr "Mittelwert seit Start" #~ msgid "peak average" diff --git a/apps/routerconsole/locale/messages_en.po b/apps/routerconsole/locale/messages_en.po new file mode 100644 index 0000000000000000000000000000000000000000..3da36a223a3987eecc682a38d90b0b41d753da18 --- /dev/null +++ b/apps/routerconsole/locale/messages_en.po @@ -0,0 +1,5633 @@ +# I2P +# Copyright (C) 2009 The I2P Project +# This file is distributed under the same license as the routerconsole package. +# To contribute translations, see http://www.i2p2.de/newdevelopers +# foo <foo@bar>, 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: I2P routerconsole\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-03-21 18:01+0000\n" +"PO-Revision-Date: 2010-06-15 14:09+0100\n" +"Last-Translator: duck <duck@mail.i2p>\n" +"Language-Team: duck <duck@mail.i2p>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#. NOTE TO TRANSLATORS: Feel free to translate all these as you see fit, there are several options... +#. spaces or not, '.' or not, plural or not. Try not to make it too long, it is used in +#. a lot of tables. +#. milliseconds +#. Note to translators, may be negative or zero, 2999 maximum. +#. {0,number,####} prevents 1234 from being output as 1,234 in the English locale. +#. If you want the digit separator in your locale, translate as {0}. +#. alternates: msec, msecs +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1141 +#, java-format +msgid "1 ms" +msgid_plural "{0,number,####} ms" +msgstr[0] "" +msgstr[1] "" + +#. seconds +#. Note to translators: quantity will always be greater than one. +#. alternates: secs, sec. 'seconds' is probably too long. +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1146 +#, java-format +msgid "1 sec" +msgid_plural "{0} sec" +msgstr[0] "" +msgstr[1] "" + +#. minutes +#. Note to translators: quantity will always be greater than one. +#. alternates: mins, min. 'minutes' is probably too long. +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1151 +#, java-format +msgid "1 min" +msgid_plural "{0} min" +msgstr[0] "" +msgstr[1] "" + +#. hours +#. Note to translators: quantity will always be greater than one. +#. alternates: hrs, hr., hrs. +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1156 +#, java-format +msgid "1 hour" +msgid_plural "{0} hours" +msgstr[0] "" +msgstr[1] "" + +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1158 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:314 +msgid "n/a" +msgstr "" + +#. days +#. Note to translators: quantity will always be greater than one. +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1162 +#, java-format +msgid "1 day" +msgid_plural "{0} days" +msgstr[0] "" +msgstr[1] "" + +#: ../../../router/java/src/net/i2p/router/Blocklist.java:122 +#, java-format +msgid "Banned by router hash: {0}" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/Blocklist.java:124 +msgid "Banned by router hash" +msgstr "" + +#. Temporary reason, until the job finishes +#: ../../../router/java/src/net/i2p/router/Blocklist.java:669 +msgid "IP banned" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/Blocklist.java:739 +#, java-format +msgid "IP banned by blocklist.txt entry {0}" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:92 +msgid "Rejecting tunnels: Shutting down" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:141 +msgid "Rejecting tunnels: High message delay" +msgstr "" + +#. hard to do {0} from here +#. setTunnelStatus("Rejecting " + (100 - (int) probAccept*100) + "% of tunnels: High number of requests"); +#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:177 +msgid "Rejecting most tunnels: High number of requests" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:233 +msgid "Rejecting tunnels: Limit reached" +msgstr "" + +#. .067KBps +#. * also limited to 90% - see below +#. always leave at least 4KBps free when allowing +#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:301 +msgid "Rejecting tunnels: Bandwidth limit" +msgstr "" + +#. hard to do {0} from here +#. setTunnelStatus("Rejecting " + ((int)(100.0*probReject)) + "% of tunnels: Bandwidth limit"); +#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:371 +msgid "Rejecting most tunnels: Bandwidth limit" +msgstr "" + +#. hard to do {0} from here +#. setTunnelStatus("Accepting " + (100-(int)(100.0*probReject)) + "% of tunnels"); +#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:375 +msgid "Accepting most tunnels" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:377 +msgid "Accepting tunnels" +msgstr "" + +#. NPE, too early +#. if (_context.router().getRouterInfo().getBandwidthTier().equals("K")) +#. setTunnelStatus("Not expecting tunnel requests: Advertised bandwidth too low"); +#. else +#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:488 +msgid "Rejecting tunnels" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:125 +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:20 +msgid "Reseeding" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:141 +#, java-format +msgid "Reseed fetched only 1 router." +msgid_plural "Reseed fetched only {0} routers." +msgstr[0] "" +msgstr[1] "" + +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:148 +msgid "Reseed failed." +msgstr "" + +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:149 +#, java-format +msgid "See {0} for help." +msgstr "" + +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:150 +msgid "reseed configuration page" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:293 +msgid "Reseeding: fetching seed URL." +msgstr "" + +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:335 +#, java-format +msgid "" +"Reseeding: fetching router info from seed URL ({0} successful, {1} errors)." +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:512 +msgid "NetDb entry" +msgstr "" + +#. This used to be "no common transports" but it is almost always no transports at all +#: ../../../router/java/src/net/i2p/router/transport/GetBidsJob.java:70 +msgid "No transports (hidden or starting up?)" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:450 +msgid "Unreachable on any transport" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:499 +msgid "Router Transport Addresses" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:504 +#, java-format +msgid "{0} is used for outbound connections only" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:518 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:129 +msgid "Help" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:519 +msgid "" +"Your transport connection limits are automatically set based on your " +"configured bandwidth." +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:521 +msgid "" +"To override these limits, add the settings i2np.ntcp.maxConnections=nnn and " +"i2np.udp.maxConnections=nnn on the advanced configuration page." +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:523 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258 +msgid "Definitions" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:735 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1890 +#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:24 +#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:33 +#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:35 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:81 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:189 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:238 +msgid "Peer" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524 +msgid "The remote peer, identified by router hash" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:525 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:736 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1894 +msgid "Dir" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:526 +msgid "Inbound connection" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:528 +msgid "Outbound connection" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:530 +msgid "They offered to introduce us (help other peers traverse our firewall)" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:532 +msgid "We offered to introduce them (help other peers traverse their firewall)" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533 +msgid "How long since a packet has been received / sent" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:737 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1895 +msgid "Idle" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:738 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1900 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:156 +msgid "In/Out" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534 +msgid "The smoothed inbound / outbound transfer rate (KBytes per second)" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535 +msgid "How long ago this connection was established" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:739 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1905 +msgid "Up" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:740 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1907 +msgid "Skew" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536 +msgid "The difference between the peer's clock and your own" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537 +msgid "" +"The congestion window, which is how many bytes can be sent without an " +"acknowledgement" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538 +msgid "The number of sent messages awaiting acknowledgement" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539 +msgid "The maximum number of concurrent messages to send" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:540 +msgid "The number of pending sends which exceed congestion window" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541 +msgid "The slow start threshold" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:542 +msgid "The round trip time in milliseconds" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1917 +msgid "Dev" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543 +msgid "The standard deviation of the round trip time in milliseconds" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544 +msgid "The retransmit timeout in milliseconds" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545 +msgid "" +"Current maximum send packet size / estimated maximum receive packet size " +"(bytes)" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:741 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1924 +msgid "TX" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546 +msgid "The total number of packets sent to the peer" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:742 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1926 +msgid "RX" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547 +msgid "The total number of packets received from the peer" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1929 +msgid "Dup TX" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548 +msgid "The total number of packets retransmitted to the peer" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1931 +msgid "Dup RX" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549 +msgid "The total number of duplicate packets received from the peer" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/ntcp/EstablishState.java:409 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/EstablishState.java:627 +#, java-format +msgid "Excessive clock skew: {0}" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:730 +msgid "NTCP connections" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:731 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1886 +msgid "Limit" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:732 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1887 +msgid "Timeout" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:743 +msgid "Out Queue" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:744 +msgid "Backlogged?" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:758 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1949 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:87 +msgid "Inbound" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:760 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1951 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:87 +msgid "Outbound" +msgstr "" + +#. buf.append("<tr> <td colspan=\"11\"><hr></td></tr>\n"); +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:807 +msgid "peers" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1885 +msgid "UDP connections" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1892 +msgid "Sort by peer hash" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1894 +msgid "Direction/Introduction" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1896 +msgid "Sort by idle inbound" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1898 +msgid "Sort by idle outbound" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1901 +msgid "Sort by inbound rate" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1903 +msgid "Sort by outbound rate" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1906 +msgid "Sort by connection uptime" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1908 +msgid "Sort by clock skew" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1911 +msgid "Sort by congestion window" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1913 +msgid "Sort by slow start threshold" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1916 +msgid "Sort by round trip time" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1918 +msgid "Sort by round trip time deviation" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1920 +msgid "Sort by retransmission timeout" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1923 +msgid "Sort by outbound maximum transmit unit" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1925 +msgid "Sort by packets sent" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1927 +msgid "Sort by packets received" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1930 +msgid "Sort by packets retransmitted" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1932 +msgid "Sort by packets received more than once" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1953 +msgid "We offered to introduce them" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1955 +msgid "They offered to introduce us" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1959 +msgid "Choked" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1967 +msgid "1 fail" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1969 +#, java-format +msgid "{0} fails" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1975 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:162 +msgid "Banned" +msgstr "" + +#. buf.append("<tr><td colspan=\"16\"><hr></td></tr>\n"); +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2106 +msgid "SUMMARY" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:124 +msgid "Dropping tunnel requests: Too slow" +msgstr "" + +#. don't even bother, since we are so overloaded locally +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:267 +msgid "Dropping tunnel requests: Overloaded" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:470 +msgid "Rejecting tunnels: Request overload" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:495 +msgid "Rejecting tunnels: Connection limit" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:695 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:716 +msgid "Dropping tunnel requests: High load" +msgstr "" + +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:708 +msgid "Dropping tunnel requests: Queue time" +msgstr "" + +#. Automatically generated pseudo-java for xgettext - do not edit +#. Translators may wish to translate a few of these, do not bother to translate all of them!! +#: ../java/build/Countries.java:3 +msgid "Andorra" +msgstr "" + +#: ../java/build/Countries.java:4 +msgid "United Arab Emirates" +msgstr "" + +#: ../java/build/Countries.java:5 +msgid "Afghanistan" +msgstr "" + +#: ../java/build/Countries.java:6 +msgid "Antigua and Barbuda" +msgstr "" + +#: ../java/build/Countries.java:7 +msgid "Anguilla" +msgstr "" + +#: ../java/build/Countries.java:8 +msgid "Albania" +msgstr "" + +#: ../java/build/Countries.java:9 +msgid "Armenia" +msgstr "" + +#: ../java/build/Countries.java:10 +msgid "Netherlands Antilles" +msgstr "" + +#: ../java/build/Countries.java:11 +msgid "Angola" +msgstr "" + +#: ../java/build/Countries.java:12 +msgid "Antarctica" +msgstr "" + +#: ../java/build/Countries.java:13 +msgid "Argentina" +msgstr "" + +#: ../java/build/Countries.java:14 +msgid "American Samoa" +msgstr "" + +#: ../java/build/Countries.java:15 +msgid "Austria" +msgstr "" + +#: ../java/build/Countries.java:16 +msgid "Australia" +msgstr "" + +#: ../java/build/Countries.java:17 +msgid "Aruba" +msgstr "" + +#: ../java/build/Countries.java:19 +msgid "Azerbaijan" +msgstr "" + +#: ../java/build/Countries.java:20 +msgid "Bosnia and Herzegovina" +msgstr "" + +#: ../java/build/Countries.java:21 +msgid "Barbados" +msgstr "" + +#: ../java/build/Countries.java:22 +msgid "Bangladesh" +msgstr "" + +#: ../java/build/Countries.java:23 +msgid "Belgium" +msgstr "" + +#: ../java/build/Countries.java:24 +msgid "Burkina Faso" +msgstr "" + +#: ../java/build/Countries.java:25 +msgid "Bulgaria" +msgstr "" + +#: ../java/build/Countries.java:26 +msgid "Bahrain" +msgstr "" + +#: ../java/build/Countries.java:27 +msgid "Burundi" +msgstr "" + +#: ../java/build/Countries.java:28 +msgid "Benin" +msgstr "" + +#: ../java/build/Countries.java:29 +msgid "Bermuda" +msgstr "" + +#: ../java/build/Countries.java:30 +msgid "Brunei Darussalam" +msgstr "" + +#: ../java/build/Countries.java:31 +msgid "Bolivia" +msgstr "" + +#: ../java/build/Countries.java:32 +msgid "Brazil" +msgstr "" + +#: ../java/build/Countries.java:33 +msgid "Bahamas" +msgstr "" + +#: ../java/build/Countries.java:34 +msgid "Bhutan" +msgstr "" + +#: ../java/build/Countries.java:35 +msgid "Bouvet Island" +msgstr "" + +#: ../java/build/Countries.java:36 +msgid "Botswana" +msgstr "" + +#: ../java/build/Countries.java:37 +msgid "Belarus" +msgstr "" + +#: ../java/build/Countries.java:38 +msgid "Belize" +msgstr "" + +#: ../java/build/Countries.java:39 +msgid "Canada" +msgstr "" + +#: ../java/build/Countries.java:40 +msgid "The Democratic Republic of the Congo" +msgstr "" + +#: ../java/build/Countries.java:41 +msgid "Central African Republic" +msgstr "" + +#: ../java/build/Countries.java:42 +msgid "Congo" +msgstr "" + +#: ../java/build/Countries.java:43 +msgid "Switzerland" +msgstr "" + +#: ../java/build/Countries.java:44 +msgid "Cote D'Ivoire" +msgstr "" + +#: ../java/build/Countries.java:45 +msgid "Cook Islands" +msgstr "" + +#: ../java/build/Countries.java:46 +msgid "Chile" +msgstr "" + +#: ../java/build/Countries.java:47 +msgid "Cameroon" +msgstr "" + +#: ../java/build/Countries.java:48 +msgid "China" +msgstr "" + +#: ../java/build/Countries.java:49 +msgid "Colombia" +msgstr "" + +#: ../java/build/Countries.java:50 +msgid "Costa Rica" +msgstr "" + +#: ../java/build/Countries.java:51 +msgid "Serbia and Montenegro" +msgstr "" + +#: ../java/build/Countries.java:52 +msgid "Cuba" +msgstr "" + +#: ../java/build/Countries.java:53 +msgid "Cape Verde" +msgstr "" + +#: ../java/build/Countries.java:54 +msgid "Cyprus" +msgstr "" + +#: ../java/build/Countries.java:55 +msgid "Czech Republic" +msgstr "" + +#: ../java/build/Countries.java:56 +msgid "Germany" +msgstr "" + +#: ../java/build/Countries.java:57 +msgid "Djibouti" +msgstr "" + +#: ../java/build/Countries.java:58 +msgid "Denmark" +msgstr "" + +#: ../java/build/Countries.java:59 +msgid "Dominica" +msgstr "" + +#: ../java/build/Countries.java:60 +msgid "Dominican Republic" +msgstr "" + +#: ../java/build/Countries.java:61 +msgid "Algeria" +msgstr "" + +#: ../java/build/Countries.java:62 +msgid "Ecuador" +msgstr "" + +#: ../java/build/Countries.java:63 +msgid "Estonia" +msgstr "" + +#: ../java/build/Countries.java:64 +msgid "Egypt" +msgstr "" + +#: ../java/build/Countries.java:65 +msgid "Eritrea" +msgstr "" + +#: ../java/build/Countries.java:66 +msgid "Spain" +msgstr "" + +#: ../java/build/Countries.java:67 +msgid "Ethiopia" +msgstr "" + +#: ../java/build/Countries.java:68 +msgid "Finland" +msgstr "" + +#: ../java/build/Countries.java:69 +msgid "Fiji" +msgstr "" + +#: ../java/build/Countries.java:70 +msgid "Falkland Islands (Malvinas)" +msgstr "" + +#: ../java/build/Countries.java:71 +msgid "Federated States of Micronesia" +msgstr "" + +#: ../java/build/Countries.java:72 +msgid "Faroe Islands" +msgstr "" + +#: ../java/build/Countries.java:73 +msgid "France" +msgstr "" + +#: ../java/build/Countries.java:74 +msgid "Gabon" +msgstr "" + +#: ../java/build/Countries.java:75 +msgid "United Kingdom" +msgstr "" + +#: ../java/build/Countries.java:76 +msgid "Grenada" +msgstr "" + +#: ../java/build/Countries.java:77 +msgid "Georgia" +msgstr "" + +#: ../java/build/Countries.java:78 +msgid "French Guiana" +msgstr "" + +#: ../java/build/Countries.java:79 +msgid "Ghana" +msgstr "" + +#: ../java/build/Countries.java:80 +msgid "Gibraltar" +msgstr "" + +#: ../java/build/Countries.java:81 +msgid "Greenland" +msgstr "" + +#: ../java/build/Countries.java:82 +msgid "Gambia" +msgstr "" + +#: ../java/build/Countries.java:83 +msgid "Guinea" +msgstr "" + +#: ../java/build/Countries.java:84 +msgid "Guadeloupe" +msgstr "" + +#: ../java/build/Countries.java:85 +msgid "Equatorial Guinea" +msgstr "" + +#: ../java/build/Countries.java:86 +msgid "Greece" +msgstr "" + +#: ../java/build/Countries.java:87 +msgid "South Georgia and the South Sandwich Islands" +msgstr "" + +#: ../java/build/Countries.java:88 +msgid "Guatemala" +msgstr "" + +#: ../java/build/Countries.java:89 +msgid "Guam" +msgstr "" + +#: ../java/build/Countries.java:90 +msgid "Guinea-Bissau" +msgstr "" + +#: ../java/build/Countries.java:91 +msgid "Guyana" +msgstr "" + +#: ../java/build/Countries.java:92 +msgid "Hong Kong" +msgstr "" + +#: ../java/build/Countries.java:93 +msgid "Honduras" +msgstr "" + +#: ../java/build/Countries.java:94 +msgid "Croatia" +msgstr "" + +#: ../java/build/Countries.java:95 +msgid "Haiti" +msgstr "" + +#: ../java/build/Countries.java:96 +msgid "Hungary" +msgstr "" + +#: ../java/build/Countries.java:97 +msgid "Indonesia" +msgstr "" + +#: ../java/build/Countries.java:98 +msgid "Ireland" +msgstr "" + +#: ../java/build/Countries.java:99 +msgid "Israel" +msgstr "" + +#: ../java/build/Countries.java:101 +msgid "India" +msgstr "" + +#: ../java/build/Countries.java:102 +msgid "British Indian Ocean Territory" +msgstr "" + +#: ../java/build/Countries.java:103 +msgid "Iraq" +msgstr "" + +#: ../java/build/Countries.java:104 +msgid "Islamic Republic of Iran" +msgstr "" + +#: ../java/build/Countries.java:105 +msgid "Iceland" +msgstr "" + +#: ../java/build/Countries.java:106 +msgid "Italy" +msgstr "" + +#: ../java/build/Countries.java:108 +msgid "Jamaica" +msgstr "" + +#: ../java/build/Countries.java:109 +msgid "Jordan" +msgstr "" + +#: ../java/build/Countries.java:110 +msgid "Japan" +msgstr "" + +#: ../java/build/Countries.java:111 +msgid "Kenya" +msgstr "" + +#: ../java/build/Countries.java:112 +msgid "Kyrgyzstan" +msgstr "" + +#: ../java/build/Countries.java:113 +msgid "Cambodia" +msgstr "" + +#: ../java/build/Countries.java:114 +msgid "Kiribati" +msgstr "" + +#: ../java/build/Countries.java:115 +msgid "Comoros" +msgstr "" + +#: ../java/build/Countries.java:116 +msgid "Saint Kitts and Nevis" +msgstr "" + +#: ../java/build/Countries.java:117 +msgid "Republic of Korea" +msgstr "" + +#: ../java/build/Countries.java:118 +msgid "Kuwait" +msgstr "" + +#: ../java/build/Countries.java:119 +msgid "Cayman Islands" +msgstr "" + +#: ../java/build/Countries.java:120 +msgid "Kazakhstan" +msgstr "" + +#: ../java/build/Countries.java:121 +msgid "Lao People's Democratic Republic" +msgstr "" + +#: ../java/build/Countries.java:122 +msgid "Lebanon" +msgstr "" + +#: ../java/build/Countries.java:123 +msgid "Saint Lucia" +msgstr "" + +#: ../java/build/Countries.java:124 +msgid "Liechtenstein" +msgstr "" + +#: ../java/build/Countries.java:125 +msgid "Sri Lanka" +msgstr "" + +#: ../java/build/Countries.java:126 +msgid "Liberia" +msgstr "" + +#: ../java/build/Countries.java:127 +msgid "Lesotho" +msgstr "" + +#: ../java/build/Countries.java:128 +msgid "Lithuania" +msgstr "" + +#: ../java/build/Countries.java:129 +msgid "Luxembourg" +msgstr "" + +#: ../java/build/Countries.java:130 +msgid "Latvia" +msgstr "" + +#: ../java/build/Countries.java:131 +msgid "Libyan Arab Jamahiriya" +msgstr "" + +#: ../java/build/Countries.java:132 +msgid "Morocco" +msgstr "" + +#: ../java/build/Countries.java:133 +msgid "Monaco" +msgstr "" + +#: ../java/build/Countries.java:134 +msgid "Republic of Moldova" +msgstr "" + +#: ../java/build/Countries.java:137 +msgid "Madagascar" +msgstr "" + +#: ../java/build/Countries.java:138 +msgid "Marshall Islands" +msgstr "" + +#: ../java/build/Countries.java:139 +msgid "The Former Yugoslav Republic of Macedonia" +msgstr "" + +#: ../java/build/Countries.java:140 +msgid "Mali" +msgstr "" + +#: ../java/build/Countries.java:141 +msgid "Myanmar" +msgstr "" + +#: ../java/build/Countries.java:142 +msgid "Mongolia" +msgstr "" + +#: ../java/build/Countries.java:143 +msgid "Macao" +msgstr "" + +#: ../java/build/Countries.java:144 +msgid "Northern Mariana Islands" +msgstr "" + +#: ../java/build/Countries.java:145 +msgid "Martinique" +msgstr "" + +#: ../java/build/Countries.java:146 +msgid "Mauritania" +msgstr "" + +#: ../java/build/Countries.java:147 +msgid "Montserrat" +msgstr "" + +#: ../java/build/Countries.java:148 +msgid "Malta" +msgstr "" + +#: ../java/build/Countries.java:149 +msgid "Mauritius" +msgstr "" + +#: ../java/build/Countries.java:150 +msgid "Maldives" +msgstr "" + +#: ../java/build/Countries.java:151 +msgid "Malawi" +msgstr "" + +#: ../java/build/Countries.java:152 +msgid "Mexico" +msgstr "" + +#: ../java/build/Countries.java:153 +msgid "Malaysia" +msgstr "" + +#: ../java/build/Countries.java:154 +msgid "Mozambique" +msgstr "" + +#: ../java/build/Countries.java:155 +msgid "Namibia" +msgstr "" + +#: ../java/build/Countries.java:156 +msgid "New Caledonia" +msgstr "" + +#: ../java/build/Countries.java:157 +msgid "Niger" +msgstr "" + +#: ../java/build/Countries.java:158 +msgid "Norfolk Island" +msgstr "" + +#: ../java/build/Countries.java:159 +msgid "Nigeria" +msgstr "" + +#: ../java/build/Countries.java:160 +msgid "Nicaragua" +msgstr "" + +#: ../java/build/Countries.java:161 +msgid "Netherlands" +msgstr "" + +#: ../java/build/Countries.java:162 +msgid "Norway" +msgstr "" + +#: ../java/build/Countries.java:163 +msgid "Nepal" +msgstr "" + +#: ../java/build/Countries.java:164 +msgid "Nauru" +msgstr "" + +#: ../java/build/Countries.java:165 +msgid "Niue" +msgstr "" + +#: ../java/build/Countries.java:166 +msgid "New Zealand" +msgstr "" + +#: ../java/build/Countries.java:167 +msgid "Oman" +msgstr "" + +#: ../java/build/Countries.java:168 +msgid "Panama" +msgstr "" + +#: ../java/build/Countries.java:169 +msgid "Peru" +msgstr "" + +#: ../java/build/Countries.java:170 +msgid "French Polynesia" +msgstr "" + +#: ../java/build/Countries.java:171 +msgid "Papua New Guinea" +msgstr "" + +#: ../java/build/Countries.java:172 +msgid "Philippines" +msgstr "" + +#: ../java/build/Countries.java:173 +msgid "Pakistan" +msgstr "" + +#: ../java/build/Countries.java:174 +msgid "Poland" +msgstr "" + +#: ../java/build/Countries.java:175 +msgid "Saint Pierre and Miquelon" +msgstr "" + +#: ../java/build/Countries.java:176 +msgid "Puerto Rico" +msgstr "" + +#: ../java/build/Countries.java:177 +msgid "Palestinian Territory" +msgstr "" + +#: ../java/build/Countries.java:178 +msgid "Portugal" +msgstr "" + +#: ../java/build/Countries.java:179 +msgid "Palau" +msgstr "" + +#: ../java/build/Countries.java:180 +msgid "Paraguay" +msgstr "" + +#: ../java/build/Countries.java:181 +msgid "Qatar" +msgstr "" + +#: ../java/build/Countries.java:182 +msgid "Reunion" +msgstr "" + +#: ../java/build/Countries.java:183 +msgid "Romania" +msgstr "" + +#: ../java/build/Countries.java:184 +msgid "Serbia" +msgstr "" + +#: ../java/build/Countries.java:185 +msgid "Russian Federation" +msgstr "" + +#: ../java/build/Countries.java:186 +msgid "Rwanda" +msgstr "" + +#: ../java/build/Countries.java:187 +msgid "Saudi Arabia" +msgstr "" + +#: ../java/build/Countries.java:188 +msgid "Solomon Islands" +msgstr "" + +#: ../java/build/Countries.java:189 +msgid "Seychelles" +msgstr "" + +#: ../java/build/Countries.java:190 +msgid "Sudan" +msgstr "" + +#: ../java/build/Countries.java:191 +msgid "Sweden" +msgstr "" + +#: ../java/build/Countries.java:192 +msgid "Singapore" +msgstr "" + +#: ../java/build/Countries.java:193 +msgid "Slovenia" +msgstr "" + +#: ../java/build/Countries.java:194 +msgid "Slovakia" +msgstr "" + +#: ../java/build/Countries.java:195 +msgid "Sierra Leone" +msgstr "" + +#: ../java/build/Countries.java:196 +msgid "San Marino" +msgstr "" + +#: ../java/build/Countries.java:197 +msgid "Senegal" +msgstr "" + +#: ../java/build/Countries.java:198 +msgid "Somalia" +msgstr "" + +#: ../java/build/Countries.java:199 +msgid "Suriname" +msgstr "" + +#: ../java/build/Countries.java:200 +msgid "Sao Tome and Principe" +msgstr "" + +#: ../java/build/Countries.java:201 +msgid "El Salvador" +msgstr "" + +#: ../java/build/Countries.java:202 +msgid "Syrian Arab Republic" +msgstr "" + +#: ../java/build/Countries.java:203 +msgid "Swaziland" +msgstr "" + +#: ../java/build/Countries.java:204 +msgid "Turks and Caicos Islands" +msgstr "" + +#: ../java/build/Countries.java:205 +msgid "Chad" +msgstr "" + +#: ../java/build/Countries.java:206 +msgid "French Southern Territories" +msgstr "" + +#: ../java/build/Countries.java:207 +msgid "Togo" +msgstr "" + +#: ../java/build/Countries.java:208 +msgid "Thailand" +msgstr "" + +#: ../java/build/Countries.java:209 +msgid "Tajikistan" +msgstr "" + +#: ../java/build/Countries.java:210 +msgid "Tokelau" +msgstr "" + +#: ../java/build/Countries.java:211 +msgid "Timor-Leste" +msgstr "" + +#: ../java/build/Countries.java:212 +msgid "Turkmenistan" +msgstr "" + +#: ../java/build/Countries.java:213 +msgid "Tunisia" +msgstr "" + +#: ../java/build/Countries.java:214 +msgid "Tonga" +msgstr "" + +#: ../java/build/Countries.java:215 +msgid "Turkey" +msgstr "" + +#: ../java/build/Countries.java:216 +msgid "Trinidad and Tobago" +msgstr "" + +#: ../java/build/Countries.java:217 +msgid "Tuvalu" +msgstr "" + +#: ../java/build/Countries.java:218 +msgid "Taiwan" +msgstr "" + +#: ../java/build/Countries.java:219 +msgid "United Republic of Tanzania" +msgstr "" + +#: ../java/build/Countries.java:220 +msgid "Ukraine" +msgstr "" + +#: ../java/build/Countries.java:221 +msgid "Uganda" +msgstr "" + +#: ../java/build/Countries.java:222 +msgid "United States Minor Outlying Islands" +msgstr "" + +#: ../java/build/Countries.java:223 +msgid "United States" +msgstr "" + +#: ../java/build/Countries.java:224 +msgid "Uruguay" +msgstr "" + +#: ../java/build/Countries.java:225 +msgid "Uzbekistan" +msgstr "" + +#: ../java/build/Countries.java:226 +msgid "Holy See (Vatican City State)" +msgstr "" + +#: ../java/build/Countries.java:227 +msgid "Saint Vincent and the Grenadines" +msgstr "" + +#: ../java/build/Countries.java:228 +msgid "Venezuela" +msgstr "" + +#: ../java/build/Countries.java:229 ../java/build/Countries.java:230 +msgid "Virgin Islands" +msgstr "" + +#: ../java/build/Countries.java:231 +msgid "Viet Nam" +msgstr "" + +#: ../java/build/Countries.java:232 +msgid "Vanuatu" +msgstr "" + +#: ../java/build/Countries.java:233 +msgid "Wallis and Futuna" +msgstr "" + +#: ../java/build/Countries.java:234 +msgid "Samoa" +msgstr "" + +#: ../java/build/Countries.java:235 +msgid "Yemen" +msgstr "" + +#: ../java/build/Countries.java:236 +msgid "Mayotte" +msgstr "" + +#: ../java/build/Countries.java:237 +msgid "South Africa" +msgstr "" + +#: ../java/build/Countries.java:238 +msgid "Zambia" +msgstr "" + +#: ../java/build/Countries.java:239 +msgid "Zimbabwe" +msgstr "" + +#: ../java/src/net/i2p/router/web/CSSHelper.java:60 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:35 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:37 +#: ../java/strings/Strings.java:29 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:125 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:257 +msgid "I2P Router Console" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:57 +msgid "Error updating the configuration - please see the error logs" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:69 +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:266 +msgid "Configuration saved successfully" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:71 +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:268 +msgid "" +"Error saving the configuration (applied but not saved) - please see the " +"error logs" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:35 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:355 +msgid "Save Client Configuration" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:39 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:427 +msgid "Save Interface Configuration" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:43 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:441 +msgid "Save WebApp Configuration" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:47 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:453 +msgid "Save Plugin Configuration" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:51 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:461 +msgid "Install Plugin" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:87 +#, java-format +msgid "Deleted plugin {0}" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:89 +#, java-format +msgid "Error deleting plugin {0}" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:101 +#, java-format +msgid "Stopped plugin {0}" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:103 +#, java-format +msgid "Error stopping plugin {0}" +msgstr "" + +#. label (IE) +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:124 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:255 +msgid "Start" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:143 +#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:49 +#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:61 +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:33 +msgid "Unsupported" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:189 +msgid "New client added" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:193 +msgid "" +"Client configuration saved successfully - restart required to take effect." +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:207 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:218 +msgid "Bad client index." +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:212 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:223 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:392 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:384 +msgid "Client" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:212 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:271 +msgid "started" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:223 +msgid "deleted" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:240 +msgid "WebApp configuration saved." +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:256 +msgid "Plugin configuration saved." +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:271 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124 +msgid "WebApp" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:273 +msgid "Failed to start" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:278 +msgid "Failed to find server." +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:284 +msgid "No plugin URL specified." +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:294 +#, java-format +msgid "No update URL specified for {0}" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:302 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:307 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:320 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:325 +msgid "Plugin or update download already in progress." +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:311 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:118 +#, java-format +msgid "Downloading plugin from {0}" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:329 +#, java-format +msgid "Checking plugin {0} for updates" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:339 +#, java-format +msgid "Started plugin {0}" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:341 +#, java-format +msgid "Error starting plugin {0}" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:376 +msgid "" +"Interface configuration saved successfully - restart required to take effect." +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:85 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:258 +msgid "Edit" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:94 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:351 +msgid "Add Client" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102 +msgid "Class and arguments" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148 +msgid "Control" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148 +msgid "Run at Startup?" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:197 +msgid "Description" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148 +msgid "Plugin" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:161 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:273 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:185 +msgid "Version" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:163 +msgid "Signed by" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:180 +msgid "Date" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:186 +msgid "Author" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:202 +msgid "License" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:207 +msgid "Website" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:212 +msgid "Update link" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:260 +msgid "Stop" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:262 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:78 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:331 +msgid "Check for updates" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:263 +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18 +msgid "Update" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:268 +#, java-format +msgid "Are you sure you want to delete {0}?" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:270 +msgid "Delete" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:18 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:343 +msgid "Add key" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:19 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:341 +msgid "Delete key" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:21 +msgid "You must enter a destination" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:23 +msgid "You must enter a key" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:34 +#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:41 +#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:43 +msgid "Key for" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:34 +msgid "added to keyring" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:36 +msgid "Invalid destination or key" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:41 +msgid "removed from keyring" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:43 +msgid "not found in keyring" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:45 +msgid "Invalid destination" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigLoggingHandler.java:82 +msgid "Log overrides updated" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigLoggingHandler.java:160 +msgid "Log configuration saved" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:48 +msgid "" +"Add additional logging statements above. Example: net.i2p.router.tunnel=WARN" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:49 +msgid "" +"Or put entries in the logger.config file. Example: logger.record.net.i2p." +"router.tunnel=WARN" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:50 +msgid "Valid levels are DEBUG, INFO, WARN, ERROR, CRIT" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68 +msgid "CRIT" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68 +msgid "DEBUG" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68 +msgid "ERROR" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68 +msgid "INFO" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68 +msgid "WARN" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:88 +msgid "Remove" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:125 +msgid "Select a class to add" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:204 +msgid "Network" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18 +msgid "Service" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:101 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:381 +#: ../java/strings/Strings.java:72 +msgid "Tunnels" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18 +msgid "UI" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19 +msgid "Clients" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:315 +msgid "Keyring" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19 +msgid "Logging" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:107 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:255 +#: ../java/strings/Strings.java:67 +msgid "Peers" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:389 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:143 +msgid "Stats" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:20 +msgid "Advanced" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:48 +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:264 +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:29 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:34 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:378 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:534 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:325 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:359 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:370 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:397 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:362 +msgid "Save changes" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:121 +msgid "Rechecking router reachability..." +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:153 +msgid "Updating IP address" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:171 +msgid "Disabling TCP completely" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:175 +msgid "Updating inbound TCP address to" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:179 +msgid "Disabling inbound TCP" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:181 +msgid "Updating inbound TCP address to auto" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:190 +msgid "Updating inbound TCP port to" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:193 +msgid "Updating inbound TCP port to auto" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:205 +msgid "Updating UDP port from" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:205 +msgid "to" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:221 +msgid "Gracefully restarting into Hidden Router Mode" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:223 +msgid "Gracefully restarting to exit Hidden Router Mode" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:232 +msgid "Enabling UPnP, restart required to take effect" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:234 +msgid "Disabling UPnP, restart required to take effect" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:242 +msgid "Enabling laptop mode" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:244 +msgid "Disabling laptop mode" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:250 +msgid "Requiring SSU introducers" +msgstr "" + +#. 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. +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:291 +msgid "Gracefully restarting I2P to change published router address" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:314 +msgid "Updating bandwidth share percentage" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigNetHandler.java:397 +msgid "Updated bandwidth limits" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:41 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:49 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:52 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:59 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:62 +msgid "unknown" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:172 +msgid "bits per second" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:173 +#, java-format +msgid "or {0} bytes per month maximum" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:20 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:333 +msgid "Ban peer until restart" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:23 +#, java-format +msgid "Manually banned via {0}" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:24 +msgid "banned until restart" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:27 +#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:38 +#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:59 +msgid "Invalid peer" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:28 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:335 +msgid "Unban peer" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:33 +msgid "unbanned" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:35 +msgid "is not currently banned" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:39 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:361 +msgid "Adjust peer bonuses" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:47 +msgid "Bad speed value" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:52 +msgid "Bad capacity value" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:17 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:368 +msgid "Save changes and reseed now" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:21 +msgid "Reseeding is already in progress" +msgstr "" + +#. skip the nonce checking in ReseedHandler +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:24 +msgid "Starting reseed process" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:66 +msgid "Configuration saved successfully." +msgstr "" + +#. Normal browsers send value, IE sends button label +#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:32 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:57 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:311 +msgid "Shutdown immediately" +msgstr "" + +#. ctx.router().shutdown(Router.EXIT_HARD); // never returns +#. give the UI time to respond +#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:36 +msgid "Cancel shutdown" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:37 +msgid "Cancel restart" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:39 +msgid "Restart immediately" +msgstr "" + +#. ctx.router().shutdown(Router.EXIT_HARD_RESTART); // never returns +#. give the UI time to respond +#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:43 +msgid "Restart" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:46 +msgid "Shutdown" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:59 +msgid "Restart imminent" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:61 +msgid "Shutdown imminent" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:65 +#, java-format +msgid "Shutdown in {0}" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:70 +#, java-format +msgid "Restart in {0}" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:53 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:309 +msgid "Shutdown gracefully" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:56 +msgid "Graceful shutdown initiated" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:60 +msgid "Shutdown immediately! boom bye bye bad bwoy" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:61 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:313 +msgid "Cancel graceful shutdown" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:63 +msgid "Graceful shutdown cancelled" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:64 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:325 +msgid "Graceful restart" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:67 +msgid "Graceful restart requested" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:68 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:327 +msgid "Hard restart" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:71 +msgid "Hard restart requested" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:72 +msgid "Rekey and Restart" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:73 +msgid "Rekeying after graceful restart" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:76 +msgid "Rekey and Shutdown" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:77 +msgid "Rekeying after graceful shutdown" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:80 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:353 +msgid "Run I2P on startup" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:82 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:355 +msgid "Don't run I2P on startup" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:84 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:373 +msgid "Dump threads" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:91 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:381 +msgid "View console on startup" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:93 +msgid "Console is to be shown on startup" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:94 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:383 +msgid "Do not view console on startup" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:96 +msgid "Console is not to be shown on startup" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:105 +msgid "Service installed" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:107 +msgid "Warning: unable to install the service" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:113 +msgid "Service removed" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:115 +msgid "Warning: unable to remove the service" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:111 +msgid "Stat filter and location updated successfully to" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:113 +msgid "Failed to update the stat filter and location" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:114 +msgid "" +"Graph list updated, may take up to 60s to be reflected here and on the <a " +"href=\"graphs.jsp\">Graphs Page</a>" +msgstr "" + +#. the count isn't really correct anyway, since we don't check for actual changes +#. addFormNotice("Updated settings for " + updated + " pools."); +#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:135 +msgid "Updated settings for all pools." +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:140 +msgid "Exploratory tunnel configuration saved successfully." +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:142 +#: ../java/src/net/i2p/router/web/ConfigUIHandler.java:36 +msgid "" +"Error saving the configuration (applied but not saved) - please see the " +"error logs." +msgstr "" + +#. * dummies for translation +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:14 +#, java-format +msgid "1 hop" +msgid_plural "{0} hops" +msgstr[0] "" +msgstr[1] "" + +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:15 +#, java-format +msgid "1 tunnel" +msgid_plural "{0} tunnels" +msgstr[0] "" +msgstr[1] "" + +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:35 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:41 +msgid "Exploratory tunnels" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:51 +#, java-format +msgid "Client tunnels for {0}" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:74 +msgid "ANONYMITY WARNING - Settings include 0-hop tunnels." +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:79 +msgid "ANONYMITY WARNING - Settings include 1-hop tunnels." +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82 +msgid "PERFORMANCE WARNING - Settings include very long tunnels." +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:85 +msgid "PERFORMANCE WARNING - Settings include high tunnel quantities." +msgstr "" + +#. buf.append("<tr><th></th><th>Inbound</th><th>Outbound</th></tr>\n"); +#. tunnel depth +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:92 +msgid "Length" +msgstr "" + +#. tunnel depth variance +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:109 +msgid "Randomization" +msgstr "" + +#. tunnel quantity +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:133 +msgid "Quantity" +msgstr "" + +#. tunnel backup quantity +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:150 +msgid "Backup quantity" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:172 +msgid "Inbound options" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:185 +msgid "Outbound options" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigUIHandler.java:31 +msgid "Theme change saved." +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigUIHandler.java:33 +msgid "Refresh the page to view." +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51 +msgid "Arabic" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 +msgid "English" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 +msgid "French" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 +msgid "German" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 +msgid "Spanish" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53 +msgid "Dutch" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53 +msgid "Portuguese" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53 +msgid "Russian" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:54 +msgid "Chinese" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:54 +msgid "Swedish" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:85 +msgid "Update available, attempting to download now" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:87 +msgid "Update available, click button on left to download" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:93 +msgid "No update available" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:101 +msgid "Updating news URL to" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:109 +msgid "Updating proxy host to" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:117 +msgid "Updating proxy port to" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:130 +msgid "Updating refresh frequency to" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:137 +msgid "Updating update policy to" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:146 +msgid "Updating update URLs." +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:155 +msgid "Updating trusted keys." +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:163 +msgid "Updating unsigned update URL to" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:88 +#: ../java/src/net/i2p/router/web/GraphHelper.java:167 +msgid "Never" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:90 +msgid "Every" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:108 +msgid "Notify only" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:115 +msgid "Download and verify only" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:123 +msgid "Download, verify, and restart" +msgstr "" + +#: ../java/src/net/i2p/router/web/FormHandler.java:176 +msgid "" +"Invalid form submission, probably because you used the 'back' or 'reload' " +"button on your browser. Please resubmit." +msgstr "" + +#: ../java/src/net/i2p/router/web/GraphHelper.java:93 +msgid "Combined bandwidth graph" +msgstr "" + +#. e.g. "statname for 60m" +#: ../java/src/net/i2p/router/web/GraphHelper.java:107 +#, java-format +msgid "{0} for {1}" +msgstr "" + +#: ../java/src/net/i2p/router/web/GraphHelper.java:146 +msgid "Configure Graph Display" +msgstr "" + +#: ../java/src/net/i2p/router/web/GraphHelper.java:146 +msgid "Select Stats" +msgstr "" + +#: ../java/src/net/i2p/router/web/GraphHelper.java:150 +msgid "Periods" +msgstr "" + +#: ../java/src/net/i2p/router/web/GraphHelper.java:151 +msgid "Plot averages" +msgstr "" + +#: ../java/src/net/i2p/router/web/GraphHelper.java:152 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:435 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:351 +msgid "or" +msgstr "" + +#: ../java/src/net/i2p/router/web/GraphHelper.java:152 +msgid "plot events" +msgstr "" + +#: ../java/src/net/i2p/router/web/GraphHelper.java:153 +msgid "Image sizes" +msgstr "" + +#: ../java/src/net/i2p/router/web/GraphHelper.java:153 +msgid "width" +msgstr "" + +#: ../java/src/net/i2p/router/web/GraphHelper.java:154 +msgid "height" +msgstr "" + +#: ../java/src/net/i2p/router/web/GraphHelper.java:154 +#: ../java/src/net/i2p/router/web/GraphHelper.java:155 +msgid "pixels" +msgstr "" + +#: ../java/src/net/i2p/router/web/GraphHelper.java:156 +msgid "Refresh delay" +msgstr "" + +#: ../java/src/net/i2p/router/web/GraphHelper.java:171 +msgid "Redraw" +msgstr "" + +#: ../java/src/net/i2p/router/web/GraphHelper.java:203 +msgid "Graph settings saved" +msgstr "" + +#: ../java/src/net/i2p/router/web/LogsHelper.java:13 +#: ../java/src/net/i2p/router/web/LogsHelper.java:37 +msgid "File location" +msgstr "" + +#: ../java/src/net/i2p/router/web/LogsHelper.java:34 +msgid "File not found" +msgstr "" + +#: ../java/src/net/i2p/router/web/LogsHelper.java:52 +msgid "No log messages" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:80 +msgid "Network Database RouterInfo Lookup" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:95 +#: ../java/strings/Strings.java:68 +msgid "Router" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:95 +msgid "not found in network database" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:107 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:215 +msgid "Network Database Contents" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:108 +msgid "View RouterInfo" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:109 +msgid "LeaseSets" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:131 +msgid "LeaseSet" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:133 +msgid "Local" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:135 +msgid "Unpublished" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:136 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:143 +msgid "Destination" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:153 +#, java-format +msgid "Expires in {0}" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:155 +#, java-format +msgid "Expired {0} ago" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:167 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:156 +msgid "Gateway" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:167 +msgid "Lease" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:169 +msgid "Tunnel" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:215 +msgid "View LeaseSets" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:217 +msgid "Not initialized" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:226 +msgid "Routers" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:228 +msgid "Show all routers" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:230 +msgid "Show all routers with full stats" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:266 +msgid "Network Database Router Statistics" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:273 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:287 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:305 +msgid "Count" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:287 +msgid "Transports" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:305 +msgid "Country" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:344 +msgid "Our info" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:346 +msgid "Peer info for" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:350 +msgid "Full entry" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:356 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:115 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:619 +msgid "Hidden" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:356 +msgid "Updated" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:357 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:360 +#, java-format +msgid "{0} ago" +msgstr "" + +#. shouldnt happen +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:359 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:363 +msgid "Published" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:365 +msgid "Address(es)" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:378 +msgid "cost" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 +msgid "Hidden or starting up" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 +msgid "SSU" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 +msgid "SSU with introducers" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404 +msgid "NTCP" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404 +msgid "NTCP and SSU" +msgstr "" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404 +msgid "NTCP and SSU with introducers" +msgstr "" + +#: ../java/src/net/i2p/router/web/NewsFetcher.java:92 +#, java-format +msgid "News last updated {0} ago." +msgstr "" + +#: ../java/src/net/i2p/router/web/NewsFetcher.java:98 +#, java-format +msgid "News last checked {0} ago." +msgstr "" + +#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:77 +#, java-format +msgid "Cannot check, plugin {0} is not installed" +msgstr "" + +#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:129 +#, java-format +msgid "Checking for update of plugin {0}" +msgstr "" + +#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:154 +#, java-format +msgid "New plugin version {0} is available" +msgstr "" + +#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:156 +#, java-format +msgid "No new version is available for plugin {0}" +msgstr "" + +#: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:165 +#, java-format +msgid "Update check failed for plugin {0}" +msgstr "" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:139 +msgid "Downloading plugin" +msgstr "" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:146 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:245 +#, java-format +msgid "{0}B transferred" +msgstr "" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:153 +msgid "Plugin downloaded" +msgstr "" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:158 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:356 +#, java-format +msgid "Cannot create plugin directory {0}" +msgstr "" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:167 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:299 +#, java-format +msgid "from {0}" +msgstr "" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:177 +#, java-format +msgid "Plugin from {0} is corrupt" +msgstr "" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:188 +#, java-format +msgid "Plugin from {0} does not contain the required configuration file" +msgstr "" + +#. updateStatus("<b>" + "Plugin contains an invalid key" + ' ' + pubkey + ' ' + signer + "</b>"); +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:201 +#, java-format +msgid "Plugin from {0} contains an invalid key" +msgstr "" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:225 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:235 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:249 +#, java-format +msgid "Plugin signature verification of {0} failed" +msgstr "" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:264 +#, java-format +msgid "Plugin from {0} has invalid name or version" +msgstr "" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:269 +#, java-format +msgid "Plugin {0} has mismatched versions" +msgstr "" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:277 +#, java-format +msgid "This plugin requires I2P version {0} or higher" +msgstr "" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:285 +#, java-format +msgid "This plugin requires Java version {0} or higher" +msgstr "" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:293 +msgid "" +"Downloaded plugin is for new installs only, but the plugin is already " +"installed" +msgstr "" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:305 +msgid "Installed plugin does not contain the required configuration file" +msgstr "" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:313 +msgid "Signature of downloaded plugin does not match installed plugin" +msgstr "" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:320 +#, java-format +msgid "Downloaded plugin version {0} is not newer than installed plugin" +msgstr "" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:327 +#, java-format +msgid "Plugin update requires installed plugin version {0} or higher" +msgstr "" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:334 +#, java-format +msgid "Plugin update requires installed plugin version {0} or lower" +msgstr "" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:351 +msgid "Plugin is for upgrades only, but the plugin is not installed" +msgstr "" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:364 +#, java-format +msgid "Failed to install plugin in {0}" +msgstr "" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:371 +#, java-format +msgid "Plugin {0} installed, router restart required" +msgstr "" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:373 +#, java-format +msgid "Plugin {0} installed" +msgstr "" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:391 +#, java-format +msgid "Plugin {0} installed and started" +msgstr "" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:394 +#, java-format +msgid "Plugin {0} installed but failed to start, check logs" +msgstr "" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:396 +#, java-format +msgid "Plugin {0} installed but failed to start" +msgstr "" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:406 +#, java-format +msgid "Failed to download plugin from {0}" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:72 +msgid "Peer Profiles" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:73 +#, java-format +msgid "Showing 1 recent profile." +msgid_plural "Showing {0} recent profiles." +msgstr[0] "" +msgstr[1] "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:75 +#, java-format +msgid "Hiding 1 older profile." +msgid_plural "Hiding {0} older profiles." +msgstr[0] "" +msgstr[1] "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:77 +#, java-format +msgid "Hiding 1 standard profile." +msgid_plural "Hiding {0} standard profiles." +msgstr[0] "" +msgstr[1] "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:82 +msgid "Groups (Caps)" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:83 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:252 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:353 +msgid "Speed" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:84 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:254 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:357 +msgid "Capacity" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:85 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:256 +msgid "Integration" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:86 +msgid "Status" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:126 +msgid "Fast, High Capacity" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:127 +msgid "High Capacity" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:128 +msgid "Standard" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:129 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:163 +msgid "Failing" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:131 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:282 +msgid "Integrated" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:164 +msgid "Unreachable" +msgstr "" + +#. hide if < 10% +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:171 +msgid "Test Fails" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:177 +msgid "profile" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:186 +msgid "Floodfill and Integrated Peers" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:190 +msgid "Caps" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:191 +msgid "Integ. Value" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:192 +msgid "Last Heard About" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:193 +msgid "Last Heard From" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:194 +msgid "Last Good Send" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:195 +msgid "Last Bad Send" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:196 +msgid "10m Resp. Time" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:197 +msgid "1h Resp. Time" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:198 +msgid "1d Resp. Time" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:199 +msgid "Last Good Lookup" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:200 +msgid "Last Bad Lookup" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:201 +msgid "Last Good Store" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:202 +msgid "Last Bad Store" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:203 +msgid "1h Fail Rate" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:204 +msgid "1d Fail Rate" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:251 +msgid "Thresholds" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:253 +msgid "fast peers" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:255 +msgid "high capacity peers" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:257 +msgid " well integrated peers" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259 +msgid "as determined by the profile organizer" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259 +msgid "groups" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260 +msgid "capabilities in the netDb, not used to determine profiles" +msgstr "" + +#. capabilities +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260 +#: ../java/strings/Strings.java:81 +msgid "caps" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261 +msgid "" +"peak throughput (bytes per second) over a 1 minute period that the peer has " +"sustained in a single tunnel" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261 +msgid "speed" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262 +msgid "capacity" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262 +msgid "how many tunnels can we ask them to join in an hour?" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263 +msgid "how many new peers have they told us about lately?" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263 +msgid "integration" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:264 +msgid "is the peer banned, or unreachable, or failing tunnel tests?" +msgstr "" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:264 +msgid "status" +msgstr "" + +#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:47 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:410 +msgid "none" +msgstr "" + +#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:62 +#, java-format +msgid "Temporary ban expiring in {0}" +msgstr "" + +#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:64 +#, java-format +msgid "Banned until restart or in {0}" +msgstr "" + +#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:76 +msgid "unban now" +msgstr "" + +#. Note to translators: all runtime zh translation disabled in this file, no font available in RRD +#: ../java/src/net/i2p/router/web/StatSummarizer.java:223 +msgid "Bandwidth usage" +msgstr "" + +#: ../java/src/net/i2p/router/web/StatSummarizer.java:230 +msgid "Outbound bytes/sec" +msgstr "" + +#. def.line(sendName, Color.BLUE, "Outbound bytes/sec", 3); +#: ../java/src/net/i2p/router/web/StatSummarizer.java:232 +msgid "Inbound bytes/sec" +msgstr "" + +#: ../java/src/net/i2p/router/web/StatSummarizer.java:235 +#: ../java/src/net/i2p/router/web/StatSummarizer.java:236 +#: ../java/src/net/i2p/router/web/StatSummarizer.java:237 +#: ../java/src/net/i2p/router/web/StatSummarizer.java:238 +msgid "bytes/sec" +msgstr "" + +#: ../java/src/net/i2p/router/web/StatSummarizer.java:235 +msgid "out average" +msgstr "" + +#: ../java/src/net/i2p/router/web/StatSummarizer.java:236 +#: ../java/src/net/i2p/router/web/StatSummarizer.java:238 +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:115 +msgid "max" +msgstr "" + +#: ../java/src/net/i2p/router/web/StatSummarizer.java:237 +msgid "in average" +msgstr "" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:57 +msgid "GO" +msgstr "" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:60 +msgid "Statistics gathered during this router's uptime" +msgstr "" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:63 +msgid "" +"The data gathered is quantized over a 1 minute period, so should just be " +"used as an estimate." +msgstr "" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:64 +msgid "These statistics are primarily used for development and debugging." +msgstr "" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:106 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:157 +msgid "No lifetime events" +msgstr "" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:117 +msgid "frequency" +msgstr "" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:121 +msgid "Rolling average events per period" +msgstr "" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:125 +msgid "Highest events per period" +msgstr "" + +#. if (showAll && (curFreq.getMaxAverageEventsPerPeriod() > 0) && (curFreq.getAverageEventsPerPeriod() > 0) ) { +#. buf.append("(current is "); +#. buf.append(pct(curFreq.getAverageEventsPerPeriod()/curFreq.getMaxAverageEventsPerPeriod())); +#. buf.append(" of max)"); +#. } +#. buf.append(" <i>avg interval between updates:</i> (").append(num(curFreq.getAverageInterval())).append("ms, min "); +#. buf.append(num(curFreq.getMinAverageInterval())).append("ms)"); +#: ../java/src/net/i2p/router/web/StatsGenerator.java:136 +msgid "Lifetime average events per period" +msgstr "" + +#. Display the strict average +#: ../java/src/net/i2p/router/web/StatsGenerator.java:141 +msgid "Lifetime average frequency" +msgstr "" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:144 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:234 +#, java-format +msgid "1 event" +msgid_plural "{0} events" +msgstr[0] "" +msgstr[1] "" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:169 +msgid "rate" +msgstr "" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:171 +msgid "Average" +msgstr "" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:174 +msgid "Highest average" +msgstr "" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:201 +#, java-format +msgid "There was 1 event in this period." +msgid_plural "There were {0} events in this period." +msgstr[0] "" +msgstr[1] "" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:203 +#, java-format +msgid "The period ended {0} ago." +msgstr "" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:205 +msgid "No events" +msgstr "" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:211 +msgid "Average event count" +msgstr "" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:213 +msgid "Events in peak period" +msgstr "" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:221 +msgid "Graph Data" +msgstr "" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:223 +msgid "Graph Event Count" +msgstr "" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:226 +msgid "Export Data as XML" +msgstr "" + +#. Display the strict average +#: ../java/src/net/i2p/router/web/StatsGenerator.java:231 +msgid "Lifetime average value" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:41 +msgid "I2P Router Help & FAQ" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:43 +msgid "Help & FAQ" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:55 +msgid "" +"Configure startup of clients and webapps (services); manually start dormant " +"services" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:57 +msgid "I2P Services" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:63 +msgid "Manage your I2P hosts file here (I2P domain name resolution)" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:65 +msgid "Addressbook" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:69 +msgid "Built-in anonymous BitTorrent Client" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:71 +msgid "Torrents" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:75 +msgid "Anonymous webmail client" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:77 +msgid "Webmail" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:81 +msgid "Anonymous resident webserver" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:83 +msgid "Webserver" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:91 +msgid "Configure I2P Router" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:93 +msgid "I2P Internals" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:99 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:379 +msgid "View existing tunnels and tunnel build status" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:105 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:253 +msgid "Show all current peer connections" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:111 +msgid "Show recent peer performance profiles" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:113 +msgid "Profiles" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:117 +msgid "Show list of all known I2P routers" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:119 +msgid "NetDB" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:123 +msgid "Health Report" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:125 +msgid "Logs" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:135 +msgid "Graph router performance" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:137 +msgid "Graphs" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:141 +msgid "Textual router performance statistics" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:147 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:370 +msgid "Local Destinations" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:149 +#: ../java/strings/Strings.java:62 +msgid "I2PTunnel" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:164 +msgid "I2P Router Help" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:166 +msgid "General" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:171 +msgid "Local Identity" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:175 +msgid "Your unique I2P router identity is" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:179 +msgid "never reveal it to anyone" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:181 +msgid "show" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:192 +msgid "How long we've been running for this session" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:195 +msgid "Uptime" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:202 +msgid "" +"Help with configuring your firewall and router for optimal I2P performance" +msgstr "" + +#. Note to translators: parameter is a version, e.g. "0.8.4" +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:232 +#, java-format +msgid "Download {0} Update" +msgstr "" + +#. Note to translators: parameter is a date and time, e.g. "02-Mar 20:34 UTC" +#. <br> is optional, to help the browser make the lines even in the button +#. If the translation is shorter than the English, you should probably not include <br> +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:240 +#, java-format +msgid "Download Unsigned<br>Update {0}" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:261 +msgid "Active" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:270 +msgid "Fast" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:276 +msgid "High capacity" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:288 +msgid "Known" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:303 +msgid "Help with firewall configuration" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:305 +msgid "Check NAT/firewall" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:325 +msgid "Reseed" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:342 +msgid "Configure router bandwidth allocation" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:344 +msgid "Bandwidth in/out" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:364 +msgid "Total" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:371 +msgid "Used" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:386 +msgid "Exploratory" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:398 +msgid "Participating" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:404 +msgid "Share ratio" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:410 +msgid "What's in the router's job queue?" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:412 +msgid "Congestion" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:417 +msgid "Job lag" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:423 +msgid "Message delay" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:429 +msgid "Tunnel lag" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:435 +msgid "Backlog" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:106 +msgid "ERR-Client Manager I2CP Error - check logs" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:113 +#, java-format +msgid "ERR-Clock Skew of {0}" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:122 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:595 +msgid "OK" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:123 +msgid "ERR-Private TCP Address" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:125 +msgid "ERR-SymmetricNAT" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:128 +msgid "WARN-Firewalled with Inbound TCP Enabled" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:130 +msgid "WARN-Firewalled and Floodfill" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:132 +msgid "WARN-Firewalled and Fast" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:133 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:599 +msgid "Firewalled" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:135 +msgid "" +"ERR-UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and " +"restart" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:141 +msgid "ERR-No Active Peers, Check Network Connection and Firewall" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:144 +msgid "ERR-UDP Disabled and Inbound TCP host/port not set" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:146 +msgid "WARN-Firewalled with UDP Disabled" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:148 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:615 +msgid "Testing" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:370 +msgid "Add/remove/edit & control your client and server tunnels" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:382 +msgid "Server" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:386 +msgid "Show tunnels" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:397 +msgid "Leases expired" +msgstr "" + +#. red or yellow light +#: ../java/src/net/i2p/router/web/SummaryHelper.java:397 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:398 +msgid "Rebuilding" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:398 +msgid "ago" +msgstr "" + +#. green light +#: ../java/src/net/i2p/router/web/SummaryHelper.java:401 +msgid "Ready" +msgstr "" + +#. yellow light +#: ../java/src/net/i2p/router/web/SummaryHelper.java:405 +msgid "Building" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:405 +msgid "Building tunnels" +msgstr "" + +#. tunnel nicknames, taken from i2ptunnel.config so they will display +#. nicely under 'local destinations' in the summary bar +#. note that if the wording changes in i2ptunnel.config, we have to +#. keep the old string here as well for existing installs +#: ../java/src/net/i2p/router/web/SummaryHelper.java:421 +#: ../java/strings/Strings.java:36 +msgid "shared clients" +msgstr "" + +#. Note to translators: all runtime zh translation disabled in this file, no font available in RRD +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:89 +#, java-format +msgid "events in {0}" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:91 +#, java-format +msgid "averaged for {0}" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:101 +msgid "Events per period" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:114 +msgid "avg" +msgstr "" + +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:116 +msgid "now" +msgstr "" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:41 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:63 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:309 +msgid "configure" +msgstr "" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:61 +msgid "Client tunnels for" +msgstr "" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:65 +msgid "dead" +msgstr "" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:71 +msgid "Participating tunnels" +msgstr "" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:72 +msgid "From" +msgstr "" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:72 +msgid "Receive on" +msgstr "" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:73 +msgid "Expiration" +msgstr "" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:73 +msgid "Send on" +msgstr "" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:73 +msgid "To" +msgstr "" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:74 +msgid "Rate" +msgstr "" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:74 +msgid "Role" +msgstr "" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:74 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:156 +msgid "Usage" +msgstr "" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:107 +msgid "grace period" +msgstr "" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:117 +msgid "Outbound Endpoint" +msgstr "" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:119 +msgid "Inbound Gateway" +msgstr "" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:121 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:162 +msgid "Participant" +msgstr "" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:126 +msgid "Inactive participating tunnels" +msgstr "" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:127 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:218 +msgid "Lifetime bandwidth usage" +msgstr "" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:156 +msgid "Expiry" +msgstr "" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:159 +msgid "Participants" +msgstr "" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:165 +msgid "Endpoint" +msgstr "" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:205 +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:212 +msgid "Build in progress" +msgstr "" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:205 +msgid "inbound" +msgstr "" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:212 +msgid "outbound" +msgstr "" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:217 +msgid "No tunnels; waiting for the grace period to end." +msgstr "" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:219 +msgid "in" +msgstr "" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:220 +msgid "out" +msgstr "" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:237 +msgid "Tunnel Counts By Peer" +msgstr "" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:238 +msgid "% of total" +msgstr "" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:238 +msgid "Our Tunnels" +msgstr "" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:238 +msgid "Participating Tunnels" +msgstr "" + +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:256 +msgid "Totals" +msgstr "" + +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:67 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:143 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:238 +msgid "Updating" +msgstr "" + +#. Process the .sud/.su2 file +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:89 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:112 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:117 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:262 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:287 +msgid "Update downloaded" +msgstr "" + +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:92 +#, java-format +msgid "Unsigned update file from {0} is corrupt" +msgstr "" + +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:112 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:282 +msgid "Restarting" +msgstr "" + +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:119 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:289 +msgid "Click Restart to install" +msgstr "" + +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:121 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:291 +msgid "Click Shutdown and restart to install" +msgstr "" + +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:122 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:293 +#, java-format +msgid "Version {0}" +msgstr "" + +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:127 +#, java-format +msgid "Failed copy to {0}" +msgstr "" + +#: ../java/src/net/i2p/router/web/UpdateHandler.java:185 +#, java-format +msgid "Updating from {0}" +msgstr "" + +#: ../java/src/net/i2p/router/web/UpdateHandler.java:254 +#, java-format +msgid "No new version found at {0}" +msgstr "" + +#: ../java/src/net/i2p/router/web/UpdateHandler.java:282 +msgid "Update verified" +msgstr "" + +#: ../java/src/net/i2p/router/web/UpdateHandler.java:308 +#, java-format +msgid "Transfer failed from {0}" +msgstr "" + +#. wars for ConfigClientsHelper +#: ../java/strings/Strings.java:12 +msgid "addressbook" +msgstr "" + +#: ../java/strings/Strings.java:13 +msgid "i2psnark" +msgstr "" + +#: ../java/strings/Strings.java:14 +msgid "i2ptunnel" +msgstr "" + +#: ../java/strings/Strings.java:15 +msgid "susimail" +msgstr "" + +#: ../java/strings/Strings.java:16 +msgid "susidns" +msgstr "" + +#: ../java/strings/Strings.java:17 +msgid "routerconsole" +msgstr "" + +#. clients, taken from clients.config, for ConfigClientsHelper +#. note that if the wording changes in clients.config, we have to +#. keep the old string here as well for existing installs +#: ../java/strings/Strings.java:22 +msgid "Web console" +msgstr "" + +#: ../java/strings/Strings.java:23 +msgid "SAM application bridge" +msgstr "" + +#: ../java/strings/Strings.java:24 +msgid "Application tunnels" +msgstr "" + +#: ../java/strings/Strings.java:25 +msgid "My eepsite web server" +msgstr "" + +#: ../java/strings/Strings.java:26 +msgid "I2P webserver (eepsite)" +msgstr "" + +#: ../java/strings/Strings.java:27 +msgid "Browser launch at startup" +msgstr "" + +#: ../java/strings/Strings.java:28 +msgid "BOB application bridge" +msgstr "" + +#: ../java/strings/Strings.java:30 +msgid "Open Router Console in web browser at startup" +msgstr "" + +#: ../java/strings/Strings.java:37 +msgid "IRC proxy" +msgstr "" + +#: ../java/strings/Strings.java:38 +msgid "eepsite" +msgstr "" + +#: ../java/strings/Strings.java:39 +msgid "I2P webserver" +msgstr "" + +#: ../java/strings/Strings.java:40 +msgid "HTTP Proxy" +msgstr "" + +#. older names for pre-0.7.4 installs +#: ../java/strings/Strings.java:42 +msgid "eepProxy" +msgstr "" + +#: ../java/strings/Strings.java:43 +msgid "ircProxy" +msgstr "" + +#. hardcoded in i2psnark +#: ../java/strings/Strings.java:45 +msgid "I2PSnark" +msgstr "" + +#. hardcoded in iMule? +#: ../java/strings/Strings.java:47 +msgid "iMule" +msgstr "" + +#. standard themes for ConfigUIHelper +#: ../java/strings/Strings.java:51 +msgid "classic" +msgstr "" + +#: ../java/strings/Strings.java:52 +msgid "dark" +msgstr "" + +#: ../java/strings/Strings.java:53 +msgid "light" +msgstr "" + +#: ../java/strings/Strings.java:54 +msgid "midnight" +msgstr "" + +#. stat groups for stats.jsp +#: ../java/strings/Strings.java:57 +msgid "Bandwidth" +msgstr "" + +#: ../java/strings/Strings.java:58 +msgid "BandwidthLimiter" +msgstr "" + +#: ../java/strings/Strings.java:59 +msgid "ClientMessages" +msgstr "" + +#: ../java/strings/Strings.java:60 +msgid "Encryption" +msgstr "" + +#: ../java/strings/Strings.java:61 +msgid "i2cp" +msgstr "" + +#: ../java/strings/Strings.java:63 +msgid "InNetPool" +msgstr "" + +#: ../java/strings/Strings.java:64 +msgid "JobQueue" +msgstr "" + +#: ../java/strings/Strings.java:65 +msgid "NetworkDatabase" +msgstr "" + +#: ../java/strings/Strings.java:66 +msgid "ntcp" +msgstr "" + +#: ../java/strings/Strings.java:69 +msgid "Stream" +msgstr "" + +#: ../java/strings/Strings.java:70 +msgid "Throttle" +msgstr "" + +#: ../java/strings/Strings.java:71 +msgid "Transport" +msgstr "" + +#: ../java/strings/Strings.java:73 +msgid "udp" +msgstr "" + +#. parameters in transport addresses (netdb.jsp) +#. may or may not be worth translating +#: ../java/strings/Strings.java:77 +msgid "host" +msgstr "" + +#: ../java/strings/Strings.java:78 +msgid "key" +msgstr "" + +#: ../java/strings/Strings.java:79 +msgid "port" +msgstr "" + +#. introducer host +#: ../java/strings/Strings.java:83 +msgid "ihost0" +msgstr "" + +#: ../java/strings/Strings.java:84 +msgid "ihost1" +msgstr "" + +#: ../java/strings/Strings.java:85 +msgid "ihost2" +msgstr "" + +#. introducer port +#: ../java/strings/Strings.java:87 +msgid "iport0" +msgstr "" + +#: ../java/strings/Strings.java:88 +msgid "iport1" +msgstr "" + +#: ../java/strings/Strings.java:89 +msgid "iport2" +msgstr "" + +#. introducer key +#: ../java/strings/Strings.java:91 +msgid "ikey0" +msgstr "" + +#: ../java/strings/Strings.java:92 +msgid "ikey1" +msgstr "" + +#: ../java/strings/Strings.java:93 +msgid "ikey2" +msgstr "" + +#. introducer tag +#: ../java/strings/Strings.java:95 +msgid "itag0" +msgstr "" + +#: ../java/strings/Strings.java:96 +msgid "itag1" +msgstr "" + +#: ../java/strings/Strings.java:97 +msgid "itag2" +msgstr "" + +#. Descriptions for the stats that are graphed by default +#. There are over 500 stats currently defined, we aren't going to tag them all +#: ../java/strings/Strings.java:101 +msgid "Low-level bandwidth receive rate" +msgstr "" + +#. bw.recvRate +#: ../java/strings/Strings.java:102 +msgid "Low-level bandwidth send rate" +msgstr "" + +#. bw.sendRate +#: ../java/strings/Strings.java:103 +msgid "How many peers we are actively talking with" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:112 +msgid "config networking" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:224 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:237 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:224 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:234 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:231 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:222 +msgid "Summary Bar" +msgstr "" + +#. We have intl defined when this is included, but not when compiled standalone. +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:237 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:250 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:237 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:247 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:244 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:242 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:235 +msgid "Refresh (s)" +msgstr "" + +#. ditto +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:241 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:254 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:241 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:251 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:248 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:245 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:239 +msgid "Enable" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:262 +msgid "I2P Network Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:316 +msgid "Bandwidth limiter" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:318 +msgid "" +"I2P will work best if you configure your rates to match the speed of your " +"internet connection." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:322 +msgid "KBps In" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:336 +msgid "KBps Out" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:352 +msgid "Share" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:359 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:327 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:326 +msgid "NOTE" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:361 +#, java-format +msgid "You have configured I2P to share only {0} KBps." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:364 +msgid "I2P requires at least 12KBps to enable sharing. " +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:365 +msgid "" +"Please enable sharing (participating in tunnels) by configuring more " +"bandwidth. " +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:366 +msgid "" +"It improves your anonymity by creating cover traffic, and helps the network." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:369 +#, java-format +msgid "You have configured I2P to share {0} KBps." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:372 +msgid "" +"The higher the share bandwidth the more you improve your anonymity and help " +"the network." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:376 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:532 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:323 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:347 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:425 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:339 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:357 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:366 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:395 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:360 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:351 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:383 +msgid "Cancel" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:393 +msgid "IP and Transport Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:395 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:417 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:324 +msgid "The default settings will work for most people." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:397 +msgid "There is help below." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:399 +msgid "UPnP Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:403 +msgid "Enable UPnP to open firewall ports" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:405 +msgid "UPnP status" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:407 +msgid "IP Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:409 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:479 +msgid "Externally reachable hostname or IP address" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:413 +msgid "Use all auto-detect methods" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:417 +msgid "Disable UPnP IP address detection" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:421 +msgid "Ignore local interface IP address" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:425 +msgid "Use SSU IP address detection only" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:429 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:497 +msgid "Specify hostname or IP" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:435 +msgid "Select Interface" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:449 +msgid "Hidden mode - do not publish IP" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:451 +msgid "(prevents participating traffic)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:453 +msgid "Action when IP changes" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:457 +msgid "" +"Laptop mode - Change router identity and UDP port when IP changes for " +"enhanced anonymity" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:459 +msgid "Experimental" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:461 +msgid "UDP Configuration:" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:463 +msgid "UDP port:" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:477 +msgid "TCP Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:483 +msgid "Use auto-detected IP address" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:485 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:517 +msgid "currently" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:489 +msgid "if we are not firewalled" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:493 +msgid "Always use auto-detected IP address (Not firewalled)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:503 +msgid "Disable inbound (Firewalled)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:507 +msgid "Completely disable" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:509 +msgid "" +"(select only if behind a firewall that throttles or blocks outbound TCP)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:511 +msgid "Externally reachable TCP port" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:515 +msgid "Use the same port configured for UDP" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:523 +msgid "Specify Port" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:527 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:357 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:348 +msgid "Note" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:530 +msgid "Changing these settings will restart your router." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:536 +msgid "Configuration Help" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:538 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:587 +msgid "" +"While I2P will work fine behind most firewalls, your speeds and network " +"integration will generally improve if the I2P port is forwarded for both UDP " +"and TCP." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:540 +msgid "" +"If you can, please poke a hole in your firewall to allow unsolicited UDP and " +"TCP packets to reach you." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:542 +msgid "" +"If you can't, I2P supports UPnP (Universal Plug and Play) and UDP hole " +"punching with \"SSU introductions\" to relay traffic." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:544 +msgid "" +"Most of the options above are for special situations, for example where UPnP " +"does not work correctly, or a firewall not under your control is doing harm." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:546 +msgid "Certain firewalls such as symmetric NATs may not work well with I2P." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:555 +msgid "" +"UPnP is used to communicate with Internet Gateway Devices (IGDs) to detect " +"the external IP address and forward ports." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:557 +msgid "UPnP support is beta, and may not work for any number of reasons" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:559 +msgid "No UPnP-compatible device present" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:561 +msgid "UPnP disabled on the device" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:563 +msgid "Software firewall interference with UPnP" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:565 +msgid "Bugs in the device's UPnP implementation" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:567 +msgid "Multiple firewall/routers in the internet connection path" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:569 +msgid "UPnP device change, reset, or address change" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:571 +msgid "Review the UPnP status here." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:573 +msgid "" +"UPnP may be enabled or disabled above, but a change requires a router " +"restart to take effect." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:575 +msgid "Hostnames entered above will be published in the network database." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:577 +msgid "They are <b>not private</b>." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:579 +msgid "" +"Also, <b>do not enter a private IP address</b> like 127.0.0.1 or 192.168.1.1." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:581 +msgid "" +"If you specify the wrong IP address or hostname, or do not properly " +"configure your NAT or firewall, your network performance will degrade " +"substantially." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:583 +msgid "When in doubt, leave the settings at the defaults." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:585 +msgid "Reachability Help" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:590 +msgid "" +"If you think you have opened up your firewall and I2P still thinks you are " +"firewalled, remember that you may have multiple firewalls, for example both " +"software packages and external hardware routers." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:593 +msgid "" +"If there is an error, the <a href=\"logs.jsp\">logs</a> may also help " +"diagnose the problem." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:597 +msgid "Your UDP port does not appear to be firewalled." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:601 +msgid "Your UDP port appears to be firewalled." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:603 +msgid "" +"As the firewall detection methods are not 100% reliable, this may " +"occasionally be displayed in error." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:605 +msgid "" +"However, if it appears consistently, you should check whether both your " +"external and internal firewalls are open for your port." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:607 +msgid "" +"I2P will work fine when firewalled, there is no reason for concern. When " +"firewalled, the router uses \"introducers\" to relay inbound connections." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:609 +msgid "" +"However, you will get more participating traffic and help the network more " +"if you can open your firewall(s)." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:611 +msgid "" +"If you think you have already done so, remember that you may have both a " +"hardware and a software firewall, or be behind an additional, institutional " +"firewall you cannot control." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:613 +msgid "" +"Also, some routers cannot correctly forward both TCP and UDP on a single " +"port, or may have other limitations or bugs that prevent them from passing " +"traffic through to I2P." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:617 +msgid "The router is currently testing whether your UDP port is firewalled." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:621 +msgid "" +"The router is not configured to publish its address, therefore it does not " +"expect incoming connections." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:623 +msgid "WARN - Firewalled and Fast" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:625 +msgid "" +"You have configured I2P to share more than 128KBps of bandwidth, but you are " +"firewalled." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:627 +msgid "" +"While I2P will work fine in this configuration, if you really have over " +"128KBps of bandwidth to share, it will be much more helpful to the network " +"if you open your firewall." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:629 +msgid "WARN - Firewalled and Floodfill" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:631 +msgid "" +"You have configured I2P to be a floodfill router, but you are firewalled." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:633 +msgid "" +"For best participation as a floodfill router, you should open your firewall." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:635 +msgid "WARN - Firewalled with Inbound TCP Enabled" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:637 +msgid "" +"You have configured inbound TCP, however your UDP port is firewalled, and " +"therefore it is likely that your TCP port is firewalled as well." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:639 +msgid "" +"If your TCP port is firewalled with inbound TCP enabled, routers will not be " +"able to contact you via TCP, which will hurt the network." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:641 +msgid "Please open your firewall or disable inbound TCP above." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:643 +msgid "WARN - Firewalled with UDP Disabled" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:645 +msgid "You have configured inbound TCP, however you have disabled UDP." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:647 +msgid "" +"You appear to be firewalled on TCP, therefore your router cannot accept " +"inbound connections." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:649 +msgid "Please open your firewall or enable UDP." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:651 +msgid "ERR - Clock Skew" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:653 +msgid "" +"Your system's clock is skewed, which will make it difficult to participate " +"in the network." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:655 +msgid "Correct your clock setting if this error persists." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:657 +msgid "ERR - Private TCP Address" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:659 +msgid "" +"You must never advertise an unroutable IP address such as 127.0.0.1 or " +"192.168.1.1 as your external address." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:661 +msgid "Correct the address or disable inbound TCP above." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:663 +msgid "ERR - SymmetricNAT" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:665 +msgid "I2P detected that you are firewalled by a Symmetric NAT." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:667 +msgid "" +"I2P does not work well behind this type of firewall. You will probably not " +"be able to accept inbound connections, which will limit your participation " +"in the network." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:669 +msgid "" +"ERR - UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config " +"and restart" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:671 +msgid "I2P was unable to bind to port 8887 or other configured port." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:673 +msgid "" +"Check to see if another program is using the configured port. If so, stop " +"that program or configure I2P to use a different port." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:675 +msgid "" +"This may be a transient error, if the other program is no longer using the " +"port." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:677 +msgid "However, a restart is always required after this error." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:679 +msgid "ERR - UDP Disabled and Inbound TCP host/port not set" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:681 +msgid "" +"You have not configured inbound TCP with a hostname and port above, however " +"you have disabled UDP." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:683 +msgid "Therefore your router cannot accept inbound connections." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:685 +msgid "Please configure a TCP host and port above or enable UDP." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:687 +msgid "ERR - Client Manager I2CP Error - check logs" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:689 +msgid "This is usually due to a port 7654 conflict. Check the logs to verify." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:691 +msgid "" +"Do you have another I2P instance running? Stop the conflicting program and " +"restart I2P." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:113 +msgid "config advanced" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:263 +msgid "I2P Advanced Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:319 +msgid "Advanced I2P Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:329 +msgid "Some changes may require a restart to take effect." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:112 +msgid "config clients" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:265 +msgid "I2P Client Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:330 +msgid "Client Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:332 +msgid "" +"The Java clients listed below are started by the router and run in the same " +"JVM." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:338 +msgid "To change other client options, edit the file" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:345 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:423 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:439 +msgid "All changes require restart to take effect." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:357 +msgid "Advanced Client Interface Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:361 +msgid "External I2CP (I2P Client Protocol) Interface Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:367 +msgid "Enabled without SSL" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:373 +msgid "Enabled with SSL required" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:379 +msgid "Disabled - Clients outside this Java process may not connect" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:381 +msgid "I2CP Port" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:385 +msgid "I2CP Interface" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:401 +msgid "Authorization" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:407 +msgid "Require username and password" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:409 +msgid "Username" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:413 +msgid "Password" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:419 +msgid "Any changes made here must also be configured in the external client." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:421 +msgid "Many clients do not support SSL or authorization." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:429 +msgid "WebApp Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:431 +msgid "" +"The Java web applications listed below are started by the webConsole client " +"and run in the same JVM as the router. They are usually web applications " +"accessible through the router console. They may be complete applications (e." +"g. i2psnark),front-ends to another client or application which must be " +"separately enabled (e.g. susidns, i2ptunnel), or have no web interface at " +"all (e.g. addressbook)." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:433 +msgid "" +"A web app may also be disabled by removing the .war file from the webapps " +"directory; however the .war file and web app will reappear when you update " +"your router to a newer version, so disabling the web app here is the " +"preferred method." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:445 +msgid "Plugin Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:447 +msgid "The plugins listed below are started by the webConsole client." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:455 +msgid "Plugin Installation" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:457 +msgid "To install a plugin, enter the download URL:" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:112 +msgid "config keyring" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:249 +msgid "I2P Keyring Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:317 +msgid "The router keyring is used to decrypt encrypted leaseSets." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:320 +msgid "" +"The keyring may contain keys for local or remote encrypted destinations." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:326 +msgid "Manual Keyring Addition" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:328 +msgid "Enter keys for encrypted remote destinations here." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:331 +msgid "Keys for local destinations must be entered on the" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:333 +msgid "I2PTunnel page" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:335 +msgid "Dest. name, hash, or full key" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:337 +msgid "Encryption Key" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:113 +msgid "config logging" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:263 +msgid "I2P Logging Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:319 +msgid "Configure I2P Logging Options" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:321 +msgid "Logging filename" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:325 +msgid "(the symbol '@' will be replaced during log rotation)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:327 +msgid "Log record format" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:331 +msgid "" +"(use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, 'm' = message)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:333 +msgid "Log date format" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:337 +msgid "" +"('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' " +"= millisecond)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:339 +msgid "Max log file size" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:343 +msgid "Default log level" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:347 +msgid "" +"(DEBUG and INFO are not recommended defaults, as they will drastically slow " +"down your router)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:349 +msgid "Log level overrides" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:353 +msgid "New override" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:112 +msgid "config peers" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:249 +msgid "I2P Peer Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:323 +msgid "Manual Peer Controls" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:325 +msgid "Router Hash" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:329 +msgid "Manually Ban / Unban a Peer" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:331 +msgid "" +"Banning will prevent the participation of this peer in tunnels you create." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:341 +msgid "Adjust Profile Bonuses" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:343 +msgid "" +"Bonuses may be positive or negative, and affect the peer's inclusion in Fast " +"and High Capacity tiers. Fast peers are used for client tunnels, and High " +"Capacity peers are used for some exploratory tunnels. Current bonuses are " +"displayed on the" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:345 +msgid "profiles page" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:363 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:273 +msgid "Banned Peers" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:384 +msgid "Banned IPs" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:112 +msgid "config reseeding" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:262 +msgid "I2P Reseeding Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:318 +msgid "Reseeding Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:320 +msgid "" +"Reseeding is the bootstrapping process used to find other routers when you " +"first install I2P, or when your router has too few router references " +"remaining." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:322 +msgid "" +"If reseeding has failed, you should first check your network connection." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:326 +msgid "" +"Change these only if HTTP is blocked by a restrictive firewall, reseed has " +"failed, and you have access to an HTTP proxy." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:328 +#, java-format +msgid "See {0} for instructions on reseeding manually." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:328 +msgid "the FAQ" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:330 +msgid "Reseed URL Selection" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:336 +msgid "Try SSL first then non-SSL" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:342 +msgid "Use SSL only" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:348 +msgid "Use non-SSL only" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:350 +msgid "Reseed URLs" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:354 +msgid "Enable HTTP proxy (not used for SSL)" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:358 +msgid "HTTP Proxy Host" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:362 +msgid "HTTP Proxy Port" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:112 +msgid "config service" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:249 +msgid "I2P Service Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:303 +msgid "Shutdown the router" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:305 +msgid "" +"Graceful shutdown lets the router satisfy the agreements it has already made " +"before shutting down, but may take a few minutes." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:307 +msgid "" +"If you need to kill the router immediately, that option is available as well." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:317 +msgid "" +"If you want the router to restart itself after shutting down, you can choose " +"one of the following." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:319 +msgid "" +"This is useful in some situations - for example, if you changed some " +"settings that client applications only read at startup, such as the " +"routerconsole password or the interface it listens on." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:321 +msgid "" +"A graceful restart will take a few minutes (but your peers will appreciate " +"your patience), while a hard restart does so immediately." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:323 +msgid "" +"After tearing down the router, it will wait 1 minute before starting back up " +"again." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:333 +msgid "Systray integration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:335 +msgid "" +"On the windows platform, there is a small application to sit in the system " +"tray, allowing you to view the router's status" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:337 +msgid "" +"(later on, I2P client applications will be able to integrate their own " +"functionality into the system tray as well)." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:339 +msgid "If you are on windows, you can either enable or disable that icon here." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:341 +msgid "Show systray icon" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:343 +msgid "Hide systray icon" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:345 +msgid "Run on startup" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:347 +msgid "" +"You can control whether I2P is run on startup or not by selecting one of the " +"following options - I2P will install (or remove) a service accordingly." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:349 +msgid "If you prefer the command line, you can also run the " +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:359 +msgid "" +"If you are running I2P as service right now, removing it will shut down your " +"router immediately." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:361 +msgid "" +"You may want to consider shutting down gracefully, as above, then running " +"uninstall_i2p_service_winnt.bat." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:365 +msgid "Debugging" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:367 +msgid "View the job queue" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:371 +msgid "" +"At times, it may be helpful to debug I2P by getting a thread dump. To do so, " +"please select the following option and review the thread dumped to <a href=" +"\"logs.jsp#servicelogs\">wrapper.log</a>." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:377 +msgid "Launch browser on router startup?" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:379 +msgid "" +"I2P's main configuration interface is this web console, so for your " +"convenience I2P can launch a web browser on startup pointing at" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:113 +msgid "config stats" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:250 +msgid "I2P Stats Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:320 +msgid "Configure I2P Stat Collection" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:322 +msgid "Enable full stats?" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:329 +msgid "change requires restart to take effect" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:331 +msgid "Stat file" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:335 +msgid "Filter" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:337 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:348 +msgid "toggle all" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:350 +msgid "Log" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:352 +msgid "Graph" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:391 +msgid "Advanced filter" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:112 +msgid "config tunnels" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:262 +msgid "I2P Tunnel Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:328 +msgid "The default settings work for most people." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:332 +msgid "There is a fundamental tradeoff between anonymity and performance." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:335 +msgid "" +"Tunnels longer than 3 hops (for example 2 hops + 0-2 hops, 3 hops + 0-1 " +"hops, 3 hops + 0-2 hops), or a high quantity + backup quantity, may severely " +"reduce performance or reliability." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:338 +msgid "High CPU and/or high outbound bandwidth usage may result." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:341 +msgid "Change these settings with care, and adjust them if you have problems." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:351 +msgid "" +"Exploratory tunnel setting changes are stored in the router.config file." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:354 +msgid "Client tunnel changes are temporary and are not saved." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:356 +msgid "To make permanent client tunnel changes see the" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:358 +msgid "i2ptunnel page" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:112 +msgid "config UI" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:262 +msgid "I2P UI Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:314 +msgid "Router Console Theme" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:339 +msgid "Theme selection disabled for Internet Explorer, sorry." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:341 +msgid "" +"If you're not using IE, it's likely that your browser is pretending to be " +"IE; please configure your browser (or proxy) to use a different User Agent " +"string if you'd like to access the console themes." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:345 +msgid "Router Console Language" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:349 +msgid "" +"Please contribute to the router console translation project! Contact the " +"developers on IRC #i2p to help." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:353 +msgid "Apply" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:112 +msgid "config update" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:249 +msgid "I2P Update Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:321 +msgid "Check for I2P and news updates" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:323 +msgid "News & I2P Updates" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:327 +msgid "Update In Progress" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:335 +msgid "News URL" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:339 +msgid "Refresh frequency" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:345 +msgid "Update policy" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:349 +msgid "Update through the eepProxy?" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:353 +msgid "eepProxy host" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:357 +msgid "eepProxy port" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:361 +msgid "Update URLs" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:365 +msgid "Trusted keys" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:369 +msgid "Update with unsigned development builds?" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:373 +msgid "Unsigned Build URL" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:379 +msgid "" +"I2P updates are disabled because you do not have write permission for the " +"install directory." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:385 +msgid "Save" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:121 +msgid "Internal Error" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:123 +msgid "Router Console" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:127 +msgid "Configuration" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:135 +msgid "Sorry! There has been an internal error." +msgstr "" + +#. note to translators - both parameters are URLs +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:139 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:254 +#, java-format +msgid "Please report bugs on {0} or {1}." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:143 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:258 +msgid "" +"You may use the username \"guest\" and password \"guest\" if you do not wish " +"to register." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:145 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:260 +msgid "Please include this information in bug reports" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:147 +msgid "Error Details" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:149 +#, java-format +msgid "Error {0}" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:169 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:250 +msgid "I2P Version and Running Environment" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:197 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:288 +msgid "" +"Note that system information, log timestamps, and log messages may provide " +"clues to your location; please review everything you include in a bug report." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:123 +msgid "Page Not Found" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:264 +msgid "" +"Sorry! You appear to be requesting a non-existent Router Console page or " +"resource." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:266 +msgid "Error 404" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:271 +msgid "not found" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:112 +msgid "graphs" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:249 +msgid "I2P Performance Graphs" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:111 +msgid "home" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:331 +msgid "Welcome to I2P" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:111 +msgid "job queue" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:248 +msgid "I2P Router Job Queue" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:111 +msgid "logs" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:248 +msgid "I2P Router Logs" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:303 +msgid "Critical Logs" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:307 +msgid "Router Logs" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:313 +msgid "Service (Wrapper) Logs" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:111 +msgid "network database summary" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:248 +msgid "I2P Network Database Summary" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:115 +msgid "WebApp Not Found" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:252 +msgid "Web Application Not Running" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:254 +msgid "The requested web application is not running." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:256 +msgid "" +"Please visit the <a href=\"/configclients.jsp#webapp\">config clients page</" +"a> to start it." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:111 +msgid "peer connections" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:248 +msgid "I2P Network Peers" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:111 +msgid "peer profiles" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:248 +msgid "I2P Network Peer Profiles" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:111 +msgid "statistics" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:265 +msgid "I2P Router Statistics" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:255 +#, java-format +msgid "Disable {0} Refresh" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:111 +msgid "tunnel summary" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:248 +msgid "I2P Tunnel Summary" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:111 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:248 +msgid "Peer Profile" +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:275 +#, java-format +msgid "Profile for peer {0}" +msgstr "" diff --git a/apps/routerconsole/locale/messages_es.po b/apps/routerconsole/locale/messages_es.po index 77de2b2d410cb4bafb5100d4200f2625ed393eaa..21a79717d3e436e71984f59955197013595c8d0e 100644 --- a/apps/routerconsole/locale/messages_es.po +++ b/apps/routerconsole/locale/messages_es.po @@ -6,27 +6,30 @@ # msgid "" msgstr "" -"Project-Id-Version: I2P routerconsole\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-12-28 00:08+0000\n" -"PO-Revision-Date: 2011-01-03 01:13+0100\n" +"Project-Id-Version: I2P\n" +"Report-Msgid-Bugs-To: https://trac.i2p2.de/\n" +"POT-Creation-Date: 2011-03-21 18:01+0000\n" +"PO-Revision-Date: 2011-05-18 23:34+0100\n" "Last-Translator: mixxy <m1xxy@mail.i2p>\n" -"Language-Team: foo <foo@bar>\n" +"Language-Team: Spanish (Castilian) <None>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Poedit-Language: French\n" +"Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#. NOTE TO TRANSLATORS: Feel free to translate all these as you see fit, there are several options... -#. spaces or not, '.' or not, plural or not. Try not to make it too long, it is used in +#. NOTE TO TRANSLATORS: Feel free to translate all these as you see fit, there +#. are several options... +#. spaces or not, '.' or not, plural or not. Try not to make it too long, it +#. is used in #. a lot of tables. #. milliseconds #. Note to translators, may be negative or zero, 2999 maximum. -#. {0,number,####} prevents 1234 from being output as 1,234 in the English locale. +#. {0,number,####} prevents 1234 from being output as 1,234 in the English +#. locale. #. If you want the digit separator in your locale, translate as {0}. #. alternates: msec, msecs -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1103 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1141 #, java-format msgid "1 ms" msgid_plural "{0,number,####} ms" @@ -36,7 +39,7 @@ msgstr[1] "{0,number,####} ms" #. seconds #. Note to translators: quantity will always be greater than one. #. alternates: secs, sec. 'seconds' is probably too long. -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1108 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1146 #, java-format msgid "1 sec" msgid_plural "{0} sec" @@ -46,55 +49,55 @@ msgstr[1] "{0} s" #. minutes #. Note to translators: quantity will always be greater than one. #. alternates: mins, min. 'minutes' is probably too long. -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1113 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1151 #, java-format msgid "1 min" msgid_plural "{0} min" -msgstr[0] "{0} min" +msgstr[0] "1 min" msgstr[1] "{0} min" #. hours #. Note to translators: quantity will always be greater than one. #. alternates: hrs, hr., hrs. -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1118 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1156 #, java-format msgid "1 hour" msgid_plural "{0} hours" msgstr[0] "1 hora" msgstr[1] "{0} horas" -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1120 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:313 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1158 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:314 msgid "n/a" -msgstr "" +msgstr "n/d" #. days #. Note to translators: quantity will always be greater than one. -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1124 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1162 #, java-format msgid "1 day" msgid_plural "{0} days" msgstr[0] "1 dÃa" msgstr[1] "{0} dÃas" -#: ../../../router/java/src/net/i2p/router/Blocklist.java:126 +#: ../../../router/java/src/net/i2p/router/Blocklist.java:122 #, java-format msgid "Banned by router hash: {0}" -msgstr "" +msgstr "Baneado por el hash del router: {0}" -#: ../../../router/java/src/net/i2p/router/Blocklist.java:128 +#: ../../../router/java/src/net/i2p/router/Blocklist.java:124 msgid "Banned by router hash" -msgstr "baneado por hash del enrutador" +msgstr "baneado por hash del router" #. Temporary reason, until the job finishes -#: ../../../router/java/src/net/i2p/router/Blocklist.java:673 +#: ../../../router/java/src/net/i2p/router/Blocklist.java:669 msgid "IP banned" -msgstr "IP baneado" +msgstr "IP baneada" -#: ../../../router/java/src/net/i2p/router/Blocklist.java:743 +#: ../../../router/java/src/net/i2p/router/Blocklist.java:739 #, java-format msgid "IP banned by blocklist.txt entry {0}" -msgstr "" +msgstr "IP baneada por la blocklist.txt: {0}" #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:92 msgid "Rejecting tunnels: Shutting down" @@ -102,13 +105,14 @@ msgstr "rechazando túneles: apagando" #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:141 msgid "Rejecting tunnels: High message delay" -msgstr "rechazando túneles: alta tardanza de los mensajes" +msgstr "rechazando túneles: mucha tardanza de los mensajes" #. hard to do {0} from here -#. setTunnelStatus("Rejecting " + (100 - (int) probAccept*100) + "% of tunnels: High number of requests"); +#. setTunnelStatus("Rejecting " + (100 - (int) probAccept*100) + "% of +#. tunnels: High number of requests"); #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:177 msgid "Rejecting most tunnels: High number of requests" -msgstr "rechazando la mayor parte de los túneles: alto número de peticiones" +msgstr "rechazando la mayorÃa de túneles: alto número de peticiones" #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:233 msgid "Rejecting tunnels: Limit reached" @@ -119,455 +123,468 @@ msgstr "rechazando túneles: lÃmite alcanzado" #. always leave at least 4KBps free when allowing #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:301 msgid "Rejecting tunnels: Bandwidth limit" -msgstr "rechazando túneles: lÃmite del ancho de banda" +msgstr "rechazando túneles: lÃmite de ancho de banda" #. hard to do {0} from here -#. setTunnelStatus("Rejecting " + ((int)(100.0*probReject)) + "% of tunnels: Bandwidth limit"); +#. setTunnelStatus("Rejecting " + ((int)(100.0*probReject)) + "% of tunnels: +#. Bandwidth limit"); #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:371 msgid "Rejecting most tunnels: Bandwidth limit" -msgstr "rechazando la mayor parte de los túneles: lÃmite del ancho de banda" +msgstr "rechazando la mayor parte de los túneles: lÃmite de ancho de banda" #. hard to do {0} from here -#. setTunnelStatus("Accepting " + (100-(int)(100.0*probReject)) + "% of tunnels"); +#. setTunnelStatus("Accepting " + (100-(int)(100.0*probReject)) + "% of +#. tunnels"); #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:375 msgid "Accepting most tunnels" -msgstr "Acceptando la mayorÃa de los túneles" +msgstr "Aceptando la mayorÃa de los túneles" #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:377 msgid "Accepting tunnels" -msgstr "acceptando túneles" +msgstr "aceptando túneles" #. NPE, too early #. if (_context.router().getRouterInfo().getBandwidthTier().equals("K")) -#. setTunnelStatus("Not expecting tunnel requests: Advertised bandwidth too low"); +#. setTunnelStatus("Not expecting tunnel requests: Advertised bandwidth too +#. low"); #. else #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:488 msgid "Rejecting tunnels" msgstr "Rechazando túneles" -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:68 -msgid "Ensure that nothing blocks outbound HTTP, check <a target=\"_top\" href=\"logs.jsp\">logs</a> and if nothing helps, read the <a target=\"_top\" href=\"http://www.i2p2.de/faq.html\">FAQ</a> about reseeding manually." -msgstr "" - -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:101 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:125 +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:20 msgid "Reseeding" -msgstr "" +msgstr "Resembrando" -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:124 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:141 #, java-format msgid "Reseed fetched only 1 router." msgid_plural "Reseed fetched only {0} routers." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "El proceso de resembrar ha encontrado un solo router." +msgstr[1] "El proceso de resembrar ha encontrado sólo {0} routers." -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:131 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:148 msgid "Reseed failed." -msgstr "" +msgstr "El proceso de resembrar ha fallado" -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:232 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:149 +#, java-format +msgid "See {0} for help." +msgstr "Consulta {0} para obtener ayuda." + +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:150 +msgid "reseed configuration page" +msgstr "Página de configuración del proceso de resembrar" + +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:293 msgid "Reseeding: fetching seed URL." -msgstr "" +msgstr "Resembrar: Buscando URL sembradora" -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:273 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:335 #, java-format msgid "Reseeding: fetching router info from seed URL ({0} successful, {1} errors)." -msgstr "" +msgstr "Resembrar: buscando informaciones de routers desde la URL sembradora ({0} exitosas, {1} errores)." -#: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:513 +#: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:512 msgid "NetDb entry" -msgstr "" +msgstr "Entrada de la NetDb" -#. This used to be "no common transports" but it is almost always no transports at all +#. This used to be "no common transports" but it is almost always no +#. transports at all #: ../../../router/java/src/net/i2p/router/transport/GetBidsJob.java:70 msgid "No transports (hidden or starting up?)" -msgstr "" +msgstr "No hay transportes (oculto o iniciando?)" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:452 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:450 msgid "Unreachable on any transport" -msgstr "" +msgstr "Inalcanzable en cualquier transporte" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:501 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:499 msgid "Router Transport Addresses" -msgstr "" +msgstr "Direcciones de transporte del router " -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:506 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:504 #, java-format msgid "{0} is used for outbound connections only" -msgstr "" +msgstr "{0} se utiliza sólo para conexiones salientes" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:520 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:518 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:129 msgid "Help" -msgstr "" +msgstr "Ayuda" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:521 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:519 msgid "Your transport connection limits are automatically set based on your configured bandwidth." -msgstr "" +msgstr "Los lÃmites de conexiones de transporte se ajustan automáticamente basándose en el ancho de banda configurado." -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:523 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:521 msgid "To override these limits, add the settings i2np.ntcp.maxConnections=nnn and i2np.udp.maxConnections=nnn on the advanced configuration page." -msgstr "" +msgstr "Para sobreescribir estos lÃmites, se deben agregar los comandos i2np.ntcp.maxConnections = nnn y i2np.udp.maxConnections = nnn en la página de configuración avanzada." -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:525 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:257 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:523 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258 msgid "Definitions" msgstr "Definiciones" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:526 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:735 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1891 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1890 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:24 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:33 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:35 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:81 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:187 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:189 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:238 msgid "Peer" msgstr "Par" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:526 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524 msgid "The remote peer, identified by router hash" -msgstr "" +msgstr "El par remoto, identificado por el hash del router" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:527 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:525 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:736 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1895 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1894 msgid "Dir" -msgstr "" +msgstr "Dir" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:528 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:526 msgid "Inbound connection" msgstr "Conexión entrante" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:530 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:528 msgid "Outbound connection" msgstr "Conexión saliente" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:532 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:530 msgid "They offered to introduce us (help other peers traverse our firewall)" -msgstr "" +msgstr "Se han ofrecido a introducirnos (a ayudar a otros pares a atravesar nuestro cortafuegos)" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:532 msgid "We offered to introduce them (help other peers traverse their firewall)" -msgstr "" +msgstr "Nos hemos ofrecido a introducirlos (a ayudar a otros compañeros a atravesar su cortafuegos)" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533 msgid "How long since a packet has been received / sent" -msgstr "" +msgstr "Cuánto tiempo hace que un paquete ha sido recibido / enviado" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:737 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1896 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1895 msgid "Idle" -msgstr "" +msgstr "inactivo" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:738 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1901 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1900 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:156 msgid "In/Out" msgstr "Entrante/Saliente" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534 msgid "The smoothed inbound / outbound transfer rate (KBytes per second)" -msgstr "" +msgstr "Tasa de transferencia de entrada / salida (KBytes por segundo)" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535 msgid "How long ago this connection was established" -msgstr "" +msgstr "Cuánto tiempo hace que se estableció esta conexión" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:739 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1906 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1905 msgid "Up" -msgstr "" +msgstr "Subida" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:740 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1908 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1907 msgid "Skew" -msgstr "" +msgstr "Desincronización" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536 msgid "The difference between the peer's clock and your own" -msgstr "" +msgstr "La diferencia entre el reloj del par y el tuyo" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537 msgid "The congestion window, which is how many bytes can be sent without an acknowledgement" -msgstr "" +msgstr "El rango de congestión, que es la cantidad de bytes que se pueden enviar sin recibir confirmación" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:540 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538 msgid "The number of sent messages awaiting acknowledgement" -msgstr "" +msgstr "El número de mensajes enviados a la espera de confirmación" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539 msgid "The maximum number of concurrent messages to send" -msgstr "" +msgstr "El número máximo de mensajes simultáneos para enviar" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:542 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:540 msgid "The number of pending sends which exceed congestion window" -msgstr "" +msgstr "El número de envÃos pendientes que superen el rango de congestión" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541 msgid "The slow start threshold" -msgstr "" +msgstr "El umbral de incicio lento" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:542 msgid "The round trip time in milliseconds" -msgstr "" +msgstr "El tiempo de ida y vuelta en milisegundos" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1918 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1917 msgid "Dev" -msgstr "" +msgstr "Dev" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543 msgid "The standard deviation of the round trip time in milliseconds" -msgstr "" +msgstr "La desviación estándar del tiempo de ida y vuelta en milisegundos" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544 msgid "The retransmit timeout in milliseconds" -msgstr "" +msgstr "El tiempo de vencimiento de la retransmisión en milisegundos" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545 msgid "Current maximum send packet size / estimated maximum receive packet size (bytes)" -msgstr "" +msgstr "Tamaño máximo actual de envÃo de paquetes / tamaño máximo estimado de paquetes entrantes (bytes)" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:741 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1925 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1924 msgid "TX" -msgstr "" +msgstr "TX" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546 msgid "The total number of packets sent to the peer" -msgstr "" +msgstr "El número total de paquetes enviados al par" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547 #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:742 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1927 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1926 msgid "RX" -msgstr "" +msgstr "RX" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547 msgid "The total number of packets received from the peer" -msgstr "" +msgstr "El número total de paquetes recibidos del par" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:550 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1930 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1929 msgid "Dup TX" -msgstr "" +msgstr "TX dup" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:550 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548 msgid "The total number of packets retransmitted to the peer" -msgstr "" +msgstr "El número total de paquetes retransmitidos al par" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:551 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1932 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1931 msgid "Dup RX" -msgstr "" +msgstr "RX dup" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:551 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549 msgid "The total number of duplicate packets received from the peer" -msgstr "" +msgstr "El número total de paquetes duplicados recibidos de los pares" #: ../../../router/java/src/net/i2p/router/transport/ntcp/EstablishState.java:409 #: ../../../router/java/src/net/i2p/router/transport/ntcp/EstablishState.java:627 #, java-format msgid "Excessive clock skew: {0}" -msgstr "" +msgstr "Desincronización excesiva del reloj: {0}" #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:730 msgid "NTCP connections" -msgstr "conexiones NTCP" +msgstr "Conexiones NTCP" #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:731 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1887 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1886 msgid "Limit" -msgstr "" +msgstr "LÃmite" #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:732 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1888 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1887 msgid "Timeout" -msgstr "" +msgstr "Tiempo de espera" #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:743 msgid "Out Queue" -msgstr "" +msgstr "cola de salida" #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:744 msgid "Backlogged?" -msgstr "" +msgstr "Atrasadas?" #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:758 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1950 -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1949 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:87 msgid "Inbound" msgstr "Entrante" #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:760 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1952 -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1951 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:87 msgid "Outbound" msgstr "Saliente" #. buf.append("<tr> <td colspan=\"11\"><hr></td></tr>\n"); #: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:807 msgid "peers" -msgstr "Pares" +msgstr "pares" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1886 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1885 msgid "UDP connections" msgstr "conexiones UDP" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1893 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1892 msgid "Sort by peer hash" -msgstr "" +msgstr "Ordenar por hash" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1895 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1894 msgid "Direction/Introduction" -msgstr "" +msgstr "Dirección/Introducción" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1897 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1896 msgid "Sort by idle inbound" -msgstr "" +msgstr "Ordenar por inactividad de entrada" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1899 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1898 msgid "Sort by idle outbound" -msgstr "" +msgstr "Ordenar por inactividad de salida" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1902 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1901 msgid "Sort by inbound rate" -msgstr "" +msgstr "Ordenar por tasa de entrada" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1904 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1903 msgid "Sort by outbound rate" -msgstr "" +msgstr "Ordenar por tasa de salida" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1907 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1906 msgid "Sort by connection uptime" -msgstr "" +msgstr "Ordenar por el tiempo de actividad" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1909 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1908 msgid "Sort by clock skew" -msgstr "" +msgstr "Ordenar por desviación de reloj" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1912 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1911 msgid "Sort by congestion window" -msgstr "" +msgstr "Ordenar por ventana de congestión" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1914 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1913 msgid "Sort by slow start threshold" -msgstr "" +msgstr "Ordenar por umbral de inicio lento" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1917 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1916 msgid "Sort by round trip time" -msgstr "" +msgstr "Ordenar por el tiempo de ida y vuelta" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1919 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1918 msgid "Sort by round trip time deviation" -msgstr "" +msgstr "Ordenar por desviación de tiempo de ida y vuelta" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1921 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1920 msgid "Sort by retransmission timeout" -msgstr "" +msgstr "Ordenar por tiempo de espera de retransmisión" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1924 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1923 msgid "Sort by outbound maximum transmit unit" -msgstr "" +msgstr "Ordenar por unidad de transmisión máxima de salida" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1926 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1925 msgid "Sort by packets sent" -msgstr "" +msgstr "Ordenar por paquetes enviados" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1928 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1927 msgid "Sort by packets received" -msgstr "" +msgstr "Ordenar por paquetes recibidos" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1931 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1930 msgid "Sort by packets retransmitted" -msgstr "" +msgstr "Ordenar por paquetes retransmitidos" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1933 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1932 msgid "Sort by packets received more than once" -msgstr "" +msgstr "Ordenar por paquetes recibidos más de una vez" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1954 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1953 msgid "We offered to introduce them" -msgstr "" +msgstr "Nos hemos ofrecido a introducirlos" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1956 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1955 msgid "They offered to introduce us" -msgstr "" +msgstr "Se han ofrecido a introducirnos" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1960 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1959 msgid "Choked" -msgstr "" +msgstr "Atascado" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1968 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1967 msgid "1 fail" -msgstr "" +msgstr "1 fallo" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1970 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1969 #, java-format msgid "{0} fails" -msgstr "" +msgstr "{0} fallos" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1976 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1975 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:162 msgid "Banned" -msgstr "" +msgstr "Baneado" #. buf.append("<tr><td colspan=\"16\"><hr></td></tr>\n"); -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2107 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2106 msgid "SUMMARY" -msgstr "" +msgstr "RESUMEN" -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:145 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:124 msgid "Dropping tunnel requests: Too slow" -msgstr "" +msgstr "Descartando túneles: Demasiado lento" #. don't even bother, since we are so overloaded locally -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:352 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:267 msgid "Dropping tunnel requests: Overloaded" -msgstr "" +msgstr "Descartando solicitudes de túnel: sobrecarga" -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:525 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:470 msgid "Rejecting tunnels: Request overload" -msgstr "" +msgstr "Rechazando túneles: Sobrecarga de solicitudes" -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:550 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:495 msgid "Rejecting tunnels: Connection limit" -msgstr "" +msgstr "Rechazando túneles: LÃmite de conexión" -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:744 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:695 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:716 msgid "Dropping tunnel requests: High load" -msgstr "" +msgstr "Descartando solicitudes de túnel: Carga alta" -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:753 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:708 msgid "Dropping tunnel requests: Queue time" -msgstr "" +msgstr "Descartando solicitudes de túnel: Tiempo de cola" #. Automatically generated pseudo-java for xgettext - do not edit -#. Translators may wish to translate a few of these, do not bother to translate all of them!! +#. Translators may wish to translate a few of these, do not bother to +#. translate all of them!! #: ../java/build/Countries.java:3 msgid "Andorra" -msgstr "Andorre" +msgstr "Andorra" #: ../java/build/Countries.java:4 msgid "United Arab Emirates" -msgstr "" +msgstr "Emiratos Ãrabes Unidos" #: ../java/build/Countries.java:5 msgid "Afghanistan" -msgstr "" +msgstr "Afganistán" #: ../java/build/Countries.java:6 msgid "Antigua and Barbuda" -msgstr "" +msgstr "Antigua y Barbuda" #: ../java/build/Countries.java:7 msgid "Anguilla" -msgstr "" +msgstr "Anguila" #: ../java/build/Countries.java:8 msgid "Albania" @@ -575,19 +592,19 @@ msgstr "Albania" #: ../java/build/Countries.java:9 msgid "Armenia" -msgstr "" +msgstr "Armenia" #: ../java/build/Countries.java:10 msgid "Netherlands Antilles" -msgstr "" +msgstr "Antillas Holandesas" #: ../java/build/Countries.java:11 msgid "Angola" -msgstr "" +msgstr "Angola" #: ../java/build/Countries.java:12 msgid "Antarctica" -msgstr "" +msgstr "La Antártida" #: ../java/build/Countries.java:13 msgid "Argentina" @@ -595,7 +612,7 @@ msgstr "Argentina" #: ../java/build/Countries.java:14 msgid "American Samoa" -msgstr "" +msgstr "Samoa Americana" #: ../java/build/Countries.java:15 msgid "Austria" @@ -603,227 +620,227 @@ msgstr "Austria" #: ../java/build/Countries.java:16 msgid "Australia" -msgstr "" +msgstr "Australia" #: ../java/build/Countries.java:17 msgid "Aruba" -msgstr "" +msgstr "Aruba" #: ../java/build/Countries.java:19 msgid "Azerbaijan" -msgstr "" +msgstr "Azerbaiyán" #: ../java/build/Countries.java:20 msgid "Bosnia and Herzegovina" -msgstr "" +msgstr "Bosnia y Herzegovina" #: ../java/build/Countries.java:21 msgid "Barbados" -msgstr "" +msgstr "Barbados" #: ../java/build/Countries.java:22 msgid "Bangladesh" -msgstr "" +msgstr "Bangladesh" #: ../java/build/Countries.java:23 msgid "Belgium" -msgstr "" +msgstr "Bélgica" #: ../java/build/Countries.java:24 msgid "Burkina Faso" -msgstr "" +msgstr "Burkina Fasso" #: ../java/build/Countries.java:25 msgid "Bulgaria" -msgstr "" +msgstr "Bulgaria" #: ../java/build/Countries.java:26 msgid "Bahrain" -msgstr "" +msgstr "Bahrein" #: ../java/build/Countries.java:27 msgid "Burundi" -msgstr "" +msgstr "Burundi" #: ../java/build/Countries.java:28 msgid "Benin" -msgstr "" +msgstr "Benin" #: ../java/build/Countries.java:29 msgid "Bermuda" -msgstr "" +msgstr "Bermudas" #: ../java/build/Countries.java:30 msgid "Brunei Darussalam" -msgstr "" +msgstr "Brunei Darussalam" #: ../java/build/Countries.java:31 msgid "Bolivia" -msgstr "" +msgstr "Bolivia" #: ../java/build/Countries.java:32 msgid "Brazil" -msgstr "" +msgstr "Brasil" #: ../java/build/Countries.java:33 msgid "Bahamas" -msgstr "" +msgstr "Bahamas" #: ../java/build/Countries.java:34 msgid "Bhutan" -msgstr "" +msgstr "Bhután" #: ../java/build/Countries.java:35 msgid "Bouvet Island" -msgstr "" +msgstr "Isla Bouvet" #: ../java/build/Countries.java:36 msgid "Botswana" -msgstr "" +msgstr "Botswana" #: ../java/build/Countries.java:37 msgid "Belarus" -msgstr "" +msgstr "Bielorrusia" #: ../java/build/Countries.java:38 msgid "Belize" -msgstr "" +msgstr "Belice" #: ../java/build/Countries.java:39 msgid "Canada" -msgstr "" +msgstr "Canadá" #: ../java/build/Countries.java:40 msgid "The Democratic Republic of the Congo" -msgstr "" +msgstr "República Democrática del Congo" #: ../java/build/Countries.java:41 msgid "Central African Republic" -msgstr "" +msgstr "República Centroafricana" #: ../java/build/Countries.java:42 msgid "Congo" -msgstr "" +msgstr "Congo" #: ../java/build/Countries.java:43 msgid "Switzerland" -msgstr "" +msgstr "Suiza" #: ../java/build/Countries.java:44 msgid "Cote D'Ivoire" -msgstr "" +msgstr "Costa de Marfil" #: ../java/build/Countries.java:45 msgid "Cook Islands" -msgstr "" +msgstr "Islas Cook" #: ../java/build/Countries.java:46 msgid "Chile" -msgstr "" +msgstr "Chile" #: ../java/build/Countries.java:47 msgid "Cameroon" -msgstr "" +msgstr "Camerún" #: ../java/build/Countries.java:48 msgid "China" -msgstr "" +msgstr "China" #: ../java/build/Countries.java:49 msgid "Colombia" -msgstr "" +msgstr "Colombia" #: ../java/build/Countries.java:50 msgid "Costa Rica" -msgstr "" +msgstr "Costa Rica" #: ../java/build/Countries.java:51 msgid "Serbia and Montenegro" -msgstr "" +msgstr "Serbia y Montenegro" #: ../java/build/Countries.java:52 msgid "Cuba" -msgstr "" +msgstr "Cuba" #: ../java/build/Countries.java:53 msgid "Cape Verde" -msgstr "" +msgstr "Cabo Verde" #: ../java/build/Countries.java:54 msgid "Cyprus" -msgstr "" +msgstr "Chipre" #: ../java/build/Countries.java:55 msgid "Czech Republic" -msgstr "" +msgstr "República Checa" #: ../java/build/Countries.java:56 msgid "Germany" -msgstr "Allemania" +msgstr "Alemania" #: ../java/build/Countries.java:57 msgid "Djibouti" -msgstr "" +msgstr "Djibouti" #: ../java/build/Countries.java:58 msgid "Denmark" -msgstr "" +msgstr "Dinamarca" #: ../java/build/Countries.java:59 msgid "Dominica" -msgstr "" +msgstr "Dominica" #: ../java/build/Countries.java:60 msgid "Dominican Republic" -msgstr "" +msgstr "República Dominicana" #: ../java/build/Countries.java:61 msgid "Algeria" -msgstr "" +msgstr "Argelia" #: ../java/build/Countries.java:62 msgid "Ecuador" -msgstr "" +msgstr "Ecuador" #: ../java/build/Countries.java:63 msgid "Estonia" -msgstr "" +msgstr "Estonia" #: ../java/build/Countries.java:64 msgid "Egypt" -msgstr "" +msgstr "Egipto" #: ../java/build/Countries.java:65 msgid "Eritrea" -msgstr "" +msgstr "Eritrea" #: ../java/build/Countries.java:66 msgid "Spain" -msgstr "" +msgstr "España" #: ../java/build/Countries.java:67 msgid "Ethiopia" -msgstr "" +msgstr "EtiopÃa" #: ../java/build/Countries.java:68 msgid "Finland" -msgstr "" +msgstr "Finlandia" #: ../java/build/Countries.java:69 msgid "Fiji" -msgstr "" +msgstr "Fiji" #: ../java/build/Countries.java:70 msgid "Falkland Islands (Malvinas)" -msgstr "" +msgstr "Islas Malvinas" #: ../java/build/Countries.java:71 msgid "Federated States of Micronesia" -msgstr "" +msgstr "Estados Federados de Micronesia" #: ../java/build/Countries.java:72 msgid "Faroe Islands" -msgstr "" +msgstr "Islas Feroe" #: ../java/build/Countries.java:73 msgid "France" @@ -831,660 +848,661 @@ msgstr "Francia" #: ../java/build/Countries.java:74 msgid "Gabon" -msgstr "" +msgstr "Gabón" #: ../java/build/Countries.java:75 msgid "United Kingdom" -msgstr "" +msgstr "Reino Unido" #: ../java/build/Countries.java:76 msgid "Grenada" -msgstr "" +msgstr "Granada" #: ../java/build/Countries.java:77 msgid "Georgia" -msgstr "" +msgstr "Georgia" #: ../java/build/Countries.java:78 msgid "French Guiana" -msgstr "" +msgstr "Guayana Francesa" #: ../java/build/Countries.java:79 msgid "Ghana" -msgstr "" +msgstr "Ghana" #: ../java/build/Countries.java:80 msgid "Gibraltar" -msgstr "" +msgstr "Gibraltar" #: ../java/build/Countries.java:81 msgid "Greenland" -msgstr "" +msgstr "Groenlandia" #: ../java/build/Countries.java:82 msgid "Gambia" -msgstr "" +msgstr "Gambia" #: ../java/build/Countries.java:83 msgid "Guinea" -msgstr "" +msgstr "Guinea" #: ../java/build/Countries.java:84 msgid "Guadeloupe" -msgstr "" +msgstr "Guadalupe" #: ../java/build/Countries.java:85 msgid "Equatorial Guinea" -msgstr "" +msgstr "Guinea Ecuatorial" #: ../java/build/Countries.java:86 msgid "Greece" -msgstr "" +msgstr "Grecia" #: ../java/build/Countries.java:87 msgid "South Georgia and the South Sandwich Islands" -msgstr "" +msgstr "Georgia del Sur e Islas Sandwich del Sur" #: ../java/build/Countries.java:88 msgid "Guatemala" -msgstr "" +msgstr "Guatemala" #: ../java/build/Countries.java:89 msgid "Guam" -msgstr "" +msgstr "Guam" #: ../java/build/Countries.java:90 msgid "Guinea-Bissau" -msgstr "" +msgstr "Guinea-Bissau" #: ../java/build/Countries.java:91 msgid "Guyana" -msgstr "" +msgstr "Guyana" #: ../java/build/Countries.java:92 msgid "Hong Kong" -msgstr "" +msgstr "Hong Kong" #: ../java/build/Countries.java:93 msgid "Honduras" -msgstr "" +msgstr "Honduras" #: ../java/build/Countries.java:94 msgid "Croatia" -msgstr "" +msgstr "Croacia" #: ../java/build/Countries.java:95 msgid "Haiti" -msgstr "" +msgstr "HaitÃ" #: ../java/build/Countries.java:96 msgid "Hungary" -msgstr "" +msgstr "HungrÃa" #: ../java/build/Countries.java:97 msgid "Indonesia" -msgstr "" +msgstr "Indonesia" #: ../java/build/Countries.java:98 msgid "Ireland" -msgstr "" +msgstr "Irlanda" #: ../java/build/Countries.java:99 msgid "Israel" -msgstr "" +msgstr "Israel" #: ../java/build/Countries.java:101 msgid "India" -msgstr "" +msgstr "India" #: ../java/build/Countries.java:102 msgid "British Indian Ocean Territory" -msgstr "" +msgstr "Territorio Británico del Océano" #: ../java/build/Countries.java:103 msgid "Iraq" -msgstr "" +msgstr "Irak" #: ../java/build/Countries.java:104 msgid "Islamic Republic of Iran" -msgstr "" +msgstr "República Islámica de Irán" #: ../java/build/Countries.java:105 msgid "Iceland" -msgstr "" +msgstr "Islandia" #: ../java/build/Countries.java:106 msgid "Italy" -msgstr "" +msgstr "Italia" #: ../java/build/Countries.java:108 msgid "Jamaica" -msgstr "" +msgstr "Jamaica" #: ../java/build/Countries.java:109 msgid "Jordan" -msgstr "" +msgstr "Jordania" #: ../java/build/Countries.java:110 msgid "Japan" -msgstr "" +msgstr "Japón" #: ../java/build/Countries.java:111 msgid "Kenya" -msgstr "" +msgstr "Kenya" #: ../java/build/Countries.java:112 msgid "Kyrgyzstan" -msgstr "" +msgstr "Kirguistán" #: ../java/build/Countries.java:113 msgid "Cambodia" -msgstr "" +msgstr "Camboya" #: ../java/build/Countries.java:114 msgid "Kiribati" -msgstr "" +msgstr "Kiribati" #: ../java/build/Countries.java:115 msgid "Comoros" -msgstr "" +msgstr "Comoras" #: ../java/build/Countries.java:116 msgid "Saint Kitts and Nevis" -msgstr "" +msgstr "Saint Kitts y Nevis" #: ../java/build/Countries.java:117 msgid "Republic of Korea" -msgstr "" +msgstr "República de Corea" #: ../java/build/Countries.java:118 msgid "Kuwait" -msgstr "" +msgstr "Kuwait" #: ../java/build/Countries.java:119 msgid "Cayman Islands" -msgstr "" +msgstr "Islas Caimán" #: ../java/build/Countries.java:120 msgid "Kazakhstan" -msgstr "" +msgstr "Kazajstán" #: ../java/build/Countries.java:121 msgid "Lao People's Democratic Republic" -msgstr "" +msgstr "República Democrática Popular Lao" #: ../java/build/Countries.java:122 msgid "Lebanon" -msgstr "" +msgstr "LÃbano" #: ../java/build/Countries.java:123 msgid "Saint Lucia" -msgstr "" +msgstr "Santa LucÃa" #: ../java/build/Countries.java:124 msgid "Liechtenstein" -msgstr "" +msgstr "Liechtenstein" #: ../java/build/Countries.java:125 msgid "Sri Lanka" -msgstr "" +msgstr "Sri Lanka" #: ../java/build/Countries.java:126 msgid "Liberia" -msgstr "" +msgstr "Liberia" #: ../java/build/Countries.java:127 msgid "Lesotho" -msgstr "" +msgstr "Lesotho" #: ../java/build/Countries.java:128 msgid "Lithuania" -msgstr "" +msgstr "Lituania" #: ../java/build/Countries.java:129 msgid "Luxembourg" -msgstr "" +msgstr "Luxemburgo" #: ../java/build/Countries.java:130 msgid "Latvia" -msgstr "" +msgstr "Letonia" #: ../java/build/Countries.java:131 msgid "Libyan Arab Jamahiriya" -msgstr "" +msgstr "Jamahiriya Ãrabe Libia" #: ../java/build/Countries.java:132 msgid "Morocco" -msgstr "" +msgstr "Marruecos" #: ../java/build/Countries.java:133 msgid "Monaco" -msgstr "" +msgstr "Mónaco" #: ../java/build/Countries.java:134 msgid "Republic of Moldova" -msgstr "" +msgstr "República de Moldavia" #: ../java/build/Countries.java:137 msgid "Madagascar" -msgstr "" +msgstr "Madagascar" #: ../java/build/Countries.java:138 msgid "Marshall Islands" -msgstr "" +msgstr "Las Islas Marshall" #: ../java/build/Countries.java:139 msgid "The Former Yugoslav Republic of Macedonia" -msgstr "" +msgstr "La Antigua República Yugoslava de Macedonia" #: ../java/build/Countries.java:140 msgid "Mali" -msgstr "" +msgstr "MalÃ" #: ../java/build/Countries.java:141 msgid "Myanmar" -msgstr "" +msgstr "Myanmar" #: ../java/build/Countries.java:142 msgid "Mongolia" -msgstr "" +msgstr "Mongolia" #: ../java/build/Countries.java:143 msgid "Macao" -msgstr "" +msgstr "Macao" #: ../java/build/Countries.java:144 msgid "Northern Mariana Islands" -msgstr "" +msgstr "Islas Marianas del Norte" #: ../java/build/Countries.java:145 msgid "Martinique" -msgstr "" +msgstr "Martinica" #: ../java/build/Countries.java:146 msgid "Mauritania" -msgstr "" +msgstr "Mauritania" #: ../java/build/Countries.java:147 msgid "Montserrat" -msgstr "" +msgstr "Montserrat" #: ../java/build/Countries.java:148 msgid "Malta" -msgstr "" +msgstr "Malta" #: ../java/build/Countries.java:149 msgid "Mauritius" -msgstr "" +msgstr "Mauricio" #: ../java/build/Countries.java:150 msgid "Maldives" -msgstr "" +msgstr "Maldivas" #: ../java/build/Countries.java:151 msgid "Malawi" -msgstr "" +msgstr "Malawi" #: ../java/build/Countries.java:152 msgid "Mexico" -msgstr "" +msgstr "México" #: ../java/build/Countries.java:153 msgid "Malaysia" -msgstr "" +msgstr "Malasia" #: ../java/build/Countries.java:154 msgid "Mozambique" -msgstr "" +msgstr "Mozambique" #: ../java/build/Countries.java:155 msgid "Namibia" -msgstr "" +msgstr "Namibia" #: ../java/build/Countries.java:156 msgid "New Caledonia" -msgstr "" +msgstr "Nueva Caledonia" #: ../java/build/Countries.java:157 msgid "Niger" -msgstr "" +msgstr "NÃger" #: ../java/build/Countries.java:158 msgid "Norfolk Island" -msgstr "" +msgstr "Isla Norfolk" #: ../java/build/Countries.java:159 msgid "Nigeria" -msgstr "" +msgstr "Nigeria" #: ../java/build/Countries.java:160 msgid "Nicaragua" -msgstr "" +msgstr "Nicaragua" #: ../java/build/Countries.java:161 msgid "Netherlands" -msgstr "" +msgstr "PaÃses Bajos" #: ../java/build/Countries.java:162 msgid "Norway" -msgstr "" +msgstr "Noruega" #: ../java/build/Countries.java:163 msgid "Nepal" -msgstr "" +msgstr "Nepal" #: ../java/build/Countries.java:164 msgid "Nauru" -msgstr "" +msgstr "Nauru" #: ../java/build/Countries.java:165 msgid "Niue" -msgstr "" +msgstr "Niue" #: ../java/build/Countries.java:166 msgid "New Zealand" -msgstr "" +msgstr "Nueva Zelanda" #: ../java/build/Countries.java:167 msgid "Oman" -msgstr "" +msgstr "Omán" #: ../java/build/Countries.java:168 msgid "Panama" -msgstr "" +msgstr "Panamá" #: ../java/build/Countries.java:169 msgid "Peru" -msgstr "" +msgstr "Perú" #: ../java/build/Countries.java:170 msgid "French Polynesia" -msgstr "" +msgstr "Polinesia francésa" #: ../java/build/Countries.java:171 msgid "Papua New Guinea" -msgstr "" +msgstr "Papua Nueva Guinea" #: ../java/build/Countries.java:172 msgid "Philippines" -msgstr "" +msgstr "Filipinas" #: ../java/build/Countries.java:173 msgid "Pakistan" -msgstr "" +msgstr "Pakistán" #: ../java/build/Countries.java:174 msgid "Poland" -msgstr "" +msgstr "Polonia" #: ../java/build/Countries.java:175 msgid "Saint Pierre and Miquelon" -msgstr "" +msgstr "San Pedro y Miquelón" #: ../java/build/Countries.java:176 msgid "Puerto Rico" -msgstr "" +msgstr "Puerto Rico" #: ../java/build/Countries.java:177 msgid "Palestinian Territory" -msgstr "" +msgstr "Territorio Palestino" #: ../java/build/Countries.java:178 msgid "Portugal" -msgstr "" +msgstr "Portugal" #: ../java/build/Countries.java:179 msgid "Palau" -msgstr "" +msgstr "Palau" #: ../java/build/Countries.java:180 msgid "Paraguay" -msgstr "" +msgstr "Paraguay" #: ../java/build/Countries.java:181 msgid "Qatar" -msgstr "" +msgstr "Qatar" #: ../java/build/Countries.java:182 msgid "Reunion" -msgstr "" +msgstr "Reunión" #: ../java/build/Countries.java:183 msgid "Romania" -msgstr "" +msgstr "Rumania" #: ../java/build/Countries.java:184 msgid "Serbia" -msgstr "" +msgstr "Serbia" #: ../java/build/Countries.java:185 msgid "Russian Federation" -msgstr "" +msgstr "Federación de Rusia" #: ../java/build/Countries.java:186 msgid "Rwanda" -msgstr "" +msgstr "Ruanda" #: ../java/build/Countries.java:187 msgid "Saudi Arabia" -msgstr "" +msgstr "Arabia SaudÃ" #: ../java/build/Countries.java:188 msgid "Solomon Islands" -msgstr "" +msgstr "Islas Salomón" #: ../java/build/Countries.java:189 msgid "Seychelles" -msgstr "" +msgstr "Seychelles" #: ../java/build/Countries.java:190 msgid "Sudan" -msgstr "" +msgstr "Sudán" #: ../java/build/Countries.java:191 msgid "Sweden" -msgstr "" +msgstr "Suecia" #: ../java/build/Countries.java:192 msgid "Singapore" -msgstr "" +msgstr "Singapur" #: ../java/build/Countries.java:193 msgid "Slovenia" -msgstr "" +msgstr "Eslovenia" #: ../java/build/Countries.java:194 msgid "Slovakia" -msgstr "" +msgstr "Eslovaquia" #: ../java/build/Countries.java:195 msgid "Sierra Leone" -msgstr "" +msgstr "Sierra Leona" #: ../java/build/Countries.java:196 msgid "San Marino" -msgstr "" +msgstr "San Marino" #: ../java/build/Countries.java:197 msgid "Senegal" -msgstr "" +msgstr "Senegal" #: ../java/build/Countries.java:198 msgid "Somalia" -msgstr "" +msgstr "Somalia" #: ../java/build/Countries.java:199 msgid "Suriname" -msgstr "" +msgstr "Surinam" #: ../java/build/Countries.java:200 msgid "Sao Tome and Principe" -msgstr "" +msgstr "Santo Tomé y PrÃncipe" #: ../java/build/Countries.java:201 msgid "El Salvador" -msgstr "" +msgstr "El Salvador" #: ../java/build/Countries.java:202 msgid "Syrian Arab Republic" -msgstr "" +msgstr "República Ãrabe Siria" #: ../java/build/Countries.java:203 msgid "Swaziland" -msgstr "" +msgstr "Swazilandia" #: ../java/build/Countries.java:204 msgid "Turks and Caicos Islands" -msgstr "" +msgstr "Islas Turcas y Caicos" #: ../java/build/Countries.java:205 msgid "Chad" -msgstr "" +msgstr "Chad" #: ../java/build/Countries.java:206 msgid "French Southern Territories" -msgstr "" +msgstr "Sur de Francia" #: ../java/build/Countries.java:207 msgid "Togo" -msgstr "" +msgstr "Togo" #: ../java/build/Countries.java:208 msgid "Thailand" -msgstr "" +msgstr "Tailandia" #: ../java/build/Countries.java:209 msgid "Tajikistan" -msgstr "" +msgstr "Tayikistán" #: ../java/build/Countries.java:210 msgid "Tokelau" -msgstr "" +msgstr "Tokelau" #: ../java/build/Countries.java:211 msgid "Timor-Leste" -msgstr "" +msgstr "Timor-Leste" #: ../java/build/Countries.java:212 msgid "Turkmenistan" -msgstr "" +msgstr "Turkmenistán" #: ../java/build/Countries.java:213 msgid "Tunisia" -msgstr "" +msgstr "Túnez" #: ../java/build/Countries.java:214 msgid "Tonga" -msgstr "" +msgstr "Tonga" #: ../java/build/Countries.java:215 msgid "Turkey" -msgstr "" +msgstr "TurquÃa" #: ../java/build/Countries.java:216 msgid "Trinidad and Tobago" -msgstr "" +msgstr "Trinidad y Tobago" #: ../java/build/Countries.java:217 msgid "Tuvalu" -msgstr "" +msgstr "Tuvalu" #: ../java/build/Countries.java:218 msgid "Taiwan" -msgstr "" +msgstr "Taiwan" #: ../java/build/Countries.java:219 msgid "United Republic of Tanzania" -msgstr "" +msgstr "República Unida de TanzanÃa" #: ../java/build/Countries.java:220 msgid "Ukraine" -msgstr "" +msgstr "Ucrania" #: ../java/build/Countries.java:221 msgid "Uganda" -msgstr "" +msgstr "Uganda" #: ../java/build/Countries.java:222 msgid "United States Minor Outlying Islands" -msgstr "" +msgstr "Islas Menores de Estados Unidos" #: ../java/build/Countries.java:223 msgid "United States" -msgstr "" +msgstr "Estados Unidos" #: ../java/build/Countries.java:224 msgid "Uruguay" -msgstr "" +msgstr "Uruguay" #: ../java/build/Countries.java:225 msgid "Uzbekistan" -msgstr "" +msgstr "Uzbekistán" #: ../java/build/Countries.java:226 msgid "Holy See (Vatican City State)" -msgstr "" +msgstr "Santa Sede (Ciudad del Vaticano)" #: ../java/build/Countries.java:227 msgid "Saint Vincent and the Grenadines" -msgstr "" +msgstr "San Vicente y las Granadinas" #: ../java/build/Countries.java:228 msgid "Venezuela" -msgstr "" +msgstr "Venezuela" #: ../java/build/Countries.java:229 #: ../java/build/Countries.java:230 msgid "Virgin Islands" -msgstr "" +msgstr "Islas VÃrgenes" #: ../java/build/Countries.java:231 msgid "Viet Nam" -msgstr "" +msgstr "Viet Nam" #: ../java/build/Countries.java:232 msgid "Vanuatu" -msgstr "" +msgstr "Vanuatu" #: ../java/build/Countries.java:233 msgid "Wallis and Futuna" -msgstr "" +msgstr "Wallis y Futuna" #: ../java/build/Countries.java:234 msgid "Samoa" -msgstr "" +msgstr "Samoa" #: ../java/build/Countries.java:235 msgid "Yemen" -msgstr "" +msgstr "Yemen" #: ../java/build/Countries.java:236 msgid "Mayotte" -msgstr "" +msgstr "Mayotte" #: ../java/build/Countries.java:237 msgid "South Africa" -msgstr "" +msgstr "Sudáfrica" #: ../java/build/Countries.java:238 msgid "Zambia" -msgstr "" +msgstr "Zambia" #: ../java/build/Countries.java:239 msgid "Zimbabwe" -msgstr "" +msgstr "Zimbabwe" -#: ../java/src/net/i2p/router/web/CSSHelper.java:57 +#: ../java/src/net/i2p/router/web/CSSHelper.java:60 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:35 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:37 #: ../java/strings/Strings.java:29 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:233 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:125 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:257 msgid "I2P Router Console" -msgstr "Console del Enrutador I2P" +msgstr "Consola del Router I2P" #: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:57 msgid "Error updating the configuration - please see the error logs" -msgstr "" +msgstr "Error al actualizar la configuración - por favor consulte los registros de errores" #: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:69 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:266 @@ -1494,83 +1512,83 @@ msgstr "Configuración guardada con éxito" #: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:71 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:268 msgid "Error saving the configuration (applied but not saved) - please see the error logs" -msgstr "" +msgstr "Error al guardar la configuración (aplicada pero no guardada) - por favor consulte los registros de errores" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:35 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:355 msgid "Save Client Configuration" msgstr "Guardar la configuración de clientes" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:39 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:405 -#, fuzzy +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:427 msgid "Save Interface Configuration" -msgstr "Guardar la configuración de clientes" +msgstr "Guardar configuración de interfaz" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:43 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:417 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:441 msgid "Save WebApp Configuration" -msgstr "" +msgstr "Guardar configuración de aplicaciones web" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:47 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:427 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:453 msgid "Save Plugin Configuration" -msgstr "" +msgstr "Guardar configuración de complementos" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:51 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:433 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:461 msgid "Install Plugin" -msgstr "" +msgstr "Instalar complemento" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:87 #, java-format msgid "Deleted plugin {0}" -msgstr "" +msgstr "Eliminado el complemento {0}" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:89 #, java-format msgid "Error deleting plugin {0}" -msgstr "" +msgstr "Error al eliminar el complemento {0}" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:101 #, java-format msgid "Stopped plugin {0}" -msgstr "" +msgstr "Detenido complemento {0}" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:103 #, java-format msgid "Error stopping plugin {0}" -msgstr "" +msgstr "Error al detener el complemento {0}" #. label (IE) #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:124 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:253 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:255 msgid "Start" msgstr "Lanzar" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:143 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:49 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:61 +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:33 msgid "Unsupported" -msgstr "" +msgstr "No soportado" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:189 msgid "New client added" -msgstr "" +msgstr "Nuevo cliente añadido" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:193 msgid "Client configuration saved successfully - restart required to take effect." -msgstr "" +msgstr "configuración de cliente guardada correctamente - Es necesario reiniciar para que los cambios surtan efecto." #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:207 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:218 msgid "Bad client index." -msgstr "" +msgstr "Ãndice de clientes en mal estado." #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:212 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:223 #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:397 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:392 #: ../java/src/net/i2p/router/web/SummaryHelper.java:384 msgid "Client" msgstr "Cliente" @@ -1582,24 +1600,24 @@ msgstr "lanzado" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:223 msgid "deleted" -msgstr "" +msgstr "eliminado" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:240 msgid "WebApp configuration saved." -msgstr "" +msgstr "configuración de aplicación Web guardada." #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:256 msgid "Plugin configuration saved." -msgstr "" +msgstr "configuración del complemento guardada." #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:271 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:122 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124 msgid "WebApp" -msgstr "" +msgstr "Aplicación Web" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:273 msgid "Failed to start" -msgstr "Fallido el lanzamiento" +msgstr "lanzamiento fallido" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:278 msgid "Failed to find server." @@ -1607,154 +1625,152 @@ msgstr "No se encontró el servidor" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:284 msgid "No plugin URL specified." -msgstr "" +msgstr "Ninguna URL de complementos especificada." #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:294 #, java-format msgid "No update URL specified for {0}" -msgstr "" +msgstr "Ninguna URL de actualización especificado para {0}" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:302 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:307 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:320 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:325 msgid "Plugin or update download already in progress." -msgstr "" +msgstr "Descarga del complemento o de la actualización ya en curso." #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:311 #: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:118 #, java-format msgid "Downloading plugin from {0}" -msgstr "" +msgstr "Descargar complemento de {0}" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:329 #, java-format msgid "Checking plugin {0} for updates" -msgstr "" +msgstr "Buscando actualizaciones para el complemento {0}" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:339 #, java-format msgid "Started plugin {0}" -msgstr "" +msgstr "Complemento {0} iniciado" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:341 #, java-format msgid "Error starting plugin {0}" -msgstr "" +msgstr "Error al iniciar el complemento {0}" #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:376 msgid "Interface configuration saved successfully - restart required to take effect." -msgstr "" +msgstr "configuración de interfaz guardada correctamente - Es necesario reiniciar para que los cambios surtan efecto." #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:85 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:256 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:258 msgid "Edit" -msgstr "" +msgstr "Editar" #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:94 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:331 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:351 msgid "Add Client" msgstr "Añadir cliente" #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102 msgid "Class and arguments" -msgstr "" +msgstr "Clase y argumentos" #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:122 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:146 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148 msgid "Control" -msgstr "" +msgstr "Control" #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:122 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:146 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148 msgid "Run at Startup?" msgstr "Lanzar al iniciarse?" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:122 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:146 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:195 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:197 msgid "Description" -msgstr "" +msgstr "Descripción" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:146 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148 msgid "Plugin" -msgstr "" +msgstr "Complemento" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:159 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:271 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:161 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:273 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:185 msgid "Version" msgstr "Versión" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:161 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:163 msgid "Signed by" -msgstr "" +msgstr "Firmado por" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:178 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:180 msgid "Date" msgstr "Fecha" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:184 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:186 msgid "Author" msgstr "Autor" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:200 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:202 msgid "License" -msgstr "" +msgstr "Licencia" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:205 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:207 msgid "Website" -msgstr "" +msgstr "Sitio web" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:210 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:212 msgid "Update link" msgstr "Enlace para actualizaciones" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:258 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:260 msgid "Stop" -msgstr "" +msgstr "Detener" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:260 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:262 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:78 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:313 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:331 msgid "Check for updates" msgstr "Buscar actualizaciones" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:261 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:263 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:235 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:242 msgid "Update" msgstr "Actualización" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:266 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:268 #, java-format msgid "Are you sure you want to delete {0}?" -msgstr "" +msgstr "¿Está seguro que desea eliminar {0}?" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:268 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:270 msgid "Delete" msgstr "Borrar" #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:18 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:325 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:343 msgid "Add key" msgstr "Añadir clave" #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:19 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:323 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:341 msgid "Delete key" msgstr "Borrar clave" #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:21 msgid "You must enter a destination" -msgstr "¡Tienes que entrar un destino!" +msgstr "Tienes que introducir un destino" #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:23 msgid "You must enter a key" -msgstr "Tienes que entrar una clave" +msgstr "Tienes que introducir una clave" #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:34 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:41 @@ -1768,7 +1784,7 @@ msgstr "añadida al llavero" #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:36 msgid "Invalid destination or key" -msgstr "" +msgstr "Clave de destino o llave no válida" #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:41 msgid "removed from keyring" @@ -1784,43 +1800,43 @@ msgstr "Destino no válido" #: ../java/src/net/i2p/router/web/ConfigLoggingHandler.java:82 msgid "Log overrides updated" -msgstr "" +msgstr "Reemplazos del registro actualizados" #: ../java/src/net/i2p/router/web/ConfigLoggingHandler.java:160 msgid "Log configuration saved" -msgstr "Guardados los ajustes de registros" +msgstr "Guardados los ajustes de los registros" #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:48 msgid "Add additional logging statements above. Example: net.i2p.router.tunnel=WARN" -msgstr "" +msgstr "Añadir nuevos argumentos para el registro arriba. Ejemplo: net.i2p.router.tunnel=WARN" #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:49 msgid "Or put entries in the logger.config file. Example: logger.record.net.i2p.router.tunnel=WARN" -msgstr "" +msgstr "O añadir nuevos argumentos en el archivo logger.config Ejemplo: logger.record.net.i2p.router.tunnel =WARN" #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:50 msgid "Valid levels are DEBUG, INFO, WARN, ERROR, CRIT" -msgstr "" +msgstr "Los niveles válidos son DEBUG, INFO, WARN, ERROR, CRIT" #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68 msgid "CRIT" -msgstr "" +msgstr "CRIT" #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68 msgid "DEBUG" -msgstr "" +msgstr "DEBUG" #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68 msgid "ERROR" -msgstr "" +msgstr "ERROR" #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68 msgid "INFO" -msgstr "" +msgstr "INFO" #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68 msgid "WARN" -msgstr "" +msgstr "WARN" #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:88 msgid "Remove" @@ -1828,7 +1844,7 @@ msgstr "Quitar" #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:125 msgid "Select a class to add" -msgstr "" +msgstr "Selecciona una clase para agregar" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:204 @@ -1841,7 +1857,7 @@ msgstr "Servicio" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:101 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:386 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:381 #: ../java/strings/Strings.java:72 msgid "Tunnels" msgstr "Túneles" @@ -1855,7 +1871,7 @@ msgid "Clients" msgstr "Clientes" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:293 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:315 msgid "Keyring" msgstr "Llavero" @@ -1865,13 +1881,13 @@ msgstr "Registros" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:107 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:260 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:255 #: ../java/strings/Strings.java:67 msgid "Peers" msgstr "Pares" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:387 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:389 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:143 msgid "Stats" msgstr "EstadÃsticas" @@ -1882,19 +1898,21 @@ msgstr "Avanzado" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:48 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:264 +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:29 #: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:34 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:360 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:516 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:307 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:341 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:377 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:344 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:378 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:534 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:325 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:359 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:370 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:397 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:362 msgid "Save changes" -msgstr "Guardar" +msgstr "Guardar cambios" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:121 msgid "Rechecking router reachability..." -msgstr "" +msgstr "Segunda verificación de accesibilidad del router ..." #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:153 msgid "Updating IP address" @@ -1902,31 +1920,31 @@ msgstr "Actualizando dirección IP" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:171 msgid "Disabling TCP completely" -msgstr "" +msgstr "Desactivando TCP completamente" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:175 msgid "Updating inbound TCP address to" -msgstr "" +msgstr "Actualizando las direcciones de entrada TCP a " #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:179 msgid "Disabling inbound TCP" -msgstr "" +msgstr "Desactivando TCP entrante" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:181 msgid "Updating inbound TCP address to auto" -msgstr "" +msgstr "Actualizando la dirección TCP de entrada a automático" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:190 msgid "Updating inbound TCP port to" -msgstr "" +msgstr "Actualizando el puerto de entrada TCP a " #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:193 msgid "Updating inbound TCP port to auto" -msgstr "" +msgstr "Actualizando el puerto de entrada TCP a automático" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:205 msgid "Updating UDP port from" -msgstr "" +msgstr "Actualizando el puerto UDP desde" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:205 msgid "to" @@ -1934,37 +1952,38 @@ msgstr "a" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:221 msgid "Gracefully restarting into Hidden Router Mode" -msgstr "" +msgstr "Reiniciando de forma controlada en modo router oculto" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:223 msgid "Gracefully restarting to exit Hidden Router Mode" -msgstr "" +msgstr "Reiniciando de forma controlada para salir del modo router oculto" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:232 msgid "Enabling UPnP, restart required to take effect" -msgstr "" +msgstr "Activando UPnP, Se requiere reiniciar para que los cambios surtan efecto" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:234 msgid "Disabling UPnP, restart required to take effect" -msgstr "" +msgstr "Deshabilitando UPnP, se requiere un reinicio para que los cambios surtan efectp" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:242 msgid "Enabling laptop mode" -msgstr "" +msgstr "Activando el modo ordenador portátil" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:244 msgid "Disabling laptop mode" -msgstr "" +msgstr "Desactivando el modo ordenador portátil" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:250 msgid "Requiring SSU introducers" -msgstr "" +msgstr "Exigir introductores SSU" -#. There's a few changes that don't really require restart (e.g. enabling inbound TCP) +#. 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. #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:291 msgid "Gracefully restarting I2P to change published router address" -msgstr "" +msgstr "Reiniciando I2P de forma controlada para cambiar la dirección publicada del router" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:314 msgid "Updating bandwidth share percentage" @@ -1989,58 +2008,76 @@ msgstr "bits por segundo" #: ../java/src/net/i2p/router/web/ConfigNetHelper.java:173 #, java-format msgid "or {0} bytes per month maximum" -msgstr "" +msgstr "ó {0} bytes por mes como máximo" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:20 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:315 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:333 msgid "Ban peer until restart" -msgstr "" +msgstr "Banear par hasta el reinicio" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:23 #, java-format msgid "Manually banned via {0}" -msgstr "" +msgstr "Manualmente baneado a través de {0}" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:24 msgid "banned until restart" -msgstr "" +msgstr "baneado hasta el reinicio" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:27 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:38 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:59 msgid "Invalid peer" -msgstr "" +msgstr "par no válido" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:28 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:317 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:335 msgid "Unban peer" -msgstr "" +msgstr "Desbanear par" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:33 msgid "unbanned" -msgstr "" +msgstr "desbaneado" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:35 msgid "is not currently banned" -msgstr "" +msgstr "no se encuentra baneado" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:39 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:343 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:361 msgid "Adjust peer bonuses" -msgstr "" +msgstr "Ajustar bonus de pares" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:47 msgid "Bad speed value" -msgstr "" +msgstr "valor de velocidad Malo" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:52 msgid "Bad capacity value" -msgstr "" +msgstr "valor de la capacidad Malo" -#. Normal browsers send value, IE sends button label -#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:32 +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:17 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:368 +msgid "Save changes and reseed now" +msgstr "Guardar cambios y resembrar ahora" + +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:21 +msgid "Reseeding is already in progress" +msgstr "Resembrar ya está en proceso" + +#. skip the nonce checking in ReseedHandler +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:24 +msgid "Starting reseed process" +msgstr "Iniciando el proceso de resembrar" + +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:66 +msgid "Configuration saved successfully." +msgstr "Configuración guardada correctamente." + +#. Normal browsers send value, IE sends button label +#: ../java/src/net/i2p/router/web/ConfigRestartBean.java:32 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:57 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:293 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:311 msgid "Shutdown immediately" msgstr "Apagar en seguida" @@ -2048,15 +2085,15 @@ msgstr "Apagar en seguida" #. give the UI time to respond #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:36 msgid "Cancel shutdown" -msgstr "Cancelar el apagarse" +msgstr "Cancelar apagado" #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:37 msgid "Cancel restart" -msgstr "Cancelar el reiniciarse" +msgstr "Cancelar reinicio" #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:39 msgid "Restart immediately" -msgstr "Reiniciar en seguida" +msgstr "Reiniciar inmediatamente" #. ctx.router().shutdown(Router.EXIT_HARD_RESTART); // never returns #. give the UI time to respond @@ -2070,11 +2107,11 @@ msgstr "Apagar" #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:59 msgid "Restart imminent" -msgstr "por reiniciarse" +msgstr "Reinicio inminente" #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:61 msgid "Shutdown imminent" -msgstr "por apagarse" +msgstr "Apagado inminente" #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:65 #, java-format @@ -2087,155 +2124,128 @@ msgid "Restart in {0}" msgstr "Reiniciando en {0}" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:53 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:291 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:309 msgid "Shutdown gracefully" -msgstr "" +msgstr "Apagar de forma controlada" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:56 msgid "Graceful shutdown initiated" -msgstr "" +msgstr "Iniciado el apagado controlado" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:60 msgid "Shutdown immediately! boom bye bye bad bwoy" -msgstr "" +msgstr "Apagar inmediatamente! Boom adiós chico malo" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:61 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:295 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:313 msgid "Cancel graceful shutdown" -msgstr "" +msgstr "Cancelar el apagado controlado" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:63 msgid "Graceful shutdown cancelled" -msgstr "" +msgstr "Cancelado el apagado controlado" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:64 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:307 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:325 msgid "Graceful restart" -msgstr "" +msgstr "Reinicio controlado" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:67 msgid "Graceful restart requested" -msgstr "" +msgstr "Ha sido solicitado el reinicio controlado" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:68 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:309 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:327 msgid "Hard restart" -msgstr "" +msgstr "Reinicio rápido" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:71 msgid "Hard restart requested" -msgstr "" +msgstr "Reinicio rápido solicitado" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:72 msgid "Rekey and Restart" -msgstr "" +msgstr "limpiar claves y reiniciar" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:73 msgid "Rekeying after graceful restart" -msgstr "" +msgstr "Reinicio de claves después del reinicio controlado" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:76 msgid "Rekey and Shutdown" -msgstr "" +msgstr "limpiar claves y apagar" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:77 msgid "Rekeying after graceful shutdown" -msgstr "" +msgstr "Reinicio de claves después del apagado controlado" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:80 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:353 msgid "Run I2P on startup" -msgstr "" +msgstr "Ejecutar I2P al arrancar el sistema" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:82 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:337 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:355 msgid "Don't run I2P on startup" -msgstr "" +msgstr "No ejecutar I2P al arrancar el sistema" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:84 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:355 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:373 msgid "Dump threads" -msgstr "" +msgstr "deshechar threads" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:91 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:323 -msgid "Show systray icon" -msgstr "" - -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:96 -msgid "System tray icon enabled." -msgstr "" - -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:98 -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:110 -msgid "System tray icon feature not supported on this platform. Sorry!" -msgstr "" - -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:101 -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:113 -msgid "Warning: unable to contact the systray manager" -msgstr "" - -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:103 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:325 -msgid "Hide systray icon" -msgstr "" - -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:108 -msgid "System tray icon disabled." -msgstr "" - -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:115 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:363 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:381 msgid "View console on startup" -msgstr "" +msgstr "Mostrar consola al iniciar" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:117 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:93 msgid "Console is to be shown on startup" -msgstr "" +msgstr "La consola se mostrará al iniciar" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:118 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:365 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:94 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:383 msgid "Do not view console on startup" -msgstr "" +msgstr "No mostrar consola al iniciar" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:120 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:96 msgid "Console is not to be shown on startup" -msgstr "" +msgstr "La consola no se mostrará al iniciar" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:129 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:105 msgid "Service installed" msgstr "Servicio instalado" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:131 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:107 msgid "Warning: unable to install the service" -msgstr "" +msgstr "Advertencia: no se puede instalar el servicio" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:137 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:113 msgid "Service removed" msgstr "Servicio quitado" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:139 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:115 msgid "Warning: unable to remove the service" -msgstr "" +msgstr "Advertencia: no se puede quitar el servicio" #: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:111 msgid "Stat filter and location updated successfully to" -msgstr "" +msgstr "Filtro de estadÃsticas y ubicación actualizados correctamente a " #: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:113 msgid "Failed to update the stat filter and location" -msgstr "" +msgstr "No se pudo actualizar el filtro de estadÃsticas y ubicación" #: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:114 msgid "Graph list updated, may take up to 60s to be reflected here and on the <a href=\"graphs.jsp\">Graphs Page</a>" -msgstr "" +msgstr "Lista del gráfico actualizada, puede tardar hasta 60s en reflejarse aquà y en la <a href=\"graphs.jsp\">Página de Gráficos</a>" -#. the count isn't really correct anyway, since we don't check for actual changes +#. the count isn't really correct anyway, since we don't check for actual +#. changes #. addFormNotice("Updated settings for " + updated + " pools."); #: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:135 msgid "Updated settings for all pools." -msgstr "" +msgstr "Actualizada la configuración para todos los valores." #: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:140 msgid "Exploratory tunnel configuration saved successfully." @@ -2244,7 +2254,7 @@ msgstr "Ajustes de los túneles exploratorios guardados con éxito" #: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:142 #: ../java/src/net/i2p/router/web/ConfigUIHandler.java:36 msgid "Error saving the configuration (applied but not saved) - please see the error logs." -msgstr "" +msgstr "Error al guardar la configuración (aplicada pero no guardada) - por favor consulte los registros de errores." #. * dummies for translation #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:14 @@ -2258,61 +2268,61 @@ msgstr[1] "{0} saltos" #, java-format msgid "1 tunnel" msgid_plural "{0} tunnels" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "1 túnel" +msgstr[1] "{0} túneles" -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:26 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:35 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:41 msgid "Exploratory tunnels" msgstr "Túneles exploratorios" -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:46 -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:61 -msgid "Client tunnels for" -msgstr "Túneles clientes para" +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:51 +#, java-format +msgid "Client tunnels for {0}" +msgstr "Túneles de cliente para {0}" -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:69 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:74 msgid "ANONYMITY WARNING - Settings include 0-hop tunnels." -msgstr "" +msgstr "ADVERTENCIA DE ANONIMATO - Los ajustes incluyen túneles de 0 saltos." -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:74 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:79 msgid "ANONYMITY WARNING - Settings include 1-hop tunnels." -msgstr "" +msgstr "ADVERTENCIA DE ANONIMATO - Los ajustes incluyen los túneles de 1 salto." -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:77 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82 msgid "PERFORMANCE WARNING - Settings include very long tunnels." -msgstr "" +msgstr "ADVERTENCIA DE RENDIMIENTO - Los ajustes incluyen túneles de gran longitud." -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:80 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:85 msgid "PERFORMANCE WARNING - Settings include high tunnel quantities." -msgstr "" +msgstr "ADVERTENCIA DE RENDIMIENTO - Los ajustes incluyen grandes cantidades de túneles." #. buf.append("<tr><th></th><th>Inbound</th><th>Outbound</th></tr>\n"); #. tunnel depth -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:87 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:92 msgid "Length" -msgstr "" +msgstr "Longitud" #. tunnel depth variance -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:104 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:109 msgid "Randomization" -msgstr "" +msgstr "Aleatoriedad" #. tunnel quantity -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:128 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:133 msgid "Quantity" msgstr "Cantidad" #. tunnel backup quantity -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:145 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:150 msgid "Backup quantity" msgstr "Cantidad de reserva" -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:167 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:172 msgid "Inbound options" msgstr "Opciones de Entrada" -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:180 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:185 msgid "Outbound options" msgstr "Opciones de Salida" @@ -2322,42 +2332,45 @@ msgstr "Cambio del tema guardado." #: ../java/src/net/i2p/router/web/ConfigUIHandler.java:33 msgid "Refresh the page to view." -msgstr "" +msgstr "Actualiza la página para ver." #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51 +msgid "Arabic" +msgstr "Ãrabe" + +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 msgid "English" msgstr "Inglés" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 msgid "French" msgstr "Francés" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 msgid "German" msgstr "Alemán" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 msgid "Spanish" msgstr "Español" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53 msgid "Dutch" msgstr "Neerlandés" -# added manually -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53 msgid "Portuguese" msgstr "Portugués" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53 msgid "Russian" msgstr "Ruso" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:54 msgid "Chinese" msgstr "Chino" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:54 msgid "Swedish" msgstr "Sueco" @@ -2371,39 +2384,39 @@ msgstr "Actualización disponible; ¡presiona el botón al lado izquierdo para d #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:93 msgid "No update available" -msgstr "No está disponible ninguna actualización" +msgstr "Ninguna actualización disponible" #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:101 msgid "Updating news URL to" -msgstr "" +msgstr "Actualizando URL de noticias a " #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:109 msgid "Updating proxy host to" -msgstr "" +msgstr "Actualizando host de proxy a " #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:117 msgid "Updating proxy port to" -msgstr "" +msgstr "Actualizando puerto del servidor proxy a " #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:130 msgid "Updating refresh frequency to" -msgstr "" +msgstr "Actualizando frecuencia de refresco a " #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:137 msgid "Updating update policy to" -msgstr "" +msgstr "Actualizando polÃtica de actualización a " #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:146 msgid "Updating update URLs." -msgstr "" +msgstr "Actualizando URLs para la actualización" #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:155 msgid "Updating trusted keys." -msgstr "" +msgstr "Actualizando claves de confianza." #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:163 msgid "Updating unsigned update URL to" -msgstr "" +msgstr "Actualizando URL de actualización no firmada a " #: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:88 #: ../java/src/net/i2p/router/web/GraphHelper.java:167 @@ -2426,27 +2439,27 @@ msgstr "Sólo descargar y verificar" msgid "Download, verify, and restart" msgstr "Descargar, verificar y reiniciar" -#: ../java/src/net/i2p/router/web/FormHandler.java:174 +#: ../java/src/net/i2p/router/web/FormHandler.java:176 msgid "Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit." -msgstr "" +msgstr "El formulario introducido es inválido, probablemente por haber utilizado el botón 'atrás' ó 'refrescar' del navegador. Por favor, reinténtelo." #: ../java/src/net/i2p/router/web/GraphHelper.java:93 msgid "Combined bandwidth graph" -msgstr "" +msgstr "gráfico de ancho de banda combinado" #. e.g. "statname for 60m" #: ../java/src/net/i2p/router/web/GraphHelper.java:107 #, java-format msgid "{0} for {1}" -msgstr "" +msgstr "{0} para {1}" #: ../java/src/net/i2p/router/web/GraphHelper.java:146 msgid "Configure Graph Display" -msgstr "" +msgstr "Configuración de la gráfica" #: ../java/src/net/i2p/router/web/GraphHelper.java:146 msgid "Select Stats" -msgstr "" +msgstr "Seleccionar EstadÃsticas" #: ../java/src/net/i2p/router/web/GraphHelper.java:150 msgid "Periods" @@ -2454,17 +2467,17 @@ msgstr "PerÃodos" #: ../java/src/net/i2p/router/web/GraphHelper.java:151 msgid "Plot averages" -msgstr "" +msgstr "promedios de la trama" #: ../java/src/net/i2p/router/web/GraphHelper.java:152 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:417 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:333 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:435 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:351 msgid "or" msgstr "o" #: ../java/src/net/i2p/router/web/GraphHelper.java:152 msgid "plot events" -msgstr "" +msgstr "eventos de la trama" #: ../java/src/net/i2p/router/web/GraphHelper.java:153 msgid "Image sizes" @@ -2476,7 +2489,7 @@ msgstr "ancho" #: ../java/src/net/i2p/router/web/GraphHelper.java:154 msgid "height" -msgstr "altura" +msgstr "alto" #: ../java/src/net/i2p/router/web/GraphHelper.java:154 #: ../java/src/net/i2p/router/web/GraphHelper.java:155 @@ -2485,20 +2498,20 @@ msgstr "pÃxeles" #: ../java/src/net/i2p/router/web/GraphHelper.java:156 msgid "Refresh delay" -msgstr "" +msgstr "Retardo de actualización" #: ../java/src/net/i2p/router/web/GraphHelper.java:171 msgid "Redraw" -msgstr "" +msgstr "Redibujar" #: ../java/src/net/i2p/router/web/GraphHelper.java:203 msgid "Graph settings saved" -msgstr "" +msgstr "configuración de gráfico guardada" #: ../java/src/net/i2p/router/web/LogsHelper.java:13 #: ../java/src/net/i2p/router/web/LogsHelper.java:37 msgid "File location" -msgstr "" +msgstr "Ubicación del archivo" #: ../java/src/net/i2p/router/web/LogsHelper.java:34 msgid "File not found" @@ -2506,37 +2519,37 @@ msgstr "Archivo no encontrado" #: ../java/src/net/i2p/router/web/LogsHelper.java:52 msgid "No log messages" -msgstr "" +msgstr "No hay mensajes de registro" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:80 msgid "Network Database RouterInfo Lookup" -msgstr "" +msgstr "Busqueda de RouterInfo en la base de datos de red" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:95 #: ../java/strings/Strings.java:68 msgid "Router" -msgstr "Enrutador" +msgstr "Router" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:95 msgid "not found in network database" -msgstr "" +msgstr "no se encuentra en la base de datos de red" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:107 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:215 msgid "Network Database Contents" -msgstr "" +msgstr "Contenido de la base de datos de red" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:108 msgid "View RouterInfo" -msgstr "" +msgstr "Ver RouterInfo" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:109 msgid "LeaseSets" -msgstr "" +msgstr "LeaseSets" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:131 msgid "LeaseSet" -msgstr "" +msgstr "LeaseSet" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:133 msgid "Local" @@ -2549,7 +2562,7 @@ msgstr "No publicado" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:136 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:143 msgid "Destination" -msgstr "" +msgstr "Destino" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:153 #, java-format @@ -2564,19 +2577,19 @@ msgstr "Caducó hace {0}" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:167 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:156 msgid "Gateway" -msgstr "" +msgstr "Gateway" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:167 msgid "Lease" -msgstr "" +msgstr "Lease" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:169 msgid "Tunnel" -msgstr "" +msgstr "Túnel" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:215 msgid "View LeaseSets" -msgstr "" +msgstr "Ver LeaseSets" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:217 msgid "Not initialized" @@ -2584,7 +2597,7 @@ msgstr "No inicializado" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:226 msgid "Routers" -msgstr "Enrutadores" +msgstr "Routers" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:228 msgid "Show all routers" @@ -2592,98 +2605,98 @@ msgstr "Mostrar todos los enrutadores" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:230 msgid "Show all routers with full stats" -msgstr "" +msgstr "Mostrar las estadÃsticas completas de todos los routers" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:265 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:266 msgid "Network Database Router Statistics" -msgstr "" +msgstr "EstadÃsticas de la base de datos de red del router" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:271 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:285 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:303 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:273 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:287 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:305 msgid "Count" -msgstr "" +msgstr "Cuenta" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:285 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:287 msgid "Transports" -msgstr "" +msgstr "Transportes" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:303 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:305 msgid "Country" msgstr "PaÃs" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:342 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:344 msgid "Our info" -msgstr "" +msgstr "Nuestra información" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:344 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:346 msgid "Peer info for" -msgstr "" +msgstr "Información de interlocutor para" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:348 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:350 msgid "Full entry" -msgstr "" +msgstr "Campo completo" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:354 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:356 #: ../java/src/net/i2p/router/web/SummaryHelper.java:115 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:601 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:619 msgid "Hidden" msgstr "Oculto" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:354 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:356 msgid "Updated" msgstr "Actualizado" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:355 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:358 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:357 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:360 #, java-format msgid "{0} ago" msgstr "hace {0}" #. shouldnt happen -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:357 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:361 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:359 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:363 msgid "Published" msgstr "Publicado" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:363 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:365 msgid "Address(es)" msgstr "Dirección(es)" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:376 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:378 msgid "cost" -msgstr "" +msgstr "coste" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 msgid "Hidden or starting up" -msgstr "" +msgstr "Oculto o iniciando" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 msgid "SSU" -msgstr "" +msgstr "SSU" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 msgid "SSU with introducers" -msgstr "" +msgstr "SSU con introductores" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404 msgid "NTCP" -msgstr "" +msgstr "NTCP" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404 msgid "NTCP and SSU" -msgstr "" +msgstr "NTCP y SSU" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404 msgid "NTCP and SSU with introducers" -msgstr "" +msgstr "NTCP y SSU con introductores" -#: ../java/src/net/i2p/router/web/NewsFetcher.java:93 +#: ../java/src/net/i2p/router/web/NewsFetcher.java:92 #, java-format msgid "News last updated {0} ago." msgstr "Noticias actualizadas hace {0}." -#: ../java/src/net/i2p/router/web/NewsFetcher.java:99 +#: ../java/src/net/i2p/router/web/NewsFetcher.java:98 #, java-format msgid "News last checked {0} ago." msgstr "Noticias chequeadas hace {0}." @@ -2691,162 +2704,163 @@ msgstr "Noticias chequeadas hace {0}." #: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:77 #, java-format msgid "Cannot check, plugin {0} is not installed" -msgstr "" +msgstr "No se puede comprobar, el complemento {0} no está instalado" #: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:129 #, java-format msgid "Checking for update of plugin {0}" -msgstr "" +msgstr "Buscando actualizaciones para el complemento {0}" #: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:154 #, java-format msgid "New plugin version {0} is available" -msgstr "" +msgstr "Hay una nueva versión del complemento {0} disponible" #: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:156 #, java-format msgid "No new version is available for plugin {0}" -msgstr "" +msgstr "No hay nuevas versiones disponibles para el complemento {0}" #: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:165 #, java-format msgid "Update check failed for plugin {0}" -msgstr "" +msgstr "Fallo al buscar actualizaciones para el complemento {0}" #: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:139 msgid "Downloading plugin" -msgstr "" +msgstr "Descargando complemento" #: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:146 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:244 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:245 #, java-format msgid "{0}B transferred" -msgstr "" +msgstr "{0}B transferidos" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:152 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:153 msgid "Plugin downloaded" -msgstr "" +msgstr "Complemento descargado" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:157 -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:344 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:158 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:356 #, java-format msgid "Cannot create plugin directory {0}" -msgstr "" +msgstr "No se puede crear directorio del complemento {0}" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:166 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:298 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:167 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:299 #, java-format msgid "from {0}" -msgstr "" +msgstr "de {0}" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:176 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:177 #, java-format msgid "Plugin from {0} is corrupt" -msgstr "" +msgstr "El complemento de {0} está dañado." -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:187 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:188 #, java-format msgid "Plugin from {0} does not contain the required configuration file" -msgstr "" +msgstr "El complemento de {0} no contiene el archivo de configuración necesario." -#. updateStatus("<b>" + "Plugin contains an invalid key" + ' ' + pubkey + ' ' + signer + "</b>"); -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:200 +#. updateStatus("<b>" + "Plugin contains an invalid key" + ' ' + pubkey + ' ' +#. + signer + "</b>"); +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:201 #, java-format msgid "Plugin from {0} contains an invalid key" -msgstr "" +msgstr "El complemento de {0} contiene una clave no válida." -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:219 -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:228 -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:237 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:225 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:235 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:249 #, java-format msgid "Plugin signature verification of {0} failed" -msgstr "" +msgstr "Verificación de la firma del complemento de {0} ha fallado" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:252 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:264 #, java-format msgid "Plugin from {0} has invalid name or version" -msgstr "" +msgstr "El complemento de {0} tiene nombre o versión no válido." -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:257 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:269 #, java-format msgid "Plugin {0} has mismatched versions" -msgstr "" +msgstr "El complemento {0} tiene versiones no coincidentes." -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:265 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:277 #, java-format msgid "This plugin requires I2P version {0} or higher" -msgstr "" +msgstr "Este complemento requiere la versión {0} o superior de I2P." -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:273 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:285 #, java-format msgid "This plugin requires Java version {0} or higher" -msgstr "" +msgstr "Este complemento requiere la versión {0} o superior de Java." -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:281 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:293 msgid "Downloaded plugin is for new installs only, but the plugin is already installed" -msgstr "" +msgstr "El complemento descargado es sólo para instalaciones nuevas, pero el complemento ya está instalado." -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:293 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:305 msgid "Installed plugin does not contain the required configuration file" -msgstr "" +msgstr "El complemento instalado no contiene el archivo de configuración necesario." -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:301 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:313 msgid "Signature of downloaded plugin does not match installed plugin" -msgstr "" +msgstr "La firma del complemento descargado no coincide con la del instalado." -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:308 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:320 #, java-format msgid "Downloaded plugin version {0} is not newer than installed plugin" -msgstr "" +msgstr "El complemento descargado con versión {0} no es más reciente que la versión ya instalada." -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:315 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:327 #, java-format msgid "Plugin update requires installed plugin version {0} or higher" -msgstr "" +msgstr "La actualización del complemento requiere tener instalada la versión {0} o superior de este complemento." -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:322 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:334 #, java-format msgid "Plugin update requires installed plugin version {0} or lower" -msgstr "" +msgstr "La actualización del complemento requiere tener instalada la versión {0} o inferior de este complemento." -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:339 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:351 msgid "Plugin is for upgrades only, but the plugin is not installed" -msgstr "" +msgstr "El complemento es sólo para actualizaciones, pero el complemento aún no está instalado." -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:352 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:364 #, java-format msgid "Failed to install plugin in {0}" -msgstr "" +msgstr "No se pudo instalar el complemento en {0}" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:359 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:371 #, java-format msgid "Plugin {0} installed, router restart required" -msgstr "" +msgstr "Complemento {0} instalado, se requiere un reinicio del router." -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:361 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:373 #, java-format msgid "Plugin {0} installed" -msgstr "" +msgstr "Complemento {0} instalado" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:379 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:391 #, java-format msgid "Plugin {0} installed and started" -msgstr "" +msgstr "Complemento {0} instalado e iniciado" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:382 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:394 #, java-format msgid "Plugin {0} installed but failed to start, check logs" -msgstr "" +msgstr "Complemento {0} instalado pero no funciona, ¡revisa los registros!" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:384 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:396 #, java-format msgid "Plugin {0} installed but failed to start" -msgstr "" +msgstr "Complemento {0} instalado, pero no se pudo iniciar." -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:394 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:406 #, java-format msgid "Failed to download plugin from {0}" -msgstr "" +msgstr "No se pudo descargar el complemento de {0}." #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:72 msgid "Peer Profiles" @@ -2854,37 +2868,43 @@ msgstr "Perfiles de los pares" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:73 #, java-format -msgid "Showing {0} recent profiles." -msgstr "Mostrando {0} perfiles recientes" +msgid "Showing 1 recent profile." +msgid_plural "Showing {0} recent profiles." +msgstr[0] "Mostrando 1 perfil reciente." +msgstr[1] "Mostrando {0} Perfiles recientes." #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:75 #, java-format -msgid "Hiding {0} older profiles." -msgstr "Ocultando {0} perfiles antiguos" +msgid "Hiding 1 older profile." +msgid_plural "Hiding {0} older profiles." +msgstr[0] "Ocultando 1 perfil más antiguo." +msgstr[1] "Ocultando {0} perfiles más antiguos." #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:77 #, java-format -msgid "Hiding {0} standard profiles." -msgstr "Ocultando {0} perfiles estándar" +msgid "Hiding 1 standard profile." +msgid_plural "Hiding {0} standard profiles." +msgstr[0] "Ocultando 1 perfil estándar." +msgstr[1] "Ocultando {0} perfiles estándar." #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:82 msgid "Groups (Caps)" -msgstr "" +msgstr "Grupos (Caps)" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:83 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:251 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:335 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:252 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:353 msgid "Speed" msgstr "Velocidad" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:84 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:253 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:339 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:254 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:357 msgid "Capacity" msgstr "Capacidad" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:85 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:255 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:256 msgid "Integration" msgstr "Integración" @@ -2902,7 +2922,7 @@ msgstr "Alta Capacidad" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:128 msgid "Standard" -msgstr "" +msgstr "Estándar" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:129 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:163 @@ -2910,7 +2930,7 @@ msgid "Failing" msgstr "Fallando" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:131 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:287 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:282 msgid "Integrated" msgstr "Integrados" @@ -2923,287 +2943,310 @@ msgstr "Inaccesible" msgid "Test Fails" msgstr "Test fallido" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:175 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:177 msgid "profile" msgstr "perfil" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:184 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:186 msgid "Floodfill and Integrated Peers" -msgstr "" +msgstr "Floodfill e pares Integrados" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:188 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:190 msgid "Caps" msgstr "CategorÃas" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:189 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:191 msgid "Integ. Value" msgstr "Valor de Integración" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:190 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:192 msgid "Last Heard About" -msgstr "" +msgstr "sabido por última vez sobre" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:191 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:193 msgid "Last Heard From" -msgstr "" +msgstr "sabido por última vez de" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:192 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:194 msgid "Last Good Send" -msgstr "" +msgstr "Último Enviado Correctamente" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:193 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:195 msgid "Last Bad Send" -msgstr "" +msgstr "Último Enviado con Errores" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:194 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:196 msgid "10m Resp. Time" -msgstr "" +msgstr "Tiempo resp. 10m" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:195 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:197 msgid "1h Resp. Time" -msgstr "" +msgstr "Tiempo resp. 1h" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:196 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:198 msgid "1d Resp. Time" -msgstr "" +msgstr "Tiempo resp. 1d" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:197 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:199 msgid "Last Good Lookup" -msgstr "" +msgstr "Última Buena Búsqueda" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:198 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:200 msgid "Last Bad Lookup" -msgstr "" +msgstr "Última Mala Búsqueda" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:199 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:201 msgid "Last Good Store" -msgstr "" +msgstr "Última Buena Guardada" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:200 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:202 msgid "Last Bad Store" -msgstr "" +msgstr "Última Mala Guardada" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:201 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:203 msgid "1h Fail Rate" -msgstr "" +msgstr "Tasa de error de 1h" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:202 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:204 msgid "1d Fail Rate" -msgstr "" +msgstr "Tasa de error de 1d" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:250 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:251 msgid "Thresholds" -msgstr "" +msgstr "Umbrales" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:252 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:253 msgid "fast peers" msgstr "pares rápidos" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:254 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:255 msgid "high capacity peers" msgstr "pares de alta capacidad" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:256 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:257 msgid " well integrated peers" -msgstr "" +msgstr "Pares bien integrados" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259 msgid "as determined by the profile organizer" -msgstr "" +msgstr "según lo determinado por el organizador del perfil" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259 msgid "groups" msgstr "grupos" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260 msgid "capabilities in the netDb, not used to determine profiles" -msgstr "" +msgstr "capacidades en el netDb, no se utilizan para determinar los perfiles" #. capabilities -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260 #: ../java/strings/Strings.java:81 msgid "caps" -msgstr "" +msgstr "lÃmites" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261 msgid "peak throughput (bytes per second) over a 1 minute period that the peer has sustained in a single tunnel" -msgstr "" +msgstr "rendimiento máximo (bytes por segundo) durante un perÃodo de 1 minuto que el par ha sostenido en un solo túnel" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261 msgid "speed" msgstr "velocidad" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262 msgid "capacity" msgstr "capacidad" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262 msgid "how many tunnels can we ask them to join in an hour?" -msgstr "" +msgstr "a cuántos túneles podemos pedirlos que se unan en una hora?" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263 msgid "how many new peers have they told us about lately?" -msgstr "" +msgstr "de cuántos nuevos pares nos han hablado últimamente?" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263 msgid "integration" msgstr "integración" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:264 msgid "is the peer banned, or unreachable, or failing tunnel tests?" -msgstr "" +msgstr "está el par baneado, o inalcanzable, o fallando las pruebas de túnel?" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:264 msgid "status" msgstr "estado" -#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:57 +#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:47 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:410 +msgid "none" +msgstr "ninguno" + +#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:62 #, java-format msgid "Temporary ban expiring in {0}" -msgstr "" +msgstr "El baneado temporal expirará en {0}" -#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:59 +#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:64 #, java-format msgid "Banned until restart or in {0}" -msgstr "" +msgstr "Baneado hasta reinicio o en {0}" -#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:71 +#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:76 msgid "unban now" -msgstr "" +msgstr "Desbanear ahora" -#. Note to translators: all runtime zh translation disabled in this file, no font available in RRD +#. Note to translators: all runtime zh translation disabled in this file, no +#. font available in RRD #: ../java/src/net/i2p/router/web/StatSummarizer.java:223 msgid "Bandwidth usage" -msgstr "" +msgstr "Uso de ancho de banda" #: ../java/src/net/i2p/router/web/StatSummarizer.java:230 msgid "Outbound bytes/sec" -msgstr "" +msgstr "bytes/seg de salida" #. def.line(sendName, Color.BLUE, "Outbound bytes/sec", 3); #: ../java/src/net/i2p/router/web/StatSummarizer.java:232 msgid "Inbound bytes/sec" -msgstr "" +msgstr "bytes/seg entrantes" #: ../java/src/net/i2p/router/web/StatSummarizer.java:235 #: ../java/src/net/i2p/router/web/StatSummarizer.java:236 #: ../java/src/net/i2p/router/web/StatSummarizer.java:237 #: ../java/src/net/i2p/router/web/StatSummarizer.java:238 msgid "bytes/sec" -msgstr "" +msgstr "bytes/seg" #: ../java/src/net/i2p/router/web/StatSummarizer.java:235 msgid "out average" -msgstr "" +msgstr "media de salida" #: ../java/src/net/i2p/router/web/StatSummarizer.java:236 #: ../java/src/net/i2p/router/web/StatSummarizer.java:238 #: ../java/src/net/i2p/router/web/SummaryRenderer.java:115 msgid "max" -msgstr "" +msgstr "max" #: ../java/src/net/i2p/router/web/StatSummarizer.java:237 msgid "in average" -msgstr "" +msgstr "en promedio" #: ../java/src/net/i2p/router/web/StatsGenerator.java:57 msgid "GO" -msgstr "" +msgstr "GO" #: ../java/src/net/i2p/router/web/StatsGenerator.java:60 msgid "Statistics gathered during this router's uptime" -msgstr "" +msgstr "EstadÃsticas recopiladas durante el funcionamiento de este router" #: ../java/src/net/i2p/router/web/StatsGenerator.java:63 msgid "The data gathered is quantized over a 1 minute period, so should just be used as an estimate." -msgstr "" +msgstr "Los datos recogidos se cuantifican en un perÃodo de 1 minuto, por lo que sólo deben utilizarse como estimación." #: ../java/src/net/i2p/router/web/StatsGenerator.java:64 msgid "These statistics are primarily used for development and debugging." -msgstr "" +msgstr "Estas estadÃsticas se utilizan principalmente para el desarrollo y depuración." -#: ../java/src/net/i2p/router/web/StatsGenerator.java:105 -#: ../java/src/net/i2p/router/web/StatsGenerator.java:156 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:106 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:157 msgid "No lifetime events" -msgstr "" +msgstr "No hay eventos de duración ilimitada" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:116 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:117 msgid "frequency" msgstr "frecuencia" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:120 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:121 msgid "Rolling average events per period" -msgstr "" +msgstr "Promedio de eventos móviles por perÃodo" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:124 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:125 msgid "Highest events per period" -msgstr "" +msgstr "Más eventos por perÃodo" -#. if (showAll && (curFreq.getMaxAverageEventsPerPeriod() > 0) && (curFreq.getAverageEventsPerPeriod() > 0) ) { +#. if (showAll && (curFreq.getMaxAverageEventsPerPeriod() > 0) && +#. (curFreq.getAverageEventsPerPeriod() > 0) ) { #. buf.append("(current is "); #. buf.append(pct(curFreq.getAverageEventsPerPeriod()/curFreq.getMaxAverageEventsPerPeriod())); #. buf.append(" of max)"); #. } -#. buf.append(" <i>avg interval between updates:</i> (").append(num(curFreq.getAverageInterval())).append("ms, min "); +#. buf.append(" <i>avg interval between updates:</i> +#. (").append(num(curFreq.getAverageInterval())).append("ms, min "); #. buf.append(num(curFreq.getMinAverageInterval())).append("ms)"); -#: ../java/src/net/i2p/router/web/StatsGenerator.java:135 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:136 msgid "Lifetime average events per period" -msgstr "" +msgstr "Media de eventos por perÃodo en la vida" #. Display the strict average -#: ../java/src/net/i2p/router/web/StatsGenerator.java:140 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:141 msgid "Lifetime average frequency" -msgstr "" +msgstr "Frecuencia media en la vida" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:144 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:234 +#, java-format +msgid "1 event" +msgid_plural "{0} events" +msgstr[0] "1 evento" +msgstr[1] "{0} eventos" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:168 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:169 msgid "rate" msgstr "Tasa" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:170 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:171 msgid "Average" msgstr "Promedio" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:173 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:174 msgid "Highest average" msgstr "Promedio máximo" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:202 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:201 #, java-format -msgid "in this period which ended {0} ago." -msgstr "" +msgid "There was 1 event in this period." +msgid_plural "There were {0} events in this period." +msgstr[0] "Hubo 1 evento en este perÃodo." +msgstr[1] "Hubo {0} eventos en este perÃodo." -#: ../java/src/net/i2p/router/web/StatsGenerator.java:204 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:203 +#, java-format +msgid "The period ended {0} ago." +msgstr "El perÃodo terminó hace {0}." + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:205 msgid "No events" msgstr "sin acontecimientos" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:210 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:211 msgid "Average event count" -msgstr "" +msgstr "número medio de eventos" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:212 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:213 msgid "Events in peak period" -msgstr "" +msgstr "Eventos en temporada alta" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:220 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:221 msgid "Graph Data" -msgstr "" +msgstr "Datos de gráfica" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:222 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:223 msgid "Graph Event Count" -msgstr "" +msgstr "Número de eventos en el Gráfico" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:225 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:226 msgid "Export Data as XML" -msgstr "" +msgstr "Exportar datos como XML" #. Display the strict average -#: ../java/src/net/i2p/router/web/StatsGenerator.java:230 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:231 msgid "Lifetime average value" -msgstr "" +msgstr "Valor medio total" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:41 msgid "I2P Router Help & FAQ" -msgstr "Ayuda acerca del enrutador I2P & FAQ" +msgstr "Ayuda del router I2P & preguntas frecuentes" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:43 msgid "Help & FAQ" @@ -3211,7 +3254,7 @@ msgstr "Ayuda" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:55 msgid "Configure startup of clients and webapps (services); manually start dormant services" -msgstr "Configura el arranque de clientes y servicios o lanza servicios no activados" +msgstr "Configura el arranque de clientes y servicios (webapps) o lanza servicios no activados" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:57 msgid "I2P Services" @@ -3219,7 +3262,7 @@ msgstr "Servicios I2P" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:63 msgid "Manage your I2P hosts file here (I2P domain name resolution)" -msgstr "" +msgstr "Administrar el archivo hosts de I2P aquà (resolución de nombres de dominio I2P)" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:65 msgid "Addressbook" @@ -3227,7 +3270,7 @@ msgstr "Libreta de direcciones" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:69 msgid "Built-in anonymous BitTorrent Client" -msgstr "" +msgstr "Cliente BitTorrent anónimo integrado" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:71 msgid "Torrents" @@ -3235,35 +3278,35 @@ msgstr "Torrents" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:75 msgid "Anonymous webmail client" -msgstr "" +msgstr "Cliente webmail anónimo" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:77 msgid "Webmail" -msgstr "MensagerÃa web" +msgstr "Webmail" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:81 msgid "Anonymous resident webserver" -msgstr "" +msgstr "Servidor web residente anónimo " #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:83 msgid "Webserver" -msgstr "Servidor web" +msgstr "ServidorWeb" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:91 msgid "Configure I2P Router" -msgstr "Configura enrutador I2P" +msgstr "Configurar router I2P" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:93 msgid "I2P Internals" msgstr "Configuración" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:99 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:384 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:379 msgid "View existing tunnels and tunnel build status" -msgstr "" +msgstr "Ver los túneles existentes y el estado de construcción de túneles" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:105 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:258 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:253 msgid "Show all current peer connections" msgstr "Mostrar todas las conexiones actuales con pares" @@ -3277,23 +3320,23 @@ msgstr "Perfiles" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:117 msgid "Show list of all known I2P routers" -msgstr "Mostrar lista de todos los enrutadores I2P conocidos" +msgstr "Mostrar lista de todos los routers I2P conocidos" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:119 msgid "NetDB" -msgstr "" +msgstr "NetDB" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:123 msgid "Health Report" -msgstr "" +msgstr "Informe de salud" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:125 msgid "Logs" -msgstr "" +msgstr "Registros" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:135 msgid "Graph router performance" -msgstr "Mostrar el rendimiento del enrutador" +msgstr "Mostrar el rendimiento del router" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:137 msgid "Graphs" @@ -3301,7 +3344,7 @@ msgstr "Gráficos" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:141 msgid "Textual router performance statistics" -msgstr "EstadÃsticas textuales del rendimiento del enrutador" +msgstr "EstadÃsticas textuales del rendimiento del router" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:147 #: ../java/src/net/i2p/router/web/SummaryHelper.java:370 @@ -3311,11 +3354,11 @@ msgstr "Destinos locales" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:149 #: ../java/strings/Strings.java:62 msgid "I2PTunnel" -msgstr "I2PTunnel" +msgstr "Túnel I2P" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:164 msgid "I2P Router Help" -msgstr "" +msgstr "Ayuda de Router I2P" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:166 msgid "General" @@ -3339,7 +3382,7 @@ msgstr "mostrar" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:192 msgid "How long we've been running for this session" -msgstr "" +msgstr "Cuanto tiempo hemos estado en funcionamiento durante esta sesión" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:195 msgid "Uptime" @@ -3347,159 +3390,166 @@ msgstr "Tiempo de servicio" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:202 msgid "Help with configuring your firewall and router for optimal I2P performance" -msgstr "" +msgstr "Ayuda con la configuración de cortafuegos y router para un rendimiento óptimo de I2P" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:231 -msgid "Download" -msgstr "Descargar" +#. Note to translators: parameter is a version, e.g. "0.8.4" +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:232 +#, java-format +msgid "Download {0} Update" +msgstr "Descargar actualización ( {0} )" +#. Note to translators: parameter is a date and time, e.g. "02-Mar 20:34 UTC" +#. <br> is optional, to help the browser make the lines even in the button +#. If the translation is shorter than the English, you should probably not +#. include <br> #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:240 -msgid "Download Unsigned" -msgstr "Descargar de forma no authentificada" +#, java-format +msgid "Download Unsigned<br>Update {0}" +msgstr "Descargar actualización<br>no firmada del {0}" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:266 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:261 msgid "Active" msgstr "Activos" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:275 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:270 msgid "Fast" msgstr "Rápidos" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:281 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:276 msgid "High capacity" msgstr "Alta capacidad" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:293 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:288 msgid "Known" msgstr "Conocidos" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:308 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:303 msgid "Help with firewall configuration" -msgstr "" +msgstr "Ayuda con la configuración del cortafuegos" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:310 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:305 msgid "Check NAT/firewall" -msgstr "" +msgstr "Comprobar NAT/cortafuegos" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:330 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:325 msgid "Reseed" -msgstr "" +msgstr "Rresembrar" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:347 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:342 msgid "Configure router bandwidth allocation" msgstr "Configurar ancho de banda del enrutador I2P" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:349 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:344 msgid "Bandwidth in/out" msgstr "Ancho de Banda entrante/saliente" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:369 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:364 msgid "Total" msgstr "Total" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:376 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:371 msgid "Used" msgstr "Usado" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:391 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:386 msgid "Exploratory" msgstr "Exploratorios" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:403 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:398 msgid "Participating" -msgstr "Participando en" +msgstr "Participando en" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:409 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:404 msgid "Share ratio" -msgstr "Compartición" +msgstr "Relación de compartición" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:415 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:410 msgid "What's in the router's job queue?" -msgstr "¿Qué está en la cola de tareas del enrutador?" +msgstr "¿Qué está en la cola de tareas del router?" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:417 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:412 msgid "Congestion" msgstr "Tareas" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:422 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:417 msgid "Job lag" msgstr "Demora - tareas" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:428 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:423 msgid "Message delay" msgstr "Demora - mensajes" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:434 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:429 msgid "Tunnel lag" -msgstr "Demora - túnel" +msgstr "Demora - túneles" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:440 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:435 msgid "Backlog" msgstr "Peticiones pendientes" #: ../java/src/net/i2p/router/web/SummaryHelper.java:106 msgid "ERR-Client Manager I2CP Error - check logs" -msgstr "" +msgstr "ERR- Error Administrador de Clientes I2CP - comprobar registros" #: ../java/src/net/i2p/router/web/SummaryHelper.java:113 #, java-format msgid "ERR-Clock Skew of {0}" -msgstr "" +msgstr "ERR-Desviación del Reloj de {0}" #: ../java/src/net/i2p/router/web/SummaryHelper.java:122 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:577 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:595 msgid "OK" -msgstr "BIEN" +msgstr "Bien" #: ../java/src/net/i2p/router/web/SummaryHelper.java:123 msgid "ERR-Private TCP Address" -msgstr "" +msgstr "ERR-Dirección TCP Privada" #: ../java/src/net/i2p/router/web/SummaryHelper.java:125 msgid "ERR-SymmetricNAT" -msgstr "" +msgstr "ERR-NAT Simétrico" #: ../java/src/net/i2p/router/web/SummaryHelper.java:128 msgid "WARN-Firewalled with Inbound TCP Enabled" -msgstr "" +msgstr "AVISO-Tras cortafuegos con TCP entrante Activado" #: ../java/src/net/i2p/router/web/SummaryHelper.java:130 msgid "WARN-Firewalled and Floodfill" -msgstr "" +msgstr "AVISO-Tras cortafuegos y Floodfill" #: ../java/src/net/i2p/router/web/SummaryHelper.java:132 msgid "WARN-Firewalled and Fast" -msgstr "" +msgstr "AVISO-Tras cortafuegos y rápido" #: ../java/src/net/i2p/router/web/SummaryHelper.java:133 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:581 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:599 msgid "Firewalled" -msgstr "Bloqueado por un corta-fuegos" +msgstr "Bloqueado por un cortafuegos" #: ../java/src/net/i2p/router/web/SummaryHelper.java:135 msgid "ERR-UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart" -msgstr "" +msgstr "ERR-puerto UDP en uso - establezca i2np.udp.internalPort=xxxx = en configuración avanzada y reinicie" #: ../java/src/net/i2p/router/web/SummaryHelper.java:141 msgid "ERR-No Active Peers, Check Network Connection and Firewall" -msgstr "" +msgstr "ERR-No hay pares activos, Compruebe la conexión de red y cortafuegos" #: ../java/src/net/i2p/router/web/SummaryHelper.java:144 msgid "ERR-UDP Disabled and Inbound TCP host/port not set" -msgstr "" +msgstr "ERR-UDP deshabilitado y el puerto/host de entrada TCP no ha sido establecido" #: ../java/src/net/i2p/router/web/SummaryHelper.java:146 msgid "WARN-Firewalled with UDP Disabled" -msgstr "" +msgstr "AVISO-Tras cortafuegos con UDP deshabilitado" #: ../java/src/net/i2p/router/web/SummaryHelper.java:148 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:597 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:615 msgid "Testing" msgstr "Comprobando" #: ../java/src/net/i2p/router/web/SummaryHelper.java:370 msgid "Add/remove/edit & control your client and server tunnels" -msgstr "" +msgstr "Agregar/quitar/editar & controlar sus túneles de cliente y servidor" #: ../java/src/net/i2p/router/web/SummaryHelper.java:382 msgid "Server" @@ -3507,17 +3557,17 @@ msgstr "Servidor" #: ../java/src/net/i2p/router/web/SummaryHelper.java:386 msgid "Show tunnels" -msgstr "Mostrar los túneles" +msgstr "Mostrar túneles" #: ../java/src/net/i2p/router/web/SummaryHelper.java:397 msgid "Leases expired" -msgstr "" +msgstr "Leases expirados" #. red or yellow light #: ../java/src/net/i2p/router/web/SummaryHelper.java:397 #: ../java/src/net/i2p/router/web/SummaryHelper.java:398 msgid "Rebuilding" -msgstr "" +msgstr "Reconstruyendo" #: ../java/src/net/i2p/router/web/SummaryHelper.java:398 msgid "ago" @@ -3531,16 +3581,12 @@ msgstr "Listo" #. yellow light #: ../java/src/net/i2p/router/web/SummaryHelper.java:405 msgid "Building" -msgstr "" +msgstr "Construyendo" #: ../java/src/net/i2p/router/web/SummaryHelper.java:405 msgid "Building tunnels" msgstr "Creando túneles" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:410 -msgid "none" -msgstr "ninguno" - #. tunnel nicknames, taken from i2ptunnel.config so they will display #. nicely under 'local destinations' in the summary bar #. note that if the wording changes in i2ptunnel.config, we have to @@ -3550,20 +3596,21 @@ msgstr "ninguno" msgid "shared clients" msgstr "clientes diferentes" -#. Note to translators: all runtime zh translation disabled in this file, no font available in RRD +#. Note to translators: all runtime zh translation disabled in this file, no +#. font available in RRD #: ../java/src/net/i2p/router/web/SummaryRenderer.java:89 #, java-format msgid "events in {0}" -msgstr "" +msgstr "eventos en {0}" #: ../java/src/net/i2p/router/web/SummaryRenderer.java:91 #, java-format msgid "averaged for {0}" -msgstr "" +msgstr "promedio por {0}" #: ../java/src/net/i2p/router/web/SummaryRenderer.java:101 msgid "Events per period" -msgstr "" +msgstr "Eventos por perÃodo" #: ../java/src/net/i2p/router/web/SummaryRenderer.java:114 msgid "avg" @@ -3575,10 +3622,14 @@ msgstr "ahora" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:41 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:63 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:287 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:309 msgid "configure" msgstr "configurar" +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:61 +msgid "Client tunnels for" +msgstr "Túneles de clientes para" + #: ../java/src/net/i2p/router/web/TunnelRenderer.java:65 msgid "dead" msgstr "muerto" @@ -3618,37 +3669,37 @@ msgstr "Papel" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:74 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:156 msgid "Usage" -msgstr "" +msgstr "Uso" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:107 msgid "grace period" -msgstr "" +msgstr "perÃodo de gracia" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:117 msgid "Outbound Endpoint" -msgstr "" +msgstr "Salida de punto final" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:119 msgid "Inbound Gateway" -msgstr "" +msgstr "Gateway de entrada" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:121 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:162 msgid "Participant" -msgstr "" +msgstr "Participante" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:126 msgid "Inactive participating tunnels" -msgstr "" +msgstr "Túneles Inactivos participantes" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:127 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:218 msgid "Lifetime bandwidth usage" -msgstr "" +msgstr "Uso de ancho de banda total" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:156 msgid "Expiry" -msgstr "" +msgstr "Expiración" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:159 msgid "Participants" @@ -3656,7 +3707,7 @@ msgstr "Participantes" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:165 msgid "Endpoint" -msgstr "" +msgstr "Punto final" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:205 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:212 @@ -3673,7 +3724,7 @@ msgstr "saliente" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:217 msgid "No tunnels; waiting for the grace period to end." -msgstr "" +msgstr "No hay túneles, esperando que termine el perÃodo de gracia." #: ../java/src/net/i2p/router/web/TunnelRenderer.java:219 msgid "in" @@ -3701,72 +3752,72 @@ msgstr "participando en" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:256 msgid "Totals" -msgstr "Total" +msgstr "Totales" -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:66 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:142 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:237 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:67 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:143 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:238 msgid "Updating" msgstr "Actualizando" #. Process the .sud/.su2 file -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:88 -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:111 -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:116 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:261 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:286 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:89 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:112 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:117 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:262 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:287 msgid "Update downloaded" -msgstr "actualización descargada" +msgstr "Actualización descargada" -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:91 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:92 #, java-format msgid "Unsigned update file from {0} is corrupt" -msgstr "" +msgstr "Archivo de actualización no firmado del {0} está dañado" -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:111 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:281 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:112 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:282 msgid "Restarting" msgstr "Reiniciando" -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:118 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:288 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:119 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:289 msgid "Click Restart to install" msgstr "¡Pincha en \"Reiniciar\" para instalar!" -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:120 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:290 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:121 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:291 msgid "Click Shutdown and restart to install" msgstr "¡Pincha en \"Apagar\" y reinicia para instalar!" -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:121 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:292 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:122 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:293 #, java-format msgid "Version {0}" msgstr "Versión {0}" -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:126 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:127 #, java-format msgid "Failed copy to {0}" -msgstr "Fallido copiar a {0}" +msgstr "Fallada copia a {0}" -#: ../java/src/net/i2p/router/web/UpdateHandler.java:184 -#, fuzzy, java-format +#: ../java/src/net/i2p/router/web/UpdateHandler.java:185 +#, java-format msgid "Updating from {0}" -msgstr "Actualizando" +msgstr "Actualizando de {0}" -#: ../java/src/net/i2p/router/web/UpdateHandler.java:253 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:254 #, java-format msgid "No new version found at {0}" -msgstr "" +msgstr "Ninguna versión nueva encontrada en {0}" -#: ../java/src/net/i2p/router/web/UpdateHandler.java:281 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:282 msgid "Update verified" -msgstr "Actualización actualizada" +msgstr "Actualización verificada" -#: ../java/src/net/i2p/router/web/UpdateHandler.java:307 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:308 #, java-format msgid "Transfer failed from {0}" -msgstr "" +msgstr "Transferencia fallida de {0}" #. wars for ConfigClientsHelper #: ../java/strings/Strings.java:12 @@ -3791,18 +3842,18 @@ msgstr "Susidns" #: ../java/strings/Strings.java:17 msgid "routerconsole" -msgstr "" +msgstr "Consola del router" #. clients, taken from clients.config, for ConfigClientsHelper #. note that if the wording changes in clients.config, we have to #. keep the old string here as well for existing installs #: ../java/strings/Strings.java:22 msgid "Web console" -msgstr "" +msgstr "Consola Web" #: ../java/strings/Strings.java:23 msgid "SAM application bridge" -msgstr "" +msgstr "Puente de aplicación SAM" #: ../java/strings/Strings.java:24 msgid "Application tunnels" @@ -3810,23 +3861,23 @@ msgstr "Túneles de aplicaciónes" #: ../java/strings/Strings.java:25 msgid "My eepsite web server" -msgstr "" +msgstr "Mi servidor web I2P" #: ../java/strings/Strings.java:26 msgid "I2P webserver (eepsite)" -msgstr "" +msgstr "Servidor web I2P (eepsite)" #: ../java/strings/Strings.java:27 msgid "Browser launch at startup" -msgstr "" +msgstr "Lanzar el navegador al iniciar" #: ../java/strings/Strings.java:28 msgid "BOB application bridge" -msgstr "" +msgstr "Puente de aplicación BOB" #: ../java/strings/Strings.java:30 msgid "Open Router Console in web browser at startup" -msgstr "" +msgstr "Abrir la consola del router en el navegador web al iniciar" #: ../java/strings/Strings.java:37 msgid "IRC proxy" @@ -3834,24 +3885,24 @@ msgstr "proxy IRC" #: ../java/strings/Strings.java:38 msgid "eepsite" -msgstr "" +msgstr "sitio I2P" #: ../java/strings/Strings.java:39 msgid "I2P webserver" -msgstr "" +msgstr "Servidor web I2P" #: ../java/strings/Strings.java:40 msgid "HTTP Proxy" -msgstr "" +msgstr "Proxy HTTP" #. older names for pre-0.7.4 installs #: ../java/strings/Strings.java:42 msgid "eepProxy" -msgstr "" +msgstr "eepProxy" #: ../java/strings/Strings.java:43 msgid "ircProxy" -msgstr "" +msgstr "Proxy irc" #. hardcoded in i2psnark #: ../java/strings/Strings.java:45 @@ -3861,7 +3912,7 @@ msgstr "I2PSnark" #. hardcoded in iMule? #: ../java/strings/Strings.java:47 msgid "iMule" -msgstr "" +msgstr "iMule" #. standard themes for ConfigUIHelper #: ../java/strings/Strings.java:51 @@ -3895,15 +3946,15 @@ msgstr "Mensajes de Clientes" #: ../java/strings/Strings.java:60 msgid "Encryption" -msgstr "Clave del Cifrado" +msgstr "Cifrado" #: ../java/strings/Strings.java:61 msgid "i2cp" -msgstr "" +msgstr "i2cp" #: ../java/strings/Strings.java:63 msgid "InNetPool" -msgstr "" +msgstr "InNetPool" #: ../java/strings/Strings.java:64 msgid "JobQueue" @@ -3915,29 +3966,29 @@ msgstr "BaseDeDatosRed" #: ../java/strings/Strings.java:66 msgid "ntcp" -msgstr "" +msgstr "ntcp" #: ../java/strings/Strings.java:69 msgid "Stream" -msgstr "" +msgstr "Corriente" #: ../java/strings/Strings.java:70 msgid "Throttle" -msgstr "" +msgstr "Regular" #: ../java/strings/Strings.java:71 msgid "Transport" -msgstr "" +msgstr "Transporte" #: ../java/strings/Strings.java:73 msgid "udp" -msgstr "" +msgstr "udp" #. parameters in transport addresses (netdb.jsp) #. may or may not be worth translating #: ../java/strings/Strings.java:77 msgid "host" -msgstr "" +msgstr "host" #: ../java/strings/Strings.java:78 msgid "key" @@ -3950,1332 +4001,1467 @@ msgstr "puerto" #. introducer host #: ../java/strings/Strings.java:83 msgid "ihost0" -msgstr "" +msgstr "ihost0" #: ../java/strings/Strings.java:84 msgid "ihost1" -msgstr "" +msgstr "ihost1" #: ../java/strings/Strings.java:85 msgid "ihost2" -msgstr "" +msgstr "ihost2" #. introducer port #: ../java/strings/Strings.java:87 msgid "iport0" -msgstr "" +msgstr "iport0" #: ../java/strings/Strings.java:88 msgid "iport1" -msgstr "" +msgstr "iport1" #: ../java/strings/Strings.java:89 msgid "iport2" -msgstr "" +msgstr "iport2" #. introducer key #: ../java/strings/Strings.java:91 msgid "ikey0" -msgstr "" +msgstr "ikey0" #: ../java/strings/Strings.java:92 msgid "ikey1" -msgstr "" +msgstr "ikey1" #: ../java/strings/Strings.java:93 msgid "ikey2" -msgstr "" +msgstr "ikey2" #. introducer tag #: ../java/strings/Strings.java:95 msgid "itag0" -msgstr "" +msgstr "itag0" #: ../java/strings/Strings.java:96 msgid "itag1" -msgstr "" +msgstr "itag1" #: ../java/strings/Strings.java:97 msgid "itag2" -msgstr "" +msgstr "itag2" #. Descriptions for the stats that are graphed by default #. There are over 500 stats currently defined, we aren't going to tag them all #: ../java/strings/Strings.java:101 msgid "Low-level bandwidth receive rate" -msgstr "" +msgstr "tasa de recepción de ancho de banda de bajo nivel" #. bw.recvRate #: ../java/strings/Strings.java:102 msgid "Low-level bandwidth send rate" -msgstr "" +msgstr "tasa de envÃo de ancho de banda de bajo nivel" #. bw.sendRate #: ../java/strings/Strings.java:103 msgid "How many peers we are actively talking with" -msgstr "" +msgstr "Con cuántos pares estamos hablando activamente" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:112 msgid "config networking" -msgstr "" - -#. We have intl defined when this is included, but not when compiled standalone. -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:217 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:230 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:217 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:227 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:222 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:215 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:215 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:215 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:215 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:215 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:215 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:234 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:215 +msgstr "configuración de red" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:224 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:237 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:224 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:234 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:231 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:222 +msgid "Summary Bar" +msgstr "Barra resumen" + +#. We have intl defined when this is included, but not when compiled +#. standalone. +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:237 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:250 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:237 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:247 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:244 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:242 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:235 msgid "Refresh (s)" msgstr "Actualizar (s)" #. ditto -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:221 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:234 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:221 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:223 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:231 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:223 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:223 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:223 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:226 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:223 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:223 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:237 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:219 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:241 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:254 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:241 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:251 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:248 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:245 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:239 msgid "Enable" msgstr "Activar" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:262 msgid "I2P Network Configuration" -msgstr "" +msgstr "Configuración de red I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:298 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:316 msgid "Bandwidth limiter" -msgstr "Limitador del ancho de banda" +msgstr "Limitador de ancho de banda" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:300 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:318 msgid "I2P will work best if you configure your rates to match the speed of your internet connection." -msgstr "" +msgstr "I2P funcionará mejor si configuras tus tasas para que coincida con la velocidad de tu conexión a Internet." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:304 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:322 msgid "KBps In" msgstr "KB/s entrantes" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:318 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:336 msgid "KBps Out" msgstr "KB/s salientes" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:334 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:352 msgid "Share" msgstr "Compartir" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:341 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:309 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:304 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:359 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:327 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:326 msgid "NOTE" -msgstr "AVISO" +msgstr "NOTA" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:343 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:361 #, java-format msgid "You have configured I2P to share only {0} KBps." -msgstr "" +msgstr "Has configurado I2P para compartir sólo {0} KBps." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:346 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:364 msgid "I2P requires at least 12KBps to enable sharing. " -msgstr "" +msgstr "I2P requiere al menos 12KBps para permitir el intercambio." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:347 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:365 msgid "Please enable sharing (participating in tunnels) by configuring more bandwidth. " -msgstr "" +msgstr "Por favor, active el intercambio (participación en túneles) configurando un mayor ancho de banda." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:348 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:366 msgid "It improves your anonymity by creating cover traffic, and helps the network." -msgstr "" +msgstr "Esto mejora tu anonimato creando tráfico de cobertura, y ayuda a la red." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:351 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:369 #, java-format msgid "You have configured I2P to share {0} KBps." -msgstr "" +msgstr "Has configurado I2P para compartir {0} KBps." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:354 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:372 msgid "The higher the share bandwidth the more you improve your anonymity and help the network." -msgstr "" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:358 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:514 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:305 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:327 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:403 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:321 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:339 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:375 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:342 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:322 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:365 +msgstr "Cuanto mayor sea el ancho de banda compartido, mayor es el anonimato y más se ayuda a la red." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:376 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:532 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:323 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:347 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:425 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:339 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:357 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:366 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:395 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:360 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:351 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:383 msgid "Cancel" msgstr "Cancelar" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:375 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:393 msgid "IP and Transport Configuration" -msgstr "" +msgstr "IP y configuración de transporte" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:377 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:395 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:395 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:417 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:324 msgid "The default settings will work for most people." -msgstr "" +msgstr "La configuración por defecto funcionará para la mayorÃa de gente." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:379 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:397 msgid "There is help below." -msgstr "Hay una ayuda abjo." +msgstr "Hay ayuda debajo." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:381 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:399 msgid "UPnP Configuration" msgstr "Configuración UPnP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:385 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:403 msgid "Enable UPnP to open firewall ports" -msgstr "" +msgstr "Activar UPnP para abrir puertos del cortafuegos" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:387 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:405 msgid "UPnP status" msgstr "Estado UPnP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:389 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:407 msgid "IP Configuration" msgstr "Configuración IP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:391 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:461 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:409 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:479 msgid "Externally reachable hostname or IP address" -msgstr "" +msgstr "Nombre de host o dirección IP accesible externamente" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:395 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:413 msgid "Use all auto-detect methods" -msgstr "" +msgstr "Utilizar todos los métodos de detección automática" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:399 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:417 msgid "Disable UPnP IP address detection" -msgstr "" +msgstr "Desactivar detección de direcciones IP por UPnP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:403 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:421 msgid "Ignore local interface IP address" -msgstr "" +msgstr "Ingonrar la dirección IP de la interfaz local" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:407 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:425 msgid "Use SSU IP address detection only" -msgstr "" +msgstr "Utilizar detección de direcciones IP sólo por SSU" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:411 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:479 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:429 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:497 msgid "Specify hostname or IP" -msgstr "" +msgstr "Especificar nombre de host o IP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:417 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:435 msgid "Select Interface" -msgstr "Elige interfaz" +msgstr "Elegir interfaz" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:431 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:449 msgid "Hidden mode - do not publish IP" -msgstr "Modo oculto - no se publica el IP" +msgstr "Modo oculto - no publicar IP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:433 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:451 msgid "(prevents participating traffic)" -msgstr "" +msgstr "(Evita el tráfico de participantes)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:435 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:453 msgid "Action when IP changes" -msgstr "" +msgstr "Acción al cambiar de IP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:439 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:457 msgid "Laptop mode - Change router identity and UDP port when IP changes for enhanced anonymity" -msgstr "" +msgstr "Modo Portátil - Cambiar identidad del router y puerto UDP cuando cambie la IP para aumentar el anonimato" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:441 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:459 msgid "Experimental" -msgstr "" +msgstr "Experimental" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:443 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:461 msgid "UDP Configuration:" msgstr "Ajustes de UDP:" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:445 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:463 msgid "UDP port:" msgstr "Puerto UDP :" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:459 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:477 msgid "TCP Configuration" -msgstr "Ajustes de TCP:" +msgstr "Ajustes de TCP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:465 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:483 msgid "Use auto-detected IP address" -msgstr "" +msgstr "Utilizar dirección IP detectada automáticamente" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:467 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:499 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:485 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:517 msgid "currently" msgstr "actualmente" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:471 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:489 msgid "if we are not firewalled" msgstr "si no estamos bloqueados por el corta-fuegos" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:475 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:493 msgid "Always use auto-detected IP address (Not firewalled)" -msgstr "" +msgstr "Siempre utilizar la dirección IP detectada automáticamente (no bloqueada por cortafuegos)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:485 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:503 msgid "Disable inbound (Firewalled)" -msgstr "" +msgstr "Deshabilitar entrada (bloqueado por cortafuegos)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:489 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:507 msgid "Completely disable" msgstr "Desactivar por completo" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:491 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:509 msgid "(select only if behind a firewall that throttles or blocks outbound TCP)" -msgstr "" +msgstr "(Selecciona sólo si estás detrás de un cortafuegos que regule o bloquee la salida por TCP)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:493 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:511 msgid "Externally reachable TCP port" -msgstr "" +msgstr "Puerto TCP externamente accesible" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:497 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:515 msgid "Use the same port configured for UDP" -msgstr "" +msgstr "Usar el mismo puerto configurado para UDP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:505 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:523 msgid "Specify Port" msgstr "Elegir un puerto" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:509 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:339 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:330 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:527 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:357 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:348 msgid "Note" -msgstr "" +msgstr "Nota" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:512 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:530 msgid "Changing these settings will restart your router." -msgstr "" +msgstr "Cambiar estos ajustes reiniciará el router." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:518 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:536 msgid "Configuration Help" -msgstr "" +msgstr "Ayuda de Configuración" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:520 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:569 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:538 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:587 msgid "While I2P will work fine behind most firewalls, your speeds and network integration will generally improve if the I2P port is forwarded for both UDP and TCP." -msgstr "" +msgstr "Aunque I2P funcionrá bien aún bloqueado por la mayorÃa de cotrafuegos, las velocidades y la integración de la red en general mejorará si el puerto I2P está abierto tanto por UDP como por TCP." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:522 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:540 msgid "If you can, please poke a hole in your firewall to allow unsolicited UDP and TCP packets to reach you." -msgstr "" +msgstr "Si es posiible, por favor permite el paso de los paquetes TCP y UDP no solicitados por el cortafuegos." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:524 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:542 msgid "If you can't, I2P supports UPnP (Universal Plug and Play) and UDP hole punching with \"SSU introductions\" to relay traffic." -msgstr "" +msgstr "Si no puede ser, I2P soporta UPnP (Universal Plug and Play) y UDP hole punching con \"introducciones SSU\" para transmitir tráfico." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:526 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:544 msgid "Most of the options above are for special situations, for example where UPnP does not work correctly, or a firewall not under your control is doing harm." -msgstr "" +msgstr "La mayorÃa de las opciones anteriores son para situaciones especiales, por ejemplo, cuando UPnP no funciona correctamente, o un cortafuegos que no está bajo tu control está haciendo daño." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:528 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:546 msgid "Certain firewalls such as symmetric NATs may not work well with I2P." -msgstr "" +msgstr "Algunos cortafuegos como NATs simétricos pueden no funcionar bien con I2P." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:537 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:555 msgid "UPnP is used to communicate with Internet Gateway Devices (IGDs) to detect the external IP address and forward ports." -msgstr "" +msgstr "UPnP se utiliza para comunicarse con dispositivos de puerta de enlace a Internet (IGDs) para detectar la dirección IP externa y los puertos que se deben abrir." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:539 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:557 msgid "UPnP support is beta, and may not work for any number of reasons" -msgstr "" +msgstr "El soporte de UPnP está en fase beta, y puede no funcionar correctamente por varias razones" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:541 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:559 msgid "No UPnP-compatible device present" -msgstr "" +msgstr "No se encuentra ningún dispositivo compatible con UPnP presente" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:543 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:561 msgid "UPnP disabled on the device" -msgstr "" +msgstr "UPnP desactivado en el dispositivo" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:545 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:563 msgid "Software firewall interference with UPnP" -msgstr "" +msgstr "Un cortafuegos de software interfiere con UPnP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:547 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:565 msgid "Bugs in the device's UPnP implementation" -msgstr "" +msgstr "Errores en la implementación de UPnP del dispositivo" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:549 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:567 msgid "Multiple firewall/routers in the internet connection path" -msgstr "" +msgstr "Múltiples cotrafuegos/routers en la ruta de conexión a Internet" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:551 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:569 msgid "UPnP device change, reset, or address change" -msgstr "" +msgstr "El dispositivo UPnP ha cambiado, reiniciado, o ha cambiado de dirección" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:553 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:571 msgid "Review the UPnP status here." -msgstr "" +msgstr "Revisar el estado de UPnP aquÃ." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:555 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:573 msgid "UPnP may be enabled or disabled above, but a change requires a router restart to take effect." -msgstr "" +msgstr "Encima de esto UPnP puede ser activado o desactivado, pero un cambio requiere reiniciar el router para que surta efecto." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:557 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:575 msgid "Hostnames entered above will be published in the network database." -msgstr "" +msgstr "Los nombres de host introducidos arriba se publicarán en la base de datos de red." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:559 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:577 msgid "They are <b>not private</b>." -msgstr "" +msgstr "<b>No son privados.</b>" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:561 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:579 msgid "Also, <b>do not enter a private IP address</b> like 127.0.0.1 or 192.168.1.1." -msgstr "" +msgstr "Además, <b>no se debe introducir una dirección IP privada</b> como 127.0.0.1 o 192.168.1.1." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:563 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:581 msgid "If you specify the wrong IP address or hostname, or do not properly configure your NAT or firewall, your network performance will degrade substantially." -msgstr "" +msgstr "Si se especifica una dirección IP o nombre de host incorrectos, o no se configura correctamente el NAT o cortafuegos, el rendimiento de la red se degradará considerablemente." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:565 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:583 msgid "When in doubt, leave the settings at the defaults." -msgstr "" +msgstr "En caso de duda, deje los ajustes con los valores predeterminados." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:567 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:585 msgid "Reachability Help" -msgstr "" +msgstr "Ayuda de Accesibilidad" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:572 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:590 msgid "If you think you have opened up your firewall and I2P still thinks you are firewalled, remember that you may have multiple firewalls, for example both software packages and external hardware routers." -msgstr "" +msgstr "Si crees que has abierto el cortafuegos y I2P todavÃa piensa que sigue bloqueado por uno, recuerda que podrÃas tener múltiples cortafuegos, por ejemplo, en paquetes de software o en routers externos." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:575 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:593 msgid "If there is an error, the <a href=\"logs.jsp\">logs</a> may also help diagnose the problem." -msgstr "" +msgstr "Si hay un error, el <a href=\"logs.jsp\">registro</a> también puede ayudar a diagnosticar el problema." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:579 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:597 msgid "Your UDP port does not appear to be firewalled." -msgstr "" +msgstr "El puerto UDP no parece estar bloqueado por un cortafuegos." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:583 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:601 msgid "Your UDP port appears to be firewalled." -msgstr "" +msgstr "El puerto UDP parece estar bloqueado por un cortafuegos." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:585 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:603 msgid "As the firewall detection methods are not 100% reliable, this may occasionally be displayed in error." -msgstr "" +msgstr "Como los métodos de detección de cortafuegos no son 100% fiables, esto puede aparecer por error." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:587 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:605 msgid "However, if it appears consistently, you should check whether both your external and internal firewalls are open for your port." -msgstr "" +msgstr "Sin embargo, si aparece constantemente, deberÃas comprobar si tanto el cortafuegos interno como externo tienen los puertos abiertos." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:589 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:607 msgid "I2P will work fine when firewalled, there is no reason for concern. When firewalled, the router uses \"introducers\" to relay inbound connections." -msgstr "" +msgstr "I2P funcionará bien aún bloqueado por un cortafuegos, no hay motivo de preocupación. Si se está detrás de un cortafuegos, el router utiliza \"introductores\" para transmitir las conexiones entrantes." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:591 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:609 msgid "However, you will get more participating traffic and help the network more if you can open your firewall(s)." -msgstr "" +msgstr "No obstante, obtendrás más tráfico participante y ayudará más a la red si puedes abrir el/los cortafuegos." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:593 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:611 msgid "If you think you have already done so, remember that you may have both a hardware and a software firewall, or be behind an additional, institutional firewall you cannot control." -msgstr "" +msgstr "Si crees que ya lo has hecho, recuerda que podrÃas tener tanto un cortafuegos de hardware como un cortafuegos por software, o podrÃas estar detrás de otro cortafuegos institucional fuera de tu control." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:595 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:613 msgid "Also, some routers cannot correctly forward both TCP and UDP on a single port, or may have other limitations or bugs that prevent them from passing traffic through to I2P." -msgstr "" +msgstr "Además, algunos routers no pueden encaminar correctamente TCP y UDP por el mismo puerto, o pueden tener otras limitaciones o bugs que les impidan pasar tráfico a través de I2P." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:599 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:617 msgid "The router is currently testing whether your UDP port is firewalled." -msgstr "" +msgstr "El router está probando si tu puerto UDP está bloqueado por un cortafuegos." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:603 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:621 msgid "The router is not configured to publish its address, therefore it does not expect incoming connections." -msgstr "" +msgstr "El router no está configurado para publicar su dirección, por lo tanto, no espera conexiones entrantes." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:605 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:623 msgid "WARN - Firewalled and Fast" -msgstr "" +msgstr "AVISO - Bloqueado por cortafuegos y rápido" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:607 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:625 msgid "You have configured I2P to share more than 128KBps of bandwidth, but you are firewalled." -msgstr "" +msgstr "Has configurado I2P para compartir más de 128 kbps de ancho de banda, pero te encuentras bloqueado por un cortafuegos" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:609 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:627 msgid "While I2P will work fine in this configuration, if you really have over 128KBps of bandwidth to share, it will be much more helpful to the network if you open your firewall." -msgstr "" +msgstr "Aunque I2P funcionará bien con esta configuración, si realmente tiene más de 128 kbps de ancho de banda para compartir, será mucho más útil a la red si abre los puertos de su router." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:611 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:629 msgid "WARN - Firewalled and Floodfill" -msgstr "" +msgstr "AVISO - Bloqueado por cortafuegos y Floodfill" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:613 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:631 msgid "You have configured I2P to be a floodfill router, but you are firewalled." -msgstr "" +msgstr "Has configurado I2P ser un router floodfill, pero estás bloqueado por un cortafuegos." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:615 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:633 msgid "For best participation as a floodfill router, you should open your firewall." -msgstr "" +msgstr "Para mejorar la participación como router floodfill, deberÃas abrir tu cortafuegos." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:617 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:635 msgid "WARN - Firewalled with Inbound TCP Enabled" -msgstr "" +msgstr "AVISO - Bloqueado por cortafuegos con TCP entrante activado" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:619 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:637 msgid "You have configured inbound TCP, however your UDP port is firewalled, and therefore it is likely that your TCP port is firewalled as well." -msgstr "" +msgstr "Has configurado TCP entrante, sin embargo el puerto UDP está bloqueado por un cortafuegos, y por lo tanto es probable que el puerto TCP esté bloqueado también." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:621 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:639 msgid "If your TCP port is firewalled with inbound TCP enabled, routers will not be able to contact you via TCP, which will hurt the network." -msgstr "" +msgstr "Si el puerto TCP está bloqueado por un cortafuegos con TCP entrante habilitado, los routers no podrán ponerse en contacto con el tuyo a través de TCP, lo que perjudicará a la red." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:623 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:641 msgid "Please open your firewall or disable inbound TCP above." -msgstr "" +msgstr "Por favor, ¡abre los puertos del cortafuegos o desactiva TCP entrante arriba!" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:625 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:643 msgid "WARN - Firewalled with UDP Disabled" -msgstr "" +msgstr "AVISO - Bloqueado por cortafuegos con UDP deshabilitado" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:627 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:645 msgid "You have configured inbound TCP, however you have disabled UDP." -msgstr "" +msgstr "Has configurado TCP entrante, sin embargo has deshabilitado UDP." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:629 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:647 msgid "You appear to be firewalled on TCP, therefore your router cannot accept inbound connections." -msgstr "" +msgstr "Parece que estás siendo bloqueado por un cortafuegos en TCP, por lo tanto el router no puede aceptar conexiones entrantes." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:631 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:649 msgid "Please open your firewall or enable UDP." -msgstr "" +msgstr "Por favor, ¡abre el cortafuegos o habilita UDP!" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:633 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:651 msgid "ERR - Clock Skew" -msgstr "" +msgstr "ERR - desviación de reloj" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:635 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:653 msgid "Your system's clock is skewed, which will make it difficult to participate in the network." -msgstr "" +msgstr "El reloj del sistema está desviado, lo que hará difÃcil participar en la red." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:637 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:655 msgid "Correct your clock setting if this error persists." -msgstr "" +msgstr "Corrija su ajuste del reloj, si este error persiste." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:639 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:657 msgid "ERR - Private TCP Address" -msgstr "" +msgstr "ERR - Dirección TCP privada" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:641 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:659 msgid "You must never advertise an unroutable IP address such as 127.0.0.1 or 192.168.1.1 as your external address." -msgstr "" +msgstr "Nunca debe anunciar una dirección IP no enrutable, como 127.0.0.1 o 192.168.1.1 como su dirección externa." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:643 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:661 msgid "Correct the address or disable inbound TCP above." -msgstr "" +msgstr "Corrija la dirección o desactive TCP entrante arriba." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:645 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:663 msgid "ERR - SymmetricNAT" -msgstr "" +msgstr "ERR - NAT Simétrico" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:647 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:665 msgid "I2P detected that you are firewalled by a Symmetric NAT." -msgstr "" +msgstr "I2P ha detectado que está siendo bloqueado por un NAT simétrico." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:649 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:667 msgid "I2P does not work well behind this type of firewall. You will probably not be able to accept inbound connections, which will limit your participation in the network." -msgstr "" +msgstr "I2P no funciona bien detrás de este tipo de cortafuegos. Probablemente no serás capaz de aceptar conexiones entrantes, lo que limitará tu participación en la red." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:651 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:669 msgid "ERR - UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart" -msgstr "" +msgstr "ERR - el puerto UDP está en uso - Establezca i2np.udp.internalPort=xxxx en configuración avanzada reinicie" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:653 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:671 msgid "I2P was unable to bind to port 8887 or other configured port." -msgstr "" +msgstr "I2P no pudo enlazar con el puerto 8887 o el otro puerto configurado." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:655 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:673 msgid "Check to see if another program is using the configured port. If so, stop that program or configure I2P to use a different port." -msgstr "" +msgstr "Compruebe si otro programa está utilizando el puerto configurado. Si es asÃ, cierre el programa o configure I2P para utilizar un puerto diferente." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:657 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:675 msgid "This may be a transient error, if the other program is no longer using the port." -msgstr "" +msgstr "Esto puede ser un error transitorio, si el otro programa ya no utiliza el puerto." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:659 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:677 msgid "However, a restart is always required after this error." -msgstr "" +msgstr "Sin embargo, siempre es necesario reiniciar después de que aparezca este error." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:661 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:679 msgid "ERR - UDP Disabled and Inbound TCP host/port not set" -msgstr "" +msgstr "ERR - UDP deshabilitado y el host/puerto de entrada TCP no ha sido establecido" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:663 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:681 msgid "You have not configured inbound TCP with a hostname and port above, however you have disabled UDP." -msgstr "" +msgstr "Arriba no has configurado TCP entrante con un nombre de host y puerto, sin embargo has deshabilitado UDP." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:665 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:683 msgid "Therefore your router cannot accept inbound connections." -msgstr "" +msgstr "Por lo tanto el router no puede aceptar conexiones entrantes." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:667 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:685 msgid "Please configure a TCP host and port above or enable UDP." -msgstr "" +msgstr "Por favor, configure un host y puerto TCP arriba o permita UDP." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:669 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:687 msgid "ERR - Client Manager I2CP Error - check logs" -msgstr "" +msgstr "ERR - Error Client Manager I2CP - verificar los registros" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:671 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:689 msgid "This is usually due to a port 7654 conflict. Check the logs to verify." -msgstr "" +msgstr "Esto se debe generalmente a un conflicto en el puerto 7654. Revisa los registros para verificarlo." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:673 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:691 msgid "Do you have another I2P instance running? Stop the conflicting program and restart I2P." -msgstr "" +msgstr "¿Tiene otra instancia I2P funcionando? Detenga el programa en conflicto y reinicie I2P." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:107 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:113 msgid "config advanced" msgstr "configuración avanzada" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:241 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:263 msgid "I2P Advanced Configuration" msgstr "Ajustes Avanzados de I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:301 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:319 msgid "Advanced I2P Configuration" -msgstr "" +msgstr "Configuración I2P avanzada" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:311 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:329 msgid "Some changes may require a restart to take effect." -msgstr "" +msgstr "Algunos cambios pueden requerir unreiniciar para que surtan efecto." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:112 msgid "config clients" msgstr "configuración de clientes" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:265 msgid "I2P Client Configuration" msgstr "Configuración de Clientes I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:312 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:330 msgid "Client Configuration" msgstr "Configuración Clientes" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:314 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:332 msgid "The Java clients listed below are started by the router and run in the same JVM." -msgstr "" +msgstr "Los clientes de Java que se enumeran a continuación son iniciados por el router y se ejecutan en la misma JVM." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:318 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:338 msgid "To change other client options, edit the file" -msgstr "" +msgstr "Para cambiar otras opciones clientes, edita el archivo" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:325 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:401 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:415 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:345 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:423 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:439 msgid "All changes require restart to take effect." -msgstr "" +msgstr "Todos los cambios requieren reiniciar para que surtan efecto." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:337 -#, fuzzy +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:357 msgid "Advanced Client Interface Configuration" -msgstr "Guardar la configuración de clientes" +msgstr "Configuración avanzada de la interfaz del cliente" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:339 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:361 msgid "External I2CP (I2P Client Protocol) Interface Configuration" -msgstr "" +msgstr "Configuración de la interfaz I2CP Exterior (I2P Protocolo de clientes)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:345 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:367 msgid "Enabled without SSL" -msgstr "" +msgstr "Habilitado sin SSL" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:351 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:373 msgid "Enabled with SSL required" -msgstr "" +msgstr "Habilitado con SSL obligatorio" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:357 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:379 msgid "Disabled - Clients outside this Java process may not connect" -msgstr "" +msgstr "Deshabilitado - Los clientes fuera de este proceso Java podrÃan no conectar" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:359 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:381 msgid "I2CP Port" -msgstr "" +msgstr "Puerto I2CP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:363 -#, fuzzy +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:385 msgid "I2CP Interface" -msgstr "Configuración" +msgstr "Interfaz I2CP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:379 -#, fuzzy +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:401 msgid "Authorization" -msgstr "Autor" +msgstr "Autorización" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:385 -msgid "Requre username and password" -msgstr "" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:407 +msgid "Require username and password" +msgstr "Requerir nombre de usuario y contraseña" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:387 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:409 msgid "Username" -msgstr "" +msgstr "Nombre de usuario" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:391 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:413 msgid "Password" -msgstr "" +msgstr "Contraseña" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:397 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:419 msgid "Any changes made here must also be configured in the external client." -msgstr "" +msgstr "Cualquier cambio realizado aquà también debe configurarse en el cliente externo." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:399 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:421 msgid "Many clients do not support SSL or authorization." -msgstr "" +msgstr "Muchos clientes no soportan SSL o autorización." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:407 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:429 msgid "WebApp Configuration" msgstr "Configuración de las Applicaciones Web" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:409 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:431 msgid "The Java web applications listed below are started by the webConsole client and run in the same JVM as the router. They are usually web applications accessible through the router console. They may be complete applications (e.g. i2psnark),front-ends to another client or application which must be separately enabled (e.g. susidns, i2ptunnel), or have no web interface at all (e.g. addressbook)." -msgstr "" +msgstr "Las aplicaciones web Java que se enumeran a continuación son iniciadas por el cliente de consola web y se ejecutan en la misma JVM que el router. Por lo general son aplicaciones web, accesibles a través de la consola del router. Pueden ser aplicaciones completas (i2psnark por ejemplo), interfaces de otro cliente o aplicaciónes que deben ser habilitadas por separado (por ejemplo, susidns, i2ptunnel), o que no tienen interfaz web en absoluto (por ejemplo, la libreta de direcciones)." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:411 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:433 msgid "A web app may also be disabled by removing the .war file from the webapps directory; however the .war file and web app will reappear when you update your router to a newer version, so disabling the web app here is the preferred method." -msgstr "" +msgstr "Una aplicación web también se puede desactivar quitando el archivo .war del directorio de aplicaciones web; Sin embargo, el archivo .war y la aplicación web volverán a aparecer al actualizar el router a una nueva versión, asà que el método preferido es deshabilitar la aplicación web aquÃ." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:421 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:445 msgid "Plugin Configuration" msgstr "Configuración de Complementos" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:423 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:447 msgid "The plugins listed below are started by the webConsole client." -msgstr "" +msgstr "Los complementos enumerados a continuación son iniciados por el cliente de consola web." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:429 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:455 msgid "Plugin Installation" -msgstr "" +msgstr "Instalación de Complementos" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:431 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:457 msgid "To install a plugin, enter the download URL:" -msgstr "" +msgstr "Para instalar un complemento, ¡introduce la URL de descarga!" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:112 msgid "config keyring" -msgstr "" +msgstr "configuración de llavero" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:249 msgid "I2P Keyring Configuration" msgstr "Configuración del Llavero" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:295 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:317 msgid "The router keyring is used to decrypt encrypted leaseSets." -msgstr "" +msgstr "El llavero del router se utiliza para descifrar leaseSets encriptados." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:298 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:320 msgid "The keyring may contain keys for local or remote encrypted destinations." -msgstr "" +msgstr "El anillo puede contener claves de cifrado para los destinos locales o remotos." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:308 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:326 msgid "Manual Keyring Addition" -msgstr "" +msgstr "Adición manual al Llavero" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:310 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:328 msgid "Enter keys for encrypted remote destinations here." -msgstr "" +msgstr "Introduzca las claves de cifrado para destinos remotos aquÃ." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:313 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:331 msgid "Keys for local destinations must be entered on the" -msgstr "" +msgstr "Las claves para los destinos locales deben introducirse en la" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:315 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:333 msgid "I2PTunnel page" -msgstr "" +msgstr "Página de túnelesI2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:317 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:335 msgid "Dest. name, hash, or full key" msgstr "Nombre del destino, hash o clave completa" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:319 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:337 msgid "Encryption Key" msgstr "Clave de cifrado" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:107 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:113 msgid "config logging" -msgstr "" +msgstr "configuración de registro" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:241 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:263 msgid "I2P Logging Configuration" -msgstr "" +msgstr "Configuración del registro I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:301 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:319 msgid "Configure I2P Logging Options" -msgstr "" +msgstr "Configurar las opciones de registro I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:303 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:321 msgid "Logging filename" -msgstr "" +msgstr "Nombre de archivo del registro" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:307 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:325 msgid "(the symbol '@' will be replaced during log rotation)" -msgstr "" +msgstr "(El sÃmbolo '@' será reemplazado durante la rotación de registro)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:309 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:327 msgid "Log record format" -msgstr "" +msgstr "Formato de escritura del registro" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:313 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:331 msgid "(use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, 'm' = message)" msgstr "(use 'd' = fecha, 'c' = clase, 't' = hilo, 'p' = prioridad, 'm' = mensaje)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:315 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:333 msgid "Log date format" -msgstr "" +msgstr "Formato de fecha del registro" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:319 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:337 msgid "('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' = millisecond)" msgstr "('MM' = mes, 'dd' = dÃa, 'HH' = hora, 'mm' = minuto, 'ss' = segundo, 'SSS' = milisegundo)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:321 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:339 msgid "Max log file size" -msgstr "" +msgstr "Tamaño máximo del archivo de registro" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:325 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:343 msgid "Default log level" -msgstr "" +msgstr "Nivel predeterminado de registro" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:329 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:347 msgid "(DEBUG and INFO are not recommended defaults, as they will drastically slow down your router)" -msgstr "" +msgstr "(DEBUG e INFO no se recomiendan por defecto, ya que ralentizaran drásticamente el router)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:331 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:349 msgid "Log level overrides" -msgstr "" +msgstr "Reemplazos a nivel de registros" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:353 msgid "New override" -msgstr "" +msgstr "Nueva reemplazo" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:112 msgid "config peers" -msgstr "configuración de los pares" +msgstr "configuración de pares" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:249 msgid "I2P Peer Configuration" -msgstr "Configuración de los Pares I2P" +msgstr "Configuración de los pares I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:305 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:323 msgid "Manual Peer Controls" -msgstr "" +msgstr "Controles Manuales de pares" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:307 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:325 msgid "Router Hash" -msgstr "Hash del Enrutador" +msgstr "Hash del Router" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:311 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:329 msgid "Manually Ban / Unban a Peer" -msgstr "" +msgstr "Banear / Desbanear manualmente a un par" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:313 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:331 msgid "Banning will prevent the participation of this peer in tunnels you create." -msgstr "" +msgstr "Banear evitará que ese par participe en cualquiera de los túneles que usted cree." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:323 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:341 msgid "Adjust Profile Bonuses" -msgstr "" +msgstr "Ajustar Perfil de Bonus" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:325 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:343 msgid "Bonuses may be positive or negative, and affect the peer's inclusion in Fast and High Capacity tiers. Fast peers are used for client tunnels, and High Capacity peers are used for some exploratory tunnels. Current bonuses are displayed on the" -msgstr "" +msgstr "Los bonus pueden ser positivos o negativos, y afectan a la inclusión de un par en los niveles 'Rápido' y 'de alta capacidad'. Los pares rápidos se utilizan para los túneles de clientes, los par de alta capacidad se utilizan para algunos túneles exploratorios. Los bonus actuales se muestran en la" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:327 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:345 msgid "profiles page" msgstr "página de perfiles" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:345 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:251 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:363 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:273 msgid "Banned Peers" -msgstr "Pares Relegados" +msgstr "pares baneados" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:366 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:384 msgid "Banned IPs" -msgstr "" +msgstr "IPs Baneadas" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:112 +msgid "config reseeding" +msgstr "config para resembrar " + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:262 +msgid "I2P Reseeding Configuration" +msgstr "Configuración del proceso de resembrar I2P" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:318 +msgid "Reseeding Configuration" +msgstr "Configuración de Resembrar" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:320 +msgid "Reseeding is the bootstrapping process used to find other routers when you first install I2P, or when your router has too few router references remaining." +msgstr "Resembrar es el proceso de bootstrapping para encontrar otros routers cuando I2P se instala por primera vez o cuando al router le quedan muy pocas referencias de otros routers." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:322 +msgid "If reseeding has failed, you should first check your network connection." +msgstr "El proceso de resembrar ha fallado, primero debes comprobar la conexión de red." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:326 +msgid "Change these only if HTTP is blocked by a restrictive firewall, reseed has failed, and you have access to an HTTP proxy." +msgstr "¡Cambia estos parámetros solamente si HTTP está bloqueado por un cortafuegos restrictivo, el proceso de resembrar ha fracasado, y si tienes acceso a un proxy HTTP!" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:328 +#, java-format +msgid "See {0} for instructions on reseeding manually." +msgstr "Ver {0} para obtener instrucciones sobre cómo resembrar manualmente." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:328 +msgid "the FAQ" +msgstr "las preguntas más frecuentes" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:330 +msgid "Reseed URL Selection" +msgstr "Selección de URL resembradora" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:336 +msgid "Try SSL first then non-SSL" +msgstr "Probar SSL primero y luego no-SSL" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:342 +msgid "Use SSL only" +msgstr "Usar SSL exclusivamente" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:348 +msgid "Use non-SSL only" +msgstr "Usar no-SSL exclusivamente" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:350 +msgid "Reseed URLs" +msgstr "URLs resembradoras" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:354 +msgid "Enable HTTP proxy (not used for SSL)" +msgstr "Habilitar proxy HTTP (no utilizado para SSL)" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:358 +msgid "HTTP Proxy Host" +msgstr "Host HTTP Proxy" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:362 +msgid "HTTP Proxy Port" +msgstr "Puerto HTTP Proxy" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:112 msgid "config service" msgstr "configuración de servicios" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:249 msgid "I2P Service Configuration" msgstr "Configuración de Servicios I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:285 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:303 msgid "Shutdown the router" -msgstr "Apagar el enrutador" +msgstr "Apagar el router" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:287 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:305 msgid "Graceful shutdown lets the router satisfy the agreements it has already made before shutting down, but may take a few minutes." -msgstr "" +msgstr "El apagado controlado permite al router cumplir los acuerdos que ya ha hecho antes de apagar, pero puede tardar unos minutos." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:289 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:307 msgid "If you need to kill the router immediately, that option is available as well." -msgstr "" +msgstr "Si tiene que apagar el router inmediatamente, también tiene esa opción" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:299 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:317 msgid "If you want the router to restart itself after shutting down, you can choose one of the following." -msgstr "" +msgstr "Si deseas que el router se reinicie después del apagado, puedes elegir una de las siguientes opciones." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:301 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:319 msgid "This is useful in some situations - for example, if you changed some settings that client applications only read at startup, such as the routerconsole password or the interface it listens on." -msgstr "" +msgstr "Esto es útil en algunas situaciones - por ejemplo, si has cambiado algunas opciones de aplicaciones cliente que sólo se leen al iniciar, como la contraseña de la consola del router o tu interfaz de escucha." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:303 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:321 msgid "A graceful restart will take a few minutes (but your peers will appreciate your patience), while a hard restart does so immediately." -msgstr "" +msgstr "Un reinicio controlado tardará unos minutos (pero tus pares te agradecerán tu paciencia), mientras que un reinicio duro lo hace inmediatamente." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:305 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:323 msgid "After tearing down the router, it will wait 1 minute before starting back up again." -msgstr "" +msgstr "Después de apagar completamente el router, esperará 1 minuto antes de volverse a iniciar." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:315 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:333 msgid "Systray integration" -msgstr "" +msgstr "integración con la bandeja del sistema" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:317 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:335 msgid "On the windows platform, there is a small application to sit in the system tray, allowing you to view the router's status" -msgstr "" +msgstr "En la plataforma Windows, hay una pequeña aplicación que se queda en la bandeja del sistema, lo que le permite ver el estado del router" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:319 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:337 msgid "(later on, I2P client applications will be able to integrate their own functionality into the system tray as well)." -msgstr "" +msgstr "(Más adelante, las aplicaciones I2P de clientes serán capaces de integrar su propia funcionalidad en la bandeja de sistema también)." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:321 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:339 msgid "If you are on windows, you can either enable or disable that icon here." -msgstr "" +msgstr "Si usted está en Windows, puede activar o desactivar ese icono que aquÃ." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:327 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:341 +msgid "Show systray icon" +msgstr "Mostrar icono de la bandeja del sistema" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:343 +msgid "Hide systray icon" +msgstr "Ocultar icono de la bandeja del sistema" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:345 msgid "Run on startup" -msgstr "Lanzar al iniciar el enrutador" +msgstr "Lanzar al iniciar" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:329 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:347 msgid "You can control whether I2P is run on startup or not by selecting one of the following options - I2P will install (or remove) a service accordingly." -msgstr "" +msgstr "Puede controlar si I2P se ejecuta en el arranque o no seleccionando una de las siguientes opciones - I2P instalará (o eliminará) un servicio en consecuencia." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:331 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:349 msgid "If you prefer the command line, you can also run the " -msgstr "" +msgstr "Si usted prefiere la lÃnea de comandos, también puede ejecutar" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:341 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:359 msgid "If you are running I2P as service right now, removing it will shut down your router immediately." -msgstr "" +msgstr "Si está ejecutando I2p como servicio en este momento, quitarlo hará que se apague el router de inmediato." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:343 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:361 msgid "You may want to consider shutting down gracefully, as above, then running uninstall_i2p_service_winnt.bat." -msgstr "" +msgstr "Es posible que desees considerar el apagado controlado como se indica arriba, para ello, ejecuta uninstall_i2p_service_winnt.bat." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:347 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:365 msgid "Debugging" -msgstr "" +msgstr "Debugging" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:349 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:367 msgid "View the job queue" msgstr "Ver cola de tareas" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:353 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:371 msgid "At times, it may be helpful to debug I2P by getting a thread dump. To do so, please select the following option and review the thread dumped to <a href=\"logs.jsp#servicelogs\">wrapper.log</a>." -msgstr "" +msgstr "A veces, puede ser útil depurar I2P consiguiendo un volcado de hilo. Para ello, selecciona la opción siguiente y revisa el dump en <a href=\"logs.jsp#servicelogs\">wrapper.log</a> ." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:359 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:377 msgid "Launch browser on router startup?" -msgstr "" +msgstr "Iniciar el navegador al arrancar el router?" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:361 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:379 msgid "I2P's main configuration interface is this web console, so for your convenience I2P can launch a web browser on startup pointing at" -msgstr "" +msgstr "La interfaz de configuración principal de I2P es esta consola Web. Para tu comodidad I2P puede lanzar el navegador web en al iniciar apuntando a" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:107 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:113 msgid "config stats" -msgstr "" +msgstr "config de estadÃsticas" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:228 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:250 msgid "I2P Stats Configuration" msgstr "Ajustes de EstadÃsticas I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:302 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:320 msgid "Configure I2P Stat Collection" -msgstr "" +msgstr "Configurar colección de estadÃsticas I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:304 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:322 msgid "Enable full stats?" -msgstr "" +msgstr "Habilitar estadÃsticas completas?" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:311 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:329 msgid "change requires restart to take effect" -msgstr "" +msgstr "cambiar esto requiere reiniciar para que los cambios surtan efecto" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:313 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:331 msgid "Stat file" -msgstr "" +msgstr "Archivo de estadÃsticas" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:317 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:335 msgid "Filter" msgstr "Filtro" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:319 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:328 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:337 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:348 msgid "toggle all" -msgstr "" +msgstr "cambiar todos" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:330 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:350 msgid "Log" -msgstr "" +msgstr "Registro" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:332 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:352 msgid "Graph" msgstr "Gráficas" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:371 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:391 msgid "Advanced filter" -msgstr "" +msgstr "Filtro avanzado" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:112 msgid "config tunnels" msgstr "Configuración de túneles" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:262 msgid "I2P Tunnel Configuration" -msgstr "Configuración de los túneles I2P" +msgstr "Configuración de túneles I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:306 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:328 msgid "The default settings work for most people." -msgstr "" +msgstr "La configuración por defecto funciona para la mayorÃa de gente." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:310 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:332 msgid "There is a fundamental tradeoff between anonymity and performance." -msgstr "" +msgstr "Hay un equilibrio fundamental entre el anonimato y el rendimiento." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:313 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:335 msgid "Tunnels longer than 3 hops (for example 2 hops + 0-2 hops, 3 hops + 0-1 hops, 3 hops + 0-2 hops), or a high quantity + backup quantity, may severely reduce performance or reliability." -msgstr "" +msgstr "Los túneles de más de tres saltos (por ejemplo, 2 + 0-2 saltos, 3 saltos+ 0-1 saltos, 3 saltos + 0-2 saltos), o una alta cantidad incluyendo túneles de respaldo, pueden reducir severamente el rendimiento o la fiabilidad." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:316 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:338 msgid "High CPU and/or high outbound bandwidth usage may result." -msgstr "" +msgstr "Puede resultar en un uso alto de CPU y/o un uso de gran ancho de banda de salida " -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:319 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:341 msgid "Change these settings with care, and adjust them if you have problems." -msgstr "" +msgstr "Cambia esta configuración con cuidado, y ajústala en caso de tener problemas." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:333 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:351 msgid "Exploratory tunnel setting changes are stored in the router.config file." -msgstr "" +msgstr "Los cambios en los túneles exploratorios se almacenan en el archivo router.config." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:336 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:354 msgid "Client tunnel changes are temporary and are not saved." -msgstr "" +msgstr "Los cambios en túnel de cliente son de carácter temporal y no se guardan." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:338 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:356 msgid "To make permanent client tunnel changes see the" -msgstr "" +msgstr "Para hacer cambios permanentes al túnel de cliente ve a la" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:340 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:358 msgid "i2ptunnel page" -msgstr "" +msgstr "Página túnel I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:112 msgid "config UI" msgstr "configuración IU" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:262 msgid "I2P UI Configuration" msgstr "Interfaz de Usuario" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:292 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:314 msgid "Router Console Theme" -msgstr "" +msgstr "Tema de la Consola del Router" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:310 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:339 msgid "Theme selection disabled for Internet Explorer, sorry." -msgstr "" +msgstr "Lo sentimos, pero la selección de temas está deshabilitada para Internet Explorer." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:312 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:341 msgid "If you're not using IE, it's likely that your browser is pretending to be IE; please configure your browser (or proxy) to use a different User Agent string if you'd like to access the console themes." -msgstr "" +msgstr "Si no estás utilizando Internet Explorer, es probable que tu navegador se esté haciendo pasar por el IE, por favor, configura tu navegador (o proxy) para utilizar un agente de usuario diferente si deseas acceder a los temas de la consola." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:316 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:345 msgid "Router Console Language" -msgstr "" +msgstr "Idioma de la Consola del Router" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:320 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:349 msgid "Please contribute to the router console translation project! Contact the developers on IRC #i2p to help." -msgstr "" +msgstr "Por favor, contribuye al proyecto de traducción de la consola del router. Ponte en contacto con los desarrolladores en el IRC #I2P o #I2P-ES para ayudar." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:324 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:353 msgid "Apply" msgstr "Aplicar" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:112 msgid "config update" msgstr "Actualización de la configuración" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:249 msgid "I2P Update Configuration" msgstr "Configuración de actualizaciones I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:303 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:321 msgid "Check for I2P and news updates" -msgstr "" +msgstr "Comprobar si hay actualizaciones de I2P o noticias" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:305 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:323 msgid "News & I2P Updates" msgstr "Noticias & actualizaciones de I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:309 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:327 msgid "Update In Progress" msgstr "Actualizando" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:317 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:335 msgid "News URL" msgstr "URL de noticias" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:321 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:339 msgid "Refresh frequency" msgstr "Frecuencia de actualización" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:327 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:345 msgid "Update policy" -msgstr "" +msgstr "PolÃtica de actualizaciones" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:331 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:349 msgid "Update through the eepProxy?" -msgstr "¿Actualizar ustilizando el eeProxy?" +msgstr "¿Actualizar utilizando el eepProxy?" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:353 msgid "eepProxy host" -msgstr "" +msgstr "host eepProxy" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:339 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:357 msgid "eepProxy port" -msgstr "" +msgstr "puerto eepProxy" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:343 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:361 msgid "Update URLs" -msgstr "" +msgstr "URLs de actualizaciones" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:347 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:365 msgid "Trusted keys" msgstr "Claves confiadas" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:351 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:369 msgid "Update with unsigned development builds?" -msgstr "" +msgstr "Actualizar con las versiones en desarrollo no firmadas?" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:355 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:373 msgid "Unsigned Build URL" -msgstr "" +msgstr "URL de versión no firmada" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:361 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:379 msgid "I2P updates are disabled because you do not have write permission for the install directory." -msgstr "" +msgstr "Las actualizaciones de I2P están desactivadas porque no tienes permiso de escritura en el directorio de la instalación." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:367 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:385 msgid "Save" msgstr "Guardar" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:117 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:121 +msgid "Internal Error" +msgstr "Error interno" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:123 +msgid "Router Console" +msgstr "Consola del Router" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:127 +msgid "Configuration" +msgstr "Configuración" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:135 +msgid "Sorry! There has been an internal error." +msgstr "Lo sentimos! Se ha producido un error interno." + +#. note to translators - both parameters are URLs +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:139 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:254 +#, java-format +msgid "Please report bugs on {0} or {1}." +msgstr "Por favor, informar sobre errores en {0} o {1}." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:143 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:258 +msgid "You may use the username \"guest\" and password \"guest\" if you do not wish to register." +msgstr "Se puede utilizar el nombre de usuario \"guest\" y contraseña \"guest\" si no desea registrarse." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:145 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:260 +msgid "Please include this information in bug reports" +msgstr "Por favor, incluya esta información en los informes de error" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:147 +msgid "Error Details" +msgstr "Detalles del error" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:149 +#, java-format +msgid "Error {0}" +msgstr "Error {0}" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:169 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:250 +msgid "I2P Version and Running Environment" +msgstr "Versión I2P y medio de ejecución" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:197 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:288 +msgid "Note that system information, log timestamps, and log messages may provide clues to your location; please review everything you include in a bug report." +msgstr "Tenga en cuenta que la información del sistema, las marcas de tiempo del registro y los mensajes del registro pueden proporcionar pistas sobre su ubicación, por favor, revise todos los datos que se incluyen en un informe de error." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:123 msgid "Page Not Found" msgstr "Página no encontrada" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:242 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:264 msgid "Sorry! You appear to be requesting a non-existent Router Console page or resource." -msgstr "" +msgstr "Lo sentimos! Pareces estar intentando entrar en una página de Consola de Router inexistente u otro recurso." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:244 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:266 msgid "Error 404" msgstr "Error 404" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:249 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:271 msgid "not found" msgstr "no encontrado" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:112 msgid "graphs" msgstr "gráficas" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:249 msgid "I2P Performance Graphs" -msgstr "" +msgstr "Gráficos de rendimiento I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:111 msgid "home" -msgstr "página de inicio" +msgstr "Página de Inicio" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:331 +msgid "Welcome to I2P" +msgstr "¡Bienvenido a I2P!" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:111 msgid "job queue" msgstr "cola de tareas" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:248 msgid "I2P Router Job Queue" -msgstr "" +msgstr "Cola de trabajos del router I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:111 msgid "logs" -msgstr "" +msgstr "registros" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:248 msgid "I2P Router Logs" -msgstr "" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:228 -msgid "I2P Version & Running Environment" -msgstr "" - -#. note to translators - both parameters are URLs -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:232 -#, java-format -msgid "Please report bugs on {0} or {1}." -msgstr "" +msgstr "Registros del Router I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:236 -msgid "You may use the username \"guest\" and password \"guest\" if you do not wish to register." -msgstr "" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:238 -msgid "Please include this information in bug reports" -msgstr "" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:266 -msgid "Note that system information, log timestamps, and log messages may provide clues to your location; please review everything you include in a bug report." -msgstr "" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:281 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:303 msgid "Critical Logs" -msgstr "" +msgstr "Registros crÃticos" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:285 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:307 msgid "Router Logs" -msgstr "" +msgstr "Registros del Router" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:291 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:313 msgid "Service (Wrapper) Logs" -msgstr "" +msgstr "Registros de Servicio (Wrapper)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:111 msgid "network database summary" -msgstr "" +msgstr "Resumen de la base de datos de red" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:248 msgid "I2P Network Database Summary" -msgstr "" +msgstr "Resumen de la base de datos de red I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:109 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:115 msgid "WebApp Not Found" -msgstr "" +msgstr "Aplicación web no encontrada" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:230 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:252 msgid "Web Application Not Running" -msgstr "" +msgstr "La Aplicación Web no se está ejecutando" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:232 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:254 msgid "The requested web application is not running." -msgstr "" +msgstr "La aplicación Web solicitada no se está ejecutando" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:234 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:256 msgid "Please visit the <a href=\"/configclients.jsp#webapp\">config clients page</a> to start it." -msgstr "" +msgstr "Por favor visita la <a href=\"/configclients.jsp#webapp\">página de configuración de clientes</a> para iniciarla." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:111 msgid "peer connections" msgstr "conexiones con pares" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:248 msgid "I2P Network Peers" -msgstr "" +msgstr "pares de la red I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:111 msgid "peer profiles" msgstr "perfiles de los pares" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:248 msgid "I2P Network Peer Profiles" -msgstr "" +msgstr "Perfiles de los pares de la red I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:111 msgid "statistics" msgstr "estadÃsticas" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:265 msgid "I2P Router Statistics" -msgstr "EstadÃsticas del enrutador I2P" +msgstr "EstadÃsticas del router I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:248 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:255 #, java-format msgid "Disable {0} Refresh" -msgstr "Deshabilitar el recargar cada {0}" +msgstr "Deshabilitar la recarga de cada {0}" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:111 msgid "tunnel summary" -msgstr "" +msgstr "Sumario de tuneles" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:248 msgid "I2P Tunnel Summary" -msgstr "" +msgstr "Sumario de tuneles I2P" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:111 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:248 +msgid "Peer Profile" +msgstr "Perfil de pares" -#~ msgid "hour" -#~ msgstr "hora" -#~ msgid "minutes" -#~ msgstr "minutos" -#~ msgid "This is useful in some situations" -#~ msgstr "C'est utile dans certains cas" -#~ msgid "Start Now" -#~ msgstr "Démarrer tout de suite" -#~ msgid "Depth" -#~ msgstr "Profondeur" -#~ msgid "view without" -#~ msgstr "montrer sans" -#~ msgid "view with" -#~ msgstr "montrer avec" -#~ msgid "Show the router's workload, and how it's performing" -#~ msgstr "Montrer les tâches en cours" -#~ msgid "Jobs" -#~ msgstr "Tâches" -#~ msgid "Tunnels in/out" -#~ msgstr "Tunnels entrants/sortants" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:275 +#, java-format +msgid "Profile for peer {0}" +msgstr "Perfil para par {0}" diff --git a/apps/routerconsole/locale/messages_fr.po b/apps/routerconsole/locale/messages_fr.po index 1d0ae74eaea698045706ddf03c4eb4172eb706b0..e5a733652ca68845bbb20f30fff3ae56665ef774 100644 --- a/apps/routerconsole/locale/messages_fr.po +++ b/apps/routerconsole/locale/messages_fr.po @@ -8,15 +8,16 @@ msgid "" msgstr "" "Project-Id-Version: I2P routerconsole\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-11-19 18:16+0000\n" -"PO-Revision-Date: 2010-11-19 20:04+0100\n" -"Last-Translator: mixxy <m1xxy@mail.i2p>\n" -"Language-Team: foo <foo@bar>\n" +"POT-Creation-Date: 2011-05-18 10:29+0000\n" +"PO-Revision-Date: 2011-05-18 13:35+0100\n" +"Last-Translator: magma <magma@mail.i2p>\n" +"Language-Team: I2P Project <foo@bar>\n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: French\n" -"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"Plural-Forms: nplurals=2; plural=(n >= 2)\n" #. NOTE TO TRANSLATORS: Feel free to translate all these as you see fit, there are several options... #. spaces or not, '.' or not, plural or not. Try not to make it too long, it is used in @@ -26,535 +27,648 @@ msgstr "" #. {0,number,####} prevents 1234 from being output as 1,234 in the English locale. #. If you want the digit separator in your locale, translate as {0}. #. alternates: msec, msecs -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1086 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1140 #, java-format msgid "1 ms" msgid_plural "{0,number,####} ms" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{0,number,####}ms" +msgstr[1] "{0,number,####}ms" #. seconds #. Note to translators: quantity will always be greater than one. #. alternates: secs, sec. 'seconds' is probably too long. -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1091 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:349 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1145 #, java-format msgid "1 sec" msgid_plural "{0} sec" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{0}s" +msgstr[1] "{0}s" #. minutes #. Note to translators: quantity will always be greater than one. #. alternates: mins, min. 'minutes' is probably too long. -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1096 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1150 #, java-format msgid "1 min" msgid_plural "{0} min" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{0}mn" +msgstr[1] "{0}mn" #. hours #. Note to translators: quantity will always be greater than one. #. alternates: hrs, hr., hrs. -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1101 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1155 #, java-format msgid "1 hour" msgid_plural "{0} hours" -msgstr[0] "1 heure" -msgstr[1] "{0} heures" +msgstr[0] "{0}h" +msgstr[1] "{0}h" -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1103 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:313 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1157 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:314 msgid "n/a" -msgstr "" +msgstr "n/d" #. days #. Note to translators: quantity will always be greater than one. -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1107 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1161 #, java-format msgid "1 day" msgid_plural "{0} days" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{0}j" +msgstr[1] "{0}j" -#: ../../../router/java/src/net/i2p/router/Blocklist.java:126 +#: ../../../router/java/src/net/i2p/router/Blocklist.java:122 #, java-format msgid "Banned by router hash: {0}" -msgstr "" +msgstr "Banni(s) par hachage routeur: {0}" -#: ../../../router/java/src/net/i2p/router/Blocklist.java:128 -#, fuzzy +#: ../../../router/java/src/net/i2p/router/Blocklist.java:124 msgid "Banned by router hash" -msgstr "Pairs interdits" +msgstr "Banni via hachage du routeur" #. Temporary reason, until the job finishes -#: ../../../router/java/src/net/i2p/router/Blocklist.java:673 +#: ../../../router/java/src/net/i2p/router/Blocklist.java:669 msgid "IP banned" -msgstr "IP interdit" +msgstr "IP bannie" -#: ../../../router/java/src/net/i2p/router/Blocklist.java:743 +#: ../../../router/java/src/net/i2p/router/Blocklist.java:739 #, java-format msgid "IP banned by blocklist.txt entry {0}" -msgstr "" +msgstr "IP bannie(s) via entrée blocklist.txt {0}" #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:92 msgid "Rejecting tunnels: Shutting down" -msgstr "" +msgstr "Refuse les tunnels: (arrêt en cours)" #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:141 msgid "Rejecting tunnels: High message delay" -msgstr "" +msgstr "Refus de tunnels: (délai de messages élevé)" #. hard to do {0} from here #. setTunnelStatus("Rejecting " + (100 - (int) probAccept*100) + "% of tunnels: High number of requests"); #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:177 msgid "Rejecting most tunnels: High number of requests" -msgstr "" +msgstr "Refuse la plupart des tunnels: (trop de requêtes)" #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:233 msgid "Rejecting tunnels: Limit reached" -msgstr "" +msgstr "Refus de tunnels: (limite atteinte)" #. .067KBps #. * also limited to 90% - see below #. always leave at least 4KBps free when allowing #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:301 msgid "Rejecting tunnels: Bandwidth limit" -msgstr "" +msgstr "Refus de tunnels: (limite de bande passante)" #. hard to do {0} from here #. setTunnelStatus("Rejecting " + ((int)(100.0*probReject)) + "% of tunnels: Bandwidth limit"); #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:371 msgid "Rejecting most tunnels: Bandwidth limit" -msgstr "" +msgstr "Refuse la plupart des tunnels: (limite de bande passante)" #. hard to do {0} from here #. setTunnelStatus("Accepting " + (100-(int)(100.0*probReject)) + "% of tunnels"); #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:375 -#, fuzzy msgid "Accepting most tunnels" -msgstr "tunnels participants" +msgstr "Accepte la plupart des tunnels" #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:377 msgid "Accepting tunnels" -msgstr "" +msgstr "Accepte les tunnels" #. NPE, too early #. if (_context.router().getRouterInfo().getBandwidthTier().equals("K")) #. setTunnelStatus("Not expecting tunnel requests: Advertised bandwidth too low"); #. else #: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:488 -#, fuzzy msgid "Rejecting tunnels" -msgstr "Configuration des tunnels" +msgstr "Refus des tunnels" -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:50 -msgid "Ensure that nothing blocks outbound HTTP, check <a target=\"_top\" href=\"logs.jsp\">logs</a> and if nothing helps, read the <a target=\"_top\" href=\"http://www.i2p2.de/faq.html\">FAQ</a> about reseeding manually." -msgstr "" - -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:82 -#, fuzzy +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:125 +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:20 msgid "Reseeding" -msgstr "Test en cours" +msgstr "Réamorçage" -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:146 -msgid "Reseeding: fetching seed URL." -msgstr "" - -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:152 -msgid "Last reseed failed fully (failed reading seed URL)." -msgstr "" +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:141 +#, java-format +msgid "Reseed fetched only 1 router." +msgid_plural "Reseed fetched only {0} routers." +msgstr[0] "Le réamorçage n'a trouvé qu'un seul routeur." +msgstr[1] "Le réamorçage n''a trouvé que {0} routeurs." -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:178 -msgid "Last reseed failed fully (no routerInfo URLs at seed URL)." -msgstr "" +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:148 +msgid "Reseed failed." +msgstr "Échec de réamorçage" -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:191 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:149 #, java-format -msgid "Reseeding: fetching router info from seed URL ({0} successful, {1} errors)." -msgstr "" +msgid "See {0} for help." +msgstr "Voir {0} pour l''aide." -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:212 -#, java-format -msgid "Last reseed failed partly ({0}% of {1})." -msgstr "" +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:150 +msgid "reseed configuration page" +msgstr "page de configuration du réamorçage" -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:217 -#, java-format -msgid "Last reseed failed ({0}% of {1})." -msgstr "" +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:293 +msgid "Reseeding: fetching seed URL." +msgstr "Réamorçage: collecte des URL sources." -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:227 -msgid "Last reseed failed fully (exception caught)." -msgstr "" +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:335 +#, java-format +msgid "Reseeding: fetching router info from seed URL ({0} successful, {1} errors)." +msgstr "Réamorçage: collecte routerInfo depuis l''URL source ({0} réussie, {1} erreurs)." -#: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:510 +#: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:512 msgid "NetDb entry" -msgstr "" +msgstr "Entrée netDb" #. This used to be "no common transports" but it is almost always no transports at all #: ../../../router/java/src/net/i2p/router/transport/GetBidsJob.java:70 msgid "No transports (hidden or starting up?)" -msgstr "" +msgstr "Pas de transports (masqués ou en cours de démarrage?)" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:451 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:450 msgid "Unreachable on any transport" -msgstr "" +msgstr "Inaccessible sur tout transport" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:500 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:499 msgid "Router Transport Addresses" -msgstr "" +msgstr "Adresses de transport du routeur" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:505 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:504 #, java-format msgid "{0} is used for outbound connections only" -msgstr "" +msgstr "{0} est utilisé seulement pour les connexions sortantes" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:518 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:129 +msgid "Help" +msgstr "Aide" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:519 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:257 +msgid "Your transport connection limits are automatically set based on your configured bandwidth." +msgstr "Vos limites de connexion de transport sont réglées automatiquement selon votre configuration de bande passante." + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:521 +msgid "To override these limits, add the settings i2np.ntcp.maxConnections=nnn and i2np.udp.maxConnections=nnn on the advanced configuration page." +msgstr "Pour modifier ces limites, ajoutez les réglages i2np.ntcp.maxConnections=nnn et i2np.udp.maxConnections=nnn dans la configuration avancée." + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:523 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258 msgid "Definitions" msgstr "Définitions" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:520 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:715 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1888 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:737 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1890 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:24 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:33 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:35 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:81 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:187 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:189 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:238 msgid "Peer" msgstr "Pair" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:520 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524 msgid "The remote peer, identified by router hash" -msgstr "" +msgstr "Le pair distant, identifié par son hachage routeur" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:521 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:716 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1892 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:525 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:738 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1894 msgid "Dir" -msgstr "" +msgstr "Sens" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:522 -#, fuzzy +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:526 msgid "Inbound connection" -msgstr "Options Entrants" +msgstr "Connexion entrante" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524 -#, fuzzy +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:528 msgid "Outbound connection" -msgstr "Options Sortants" +msgstr "Connexion sortante" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:526 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:530 msgid "They offered to introduce us (help other peers traverse our firewall)" -msgstr "" +msgstr "A proposé de nous représenter (aide de la part d'autres pairs pour traverser notre pare-feu)" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:528 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:532 msgid "We offered to introduce them (help other peers traverse their firewall)" -msgstr "" +msgstr "Nous avons proposé de le représenter (aide à d'autres pairs pour traverser passer leur pare-feu)" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:529 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533 msgid "How long since a packet has been received / sent" -msgstr "" +msgstr "Temps écoulé depuis la dernière réception/émission d'un paquet " -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:529 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:717 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1893 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:739 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1895 msgid "Idle" -msgstr "" +msgstr "En attente" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:530 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:718 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1898 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:740 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1900 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:156 msgid "In/Out" msgstr "Entrant/Sortant" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:530 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534 msgid "The smoothed inbound / outbound transfer rate (KBytes per second)" -msgstr "" +msgstr "Taux de transfert entrant/sortant lissé (ko/s)" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:531 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535 msgid "How long ago this connection was established" -msgstr "" +msgstr "Depuis combien de temps cette connexion est établie" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:531 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:719 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1903 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:741 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1905 msgid "Up" -msgstr "" +msgstr "En marche" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:532 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:720 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1905 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:742 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1907 msgid "Skew" -msgstr "" +msgstr "Dérive" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:532 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536 msgid "The difference between the peer's clock and your own" -msgstr "" +msgstr "Écart de temps entre l'horloge du pair et la votre" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537 msgid "The congestion window, which is how many bytes can be sent without an acknowledgement" -msgstr "" +msgstr "Fenêtre de congestion, en nombre d'octets transmissibles sans acquittement" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538 msgid "The number of sent messages awaiting acknowledgement" -msgstr "" +msgstr "Nombre de messages en attente d'acquittement" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539 msgid "The maximum number of concurrent messages to send" -msgstr "" +msgstr "Nombre maximum de messages simultanés à envoyer" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:540 msgid "The number of pending sends which exceed congestion window" -msgstr "" +msgstr "Nombre d'envois en attente qui débordent de la fenêtre de congestion" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541 msgid "The slow start threshold" -msgstr "" +msgstr "Seuil de démarrage lent" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:542 msgid "The round trip time in milliseconds" -msgstr "" +msgstr "Aller-retour en ms" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1915 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1917 msgid "Dev" -msgstr "" +msgstr "Deviat." -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543 msgid "The standard deviation of the round trip time in milliseconds" -msgstr "" +msgstr "Dérive standard d'aller-retour en ms" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:540 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544 msgid "The retransmit timeout in milliseconds" -msgstr "" +msgstr "Délai de retransmission en millisecondes" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545 msgid "Current maximum send packet size / estimated maximum receive packet size (bytes)" -msgstr "" +msgstr "Taille actuelle maximum de paquet envoyé / taille maximum estimée de paquet reçu (octets) " -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:542 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:721 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1922 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:743 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1924 msgid "TX" -msgstr "" +msgstr "TX" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:542 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546 msgid "The total number of packets sent to the peer" -msgstr "" +msgstr "Nombre de paquets envoyés au pair" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:722 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1924 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:744 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1926 msgid "RX" -msgstr "" +msgstr "RX" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547 msgid "The total number of packets received from the peer" -msgstr "" +msgstr "Nombre de paquets reçus du pair" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1927 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1929 msgid "Dup TX" -msgstr "" +msgstr "TX dupl." -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548 msgid "The total number of packets retransmitted to the peer" -msgstr "" +msgstr "Nombre de paquets retransmis au pair" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1929 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1931 msgid "Dup RX" -msgstr "" +msgstr "RX dupl." -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549 msgid "The total number of duplicate packets received from the peer" -msgstr "" +msgstr "Nombre de paquets en double reçus du pair" + +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:402 +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18 +msgid "Service" +msgstr "Service" + +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:404 +msgid "WAN Common Interface Configuration" +msgstr "Configuration de l'interface commune Internet" + +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:405 +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:411 +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:421 +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:426 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:86 +msgid "Status" +msgstr "État" + +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:406 +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:412 +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:422 +msgid "Type" +msgstr "Type" + +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:407 +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:413 +msgid "Upstream" +msgstr "Montant" + +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:408 +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:414 +msgid "Downstream" +msgstr "Descendant" + +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:410 +msgid "WAN PPP Connection" +msgstr "Connexion Internet PPP" + +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:415 +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:423 +msgid "External IP" +msgstr "Adresse IP externe" + +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:417 +msgid "Layer 3 Forwarding" +msgstr "Transfert niveau 3" + +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:418 +msgid "Default Connection Service" +msgstr "Service de connexion par défaut" + +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:420 +msgid "WAN IP Connection" +msgstr "Connexion IP Internet" + +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:425 +msgid "WAN Ethernet Link Configuration" +msgstr "Configuration du lien Ethernet Internet" + +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:438 +msgid "Found Device" +msgstr "Appareil détecté" + +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:440 +msgid "Subdevice" +msgstr "Service" + +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:461 +msgid "UPnP Status" +msgstr "État d'UPnP" + +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:464 +msgid "UPnP has been disabled; Do you have more than one UPnP Internet Gateway Device on your LAN ?" +msgstr "UPnP a été désactivé; peut-être avez-vous plus d'une passerelle Internet avec UPnP activé sur votre réseau local." + +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:467 +msgid "UPnP has not found any UPnP-aware, compatible device on your LAN." +msgstr "UPnP n'a pas trouvé de passerelle compatible sur votre réseau local." + +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:475 +#, java-format +msgid "The current external IP address reported by UPnP is {0}" +msgstr "Adresse IP externe détectée par UPnP : {0}" + +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:477 +msgid "The current external IP address is not available." +msgstr "L'adresse IP externe n'est pas disponible." + +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:481 +#, java-format +msgid "UPnP reports the maximum downstream bit rate is {0}bits/sec" +msgstr "UPnP indique un débit descendant maximum de {0}b/s" + +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:483 +#, java-format +msgid "UPnP reports the maximum upstream bit rate is {0}bits/sec" +msgstr "UPnP indique un débit montant maximum de {0}b/s" + +#. {0} is TCP or UDP +#. {1,number,#####} prevents 12345 from being output as 12,345 in the English locale. +#. If you want the digit separator in your locale, translate as {1}. +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:492 +#, java-format +msgid "{0} port {1,number,#####} was successfully forwarded by UPnP." +msgstr "Le port {0} {1,number,#####} est correctement transféré par UPnP." + +#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:494 +#, java-format +msgid "{0} port {1,number,#####} was not forwarded by UPnP." +msgstr "Le port {0} {1,number,#####} n'est pas transféré par UPnP." + +#: ../../../router/java/src/net/i2p/router/transport/UPnPManager.java:161 +msgid "UPnP is not enabled" +msgstr "UPnP n'est pas activé" #: ../../../router/java/src/net/i2p/router/transport/ntcp/EstablishState.java:409 #: ../../../router/java/src/net/i2p/router/transport/ntcp/EstablishState.java:627 #, java-format msgid "Excessive clock skew: {0}" -msgstr "" +msgstr "Décalage excessif de l''horloge: {0}" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:710 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:732 msgid "NTCP connections" msgstr "connexions NTCP" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:711 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1884 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:733 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1886 msgid "Limit" -msgstr "" +msgstr "Limite" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:712 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1885 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:734 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1887 msgid "Timeout" -msgstr "" +msgstr "Échéance" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:723 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:745 msgid "Out Queue" -msgstr "" +msgstr "File de sortie" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:724 -#, fuzzy +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:746 msgid "Backlogged?" -msgstr "Retard accumulé" +msgstr "Réinscrit?" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:738 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1947 -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:760 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1949 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:87 msgid "Inbound" msgstr "Entrant" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:740 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1949 -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:762 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1951 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:87 msgid "Outbound" msgstr "Sortant" #. buf.append("<tr> <td colspan=\"11\"><hr></td></tr>\n"); -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:787 -#, fuzzy +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:809 msgid "peers" msgstr "Pairs" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1883 -#, fuzzy +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1885 msgid "UDP connections" msgstr "connexions UDP" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1890 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1892 msgid "Sort by peer hash" -msgstr "" +msgstr "Tri par hachage de pair" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1892 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1894 msgid "Direction/Introduction" -msgstr "" +msgstr "Direction/Introduction" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1894 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1896 msgid "Sort by idle inbound" -msgstr "" +msgstr "Tri par entrant inactif" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1896 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1898 msgid "Sort by idle outbound" -msgstr "" +msgstr "Tri par sortant inactif" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1899 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1901 msgid "Sort by inbound rate" -msgstr "" +msgstr "Tri par taux entrant" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1901 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1903 msgid "Sort by outbound rate" -msgstr "" +msgstr "Tri par taux sortant" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1904 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1906 msgid "Sort by connection uptime" -msgstr "" +msgstr "Tri par durée de connexion" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1906 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1908 msgid "Sort by clock skew" -msgstr "" +msgstr "Tri par décalage d'horloge" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1909 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1911 msgid "Sort by congestion window" -msgstr "" +msgstr "Tri par fenêtre de congestion" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1911 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1913 msgid "Sort by slow start threshold" -msgstr "" +msgstr "Tri par seuil de démarrage lent" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1914 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1916 msgid "Sort by round trip time" -msgstr "" +msgstr "Tri par durée d'aller-retour" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1916 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1918 msgid "Sort by round trip time deviation" -msgstr "" +msgstr "Tri par dérive de durée d'aller-retour" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1918 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1920 msgid "Sort by retransmission timeout" -msgstr "" +msgstr "Tri pas dépassement de durée de retransmission" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1921 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1923 msgid "Sort by outbound maximum transmit unit" -msgstr "" +msgstr "Tri par MTU sortant" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1923 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1925 msgid "Sort by packets sent" -msgstr "" +msgstr "Tri par paquets envoyés" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1925 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1927 msgid "Sort by packets received" -msgstr "" +msgstr "Tri par paquets reçus" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1928 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1930 msgid "Sort by packets retransmitted" -msgstr "" +msgstr "Tri par paquets renvoyés" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1930 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1932 msgid "Sort by packets received more than once" -msgstr "" +msgstr "Tri par paquet reçus multiples" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1951 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1953 msgid "We offered to introduce them" -msgstr "" +msgstr "Propositions de présentation à " -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1953 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1955 msgid "They offered to introduce us" -msgstr "" +msgstr "Ont proposé leur service" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1957 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1959 msgid "Choked" -msgstr "" +msgstr "Choqué" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1965 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1967 msgid "1 fail" -msgstr "" +msgstr "1 échec" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1967 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1969 #, java-format msgid "{0} fails" -msgstr "" +msgstr "{0} échecs" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1973 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1975 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:162 msgid "Banned" -msgstr "Prohibé" +msgstr "Banni" #. buf.append("<tr><td colspan=\"16\"><hr></td></tr>\n"); -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2105 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2106 msgid "SUMMARY" -msgstr "" +msgstr "RÉSUMÉ" -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:145 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:124 msgid "Dropping tunnel requests: Too slow" -msgstr "" +msgstr "Perte de demandes de tunnels: Trop lent" #. don't even bother, since we are so overloaded locally -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:352 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:270 msgid "Dropping tunnel requests: Overloaded" -msgstr "" +msgstr "Perte de demandes de tunnnels: Surchargé" -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:525 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:473 msgid "Rejecting tunnels: Request overload" -msgstr "" +msgstr "Rejet de tunnels: Surcharge de requêtes " -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:550 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:498 msgid "Rejecting tunnels: Connection limit" -msgstr "" +msgstr "Rejet de tunnels: Limite de connexions" -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:744 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:698 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:719 msgid "Dropping tunnel requests: High load" -msgstr "" +msgstr "Perte de tunnels: Forte charge" -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:753 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:711 msgid "Dropping tunnel requests: Queue time" -msgstr "" +msgstr "Demandes de fermeture de tunnel: temps en file d'attente" #. Automatically generated pseudo-java for xgettext - do not edit #. Translators may wish to translate a few of these, do not bother to translate all of them!! @@ -564,19 +678,19 @@ msgstr "Andorre" #: ../java/build/Countries.java:4 msgid "United Arab Emirates" -msgstr "" +msgstr "Émirats arabes unis" #: ../java/build/Countries.java:5 msgid "Afghanistan" -msgstr "" +msgstr "Afghanistan" #: ../java/build/Countries.java:6 msgid "Antigua and Barbuda" -msgstr "" +msgstr "Antigua-et-Barbuda" #: ../java/build/Countries.java:7 msgid "Anguilla" -msgstr "" +msgstr "Anguilla" #: ../java/build/Countries.java:8 msgid "Albania" @@ -584,19 +698,19 @@ msgstr "Albanie" #: ../java/build/Countries.java:9 msgid "Armenia" -msgstr "" +msgstr "Arménie" #: ../java/build/Countries.java:10 msgid "Netherlands Antilles" -msgstr "" +msgstr "Antilles néerlandaises" #: ../java/build/Countries.java:11 msgid "Angola" -msgstr "" +msgstr "Angola" #: ../java/build/Countries.java:12 msgid "Antarctica" -msgstr "" +msgstr "Antarctique" #: ../java/build/Countries.java:13 msgid "Argentina" @@ -604,7 +718,7 @@ msgstr "Argentine" #: ../java/build/Countries.java:14 msgid "American Samoa" -msgstr "" +msgstr "Samoa américanes" #: ../java/build/Countries.java:15 msgid "Austria" @@ -612,63 +726,63 @@ msgstr "Autriche" #: ../java/build/Countries.java:16 msgid "Australia" -msgstr "" +msgstr "Australie" #: ../java/build/Countries.java:17 msgid "Aruba" -msgstr "" +msgstr "Aruba" #: ../java/build/Countries.java:19 msgid "Azerbaijan" -msgstr "" +msgstr "Azerbaïdjan" #: ../java/build/Countries.java:20 msgid "Bosnia and Herzegovina" -msgstr "" +msgstr "Bosnie Herzégovine" #: ../java/build/Countries.java:21 msgid "Barbados" -msgstr "" +msgstr "Barbades" #: ../java/build/Countries.java:22 msgid "Bangladesh" -msgstr "" +msgstr "Bangladesh" #: ../java/build/Countries.java:23 msgid "Belgium" -msgstr "" +msgstr "Belgique" #: ../java/build/Countries.java:24 msgid "Burkina Faso" -msgstr "" +msgstr "Burkina Faso" #: ../java/build/Countries.java:25 msgid "Bulgaria" -msgstr "" +msgstr "Bulgarie" #: ../java/build/Countries.java:26 msgid "Bahrain" -msgstr "" +msgstr "Bahreïn" #: ../java/build/Countries.java:27 msgid "Burundi" -msgstr "" +msgstr "Burundi" #: ../java/build/Countries.java:28 msgid "Benin" -msgstr "" +msgstr "Benin" #: ../java/build/Countries.java:29 msgid "Bermuda" -msgstr "" +msgstr "Bermudes" #: ../java/build/Countries.java:30 msgid "Brunei Darussalam" -msgstr "" +msgstr "Brunei" #: ../java/build/Countries.java:31 msgid "Bolivia" -msgstr "" +msgstr "Bolivie" #: ../java/build/Countries.java:32 msgid "Brazil" @@ -676,95 +790,95 @@ msgstr "Brésil" #: ../java/build/Countries.java:33 msgid "Bahamas" -msgstr "" +msgstr "Bahamas" #: ../java/build/Countries.java:34 msgid "Bhutan" -msgstr "" +msgstr "Bhoutan" #: ../java/build/Countries.java:35 msgid "Bouvet Island" -msgstr "" +msgstr "ÃŽle Bouvet" #: ../java/build/Countries.java:36 msgid "Botswana" -msgstr "" +msgstr "Botswana" #: ../java/build/Countries.java:37 msgid "Belarus" -msgstr "" +msgstr "Biélorussie" #: ../java/build/Countries.java:38 msgid "Belize" -msgstr "" +msgstr "Bélize" #: ../java/build/Countries.java:39 msgid "Canada" -msgstr "" +msgstr "Canada" #: ../java/build/Countries.java:40 msgid "The Democratic Republic of the Congo" -msgstr "" +msgstr "République démocratique du Congo" #: ../java/build/Countries.java:41 msgid "Central African Republic" -msgstr "" +msgstr "République centre africaine" #: ../java/build/Countries.java:42 msgid "Congo" -msgstr "" +msgstr "Congo" #: ../java/build/Countries.java:43 msgid "Switzerland" -msgstr "" +msgstr "Suisse" #: ../java/build/Countries.java:44 msgid "Cote D'Ivoire" -msgstr "" +msgstr "Côte d'ivoire" #: ../java/build/Countries.java:45 msgid "Cook Islands" -msgstr "" +msgstr "ÃŽles Cook" #: ../java/build/Countries.java:46 msgid "Chile" -msgstr "" +msgstr "Chili" #: ../java/build/Countries.java:47 msgid "Cameroon" -msgstr "" +msgstr "Cameroun" #: ../java/build/Countries.java:48 msgid "China" -msgstr "" +msgstr "Chine" #: ../java/build/Countries.java:49 msgid "Colombia" -msgstr "" +msgstr "Colombie" #: ../java/build/Countries.java:50 msgid "Costa Rica" -msgstr "" +msgstr "Costa Rica" #: ../java/build/Countries.java:51 msgid "Serbia and Montenegro" -msgstr "" +msgstr "Serbie-et-Monténégro" #: ../java/build/Countries.java:52 msgid "Cuba" -msgstr "" +msgstr "Cuba" #: ../java/build/Countries.java:53 msgid "Cape Verde" -msgstr "" +msgstr "Cap-Vert" #: ../java/build/Countries.java:54 msgid "Cyprus" -msgstr "" +msgstr "Chypre" #: ../java/build/Countries.java:55 msgid "Czech Republic" -msgstr "" +msgstr "République Tchèque" #: ../java/build/Countries.java:56 msgid "Germany" @@ -772,67 +886,67 @@ msgstr "Allemagne" #: ../java/build/Countries.java:57 msgid "Djibouti" -msgstr "" +msgstr "Djibouti" #: ../java/build/Countries.java:58 msgid "Denmark" -msgstr "" +msgstr "Danemark" #: ../java/build/Countries.java:59 msgid "Dominica" -msgstr "" +msgstr "Dominique" #: ../java/build/Countries.java:60 msgid "Dominican Republic" -msgstr "" +msgstr "République Dominicaine" #: ../java/build/Countries.java:61 msgid "Algeria" -msgstr "" +msgstr "Algérie" #: ../java/build/Countries.java:62 msgid "Ecuador" -msgstr "" +msgstr "Équateur" #: ../java/build/Countries.java:63 msgid "Estonia" -msgstr "" +msgstr "Estonie" #: ../java/build/Countries.java:64 msgid "Egypt" -msgstr "" +msgstr "Égypte" #: ../java/build/Countries.java:65 msgid "Eritrea" -msgstr "" +msgstr "Érythrée" #: ../java/build/Countries.java:66 msgid "Spain" -msgstr "" +msgstr "Espagne" #: ../java/build/Countries.java:67 msgid "Ethiopia" -msgstr "" +msgstr "Éthiopie" #: ../java/build/Countries.java:68 msgid "Finland" -msgstr "" +msgstr "Finlande" #: ../java/build/Countries.java:69 msgid "Fiji" -msgstr "" +msgstr "Fidji" #: ../java/build/Countries.java:70 msgid "Falkland Islands (Malvinas)" -msgstr "" +msgstr "Malouines" #: ../java/build/Countries.java:71 msgid "Federated States of Micronesia" -msgstr "" +msgstr "Micronésie" #: ../java/build/Countries.java:72 msgid "Faroe Islands" -msgstr "" +msgstr "Féroé" #: ../java/build/Countries.java:73 msgid "France" @@ -840,660 +954,661 @@ msgstr "France" #: ../java/build/Countries.java:74 msgid "Gabon" -msgstr "" +msgstr "Gabon" #: ../java/build/Countries.java:75 msgid "United Kingdom" -msgstr "" +msgstr "Royaume uni" #: ../java/build/Countries.java:76 msgid "Grenada" -msgstr "" +msgstr "Grenade" #: ../java/build/Countries.java:77 msgid "Georgia" -msgstr "" +msgstr "Géorgie" #: ../java/build/Countries.java:78 msgid "French Guiana" -msgstr "" +msgstr "Guyane française" #: ../java/build/Countries.java:79 msgid "Ghana" -msgstr "" +msgstr "Ghana" #: ../java/build/Countries.java:80 msgid "Gibraltar" -msgstr "" +msgstr "Gibraltar" #: ../java/build/Countries.java:81 msgid "Greenland" -msgstr "" +msgstr "Groenland" #: ../java/build/Countries.java:82 msgid "Gambia" -msgstr "" +msgstr "Gambie" #: ../java/build/Countries.java:83 msgid "Guinea" -msgstr "" +msgstr "Guinée" #: ../java/build/Countries.java:84 msgid "Guadeloupe" -msgstr "" +msgstr "Guadeloupe" #: ../java/build/Countries.java:85 msgid "Equatorial Guinea" -msgstr "" +msgstr "Guinée équatoriale" #: ../java/build/Countries.java:86 msgid "Greece" -msgstr "" +msgstr "Grèce" #: ../java/build/Countries.java:87 msgid "South Georgia and the South Sandwich Islands" -msgstr "" +msgstr "Géorgie et Sandwich du sud" #: ../java/build/Countries.java:88 msgid "Guatemala" -msgstr "" +msgstr "Guatémala" #: ../java/build/Countries.java:89 msgid "Guam" -msgstr "" +msgstr "Guam" #: ../java/build/Countries.java:90 msgid "Guinea-Bissau" -msgstr "" +msgstr "Guinée-Bissau" #: ../java/build/Countries.java:91 msgid "Guyana" -msgstr "" +msgstr "Guyane" #: ../java/build/Countries.java:92 msgid "Hong Kong" -msgstr "" +msgstr "Hong Kong" #: ../java/build/Countries.java:93 msgid "Honduras" -msgstr "" +msgstr "Honduras" #: ../java/build/Countries.java:94 msgid "Croatia" -msgstr "" +msgstr "Croatie" #: ../java/build/Countries.java:95 msgid "Haiti" -msgstr "" +msgstr "Haïti" #: ../java/build/Countries.java:96 msgid "Hungary" -msgstr "" +msgstr "Hongrie" #: ../java/build/Countries.java:97 msgid "Indonesia" -msgstr "" +msgstr "Indonésie" #: ../java/build/Countries.java:98 msgid "Ireland" -msgstr "" +msgstr "Irlande" #: ../java/build/Countries.java:99 msgid "Israel" -msgstr "" +msgstr "Israël" #: ../java/build/Countries.java:101 msgid "India" -msgstr "" +msgstr "Inde" #: ../java/build/Countries.java:102 msgid "British Indian Ocean Territory" -msgstr "" +msgstr "Territoire britannique de l'océan Indien" #: ../java/build/Countries.java:103 msgid "Iraq" -msgstr "" +msgstr "Irak" #: ../java/build/Countries.java:104 msgid "Islamic Republic of Iran" -msgstr "" +msgstr "Iran" #: ../java/build/Countries.java:105 msgid "Iceland" -msgstr "" +msgstr "Islande" #: ../java/build/Countries.java:106 msgid "Italy" -msgstr "" +msgstr "Italie" #: ../java/build/Countries.java:108 msgid "Jamaica" -msgstr "" +msgstr "Jamaïque" #: ../java/build/Countries.java:109 msgid "Jordan" -msgstr "" +msgstr "Jordanie" #: ../java/build/Countries.java:110 msgid "Japan" -msgstr "" +msgstr "Japon" #: ../java/build/Countries.java:111 msgid "Kenya" -msgstr "" +msgstr "Kenya" #: ../java/build/Countries.java:112 msgid "Kyrgyzstan" -msgstr "" +msgstr "Kirghizistan" #: ../java/build/Countries.java:113 msgid "Cambodia" -msgstr "" +msgstr "Cambodge" #: ../java/build/Countries.java:114 msgid "Kiribati" -msgstr "" +msgstr "Kiribati" #: ../java/build/Countries.java:115 msgid "Comoros" -msgstr "" +msgstr "Comores" #: ../java/build/Countries.java:116 msgid "Saint Kitts and Nevis" -msgstr "" +msgstr "Saint-Christophe-et-Niévès" #: ../java/build/Countries.java:117 msgid "Republic of Korea" -msgstr "" +msgstr "Corée" #: ../java/build/Countries.java:118 msgid "Kuwait" -msgstr "" +msgstr "Koweit" #: ../java/build/Countries.java:119 msgid "Cayman Islands" -msgstr "" +msgstr "Caïman" #: ../java/build/Countries.java:120 msgid "Kazakhstan" -msgstr "" +msgstr "Kazakhstan" #: ../java/build/Countries.java:121 msgid "Lao People's Democratic Republic" -msgstr "" +msgstr "Laos" #: ../java/build/Countries.java:122 msgid "Lebanon" -msgstr "" +msgstr "Liban" #: ../java/build/Countries.java:123 msgid "Saint Lucia" -msgstr "" +msgstr "Sainte Lucie" #: ../java/build/Countries.java:124 msgid "Liechtenstein" -msgstr "" +msgstr "Liechtenstein" #: ../java/build/Countries.java:125 msgid "Sri Lanka" -msgstr "" +msgstr "Sri Lanka" #: ../java/build/Countries.java:126 msgid "Liberia" -msgstr "" +msgstr "Libéria" #: ../java/build/Countries.java:127 msgid "Lesotho" -msgstr "" +msgstr "Lesotho" #: ../java/build/Countries.java:128 msgid "Lithuania" -msgstr "" +msgstr "Lithuanie" #: ../java/build/Countries.java:129 msgid "Luxembourg" -msgstr "" +msgstr "Luxembourg" #: ../java/build/Countries.java:130 msgid "Latvia" -msgstr "" +msgstr "Lettonie" #: ../java/build/Countries.java:131 msgid "Libyan Arab Jamahiriya" -msgstr "" +msgstr "Libye" #: ../java/build/Countries.java:132 msgid "Morocco" -msgstr "" +msgstr "Maroc" #: ../java/build/Countries.java:133 msgid "Monaco" -msgstr "" +msgstr "Monaco" #: ../java/build/Countries.java:134 msgid "Republic of Moldova" -msgstr "" +msgstr "Moldavie" #: ../java/build/Countries.java:137 msgid "Madagascar" -msgstr "" +msgstr "Madagascar" #: ../java/build/Countries.java:138 msgid "Marshall Islands" -msgstr "" +msgstr "Marshall" #: ../java/build/Countries.java:139 msgid "The Former Yugoslav Republic of Macedonia" -msgstr "" +msgstr "Macédoine" #: ../java/build/Countries.java:140 msgid "Mali" -msgstr "" +msgstr "Mali" #: ../java/build/Countries.java:141 msgid "Myanmar" -msgstr "" +msgstr "Birmanie" #: ../java/build/Countries.java:142 msgid "Mongolia" -msgstr "" +msgstr "Mongolie" #: ../java/build/Countries.java:143 msgid "Macao" -msgstr "" +msgstr "Macao" #: ../java/build/Countries.java:144 msgid "Northern Mariana Islands" -msgstr "" +msgstr "Mariannes" #: ../java/build/Countries.java:145 msgid "Martinique" -msgstr "" +msgstr "Martinique" #: ../java/build/Countries.java:146 msgid "Mauritania" -msgstr "" +msgstr "Mauritanie" #: ../java/build/Countries.java:147 msgid "Montserrat" -msgstr "" +msgstr "Montserrat" #: ../java/build/Countries.java:148 msgid "Malta" -msgstr "" +msgstr "Malte" #: ../java/build/Countries.java:149 msgid "Mauritius" -msgstr "" +msgstr "Maurice" #: ../java/build/Countries.java:150 msgid "Maldives" -msgstr "" +msgstr "Maldives" #: ../java/build/Countries.java:151 msgid "Malawi" -msgstr "" +msgstr "Malawi" #: ../java/build/Countries.java:152 msgid "Mexico" -msgstr "" +msgstr "Mexique" #: ../java/build/Countries.java:153 msgid "Malaysia" -msgstr "" +msgstr "Malaisie" #: ../java/build/Countries.java:154 msgid "Mozambique" -msgstr "" +msgstr "Mozambique" #: ../java/build/Countries.java:155 msgid "Namibia" -msgstr "" +msgstr "Namibie" #: ../java/build/Countries.java:156 msgid "New Caledonia" -msgstr "" +msgstr "Nouvelle Calédonie" #: ../java/build/Countries.java:157 msgid "Niger" -msgstr "" +msgstr "Niger" #: ../java/build/Countries.java:158 msgid "Norfolk Island" -msgstr "" +msgstr "Norfolk" #: ../java/build/Countries.java:159 msgid "Nigeria" -msgstr "" +msgstr "Nigéria" #: ../java/build/Countries.java:160 msgid "Nicaragua" -msgstr "" +msgstr "Nicaragua" #: ../java/build/Countries.java:161 msgid "Netherlands" -msgstr "" +msgstr "Pays bas" #: ../java/build/Countries.java:162 msgid "Norway" -msgstr "" +msgstr "Norvège" #: ../java/build/Countries.java:163 msgid "Nepal" -msgstr "" +msgstr "Népal" #: ../java/build/Countries.java:164 msgid "Nauru" -msgstr "" +msgstr "Nauru" #: ../java/build/Countries.java:165 msgid "Niue" -msgstr "" +msgstr "Niue" #: ../java/build/Countries.java:166 msgid "New Zealand" -msgstr "" +msgstr "Nouvelle Zélande" #: ../java/build/Countries.java:167 msgid "Oman" -msgstr "" +msgstr "Oman" #: ../java/build/Countries.java:168 msgid "Panama" -msgstr "" +msgstr "Panama" #: ../java/build/Countries.java:169 msgid "Peru" -msgstr "" +msgstr "Pérou" #: ../java/build/Countries.java:170 msgid "French Polynesia" -msgstr "" +msgstr "Polynésie française" #: ../java/build/Countries.java:171 msgid "Papua New Guinea" -msgstr "" +msgstr "Papouasie-Nouvelle-Guinée" #: ../java/build/Countries.java:172 msgid "Philippines" -msgstr "" +msgstr "Philippines" #: ../java/build/Countries.java:173 msgid "Pakistan" -msgstr "" +msgstr "Pakistan" #: ../java/build/Countries.java:174 msgid "Poland" -msgstr "" +msgstr "Pologne" #: ../java/build/Countries.java:175 msgid "Saint Pierre and Miquelon" -msgstr "" +msgstr "Saint Pierre et Miquelon" #: ../java/build/Countries.java:176 msgid "Puerto Rico" -msgstr "" +msgstr "Porto Rico" #: ../java/build/Countries.java:177 msgid "Palestinian Territory" -msgstr "" +msgstr "Palestine" #: ../java/build/Countries.java:178 msgid "Portugal" -msgstr "" +msgstr "Portugal" #: ../java/build/Countries.java:179 msgid "Palau" -msgstr "" +msgstr "Palaos" #: ../java/build/Countries.java:180 msgid "Paraguay" -msgstr "" +msgstr "Paraguay" #: ../java/build/Countries.java:181 msgid "Qatar" -msgstr "" +msgstr "Qatar" #: ../java/build/Countries.java:182 msgid "Reunion" -msgstr "" +msgstr "Réunion" #: ../java/build/Countries.java:183 msgid "Romania" -msgstr "" +msgstr "Roumanie" #: ../java/build/Countries.java:184 msgid "Serbia" -msgstr "" +msgstr "Serbie" #: ../java/build/Countries.java:185 msgid "Russian Federation" -msgstr "" +msgstr "Russie" #: ../java/build/Countries.java:186 msgid "Rwanda" -msgstr "" +msgstr "Rwanda" #: ../java/build/Countries.java:187 msgid "Saudi Arabia" -msgstr "" +msgstr "Arabie Saoudite" #: ../java/build/Countries.java:188 msgid "Solomon Islands" -msgstr "" +msgstr "Salomon" #: ../java/build/Countries.java:189 msgid "Seychelles" -msgstr "" +msgstr "Seychelles" #: ../java/build/Countries.java:190 msgid "Sudan" -msgstr "" +msgstr "Soudan" #: ../java/build/Countries.java:191 msgid "Sweden" -msgstr "" +msgstr "Suède" #: ../java/build/Countries.java:192 msgid "Singapore" -msgstr "" +msgstr "Singapour" #: ../java/build/Countries.java:193 msgid "Slovenia" -msgstr "" +msgstr "Slovénie" #: ../java/build/Countries.java:194 msgid "Slovakia" -msgstr "" +msgstr "Slovaquie" #: ../java/build/Countries.java:195 msgid "Sierra Leone" -msgstr "" +msgstr "Sierra Leone" #: ../java/build/Countries.java:196 msgid "San Marino" -msgstr "" +msgstr "Saint Marin" #: ../java/build/Countries.java:197 msgid "Senegal" -msgstr "" +msgstr "Sénégal" #: ../java/build/Countries.java:198 msgid "Somalia" -msgstr "" +msgstr "Somalie" #: ../java/build/Countries.java:199 msgid "Suriname" -msgstr "" +msgstr "Surinam" #: ../java/build/Countries.java:200 msgid "Sao Tome and Principe" -msgstr "" +msgstr "Sao Tome e Principe" #: ../java/build/Countries.java:201 msgid "El Salvador" -msgstr "" +msgstr "Salvador" #: ../java/build/Countries.java:202 msgid "Syrian Arab Republic" -msgstr "" +msgstr "Syrie" #: ../java/build/Countries.java:203 msgid "Swaziland" -msgstr "" +msgstr "Swaziland" #: ../java/build/Countries.java:204 msgid "Turks and Caicos Islands" -msgstr "" +msgstr "Turques-et-Caïques" #: ../java/build/Countries.java:205 msgid "Chad" -msgstr "" +msgstr "Tchad" #: ../java/build/Countries.java:206 msgid "French Southern Territories" -msgstr "" +msgstr "Terres australes et antarctiques françaises" #: ../java/build/Countries.java:207 msgid "Togo" -msgstr "" +msgstr "Togo" #: ../java/build/Countries.java:208 msgid "Thailand" -msgstr "" +msgstr "Thaïlande" #: ../java/build/Countries.java:209 msgid "Tajikistan" -msgstr "" +msgstr "Tadjikistan" #: ../java/build/Countries.java:210 msgid "Tokelau" -msgstr "" +msgstr "Tokelau" #: ../java/build/Countries.java:211 msgid "Timor-Leste" -msgstr "" +msgstr "Timor oriental" #: ../java/build/Countries.java:212 msgid "Turkmenistan" -msgstr "" +msgstr "Turkménistan" #: ../java/build/Countries.java:213 msgid "Tunisia" -msgstr "" +msgstr "Tunisie" #: ../java/build/Countries.java:214 msgid "Tonga" -msgstr "" +msgstr "Tonga" #: ../java/build/Countries.java:215 msgid "Turkey" -msgstr "" +msgstr "Turquie" #: ../java/build/Countries.java:216 msgid "Trinidad and Tobago" -msgstr "" +msgstr "Trinidad et Tobago" #: ../java/build/Countries.java:217 msgid "Tuvalu" -msgstr "" +msgstr "Tuvalu" #: ../java/build/Countries.java:218 msgid "Taiwan" -msgstr "" +msgstr "Taiwan" #: ../java/build/Countries.java:219 msgid "United Republic of Tanzania" -msgstr "" +msgstr "Tanzanie" #: ../java/build/Countries.java:220 msgid "Ukraine" -msgstr "" +msgstr "Ukraine" #: ../java/build/Countries.java:221 msgid "Uganda" -msgstr "" +msgstr "Ouganda" #: ../java/build/Countries.java:222 msgid "United States Minor Outlying Islands" -msgstr "" +msgstr "ÃŽles mineures éloignées des États-Unis" #: ../java/build/Countries.java:223 msgid "United States" -msgstr "" +msgstr "États unis" #: ../java/build/Countries.java:224 msgid "Uruguay" -msgstr "" +msgstr "Uruguay" #: ../java/build/Countries.java:225 msgid "Uzbekistan" -msgstr "" +msgstr "Ouzbékistan" #: ../java/build/Countries.java:226 msgid "Holy See (Vatican City State)" -msgstr "" +msgstr "Vatican" #: ../java/build/Countries.java:227 msgid "Saint Vincent and the Grenadines" -msgstr "" +msgstr "Saint-Vincent-et-les Grenadines" #: ../java/build/Countries.java:228 msgid "Venezuela" -msgstr "" +msgstr "Venezuela" #: ../java/build/Countries.java:229 #: ../java/build/Countries.java:230 msgid "Virgin Islands" -msgstr "" +msgstr "Ãles Vierges" #: ../java/build/Countries.java:231 msgid "Viet Nam" -msgstr "" +msgstr "Viêt Nam" #: ../java/build/Countries.java:232 msgid "Vanuatu" -msgstr "" +msgstr "Vanuatu" #: ../java/build/Countries.java:233 msgid "Wallis and Futuna" -msgstr "" +msgstr "Wallis et Futuna" #: ../java/build/Countries.java:234 msgid "Samoa" -msgstr "" +msgstr "Samoa" #: ../java/build/Countries.java:235 msgid "Yemen" -msgstr "" +msgstr "Yémen" #: ../java/build/Countries.java:236 msgid "Mayotte" -msgstr "" +msgstr "Mayotte" #: ../java/build/Countries.java:237 msgid "South Africa" -msgstr "" +msgstr "Afrique du sud" #: ../java/build/Countries.java:238 msgid "Zambia" -msgstr "" +msgstr "Zambie" #: ../java/build/Countries.java:239 msgid "Zimbabwe" -msgstr "" +msgstr "Zimbabwe" -#: ../java/src/net/i2p/router/web/CSSHelper.java:57 +#: ../java/src/net/i2p/router/web/CSSHelper.java:60 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:35 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:37 #: ../java/strings/Strings.java:29 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:234 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:125 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:257 msgid "I2P Router Console" msgstr "Console du routeur I2P" #: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:57 msgid "Error updating the configuration - please see the error logs" -msgstr "" +msgstr "Erreur pendant la mise à jour de la configuration: contrôlez les historiques" #: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:69 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:266 @@ -1503,253 +1618,257 @@ msgstr "Configuration sauvegardé avec succès" #: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:71 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:268 msgid "Error saving the configuration (applied but not saved) - please see the error logs" -msgstr "" +msgstr "Erreur pendant l'enregistrement de la configuration (appliquée mais non sauvegardée): contrôlez les historiques" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:34 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:334 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:35 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:355 msgid "Save Client Configuration" -msgstr "Sauvegarder Configuration Client " +msgstr "Enregistrer la configuration du client " -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:38 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:346 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:39 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:427 +msgid "Save Interface Configuration" +msgstr "Enregistrer la configuration de l'interface" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:43 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:441 msgid "Save WebApp Configuration" -msgstr "" +msgstr "Enregistrer la configuration WebApp" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:42 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:356 -#, fuzzy +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:47 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:453 msgid "Save Plugin Configuration" -msgstr "Sauvegarder Configuration Client " +msgstr "Enregistrer la configuration du greffon" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:46 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:362 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:51 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:461 msgid "Install Plugin" -msgstr "" +msgstr "Installer le greffon" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:82 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:87 #, java-format msgid "Deleted plugin {0}" -msgstr "" +msgstr "Greffon {0} supprimé" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:84 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:89 #, java-format msgid "Error deleting plugin {0}" -msgstr "" +msgstr "Erreur de suppression du greffon {0}" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:96 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:101 #, java-format msgid "Stopped plugin {0}" -msgstr "" +msgstr "Greffon {0} arrêté" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:98 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:103 #, java-format msgid "Error stopping plugin {0}" -msgstr "" +msgstr "Erreur d''arrêt du greffon {0}" #. label (IE) -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:119 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:189 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:124 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:255 msgid "Start" msgstr "Démarrer" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:138 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:143 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:49 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:61 +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:33 msgid "Unsupported" msgstr "Non supportée" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:184 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:189 msgid "New client added" -msgstr "" +msgstr "Nouveau client ajouté" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:188 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:193 msgid "Client configuration saved successfully - restart required to take effect." msgstr "La configuration du client a été sauvegardé avec succès - redémarrer pour prendre effet. " -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:202 -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:213 -msgid "Bad client index." -msgstr "" - #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:207 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:218 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:38 +msgid "Bad client index." +msgstr "Index client incorrect." + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:212 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:223 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:392 -#: ../java/src/net/i2p/router/web/SummaryHelper.java:379 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:384 msgid "Client" -msgstr "Client" +msgstr "Clients" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:207 -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:266 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:212 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:271 msgid "started" msgstr "démarré" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:218 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:223 msgid "deleted" -msgstr "" +msgstr "effacé" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:235 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:240 msgid "WebApp configuration saved." msgstr "Sauvegardé configuration WebApp" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:251 -#, fuzzy +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:256 msgid "Plugin configuration saved." -msgstr "Configuration Client" +msgstr "Configuration du greffon enregistrée" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:266 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:58 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:271 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124 msgid "WebApp" -msgstr "" +msgstr "WebApp" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:268 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:273 msgid "Failed to start" msgstr "Echec de démarrage" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:273 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:278 msgid "Failed to find server." msgstr "Pas pu trouver un serveur." -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:279 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:284 msgid "No plugin URL specified." -msgstr "" +msgstr "URL du greffon non spécifiée." -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:289 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:294 #, java-format msgid "No update URL specified for {0}" -msgstr "" +msgstr "URL de mise à jour non spécifiée pour {0}" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:297 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:302 -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:315 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:307 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:320 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:325 msgid "Plugin or update download already in progress." -msgstr "" +msgstr "Greffon ou téléchargement de mise à jour déjà en cours d'exécution." -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:306 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:311 #: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:118 #, java-format msgid "Downloading plugin from {0}" -msgstr "" +msgstr "Téléchargement greffon depuis {0}" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:324 -#, fuzzy, java-format +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:329 +#, java-format msgid "Checking plugin {0} for updates" -msgstr "Chercher des mises à jour" +msgstr "Cherche de mise à jour du greffon {0}" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:334 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:339 #, java-format msgid "Started plugin {0}" -msgstr "" +msgstr "Greffon {0} démarré" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:336 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:341 #, java-format msgid "Error starting plugin {0}" -msgstr "" +msgstr "Erreur de démarrage du greffon {0}" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:376 +msgid "Interface configuration saved successfully - restart required to take effect." +msgstr "La configuration de l'interface a été sauvegardée avec succès - redémarrer pour prise en compte." -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:21 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:192 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:85 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:258 msgid "Edit" -msgstr "" +msgstr "Modifier" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:30 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:330 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:94 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:351 msgid "Add Client" -msgstr "Ajouter client" +msgstr "Ajouter un client" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:38 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102 msgid "Class and arguments" -msgstr "" +msgstr "Classe et paramètres" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:38 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:58 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:82 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148 msgid "Control" -msgstr "" +msgstr "Actions" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:38 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:58 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:82 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148 msgid "Run at Startup?" -msgstr "Lancer au démarrage ?" +msgstr "Lancé au démarrage" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:58 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:82 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:131 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:197 msgid "Description" -msgstr "" +msgstr "Description" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:82 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148 msgid "Plugin" -msgstr "" +msgstr "Greffon" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:95 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:271 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:181 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:161 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:273 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:185 msgid "Version" msgstr "Version" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:97 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:163 msgid "Signed by" -msgstr "" +msgstr "Signé par" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:114 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:180 msgid "Date" msgstr "Date" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:120 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:186 msgid "Author" msgstr "Autheur" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:136 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:202 msgid "License" -msgstr "" +msgstr "Licence" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:141 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:207 msgid "Website" -msgstr "" +msgstr "Site web" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:146 -#, fuzzy +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:212 msgid "Update link" -msgstr "Méthode de mise à jour" +msgstr "Mise à jour du lien" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:194 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:260 msgid "Stop" -msgstr "" +msgstr "Arrêt" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:196 -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:81 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:312 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:262 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:80 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:331 msgid "Check for updates" -msgstr "Chercher des mises à jour" +msgstr "Vérifier les mises à jour" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:197 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:263 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:231 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:238 msgid "Update" -msgstr "Mettre à jour" +msgstr "Mise à jour" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:202 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:268 #, java-format msgid "Are you sure you want to delete {0}?" -msgstr "" +msgstr "Voulez-vous vraiment supprimer {0}?" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:204 -#, fuzzy +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:270 msgid "Delete" -msgstr "Supprimer une clé" +msgstr "Effacer" #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:18 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:324 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:343 msgid "Add key" -msgstr "Ajouter une clé" +msgstr "Ajouter la clé" #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:19 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:322 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:341 msgid "Delete key" -msgstr "Supprimer une clé" +msgstr "Supprimer la clé" #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:21 msgid "You must enter a destination" @@ -1767,116 +1886,110 @@ msgstr "Clé pour" #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:34 msgid "added to keyring" -msgstr "ajouté au porte-clés " +msgstr "ajoutée au porte-clés " #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:36 msgid "Invalid destination or key" -msgstr "Destination ou clé pas valable" +msgstr "Destination ou clé incorrecte" #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:41 msgid "removed from keyring" -msgstr "enlévé du porte-clés" +msgstr "enlevée du porte-clés" #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:43 msgid "not found in keyring" -msgstr "pas trouvé sur le porte-clés" +msgstr "pas trouvée sur le porte-clés" #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:45 msgid "Invalid destination" -msgstr "Destination pas valable" +msgstr "Destination incorrecte" #: ../java/src/net/i2p/router/web/ConfigLoggingHandler.java:82 msgid "Log overrides updated" -msgstr "" +msgstr "Écrasement des historiques mis à jour" #: ../java/src/net/i2p/router/web/ConfigLoggingHandler.java:160 -#, fuzzy msgid "Log configuration saved" -msgstr "Aide avec la configuration" +msgstr "Configuration des historiques enregistrée" #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:48 msgid "Add additional logging statements above. Example: net.i2p.router.tunnel=WARN" -msgstr "" +msgstr "Ajoutez des critères supplémentaires ci-dessus. Exemple: net.i2p.router.tunnel=WARN" #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:49 msgid "Or put entries in the logger.config file. Example: logger.record.net.i2p.router.tunnel=WARN" -msgstr "" +msgstr "Ou mettez des entrées dans le fichier logger.config. Exemple logger.record.net.i2p.router.tunnel=WARN" #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:50 msgid "Valid levels are DEBUG, INFO, WARN, ERROR, CRIT" -msgstr "" +msgstr "Les niveaux autorisés sont DEBUG, INFO, WARN, ERROR, CRIT" #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68 msgid "CRIT" -msgstr "" +msgstr "CRIT" #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68 msgid "DEBUG" -msgstr "" +msgstr "DEBUG" #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68 msgid "ERROR" -msgstr "" +msgstr "ERROR" #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68 msgid "INFO" -msgstr "" +msgstr "INFO" #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68 msgid "WARN" -msgstr "" +msgstr "WARN" #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:88 -#, fuzzy msgid "Remove" -msgstr "Supprimir" +msgstr "Supprimer" #: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:125 msgid "Select a class to add" -msgstr "" +msgstr "Choisissez une classe à ajouter" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:200 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:204 msgid "Network" msgstr "Réseau" -#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18 -msgid "Service" -msgstr "" - #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:101 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:381 #: ../java/strings/Strings.java:72 msgid "Tunnels" -msgstr "" +msgstr "Tunnels" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18 msgid "UI" -msgstr "IHM" +msgstr "Apparence" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19 msgid "Clients" msgstr "Clients" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:292 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:315 msgid "Keyring" msgstr "Porte-clés" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19 msgid "Logging" -msgstr "Enregistrements" +msgstr "Historiques" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:107 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:256 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:255 #: ../java/strings/Strings.java:67 msgid "Peers" msgstr "Pairs" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:387 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:389 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:143 msgid "Stats" msgstr "Statistiques" @@ -1887,19 +2000,21 @@ msgstr "Avancé" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:48 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:264 -#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:35 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:359 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:515 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:305 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:339 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:375 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:343 +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:29 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:34 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:378 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:534 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:325 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:359 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:370 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:397 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:362 msgid "Save changes" -msgstr "Sauvegarder" +msgstr "Enregistrer" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:121 msgid "Rechecking router reachability..." -msgstr "" +msgstr "Vérification de l'accessibilité du routeur..." #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:153 msgid "Updating IP address" @@ -1907,31 +2022,31 @@ msgstr "Mise à jour d'adresse IP en cours" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:171 msgid "Disabling TCP completely" -msgstr "" +msgstr "Désactivation complète de TCP" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:175 msgid "Updating inbound TCP address to" -msgstr "" +msgstr "Mise à jour adresse TCP entrante à " #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:179 msgid "Disabling inbound TCP" -msgstr "" +msgstr "Désactivation TCP entrant" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:181 msgid "Updating inbound TCP address to auto" -msgstr "" +msgstr "Mise à jour adresse TCP entrante à \"Auto\"" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:190 msgid "Updating inbound TCP port to" -msgstr "" +msgstr "Mise à jour port TCP entrant à " #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:193 msgid "Updating inbound TCP port to auto" -msgstr "" +msgstr "Mise à jour port TCP entrant à \"Auto\"" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:205 msgid "Updating UDP port from" -msgstr "" +msgstr "Mise à jour port UDP de " #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:205 msgid "to" @@ -1939,37 +2054,37 @@ msgstr "à " #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:221 msgid "Gracefully restarting into Hidden Router Mode" -msgstr "" +msgstr "Redémarrage respectueux en mode routeur caché" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:223 msgid "Gracefully restarting to exit Hidden Router Mode" -msgstr "" +msgstr "Redémarrage respectueux pour sortie du mode routeur caché" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:232 msgid "Enabling UPnP, restart required to take effect" -msgstr "" +msgstr "Activation UPnP, sera prise en compte au démarrage suivant" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:234 msgid "Disabling UPnP, restart required to take effect" -msgstr "" +msgstr "Désactivation UPnP, sera prise en compte au démarrage suivant" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:242 msgid "Enabling laptop mode" -msgstr "" +msgstr "Activation mode portable" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:244 msgid "Disabling laptop mode" -msgstr "" +msgstr "Désactivation mode portable" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:250 msgid "Requiring SSU introducers" -msgstr "" +msgstr "Nécessite des représentants SSU" #. 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. #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:291 msgid "Gracefully restarting I2P to change published router address" -msgstr "" +msgstr "Redémarrage respectueux en cours pour modifier l'adresse routeur publiée" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:314 msgid "Updating bandwidth share percentage" @@ -1979,36 +2094,36 @@ msgstr "Mise à jour du pourcentage de bande passante partagée" msgid "Updated bandwidth limits" msgstr "Limitations mises à jour de la bande passante " -#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:39 -#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:47 -#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:50 -#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:57 -#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:60 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:41 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:49 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:52 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:59 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:62 msgid "unknown" msgstr "inconnu" -#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:169 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:172 msgid "bits per second" msgstr "bits par seconde" -#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:170 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:173 #, java-format msgid "or {0} bytes per month maximum" -msgstr "" +msgstr "= {0} o/mois maximum" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:20 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:314 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:333 msgid "Ban peer until restart" msgstr "Interdire pair jusqu'au redémarrage" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:23 #, java-format msgid "Manually banned via {0}" -msgstr "" +msgstr "Banni manuellement via {0}" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:24 msgid "banned until restart" -msgstr "interdit jusqu'au rédémarrage" +msgstr "banni jusqu'au redémarrage" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:27 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:38 @@ -2017,9 +2132,9 @@ msgid "Invalid peer" msgstr "Pair pas valable" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:28 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:316 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:335 msgid "Unban peer" -msgstr "" +msgstr "Banissement du pair levé" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:33 msgid "unbanned" @@ -2027,38 +2142,55 @@ msgstr "plus interdit" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:35 msgid "is not currently banned" -msgstr "n'est pas actuellement interdit" +msgstr "n'est pas banni actuellement" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:39 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:322 -msgid "Adjust Profile Bonuses" -msgstr "" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:361 +msgid "Adjust peer bonuses" +msgstr "Ajuster les boni des pairs" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:47 msgid "Bad speed value" -msgstr "" +msgstr "Valeur de vitesse incorrecte" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:52 msgid "Bad capacity value" msgstr "Mauvaise valeur de capacité" +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:17 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:368 +msgid "Save changes and reseed now" +msgstr "Sauvegarder et réamorcer" + +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:21 +msgid "Reseeding is already in progress" +msgstr "Réamorçage déjà en cours" + +#. skip the nonce checking in ReseedHandler +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:24 +msgid "Starting reseed process" +msgstr "Processus de réamorçage en cours." + +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:66 +msgid "Configuration saved successfully." +msgstr "Configuration sauvegardée" + #. Normal browsers send value, IE sends button label #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:32 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:57 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:292 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:311 msgid "Shutdown immediately" -msgstr "Fermer immédiatement" +msgstr "Arrêter immédiatement" #. ctx.router().shutdown(Router.EXIT_HARD); // never returns #. give the UI time to respond #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:36 msgid "Cancel shutdown" -msgstr "Annuler redémarrage" +msgstr "Annuler l'arrêt" #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:37 -#, fuzzy msgid "Cancel restart" -msgstr "Redémarrage gracieux" +msgstr "Annuler le redémarrage" #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:39 msgid "Restart immediately" @@ -2068,353 +2200,332 @@ msgstr "Redémarrer immédiatement" #. give the UI time to respond #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:43 msgid "Restart" -msgstr "Redémarrer" +msgstr "Redémarrage" #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:46 msgid "Shutdown" -msgstr "Fermer" +msgstr "Arrêt" #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:59 -#, fuzzy msgid "Restart imminent" -msgstr "Redémarrer immédiatement" +msgstr "Redémarrage imminent" #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:61 msgid "Shutdown imminent" -msgstr "Fermature imminente" +msgstr "Arrêt imminent" #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:65 #, java-format msgid "Shutdown in {0}" -msgstr "Fermature en {0}" +msgstr "Arrêt dans {0}" #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:70 #, java-format msgid "Restart in {0}" -msgstr "Redémarrage en {0}" +msgstr "Redémarrage dans {0}" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:53 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:290 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:309 msgid "Shutdown gracefully" -msgstr "Fermer gracieusement" +msgstr "Arrêt respectueux" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:56 msgid "Graceful shutdown initiated" -msgstr "Fermature gracieuse initiée" +msgstr "Arrêt respectueux initialisé" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:60 msgid "Shutdown immediately! boom bye bye bad bwoy" -msgstr "Fermer immédiatement !" +msgstr "Arrêt immédiat! (À la sauvage)" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:61 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:294 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:313 msgid "Cancel graceful shutdown" -msgstr "Annuler fermeture gracieux" +msgstr "Annuler l'arrêt respectueux" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:63 msgid "Graceful shutdown cancelled" -msgstr "Fermeture gracieux annulée" +msgstr "Arrêt respectueux annulé" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:64 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:306 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:325 msgid "Graceful restart" -msgstr "Redémarrage gracieux" +msgstr "Redémarrage respectueux" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:67 msgid "Graceful restart requested" -msgstr "Redémarrage gracieux demandé" +msgstr "Redémarrage respectueux demandé" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:68 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:308 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:327 msgid "Hard restart" -msgstr "Redémarrage immédiate" +msgstr "Redémarrage immédiat" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:71 msgid "Hard restart requested" -msgstr "Redémarrage immédiate demandé" +msgstr "Redémarrage immédiat demandé" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:72 msgid "Rekey and Restart" -msgstr "" +msgstr "Régénération de clé et redémarrage" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:73 msgid "Rekeying after graceful restart" -msgstr "" +msgstr "Régénaration clé après redémarrage respecteux" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:76 msgid "Rekey and Shutdown" -msgstr "" +msgstr "Régénération clé et arrêt" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:77 msgid "Rekeying after graceful shutdown" -msgstr "" +msgstr "Régénération clé après arrêt respectueux" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:80 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:334 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:353 msgid "Run I2P on startup" msgstr "Lancer I2P au démarrage" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:82 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:336 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:355 msgid "Don't run I2P on startup" msgstr "Ne pas lancer I2P au démarrage" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:84 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:354 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:373 msgid "Dump threads" -msgstr "Dump fils d'exécution" +msgstr "Cliché des tâches" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:91 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:322 -msgid "Show systray icon" -msgstr "" - -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:96 -msgid "System tray icon enabled." -msgstr "" - -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:98 -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:110 -msgid "System tray icon feature not supported on this platform. Sorry!" -msgstr "" - -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:101 -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:113 -msgid "Warning: unable to contact the systray manager" -msgstr "" - -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:103 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:324 -msgid "Hide systray icon" -msgstr "" - -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:108 -msgid "System tray icon disabled." -msgstr "" - -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:115 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:362 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:381 msgid "View console on startup" msgstr "Montrer la console au démarrage" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:117 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:93 msgid "Console is to be shown on startup" -msgstr "" +msgstr "Afficher la console au démarrage" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:118 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:364 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:94 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:383 msgid "Do not view console on startup" msgstr "Ne pas montrer la console au démarrage" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:120 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:96 msgid "Console is not to be shown on startup" -msgstr "" +msgstr "Ne pas afficher la console au démarrage" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:129 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:105 msgid "Service installed" msgstr "Service installé" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:131 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:107 msgid "Warning: unable to install the service" -msgstr "" +msgstr "Avertissement: impossible d'installer le service" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:137 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:113 msgid "Service removed" -msgstr "Service enlévé" +msgstr "Service enlevé" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:139 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:115 msgid "Warning: unable to remove the service" -msgstr "" +msgstr "Avertissement: impossible de désinstaller le service" -#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:118 +#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:111 msgid "Stat filter and location updated successfully to" -msgstr "" +msgstr "Filtre de statistiques et emplacement mis à jour à " -#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:120 +#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:113 msgid "Failed to update the stat filter and location" -msgstr "" +msgstr "Échec de mise à jour du filtre de statistiques et emplacement" -#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:121 +#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:114 msgid "Graph list updated, may take up to 60s to be reflected here and on the <a href=\"graphs.jsp\">Graphs Page</a>" -msgstr "" +msgstr "Liste des graphiques mise à jour. Peut nécessiter jusqu'à 60s pour être répercutée ici et la <a href=\"graphs.jsp\">page des graphiques</a>." #. the count isn't really correct anyway, since we don't check for actual changes #. addFormNotice("Updated settings for " + updated + " pools."); -#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:137 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:135 msgid "Updated settings for all pools." -msgstr "" +msgstr "Mise à jour des réglages pour tous les groupes." -#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:142 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:140 msgid "Exploratory tunnel configuration saved successfully." -msgstr "Configuration du tunnel exploratoire a été sauvegardé avec succès." +msgstr "Configuration des tunnels exploratoires sauvegardée avec succès." -#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:144 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:142 #: ../java/src/net/i2p/router/web/ConfigUIHandler.java:36 msgid "Error saving the configuration (applied but not saved) - please see the error logs." -msgstr "" +msgstr "Erreur pendant l'enregistrement de la configuration (appliquée mais non sauvegardée): contrôlez les historiques" #. * dummies for translation #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:14 #, java-format msgid "1 hop" msgid_plural "{0} hops" -msgstr[0] "1 saut" +msgstr[0] "{0} saut" msgstr[1] "{0} sauts" #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:15 #, java-format msgid "1 tunnel" msgid_plural "{0} tunnels" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "{0} tunnel" +msgstr[1] "{0} tunnels" -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:26 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:35 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:41 msgid "Exploratory tunnels" msgstr "Tunnels exploratoires" -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:46 -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:61 -msgid "Client tunnels for" -msgstr "Tunnels clients pour" +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:51 +#, java-format +msgid "Client tunnels for {0}" +msgstr "Tunnels clients pour {0}" -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:69 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:74 msgid "ANONYMITY WARNING - Settings include 0-hop tunnels." -msgstr "" +msgstr "AVERTISSEMENT d'ANONYMAT: les réglages incluent des tunnels à 0 saut!" -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:74 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:79 msgid "ANONYMITY WARNING - Settings include 1-hop tunnels." -msgstr "" +msgstr "AVERTISSEMENT d'ANONYMAT: les réglages incluent des tunnels à 1 saut!" -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:77 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82 msgid "PERFORMANCE WARNING - Settings include very long tunnels." -msgstr "" +msgstr "AVERTISSEMENT de PERFORMANCES: les réglages incluent des tunnels très longs!" -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:80 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:85 msgid "PERFORMANCE WARNING - Settings include high tunnel quantities." -msgstr "" +msgstr "AVERTISSEMENT de PERFORMANCES: les réglages incluent un grand nombre de tunnels!" #. buf.append("<tr><th></th><th>Inbound</th><th>Outbound</th></tr>\n"); #. tunnel depth -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:87 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:92 msgid "Length" -msgstr "" +msgstr "Longueur" #. tunnel depth variance -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:104 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:109 msgid "Randomization" -msgstr "Randomisation" +msgstr "Aléas" #. tunnel quantity -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:128 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:133 msgid "Quantity" -msgstr "Quantité" +msgstr "Nombre" #. tunnel backup quantity -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:145 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:150 msgid "Backup quantity" -msgstr "'Backup' quantité" +msgstr "Secours" -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:167 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:172 msgid "Inbound options" msgstr "Options Entrants" -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:180 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:185 msgid "Outbound options" msgstr "Options Sortants" #: ../java/src/net/i2p/router/web/ConfigUIHandler.java:31 msgid "Theme change saved." -msgstr "Changement de thème sauvegardé." +msgstr "Changement de thème enregistré." #: ../java/src/net/i2p/router/web/ConfigUIHandler.java:33 msgid "Refresh the page to view." -msgstr "" +msgstr "Réactualiser la page." #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51 +msgid "Arabic" +msgstr "Arabe" + +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 msgid "English" msgstr "Anglais" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 msgid "French" msgstr "Français" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 msgid "German" msgstr "Allemand" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 msgid "Spanish" msgstr "Espagnol" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 -msgid "Chinese" -msgstr "Chinois" - -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53 msgid "Dutch" msgstr "Néerlandais" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53 +msgid "Portuguese" +msgstr "Portugais" + +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53 msgid "Russian" msgstr "Russe" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:54 +msgid "Chinese" +msgstr "Chinois" + +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:54 msgid "Swedish" msgstr "Suédois" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:88 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:87 msgid "Update available, attempting to download now" -msgstr "Mise à jour disponible, en tentant de la télécharger actuellement" +msgstr "Mise à jour disponible, essai de téléchargement en cours" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:90 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:89 msgid "Update available, click button on left to download" -msgstr "Mise à jour disponible, cliquez sur le bouton sur la gauche pour la télécharger" +msgstr "Mise à jour disponible, cliquez sur le bouton de gauche pour la télécharger" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:96 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:95 msgid "No update available" msgstr "Pas de mise à jour disponible" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:104 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:103 msgid "Updating news URL to" -msgstr "" +msgstr "Mise à jour de l'URL de news vers " -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:112 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:111 msgid "Updating proxy host to" -msgstr "" +msgstr "Mise à jour de l'hôte mandataire vers" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:120 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:119 msgid "Updating proxy port to" -msgstr "" +msgstr "Mise à jour du port mandataire vers" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:133 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:132 msgid "Updating refresh frequency to" -msgstr "" +msgstr "Mise à jour de la fréquence de rafraîchissement vers" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:140 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:139 msgid "Updating update policy to" -msgstr "" +msgstr "Mise à jour de la stratégie de mises à jour vers" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:149 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:148 msgid "Updating update URLs." -msgstr "" +msgstr "Mise à jour de l'URL de mises à jour." -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:158 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:157 msgid "Updating trusted keys." -msgstr "" +msgstr "Mise à jour des clefs de confiance." -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:166 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:165 msgid "Updating unsigned update URL to" -msgstr "" +msgstr "Mise à jour de l'URL de mises à jour non signées vers" #: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:88 -#: ../java/src/net/i2p/router/web/GraphHelper.java:138 +#: ../java/src/net/i2p/router/web/GraphHelper.java:167 msgid "Never" msgstr "Jamais" #: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:90 msgid "Every" -msgstr "Chaque" +msgstr "Tou(te)s les" #: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:108 msgid "Notify only" @@ -2428,87 +2539,79 @@ msgstr "Télécharger et vérifier seulement" msgid "Download, verify, and restart" msgstr "Télécharger, vérifier et redémarrer" -#: ../java/src/net/i2p/router/web/FormHandler.java:163 +#: ../java/src/net/i2p/router/web/FormHandler.java:176 msgid "Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit." -msgstr "" +msgstr "Soumission de formulaire incorrecte: vous avez peut-être utilisé le bouton \"Page précédente\" ou \"Rechargement\" de votre navigateur. Merci de renvoyer." -#: ../java/src/net/i2p/router/web/GraphHelper.java:82 +#: ../java/src/net/i2p/router/web/GraphHelper.java:93 msgid "Combined bandwidth graph" -msgstr "" +msgstr "Graphique combiné de bandes passantes" #. e.g. "statname for 60m" -#: ../java/src/net/i2p/router/web/GraphHelper.java:96 +#: ../java/src/net/i2p/router/web/GraphHelper.java:107 #, java-format msgid "{0} for {1}" -msgstr "" +msgstr "{0} pour {1}" -#: ../java/src/net/i2p/router/web/GraphHelper.java:130 +#: ../java/src/net/i2p/router/web/GraphHelper.java:146 msgid "Configure Graph Display" -msgstr "Graphe affichage configuration" +msgstr "Paramètres d'affichage des graphiques" -#: ../java/src/net/i2p/router/web/GraphHelper.java:130 +#: ../java/src/net/i2p/router/web/GraphHelper.java:146 msgid "Select Stats" -msgstr "" +msgstr "Choix des statistiques" -#: ../java/src/net/i2p/router/web/GraphHelper.java:132 +#: ../java/src/net/i2p/router/web/GraphHelper.java:150 msgid "Periods" -msgstr "Périodes" +msgstr "Plage (mn)" -#: ../java/src/net/i2p/router/web/GraphHelper.java:133 +#: ../java/src/net/i2p/router/web/GraphHelper.java:151 msgid "Plot averages" msgstr "Tracer les moyennes" -#: ../java/src/net/i2p/router/web/GraphHelper.java:134 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:416 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:332 +#: ../java/src/net/i2p/router/web/GraphHelper.java:152 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:435 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:351 msgid "or" msgstr "ou" -#: ../java/src/net/i2p/router/web/GraphHelper.java:134 +#: ../java/src/net/i2p/router/web/GraphHelper.java:152 msgid "plot events" -msgstr "tracer les événements" +msgstr "les événements" -#: ../java/src/net/i2p/router/web/GraphHelper.java:135 +#: ../java/src/net/i2p/router/web/GraphHelper.java:153 msgid "Image sizes" msgstr "Taille des images" -#: ../java/src/net/i2p/router/web/GraphHelper.java:135 +#: ../java/src/net/i2p/router/web/GraphHelper.java:153 msgid "width" msgstr "largeur" -#: ../java/src/net/i2p/router/web/GraphHelper.java:136 +#: ../java/src/net/i2p/router/web/GraphHelper.java:154 msgid "height" msgstr "hauteur" -#: ../java/src/net/i2p/router/web/GraphHelper.java:136 -#: ../java/src/net/i2p/router/web/GraphHelper.java:137 +#: ../java/src/net/i2p/router/web/GraphHelper.java:154 +#: ../java/src/net/i2p/router/web/GraphHelper.java:155 msgid "pixels" msgstr "pixels" -#: ../java/src/net/i2p/router/web/GraphHelper.java:138 +#: ../java/src/net/i2p/router/web/GraphHelper.java:156 msgid "Refresh delay" -msgstr "Delai d'actualisation" - -#: ../java/src/net/i2p/router/web/GraphHelper.java:138 -msgid "hour" -msgstr "heure" - -#: ../java/src/net/i2p/router/web/GraphHelper.java:138 -msgid "minute" -msgstr "" - -#: ../java/src/net/i2p/router/web/GraphHelper.java:138 -msgid "minutes" -msgstr "minutes" +msgstr "Actualiser toutes les" -#: ../java/src/net/i2p/router/web/GraphHelper.java:139 +#: ../java/src/net/i2p/router/web/GraphHelper.java:171 msgid "Redraw" -msgstr "" +msgstr "Rafraîchir" + +#: ../java/src/net/i2p/router/web/GraphHelper.java:203 +msgid "Graph settings saved" +msgstr "Réglages des graphiques enregistrés" #: ../java/src/net/i2p/router/web/LogsHelper.java:13 #: ../java/src/net/i2p/router/web/LogsHelper.java:37 msgid "File location" -msgstr "" +msgstr "Emplacement du fichier" #: ../java/src/net/i2p/router/web/LogsHelper.java:34 msgid "File not found" @@ -2516,78 +2619,77 @@ msgstr "Fichier pas trouvé" #: ../java/src/net/i2p/router/web/LogsHelper.java:52 msgid "No log messages" -msgstr "" +msgstr "Historique vide" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:80 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:79 msgid "Network Database RouterInfo Lookup" -msgstr "" +msgstr "Recherche RouterInfo dans la base de données du réseau " -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:95 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:94 #: ../java/strings/Strings.java:68 msgid "Router" msgstr "Routeur" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:95 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:94 msgid "not found in network database" -msgstr "" +msgstr "non trouvé dans la NetDb" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:107 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:106 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:215 msgid "Network Database Contents" -msgstr "" +msgstr "Contenus NetDb" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:108 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:107 msgid "View RouterInfo" -msgstr "" +msgstr "Retour synthèse routeurs" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:109 -#, fuzzy +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:108 msgid "LeaseSets" -msgstr "Bail" +msgstr "Jeux de baux" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:131 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:130 msgid "LeaseSet" -msgstr "" +msgstr "Jeu de baux" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:133 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:132 msgid "Local" -msgstr "Locale" +msgstr "Local" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:135 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:134 msgid "Unpublished" msgstr "Pas publié" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:136 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:143 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:135 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:142 msgid "Destination" -msgstr "" +msgstr "Destination" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:153 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:152 #, java-format msgid "Expires in {0}" -msgstr "Expirera en {0}" +msgstr "Expirera dans {0}" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:155 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:154 #, java-format msgid "Expired {0} ago" msgstr "Périmé il y a {0}" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:167 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:166 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:156 msgid "Gateway" -msgstr "" +msgstr "Passerelle" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:167 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:166 msgid "Lease" msgstr "Bail" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:169 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:168 msgid "Tunnel" -msgstr "" +msgstr "Tunnel" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:215 msgid "View LeaseSets" -msgstr "" +msgstr "Afficher les jeux de baux" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:217 msgid "Not initialized" @@ -2595,109 +2697,106 @@ msgstr "Pas initialisé" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:226 msgid "Routers" -msgstr "Routeurs" +msgstr "Synthèse routeurs" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:228 -#, fuzzy msgid "Show all routers" -msgstr "Fermer le routeur" +msgstr "Afficher tous, avec statistiques basiques" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:230 msgid "Show all routers with full stats" -msgstr "" +msgstr "Afficher tous, avec statistiques complètes" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:265 -#, fuzzy +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:266 msgid "Network Database Router Statistics" -msgstr "Statistiques du routeur I2P" +msgstr "Statistiques NetDb du routeur " -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:271 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:285 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:303 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:273 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:287 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:305 msgid "Count" -msgstr "" +msgstr "Nombre" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:285 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:287 msgid "Transports" -msgstr "" +msgstr "Transports" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:303 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:305 msgid "Country" msgstr "Pays" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:342 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:344 msgid "Our info" -msgstr "Notre info" +msgstr "Ce routeur" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:344 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:346 msgid "Peer info for" -msgstr "Mise à jour en cours" +msgstr "Informations pair" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:348 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:350 msgid "Full entry" -msgstr "" +msgstr "Détails" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:354 -#: ../java/src/net/i2p/router/web/SummaryHelper.java:110 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:600 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:356 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:115 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:619 msgid "Hidden" msgstr "Caché" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:354 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:356 msgid "Updated" -msgstr "Mise à jour fini" +msgstr "Mise à jour terminée" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:355 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:358 -#, fuzzy, java-format +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:357 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:360 +#, java-format msgid "{0} ago" -msgstr "Périmé il y a {0}" +msgstr "il y a {0}" #. shouldnt happen -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:357 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:361 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:359 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:363 msgid "Published" msgstr "Publié il y a" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:363 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:365 msgid "Address(es)" msgstr "Adresse(s)" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:376 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:378 msgid "cost" -msgstr "" +msgstr "coût" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402 -#, fuzzy +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 msgid "Hidden or starting up" -msgstr "Lancer avec le démarrage du routeur" +msgstr "Masqué ou en cours de démarrage" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 msgid "SSU" -msgstr "" +msgstr "SSU" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 msgid "SSU with introducers" -msgstr "" +msgstr "SSU avec représentants" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404 msgid "NTCP" -msgstr "" +msgstr "NTCP" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404 msgid "NTCP and SSU" -msgstr "" +msgstr "NTCP et SSU" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404 msgid "NTCP and SSU with introducers" -msgstr "" +msgstr "NTCP et SSU avec représentants" -#: ../java/src/net/i2p/router/web/NewsFetcher.java:82 +#: ../java/src/net/i2p/router/web/NewsFetcher.java:92 #, java-format msgid "News last updated {0} ago." msgstr "Actualités mises à jour il y a {0}" -#: ../java/src/net/i2p/router/web/NewsFetcher.java:88 +#: ../java/src/net/i2p/router/web/NewsFetcher.java:98 #, java-format msgid "News last checked {0} ago." msgstr "Actualités vérifiés il y a {0}" @@ -2705,163 +2804,162 @@ msgstr "Actualités vérifiés il y a {0}" #: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:77 #, java-format msgid "Cannot check, plugin {0} is not installed" -msgstr "" +msgstr "Non vérifiable, le greffon {0} n''est pas installé" #: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:129 -#, fuzzy, java-format +#, java-format msgid "Checking for update of plugin {0}" -msgstr "Chercher des mises à jour" +msgstr "Recherche de mise à jour du greffon {0}" #: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:154 #, java-format msgid "New plugin version {0} is available" -msgstr "" +msgstr "La nouvelle version {0} du greffon est disponible" #: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:156 #, java-format msgid "No new version is available for plugin {0}" -msgstr "" +msgstr "Pas de nouvelle version pour le greffon {0}" #: ../java/src/net/i2p/router/web/PluginUpdateChecker.java:165 #, java-format msgid "Update check failed for plugin {0}" -msgstr "" +msgstr "Échec de la vérification de mise à jour du greffon {0}" #: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:139 -#, fuzzy msgid "Downloading plugin" -msgstr "Télécharger pas signé" +msgstr "Téléchargement greffon en cours" #: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:146 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:185 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:245 #, java-format msgid "{0}B transferred" -msgstr "" +msgstr "{0}o transférés" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:152 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:153 msgid "Plugin downloaded" -msgstr "" +msgstr "Greffon téléchargé" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:157 -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:344 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:158 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:356 #, java-format msgid "Cannot create plugin directory {0}" -msgstr "" +msgstr "Impossible de créer le répertoire du greffon {0}" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:166 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:226 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:167 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:299 #, java-format msgid "from {0}" -msgstr "" +msgstr "depuis {0}" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:176 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:177 #, java-format msgid "Plugin from {0} is corrupt" -msgstr "" +msgstr "Le greffon de {0} est corrompu" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:187 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:188 #, java-format msgid "Plugin from {0} does not contain the required configuration file" -msgstr "" +msgstr "Le greffon de {0} ne contient pas le fichier de configuration requis" #. updateStatus("<b>" + "Plugin contains an invalid key" + ' ' + pubkey + ' ' + signer + "</b>"); -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:200 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:201 #, java-format msgid "Plugin from {0} contains an invalid key" -msgstr "" +msgstr "Le greffon de {0} contient une clef incorrecte." -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:219 -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:228 -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:237 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:225 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:235 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:249 #, java-format msgid "Plugin signature verification of {0} failed" -msgstr "" +msgstr "Échec de vérification de signature du greffon {0}" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:252 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:264 #, java-format msgid "Plugin from {0} has invalid name or version" -msgstr "" +msgstr "La version ou le nom du greffon de {0} est incorrect." -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:257 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:269 #, java-format msgid "Plugin {0} has mismatched versions" -msgstr "" +msgstr "Versions désapairées du greffon {0}" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:265 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:277 #, java-format msgid "This plugin requires I2P version {0} or higher" -msgstr "" +msgstr "Ce greffon nécessite I2P version {0} ou plus récente" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:273 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:285 #, java-format msgid "This plugin requires Java version {0} or higher" -msgstr "" +msgstr "Ce greffon nécessite Java version {0} ou plus récente" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:281 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:293 msgid "Downloaded plugin is for new installs only, but the plugin is already installed" -msgstr "" +msgstr "La version du greffon téléchargée est faite pour les nouvelles installations, mais le greffon est déjà installé " -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:293 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:305 msgid "Installed plugin does not contain the required configuration file" -msgstr "" +msgstr "Le greffon installé ne contient pas le fichier de configuration requis" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:301 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:313 msgid "Signature of downloaded plugin does not match installed plugin" -msgstr "" +msgstr "La signature du greffon téléchargé ne correspond pas à celle de celui qui est installé" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:308 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:320 #, java-format msgid "Downloaded plugin version {0} is not newer than installed plugin" -msgstr "" +msgstr "La version {0} du greffon téléchargé n''est pas plus récente que celle installée" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:315 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:327 #, java-format msgid "Plugin update requires installed plugin version {0} or higher" -msgstr "" +msgstr "La mise à jour du greffon nécessite au moins la version {0}" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:322 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:334 #, java-format msgid "Plugin update requires installed plugin version {0} or lower" -msgstr "" +msgstr "La mise à jour du greffon nécessite au plus la version {0}" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:339 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:351 msgid "Plugin is for upgrades only, but the plugin is not installed" -msgstr "" +msgstr "Ce greffon est seulement une mise à jour, mais le greffon prérequis n'est pas installé" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:352 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:364 #, java-format msgid "Failed to install plugin in {0}" -msgstr "" +msgstr "Échec d''installation du greffon {0}" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:359 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:371 #, java-format msgid "Plugin {0} installed, router restart required" -msgstr "" +msgstr "Greffon {0} installé, le routeur doit être redémarré" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:361 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:373 #, java-format msgid "Plugin {0} installed" -msgstr "" +msgstr "Greffon {0} installé" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:370 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:391 #, java-format msgid "Plugin {0} installed and started" -msgstr "" +msgstr "Greffon {0} installé et démarré" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:372 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:394 #, java-format msgid "Plugin {0} installed but failed to start, check logs" -msgstr "" +msgstr "Greffon {0} installé, mais son démarrage a échoué. Vérifiez les historiques" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:374 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:396 #, java-format msgid "Plugin {0} installed but failed to start" -msgstr "" +msgstr "Greffon {0} installé, mais son démarrage a échoué" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:384 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:406 #, java-format msgid "Failed to download plugin from {0}" -msgstr "" +msgstr "Échec de téléchargement du greffon {0}" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:72 msgid "Peer Profiles" @@ -2869,44 +2967,46 @@ msgstr "Profils des pairs" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:73 #, java-format -msgid "Showing {0} recent profiles." -msgstr "Montrant {0} profiles récents" +msgid "Showing 1 recent profile." +msgid_plural "Showing {0} recent profiles." +msgstr[0] "Affichage d'un profil récent." +msgstr[1] "Affichage de {0} profils récents." #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:75 #, java-format -msgid "Hiding {0} older profiles." -msgstr "Cachant {0} profiles anciens" +msgid "Hiding 1 older profile." +msgid_plural "Hiding {0} older profiles." +msgstr[0] "Masquage d'un très vieux profil." +msgstr[1] "Masquage de {0} très vieux profils." #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:77 -#, fuzzy, java-format -msgid "Hiding {0} standard profiles." -msgstr "Cachant {0} profiles anciens" +#, java-format +msgid "Hiding 1 standard profile." +msgid_plural "Hiding {0} standard profiles." +msgstr[0] "Masquage d'un profil standard." +msgstr[1] "Masquage de {0} profils standards." #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:82 msgid "Groups (Caps)" -msgstr "" +msgstr "Groupes (capacités)" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:83 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:251 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:334 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:252 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:353 msgid "Speed" msgstr "Vitesse" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:84 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:253 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:338 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:254 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:357 msgid "Capacity" msgstr "Capacité" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:85 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:255 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:256 msgid "Integration" msgstr "Intégration" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:86 -msgid "Status" -msgstr "Statut actuel" - #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:126 msgid "Fast, High Capacity" msgstr "Rapide, haute capacité" @@ -2917,7 +3017,7 @@ msgstr "Haute capacité" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:128 msgid "Standard" -msgstr "" +msgstr "Standard" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:129 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:163 @@ -2927,7 +3027,7 @@ msgstr "Défaillant" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:131 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:282 msgid "Integrated" -msgstr "Intégré" +msgstr "Bien intégrés" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:164 msgid "Unreachable" @@ -2936,238 +3036,228 @@ msgstr "Inaccessible" #. hide if < 10% #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:171 msgid "Test Fails" -msgstr "Test échec" +msgstr "Échec de test" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:175 -#, fuzzy +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:177 msgid "profile" -msgstr "Profiles" +msgstr "Profil" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:184 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:186 msgid "Floodfill and Integrated Peers" -msgstr "Floodfill et pairs intégrés" +msgstr "Pairs diffuseurs et intégrés" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:188 -#, fuzzy +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:190 msgid "Caps" -msgstr "graphes" +msgstr "Possib." -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:189 -#, fuzzy +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:191 msgid "Integ. Value" -msgstr "Intégré" +msgstr "Valeur intég." -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:190 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:192 msgid "Last Heard About" -msgstr "" +msgstr "Signalé la dernière fois" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:191 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:193 msgid "Last Heard From" -msgstr "" +msgstr "Entendu depuis" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:192 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:194 msgid "Last Good Send" -msgstr "" +msgstr "Dernier envoi OK" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:193 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:195 msgid "Last Bad Send" -msgstr "" +msgstr "Dernier envoi KO" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:194 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:196 msgid "10m Resp. Time" -msgstr "" +msgstr "Tps de rép.(10mn)" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:195 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:197 msgid "1h Resp. Time" -msgstr "" +msgstr "Tps de rép. (1h)" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:196 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:198 msgid "1d Resp. Time" -msgstr "" +msgstr "Tps de rép.(1j)" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:197 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:199 msgid "Last Good Lookup" -msgstr "" +msgstr "Dernière req. OK" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:198 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:200 msgid "Last Bad Lookup" -msgstr "" +msgstr "Dernière req. KO" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:199 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:201 msgid "Last Good Store" -msgstr "" +msgstr "Dernier stk.OK" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:200 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:202 msgid "Last Bad Store" -msgstr "" +msgstr "Dernier stk.KO" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:201 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:203 msgid "1h Fail Rate" -msgstr "" +msgstr "Taux d'échec (1h)" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:202 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:204 msgid "1d Fail Rate" -msgstr "" +msgstr "Taux d'échec (1j)" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:250 -#, fuzzy +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:251 msgid "Thresholds" -msgstr "Seuils :" +msgstr "Seuils" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:252 -#, fuzzy +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:253 msgid "fast peers" -msgstr "Configuration des pairs" +msgstr "pairs rapides" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:254 -#, fuzzy +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:255 msgid "high capacity peers" -msgstr "Haute capacité" +msgstr "pairs à haute capacités" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:256 -#, fuzzy +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:257 msgid " well integrated peers" -msgstr "Floodfill et pairs intégrés" +msgstr "pairs bien intégrés" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259 msgid "as determined by the profile organizer" -msgstr "" +msgstr "tels que définis par le gestionnaire de profils" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259 msgid "groups" -msgstr "groupes" +msgstr "Groupes" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260 msgid "capabilities in the netDb, not used to determine profiles" -msgstr "" +msgstr "possibilités vues dans la base de données du réseau (non utilisées pour définir les profils)" #. capabilities -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260 #: ../java/strings/Strings.java:81 msgid "caps" -msgstr "" +msgstr "Possib." -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261 msgid "peak throughput (bytes per second) over a 1 minute period that the peer has sustained in a single tunnel" -msgstr "" +msgstr "débit crête (o/s) tenu sur 1mn par le pair sur un seul tunnel" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261 msgid "speed" -msgstr "vitesse" +msgstr "Vitesse" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262 msgid "capacity" -msgstr "capacité" +msgstr "Capacité" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262 msgid "how many tunnels can we ask them to join in an hour?" -msgstr "" +msgstr "combien de tunnels nous pouvons lui demander de rejoindre en une heure." -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263 msgid "how many new peers have they told us about lately?" -msgstr "" +msgstr "sur combien de nouveaux pairs il nous a renseigné récemment." -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263 msgid "integration" -msgstr "intégration" +msgstr "Intégration" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:264 msgid "is the peer banned, or unreachable, or failing tunnel tests?" -msgstr "" +msgstr "Le pair banni, injoignable ou les tests de tunnels échouent." -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:264 msgid "status" -msgstr "statut" +msgstr "État" + +#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:47 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:410 +msgid "none" +msgstr "aucun" -#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:57 +#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:62 #, java-format msgid "Temporary ban expiring in {0}" -msgstr "" +msgstr "Le bannissement temporaire expire dans {0}" -#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:59 -#, fuzzy, java-format +#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:64 +#, java-format msgid "Banned until restart or in {0}" -msgstr "interdit jusqu'au rédémarrage" +msgstr "Banni jusqu''au redémarrage ou dans {0}" -#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:71 -#, fuzzy +#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:76 msgid "unban now" -msgstr "plus interdit" +msgstr "lever le bannissement" #. Note to translators: all runtime zh translation disabled in this file, no font available in RRD -#: ../java/src/net/i2p/router/web/StatSummarizer.java:174 -#, fuzzy +#: ../java/src/net/i2p/router/web/StatSummarizer.java:223 msgid "Bandwidth usage" -msgstr "Bande passante entrante/sortante" +msgstr "Utilisation de la bande passante" -#: ../java/src/net/i2p/router/web/StatSummarizer.java:181 -#, fuzzy +#: ../java/src/net/i2p/router/web/StatSummarizer.java:230 msgid "Outbound bytes/sec" -msgstr "Options Sortants" +msgstr "o/s sortants" #. def.line(sendName, Color.BLUE, "Outbound bytes/sec", 3); -#: ../java/src/net/i2p/router/web/StatSummarizer.java:183 -#, fuzzy +#: ../java/src/net/i2p/router/web/StatSummarizer.java:232 msgid "Inbound bytes/sec" -msgstr "Options Entrants" +msgstr "o/s entrants" -#: ../java/src/net/i2p/router/web/StatSummarizer.java:186 -#: ../java/src/net/i2p/router/web/StatSummarizer.java:187 -#: ../java/src/net/i2p/router/web/StatSummarizer.java:188 -#: ../java/src/net/i2p/router/web/StatSummarizer.java:189 +#: ../java/src/net/i2p/router/web/StatSummarizer.java:235 +#: ../java/src/net/i2p/router/web/StatSummarizer.java:236 +#: ../java/src/net/i2p/router/web/StatSummarizer.java:237 +#: ../java/src/net/i2p/router/web/StatSummarizer.java:238 msgid "bytes/sec" -msgstr "" +msgstr "o/s" -#: ../java/src/net/i2p/router/web/StatSummarizer.java:186 -#, fuzzy +#: ../java/src/net/i2p/router/web/StatSummarizer.java:235 msgid "out average" -msgstr "Tracer les moyennes" +msgstr "hors moyenne" -#: ../java/src/net/i2p/router/web/StatSummarizer.java:187 -#: ../java/src/net/i2p/router/web/StatSummarizer.java:189 +#: ../java/src/net/i2p/router/web/StatSummarizer.java:236 +#: ../java/src/net/i2p/router/web/StatSummarizer.java:238 #: ../java/src/net/i2p/router/web/SummaryRenderer.java:115 msgid "max" -msgstr "" +msgstr "max" -#: ../java/src/net/i2p/router/web/StatSummarizer.java:188 -#, fuzzy +#: ../java/src/net/i2p/router/web/StatSummarizer.java:237 msgid "in average" -msgstr "Tracer les moyennes" +msgstr "dans la moyenne" #: ../java/src/net/i2p/router/web/StatsGenerator.java:57 msgid "GO" -msgstr "" +msgstr "Lancer" #: ../java/src/net/i2p/router/web/StatsGenerator.java:60 msgid "Statistics gathered during this router's uptime" -msgstr "" +msgstr "Statistiques collectées pendant cette session du routeur" #: ../java/src/net/i2p/router/web/StatsGenerator.java:63 msgid "The data gathered is quantized over a 1 minute period, so should just be used as an estimate." -msgstr "" +msgstr "Les données collectées sont quantifiées sur 1mn, et ne doivent être utilisées que comme estimations." #: ../java/src/net/i2p/router/web/StatsGenerator.java:64 msgid "These statistics are primarily used for development and debugging." -msgstr "" +msgstr "Ces statistiques sont initialement destinées au développement et au débogage." -#: ../java/src/net/i2p/router/web/StatsGenerator.java:105 -#: ../java/src/net/i2p/router/web/StatsGenerator.java:156 -#, fuzzy +#: ../java/src/net/i2p/router/web/StatsGenerator.java:106 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:157 msgid "No lifetime events" -msgstr "tracer les événements" +msgstr "Aucun évènement de durée de vie" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:116 -#, fuzzy +#: ../java/src/net/i2p/router/web/StatsGenerator.java:117 msgid "frequency" -msgstr "Fréquence d'actualisation" +msgstr "fréquence" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:120 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:121 msgid "Rolling average events per period" -msgstr "" +msgstr "Moyenne glissante d'évènements par période" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:124 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:125 msgid "Highest events per period" -msgstr "" +msgstr "Maximum d'évènements par période" #. if (showAll && (curFreq.getMaxAverageEventsPerPeriod() > 0) && (curFreq.getAverageEventsPerPeriod() > 0) ) { #. buf.append("(current is "); @@ -3176,79 +3266,87 @@ msgstr "" #. } #. buf.append(" <i>avg interval between updates:</i> (").append(num(curFreq.getAverageInterval())).append("ms, min "); #. buf.append(num(curFreq.getMinAverageInterval())).append("ms)"); -#: ../java/src/net/i2p/router/web/StatsGenerator.java:135 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:136 msgid "Lifetime average events per period" -msgstr "" +msgstr "évènements de moyenne de durée de vie par période" #. Display the strict average -#: ../java/src/net/i2p/router/web/StatsGenerator.java:140 -#, fuzzy +#: ../java/src/net/i2p/router/web/StatsGenerator.java:141 msgid "Lifetime average frequency" -msgstr "Fréquence d'actualisation" +msgstr "Fréquence moyenne de durée de vie" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:144 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:234 +#, java-format +msgid "1 event" +msgid_plural "{0} events" +msgstr[0] "1 évènement" +msgstr[1] "{0} évènements" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:168 -#, fuzzy +#: ../java/src/net/i2p/router/web/StatsGenerator.java:169 msgid "rate" -msgstr "Taux" +msgstr "taux" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:170 -#, fuzzy +#: ../java/src/net/i2p/router/web/StatsGenerator.java:171 msgid "Average" -msgstr "Tracer les moyennes" +msgstr "moyenne" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:173 -#, fuzzy +#: ../java/src/net/i2p/router/web/StatsGenerator.java:174 msgid "Highest average" -msgstr "Tracer les moyennes" +msgstr "Plus haute moyenne" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:202 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:201 #, java-format -msgid "in this period which ended {0} ago." -msgstr "" +msgid "There was 1 event in this period." +msgid_plural "There were {0} events in this period." +msgstr[0] "Il y a eu 1 évènement sur cette période." +msgstr[1] "Il y a eu {0} évènements sur cette période." -#: ../java/src/net/i2p/router/web/StatsGenerator.java:204 -#, fuzzy +#: ../java/src/net/i2p/router/web/StatsGenerator.java:203 +#, java-format +msgid "The period ended {0} ago." +msgstr "La période s''est terminée il y a {0}." + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:205 msgid "No events" -msgstr "tracer les événements" +msgstr "Aucun évènement" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:210 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:211 msgid "Average event count" -msgstr "" +msgstr "Nombre moyen d'évènements" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:212 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:213 msgid "Events in peak period" -msgstr "" +msgstr "Pic d'évènements dans la période" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:220 -#, fuzzy +#: ../java/src/net/i2p/router/web/StatsGenerator.java:221 msgid "Graph Data" -msgstr "Graphe" +msgstr "Graphique de données" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:222 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:223 msgid "Graph Event Count" -msgstr "" +msgstr "Nombre d'évènements de graphiques" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:225 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:226 msgid "Export Data as XML" -msgstr "" +msgstr "Exporter en XML" #. Display the strict average -#: ../java/src/net/i2p/router/web/StatsGenerator.java:230 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:231 msgid "Lifetime average value" -msgstr "" +msgstr "Durée de vie moyenne" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:41 -#, fuzzy msgid "I2P Router Help & FAQ" -msgstr "Aide routeur I2P" +msgstr "Aide routeur I2P & FAQ" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:43 msgid "Help & FAQ" -msgstr "" +msgstr "Aide & FAQ" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:55 msgid "Configure startup of clients and webapps (services); manually start dormant services" -msgstr "" +msgstr "configurer le démarrage des clients et des applications web (services); démarrer manuellement les services arrêtés" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:57 msgid "I2P Services" @@ -3256,7 +3354,7 @@ msgstr "Services I2P" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:63 msgid "Manage your I2P hosts file here (I2P domain name resolution)" -msgstr "Gérer votre fichier 'I2P hosts' ici (I2P DNS)" +msgstr "Gérer votre fichier d'hôtes I2P ici (I2P DNS)" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:65 msgid "Addressbook" @@ -3276,7 +3374,7 @@ msgstr "Client webmail anonyme" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:77 msgid "Webmail" -msgstr "messagerie Web" +msgstr "Messagerie web" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:81 msgid "Anonymous resident webserver" @@ -3297,40 +3395,40 @@ msgstr "Configuration" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:99 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:379 msgid "View existing tunnels and tunnel build status" -msgstr "Montrer les tunnels existants et le statut de création des tunnels" +msgstr "État des tunnels existants et de la création de tunnels" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:105 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:254 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:253 msgid "Show all current peer connections" -msgstr "Montrer toutes les connexions actuelles aux pairs" +msgstr "Afficher toutes les connexions actuelles aux pairs" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:111 msgid "Show recent peer performance profiles" -msgstr "Montrer les profils de la performance récente des pairs" +msgstr "Afficher les profils de la performance récente des pairs" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:113 msgid "Profiles" -msgstr "Profiles" +msgstr "Profils" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:117 msgid "Show list of all known I2P routers" -msgstr "Montrer une liste de touts le routeurs I2P connus" +msgstr "Afficher tous les routeurs I2P connus" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:119 msgid "NetDB" -msgstr "" +msgstr "NetDb" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:123 msgid "Health Report" -msgstr "Fichier traces du routeur" +msgstr "Bilan de santé" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:125 msgid "Logs" -msgstr "Fichier traces" +msgstr "Historiques" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:135 msgid "Graph router performance" -msgstr "Montrer la performance du routeur avec des graphes" +msgstr "Graphique de performances du routeur" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:137 msgid "Graphs" @@ -3338,82 +3436,87 @@ msgstr "Graphes" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:141 msgid "Textual router performance statistics" -msgstr "La performance statistique du routeur en texte" +msgstr "Statistiques textuelles de performance du routeur" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:147 -#: ../java/src/net/i2p/router/web/SummaryHelper.java:365 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:370 msgid "Local Destinations" msgstr "Destinations locales" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:149 #: ../java/strings/Strings.java:62 -#, fuzzy msgid "I2PTunnel" -msgstr "tunnel sommaire I2P" +msgstr "I2PTunnel" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:160 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:164 msgid "I2P Router Help" -msgstr "Aide routeur I2P" +msgstr "Aide du routeur I2P" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:162 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:166 msgid "General" msgstr "Général" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:167 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:171 msgid "Local Identity" msgstr "Identité locale" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:171 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:175 msgid "Your unique I2P router identity is" -msgstr "L'identité unique de votre routeur est" +msgstr "L'identité unique de votre routeur commence par" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:175 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:179 msgid "never reveal it to anyone" -msgstr "ne jamais la révéler à personne" +msgstr "NE la révélez JAMAIS à PERSONNE ! (Cliquez pour l'afficher)" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:177 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:181 msgid "show" -msgstr "" +msgstr "Détails" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:188 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:192 msgid "How long we've been running for this session" -msgstr "" +msgstr "Durée de cette session" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:191 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:195 msgid "Uptime" -msgstr "Temps de service" +msgstr "Lancé depuis" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:198 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:202 msgid "Help with configuring your firewall and router for optimal I2P performance" -msgstr "Aide avec la configuration du pare-feu et du routeur afin d'optimiser la performance d'I2P" +msgstr "Aide à la configuration du pare-feu et du routeur pour optimiser les performances d'I2P" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:227 -msgid "Download" -msgstr "Télécharger" +#. Note to translators: parameter is a version, e.g. "0.8.4" +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:232 +#, java-format +msgid "Download {0} Update" +msgstr "Télécharger la version {0}" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:236 -msgid "Download Unsigned" -msgstr "Télécharger pas signé" +#. Note to translators: parameter is a date and time, e.g. "02-Mar 20:34 UTC" +#. <br> is optional, to help the browser make the lines even in the button +#. If the translation is shorter than the English, you should probably not include <br> +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:240 +#, java-format +msgid "Download Unsigned<br>Update {0}" +msgstr "Télécharger la version<br> non signée {0}" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:262 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:261 msgid "Active" -msgstr "Actif" +msgstr "Actifs" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:270 msgid "Fast" -msgstr "Rapide" +msgstr "Rapides" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:276 msgid "High capacity" -msgstr "Haute capacité" +msgstr "Hautes capacités" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:288 msgid "Known" -msgstr "Connu" +msgstr "Connus" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:303 msgid "Help with firewall configuration" -msgstr "Aide avec la configuration du pare-feu" +msgstr "Aide à la configuration du pare-feu" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:305 msgid "Check NAT/firewall" @@ -3421,7 +3524,7 @@ msgstr "Vérifier NAT/pare-feu" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:325 msgid "Reseed" -msgstr "" +msgstr "Réamorçage" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:342 msgid "Configure router bandwidth allocation" @@ -3441,196 +3544,189 @@ msgstr "Utilisée" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:386 msgid "Exploratory" -msgstr "Exploratoire" +msgstr "Exploratoires" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:398 msgid "Participating" -msgstr "Participant" +msgstr "Participants" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:404 -#, fuzzy msgid "Share ratio" -msgstr "Partager" +msgstr "Rapport de partage" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:410 msgid "What's in the router's job queue?" -msgstr "Montrer les tâches du routeur qui sont à traiter " +msgstr "Afficher la file d'attente de travaux du routeur. " #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:412 msgid "Congestion" -msgstr "Saturation réseau" +msgstr "Charge" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:417 msgid "Job lag" -msgstr "Tâche décalage" +msgstr "Retard de tâches" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:423 msgid "Message delay" -msgstr "Message retard" +msgstr "Retard de messages" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:429 msgid "Tunnel lag" -msgstr "Tunnel décalage" +msgstr "Retard de tunnels" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:435 msgid "Backlog" -msgstr "Retard accumulé" +msgstr "En attente" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:101 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:106 msgid "ERR-Client Manager I2CP Error - check logs" -msgstr "" +msgstr "ERR-Erreur du gestionnaire de clients I2CP - vérifier l'historique" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:108 -#, fuzzy, java-format +#: ../java/src/net/i2p/router/web/SummaryHelper.java:113 +#, java-format msgid "ERR-Clock Skew of {0}" -msgstr "ERR - horloge décalé" +msgstr "ERR - horloge décalée de {0}" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:117 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:576 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:122 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:595 msgid "OK" msgstr "OK" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:118 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:123 msgid "ERR-Private TCP Address" msgstr "ERR - Adresse TCP privée" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:120 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:125 msgid "ERR-SymmetricNAT" msgstr "ERR - NAT symétrique" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:123 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:128 msgid "WARN-Firewalled with Inbound TCP Enabled" msgstr "WARN - pare-feu avec TCP entrant activé" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:125 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:130 msgid "WARN-Firewalled and Floodfill" -msgstr "WARN - Pare-feu et Floodfill" +msgstr "WARN - Pare-feu et Diffuseur" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:127 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:132 msgid "WARN-Firewalled and Fast" msgstr "WARN - Pare-feu et Rapide" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:128 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:580 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:133 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:599 msgid "Firewalled" msgstr "Bloqué par un pare-feu" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:130 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:135 msgid "ERR-UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart" -msgstr "" +msgstr "ERR-port UDP en cours d'utilisation - Réglez i2np.udp.internalPort=xxxx dans la configuration avancée et redémarrez" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:136 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:141 msgid "ERR-No Active Peers, Check Network Connection and Firewall" -msgstr "" +msgstr "ERR-Pas de pair actif, vérifiez votre connexion réseau et votre pare-feu" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:139 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:144 msgid "ERR-UDP Disabled and Inbound TCP host/port not set" -msgstr "" +msgstr "ERR-UDP désactivé, mais port/hôte entrants TCP non renseignés" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:141 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:146 msgid "WARN-Firewalled with UDP Disabled" msgstr "WARN - Pare-feu avec UDP desactivé" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:143 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:596 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:148 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:615 msgid "Testing" msgstr "Test en cours" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:365 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:370 msgid "Add/remove/edit & control your client and server tunnels" -msgstr "Ajouter/enlever/éditer & contrôler vos tunnels client et serveur" +msgstr "Ajoutez, modifiez/supprimez & contrôlez vos tunnels clients et serveurs" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:377 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:382 msgid "Server" msgstr "Serveur" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:381 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:386 msgid "Show tunnels" msgstr "Montrer les tunnels" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:392 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:397 msgid "Leases expired" msgstr "Bails périmés" #. red or yellow light -#: ../java/src/net/i2p/router/web/SummaryHelper.java:392 -#: ../java/src/net/i2p/router/web/SummaryHelper.java:393 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:397 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:398 msgid "Rebuilding" -msgstr "" +msgstr "Reconstruction" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:393 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:398 msgid "ago" msgstr "il y a" #. green light -#: ../java/src/net/i2p/router/web/SummaryHelper.java:396 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:401 msgid "Ready" msgstr "Prêt" #. yellow light -#: ../java/src/net/i2p/router/web/SummaryHelper.java:400 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:405 msgid "Building" -msgstr "" +msgstr "Construction" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:400 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:405 msgid "Building tunnels" msgstr "Création des tunnels en cours" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:405 -#, fuzzy -msgid "none" -msgstr "Connu" - #. tunnel nicknames, taken from i2ptunnel.config so they will display #. nicely under 'local destinations' in the summary bar #. note that if the wording changes in i2ptunnel.config, we have to #. keep the old string here as well for existing installs -#: ../java/src/net/i2p/router/web/SummaryHelper.java:416 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:421 #: ../java/strings/Strings.java:36 msgid "shared clients" msgstr "clients partagés" #. Note to translators: all runtime zh translation disabled in this file, no font available in RRD #: ../java/src/net/i2p/router/web/SummaryRenderer.java:89 -#, fuzzy, java-format +#, java-format msgid "events in {0}" -msgstr "Redémarrage en {0}" +msgstr "Évènements en {0}" #: ../java/src/net/i2p/router/web/SummaryRenderer.java:91 #, java-format msgid "averaged for {0}" -msgstr "" +msgstr "moyenne pour {0}" #: ../java/src/net/i2p/router/web/SummaryRenderer.java:101 -#, fuzzy msgid "Events per period" -msgstr "bits par seconde" +msgstr "Fréquence" #: ../java/src/net/i2p/router/web/SummaryRenderer.java:114 -#, fuzzy msgid "avg" -msgstr ":" +msgstr "moy" #: ../java/src/net/i2p/router/web/SummaryRenderer.java:116 -#, fuzzy msgid "now" -msgstr "Connu" +msgstr "maintenant" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:41 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:63 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:280 -#, fuzzy +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:309 msgid "configure" msgstr "configuration" +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:61 +msgid "Client tunnels for" +msgstr "Tunnels clients pour" + #: ../java/src/net/i2p/router/web/TunnelRenderer.java:65 -#, fuzzy msgid "dead" -msgstr "Prêt" +msgstr "Morts" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:71 msgid "Participating tunnels" -msgstr "tunnels participants" +msgstr "Tunnels participants" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:72 msgid "From" @@ -3638,7 +3734,7 @@ msgstr "De" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:72 msgid "Receive on" -msgstr "Réception active" +msgstr "Reçoit sur" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:73 msgid "Expiration" @@ -3646,11 +3742,11 @@ msgstr "Expiration" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:73 msgid "Send on" -msgstr "Envoyer activé" +msgstr "Envoie sur" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:73 msgid "To" -msgstr "à " +msgstr "Vers" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:74 msgid "Rate" @@ -3667,15 +3763,15 @@ msgstr "Utilisation" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:107 msgid "grace period" -msgstr "" +msgstr "délai de grâce" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:117 msgid "Outbound Endpoint" -msgstr "Endpoint Sortant" +msgstr "Point terminal sortant" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:119 msgid "Inbound Gateway" -msgstr "Gateway Entrant" +msgstr "Passerelle entrante" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:121 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:162 @@ -3684,12 +3780,12 @@ msgstr "Participant" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:126 msgid "Inactive participating tunnels" -msgstr "" +msgstr "Tunnels participants inactifs" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:127 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:218 msgid "Lifetime bandwidth usage" -msgstr "" +msgstr "Utilisation de la bande passante depuis le démarrage" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:156 msgid "Expiry" @@ -3701,12 +3797,12 @@ msgstr "Participants" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:165 msgid "Endpoint" -msgstr "" +msgstr "Point terminal" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:205 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:212 msgid "Build in progress" -msgstr "Création d'un tunnel en cours" +msgstr "Création en cours" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:205 msgid "inbound" @@ -3718,15 +3814,15 @@ msgstr "sortant" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:217 msgid "No tunnels; waiting for the grace period to end." -msgstr "Pas de tunnel; attendant la fin du délai de grâce" +msgstr "Pas de tunnel; attente de la fin du délai de grâce" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:219 msgid "in" -msgstr "entrer" +msgstr "entrés" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:220 msgid "out" -msgstr "sortir" +msgstr "sortis" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:237 msgid "Tunnel Counts By Peer" @@ -3737,82 +3833,86 @@ msgid "% of total" msgstr "% du total" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:238 -#, fuzzy msgid "Our Tunnels" -msgstr "Montrer les tunnels" +msgstr "Mes tunnels" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:238 -#, fuzzy msgid "Participating Tunnels" -msgstr "tunnels participants" +msgstr "Tunnels participants" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:256 -#, fuzzy msgid "Totals" -msgstr "Totale" +msgstr "Totaux" -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:66 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:132 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:145 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:178 -#, fuzzy +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:67 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:143 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:238 msgid "Updating" -msgstr "Mettre à jour" - -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:88 -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:111 -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:116 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:189 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:214 -#, fuzzy +msgstr "Mise à jour en cours" + +#. Process the .sud/.su2 file +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:89 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:112 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:117 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:262 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:287 msgid "Update downloaded" -msgstr "Méthode de mise à jour" +msgstr "Mise à jour téléchargée" -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:91 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:92 #, java-format msgid "Unsigned update file from {0} is corrupt" -msgstr "" +msgstr "Le fichier de mise à jour non signé de {0} est corrompu" -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:111 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:209 -#, fuzzy +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:112 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:282 msgid "Restarting" -msgstr "Redémarrer" +msgstr "Redémarrage en cours" -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:118 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:216 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:119 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:289 msgid "Click Restart to install" -msgstr "" +msgstr "cliquez sur Redémarrer pour installer" -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:120 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:218 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:121 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:291 msgid "Click Shutdown and restart to install" -msgstr "" +msgstr "Cliquez sur \"Arrêter\" puis \"Démarrer\" pour installer" -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:121 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:220 -#, fuzzy, java-format +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:122 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:293 +#, java-format msgid "Version {0}" -msgstr "Version" +msgstr "Version {0}" -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:126 -#, fuzzy, java-format +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:127 +#, java-format msgid "Failed copy to {0}" -msgstr "Echec de démarrage" +msgstr "Échec de copie vers {0}" + +#: ../java/src/net/i2p/router/web/UpdateHandler.java:185 +#, java-format +msgid "Updating from {0}" +msgstr "Mise à jour depuis {0}" -#: ../java/src/net/i2p/router/web/UpdateHandler.java:209 -#, fuzzy +#: ../java/src/net/i2p/router/web/UpdateHandler.java:254 +#, java-format +msgid "No new version found at {0}" +msgstr "Pas de nouvelle trouvée sur {0}" + +#: ../java/src/net/i2p/router/web/UpdateHandler.java:282 msgid "Update verified" -msgstr "Mise à jour fini" +msgstr "Mise à jour vérifiée" -#: ../java/src/net/i2p/router/web/UpdateHandler.java:234 -msgid "Transfer failed" -msgstr "" +#: ../java/src/net/i2p/router/web/UpdateHandler.java:308 +#, java-format +msgid "Transfer failed from {0}" +msgstr "Échec de transfert depuis {0}" #. wars for ConfigClientsHelper #: ../java/strings/Strings.java:12 msgid "addressbook" -msgstr "carnet d'adresse" +msgstr "carnet d'adresses" #: ../java/strings/Strings.java:13 msgid "i2psnark" @@ -3843,11 +3943,11 @@ msgstr "Console web" #: ../java/strings/Strings.java:23 msgid "SAM application bridge" -msgstr "" +msgstr "Pont applicatif SAM" #: ../java/strings/Strings.java:24 msgid "Application tunnels" -msgstr "Tunnels d'application" +msgstr "Tunnels d'applications" #: ../java/strings/Strings.java:25 msgid "My eepsite web server" @@ -3855,19 +3955,19 @@ msgstr "Serveur web de mon eepsite" #: ../java/strings/Strings.java:26 msgid "I2P webserver (eepsite)" -msgstr "" +msgstr "Serveur web I2P (eepsite)" #: ../java/strings/Strings.java:27 msgid "Browser launch at startup" -msgstr "" +msgstr "Lancer le navigateur au démarrage" #: ../java/strings/Strings.java:28 msgid "BOB application bridge" -msgstr "" +msgstr "Pont applicatif BOB" #: ../java/strings/Strings.java:30 msgid "Open Router Console in web browser at startup" -msgstr "" +msgstr "Ouvrir la console du routeur dans le navigateur au démarrage" #: ../java/strings/Strings.java:37 msgid "IRC proxy" @@ -3878,23 +3978,21 @@ msgid "eepsite" msgstr "eepsite" #: ../java/strings/Strings.java:39 -#, fuzzy msgid "I2P webserver" -msgstr "Serveur web" +msgstr "Serveur web I2P" #: ../java/strings/Strings.java:40 msgid "HTTP Proxy" -msgstr "" +msgstr "Mandataire HTTP" #. older names for pre-0.7.4 installs #: ../java/strings/Strings.java:42 -#, fuzzy msgid "eepProxy" -msgstr "eeProxy hôte" +msgstr "hôte eeProxy" #: ../java/strings/Strings.java:43 msgid "ircProxy" -msgstr "" +msgstr "Mandataire IRC" #. hardcoded in i2psnark #: ../java/strings/Strings.java:45 @@ -3904,1364 +4002,1636 @@ msgstr "I2PSnark" #. hardcoded in iMule? #: ../java/strings/Strings.java:47 msgid "iMule" -msgstr "" +msgstr "iMule" #. standard themes for ConfigUIHelper #: ../java/strings/Strings.java:51 msgid "classic" -msgstr "classique" +msgstr "Classique" #: ../java/strings/Strings.java:52 msgid "dark" -msgstr "foncé" +msgstr "Sombre" #: ../java/strings/Strings.java:53 msgid "light" -msgstr "léger" +msgstr "Clair" #: ../java/strings/Strings.java:54 -#, fuzzy msgid "midnight" -msgstr "léger" +msgstr "Minuit" #. stat groups for stats.jsp #: ../java/strings/Strings.java:57 -#, fuzzy msgid "Bandwidth" -msgstr "Bande passante entrante/sortante" +msgstr "Bande passante" #: ../java/strings/Strings.java:58 -#, fuzzy msgid "BandwidthLimiter" msgstr "Limiteur de bande passante" #: ../java/strings/Strings.java:59 -#, fuzzy msgid "ClientMessages" -msgstr "Clients" +msgstr "Messages clients" #: ../java/strings/Strings.java:60 -#, fuzzy msgid "Encryption" -msgstr "Clé d'encryption" +msgstr "Cryptage" #: ../java/strings/Strings.java:61 msgid "i2cp" -msgstr "" +msgstr "i2cp" #: ../java/strings/Strings.java:63 msgid "InNetPool" -msgstr "" +msgstr "InNetPool" #: ../java/strings/Strings.java:64 -#, fuzzy msgid "JobQueue" -msgstr "queue des tâches" +msgstr "File d'attente de travaux" #: ../java/strings/Strings.java:65 -#, fuzzy msgid "NetworkDatabase" -msgstr "Réseau" +msgstr "Base de données du réseau" #: ../java/strings/Strings.java:66 msgid "ntcp" -msgstr "" +msgstr "ntcp" #: ../java/strings/Strings.java:69 msgid "Stream" -msgstr "" +msgstr "flux" #: ../java/strings/Strings.java:70 msgid "Throttle" -msgstr "" +msgstr "Régulation" #: ../java/strings/Strings.java:71 msgid "Transport" -msgstr "" +msgstr "Transport" #: ../java/strings/Strings.java:73 msgid "udp" -msgstr "" +msgstr "udp" #. parameters in transport addresses (netdb.jsp) #. may or may not be worth translating #: ../java/strings/Strings.java:77 msgid "host" -msgstr "" +msgstr "hôte" #: ../java/strings/Strings.java:78 -#, fuzzy msgid "key" -msgstr "Ajouter une clé" +msgstr "clef" #: ../java/strings/Strings.java:79 -#, fuzzy msgid "port" -msgstr "ou" +msgstr "port" #. introducer host #: ../java/strings/Strings.java:83 msgid "ihost0" -msgstr "" +msgstr "ihost0" #: ../java/strings/Strings.java:84 msgid "ihost1" -msgstr "" +msgstr "ihost1" #: ../java/strings/Strings.java:85 msgid "ihost2" -msgstr "" +msgstr "ihost2" #. introducer port #: ../java/strings/Strings.java:87 msgid "iport0" -msgstr "" +msgstr "iport0" #: ../java/strings/Strings.java:88 msgid "iport1" -msgstr "" +msgstr "iport1" #: ../java/strings/Strings.java:89 msgid "iport2" -msgstr "" +msgstr "iport2" #. introducer key #: ../java/strings/Strings.java:91 msgid "ikey0" -msgstr "" +msgstr "ikey0" #: ../java/strings/Strings.java:92 msgid "ikey1" -msgstr "" +msgstr "ikey1" #: ../java/strings/Strings.java:93 msgid "ikey2" -msgstr "" +msgstr "ikey2" #. introducer tag #: ../java/strings/Strings.java:95 msgid "itag0" -msgstr "" +msgstr "itag0" #: ../java/strings/Strings.java:96 msgid "itag1" -msgstr "" +msgstr "itag1" #: ../java/strings/Strings.java:97 msgid "itag2" -msgstr "" +msgstr "itag2" #. Descriptions for the stats that are graphed by default #. There are over 500 stats currently defined, we aren't going to tag them all #: ../java/strings/Strings.java:101 msgid "Low-level bandwidth receive rate" -msgstr "" +msgstr "Taux de bande passante de réception faible" #. bw.recvRate #: ../java/strings/Strings.java:102 msgid "Low-level bandwidth send rate" -msgstr "" +msgstr "Taux de bande passante d'émission de bas niveau" #. bw.sendRate #: ../java/strings/Strings.java:103 msgid "How many peers we are actively talking with" -msgstr "" +msgstr "Nombre de pairs actifs" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:112 msgid "config networking" msgstr "Interconnexion configuration" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:224 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:237 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:224 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:234 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005ffr_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:231 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:222 +msgid "Summary Bar" +msgstr "Panneau de contrôle" + #. We have intl defined when this is included, but not when compiled standalone. -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:217 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:218 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:217 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:217 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:231 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:217 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:217 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:218 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:217 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:217 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:217 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:228 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:217 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:223 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:235 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:216 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:237 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:250 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:237 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:247 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005ffr_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:244 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:242 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:235 msgid "Refresh (s)" -msgstr "Actualiser (s)" +msgstr "Actualisation auto. (s)" #. ditto -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:221 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:222 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:221 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:221 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:235 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:221 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:221 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:222 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:221 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:221 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:221 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:224 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:232 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:221 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:224 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:224 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:224 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:227 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:224 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:224 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:238 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:241 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:254 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:241 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:251 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005ffr_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:248 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:245 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:239 msgid "Enable" msgstr "Activer" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:241 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:262 msgid "I2P Network Configuration" msgstr "Configuration I2P réseau" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:297 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:316 msgid "Bandwidth limiter" -msgstr "Limiteur de bande passante" +msgstr "Gestionnaire de bande passante" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:299 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:318 msgid "I2P will work best if you configure your rates to match the speed of your internet connection." -msgstr "I2P fonctionnera mieux si vous configurez le débit de transmission et réception pour qu'ils soient égales à ceux de votre connexion internet." +msgstr "I2P fonctionnera mieux si vous configurez les débits de réception et d'émission pour qu'ils correspondent à ceux de votre connexion Internet." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:303 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:322 msgid "KBps In" -msgstr "KOps entrant" +msgstr "ko/s entrants" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:317 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:336 msgid "KBps Out" -msgstr "KOps sortant" +msgstr "ko/s sortants" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:333 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:352 msgid "Share" -msgstr "Partager" +msgstr "Partagés" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:340 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:307 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:303 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:359 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:327 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:326 msgid "NOTE" -msgstr "NOTER" +msgstr "NOTE" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:342 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:361 #, java-format msgid "You have configured I2P to share only {0} KBps." -msgstr "Vous avez configuré I2P à partager que {0} KOps." +msgstr "Vous avez configuré I2P pour qu''il ne partage que {0} ko/s." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:345 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:364 msgid "I2P requires at least 12KBps to enable sharing. " -msgstr "I2P a besoin de plus de 12KOps afin d'activer le partage de bande passante" +msgstr "I2P a besoin de plus de 12ko/s afin d'activer le partage de bande passante." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:346 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:365 msgid "Please enable sharing (participating in tunnels) by configuring more bandwidth. " -msgstr "Veuillez activer le partage de bande passante (tunnels participants) en augmentant votre bande passante." +msgstr "Merci d'activer le partage de bande passante (en participant aux tunnels) en augmentant votre bande passante, si possible." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:347 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:366 msgid "It improves your anonymity by creating cover traffic, and helps the network." msgstr "Cela aidera votre anonymat en cachant vos données parmi les données des autres, et cela améliorera le réseau." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:350 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:369 #, java-format msgid "You have configured I2P to share {0} KBps." -msgstr "Vous avez configuré I2P à partager {0} KOps." +msgstr "Vous avez configuré le partage I2P à {0}ko/s." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:353 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:372 msgid "The higher the share bandwidth the more you improve your anonymity and help the network." msgstr "En partageant plus de votre bande passante, vous améliorerez votre anonymat et le réseau." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:357 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:513 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:303 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:326 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:320 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:337 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:373 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:341 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:321 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:364 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:376 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:532 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:323 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:347 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:425 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:339 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:357 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:366 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:395 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:360 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:351 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:383 msgid "Cancel" msgstr "Annuler" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:374 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:393 msgid "IP and Transport Configuration" -msgstr "" +msgstr "Configuration IP et transport " -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:376 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:395 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:417 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:324 msgid "The default settings will work for most people." msgstr "La configuration par défaut marchera pour la plupart des gens." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:378 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:397 msgid "There is help below." msgstr "Voir les explications ci-dessous." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:380 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:399 msgid "UPnP Configuration" msgstr "Configuration UPnP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:384 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:403 msgid "Enable UPnP to open firewall ports" msgstr "Activer UPnP afin d'ouvrir les ports du pare-feu" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:386 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:405 msgid "UPnP status" -msgstr "Statut UPnP" +msgstr "État de UPnP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:388 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:407 msgid "IP Configuration" msgstr "Configuration IP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:390 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:460 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:409 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:479 msgid "Externally reachable hostname or IP address" -msgstr "Adresse IP ou nom d'hôte qui est joignable depuis l'exterieur" +msgstr "Adresse IP ou nom d'hôte joignable de l'extérieur" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:394 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:413 msgid "Use all auto-detect methods" -msgstr "Utiliser toute méthode d'auto-détection" +msgstr "Utiliser toutes les méthodes d'auto-détection" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:398 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:417 msgid "Disable UPnP IP address detection" -msgstr "Desactiver la détection de l'adresse IP par UPnP" +msgstr "Désactiver la détection de l'adresse IP par UPnP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:402 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:421 msgid "Ignore local interface IP address" msgstr "Ignorer l'adresse IP de l'interface locale" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:406 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:425 msgid "Use SSU IP address detection only" -msgstr "Utiliser seulement SSU pour détecter l'adresse IP" +msgstr "N'utiliser que la détection d'adresse IP par SSU" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:410 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:478 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:429 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:497 msgid "Specify hostname or IP" -msgstr "Saisir l'adresse IP ou le nom de l'hôte" +msgstr "Saisir l'adresse IP ou le nom d'hôte" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:416 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:435 msgid "Select Interface" msgstr "Choisir l'interface" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:430 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:449 msgid "Hidden mode - do not publish IP" msgstr "Mode caché - ne pas publier l'adresse IP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:432 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:451 msgid "(prevents participating traffic)" -msgstr "" +msgstr "(empêche le trafic participants)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:434 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:453 msgid "Action when IP changes" -msgstr "" +msgstr "Action quand l'IP change" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:438 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:457 msgid "Laptop mode - Change router identity and UDP port when IP changes for enhanced anonymity" -msgstr "" +msgstr "Mode IP publique dynamique/PC portable: modifie l'identité du router et le port UDP quand l'IP publique change, pour améliorer l'anonymat" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:440 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:459 msgid "Experimental" -msgstr "" +msgstr "Expérimental" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:442 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:461 msgid "UDP Configuration:" msgstr "Configuration UDP :" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:444 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:463 msgid "UDP port:" msgstr "Port UDP :" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:458 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:477 msgid "TCP Configuration" msgstr "Configuration TCP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:464 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:483 msgid "Use auto-detected IP address" -msgstr "Utiliser l'adresse IP qui a été auto-détectée" +msgstr "Utiliser l'adresse IP auto-détectée" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:466 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:498 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:485 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:517 msgid "currently" msgstr "actuellement" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:470 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:489 msgid "if we are not firewalled" -msgstr "s'il n'y a pas de pare-feu" +msgstr "si vous n'êtes pas bloqué par un pare-feu" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:474 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:493 msgid "Always use auto-detected IP address (Not firewalled)" -msgstr "Utiliser toujours l'adresse IP qui a été auto-détectée (pas de pare-feu)" +msgstr "Toujours utiliser l'adresse IP auto-détectée (non bloqué par pare-feu)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:484 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:503 msgid "Disable inbound (Firewalled)" msgstr "Desactiver les connexions entrantes (derrière un pare-feu)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:488 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:507 msgid "Completely disable" msgstr "Desactiver complètement" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:490 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:509 msgid "(select only if behind a firewall that throttles or blocks outbound TCP)" msgstr "(selectionner seulement si derrière un pare-feu qui limite les connexions sortantes TCP)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:492 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:511 msgid "Externally reachable TCP port" -msgstr "" +msgstr "Port TCP joignable de l'extérieur" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:496 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:515 msgid "Use the same port configured for UDP" msgstr "Utiliser le même port qui a été configuré pour UDP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:504 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:523 msgid "Specify Port" msgstr "Saisir le port" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:508 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:338 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:329 -msgid "Note" -msgstr "Noter" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:527 +msgid "Notes" +msgstr "Remarques" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:511 -msgid "Changing these settings will restart your router." -msgstr "Un changement de cette configuration entraînera un redémarrage du routeur" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:530 +msgid "a) Do not reveal your port numbers to anyone! b) Changing these settings will restart your router." +msgstr "a)Ne révélez vos n° de ports à personne! b)La modification de ces réglages redémarrera votre routeur. " -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:517 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:536 msgid "Configuration Help" -msgstr "Aide avec la configuration" +msgstr "Aide à la configuration" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:519 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:568 -#, fuzzy +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:538 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:587 msgid "While I2P will work fine behind most firewalls, your speeds and network integration will generally improve if the I2P port is forwarded for both UDP and TCP." -msgstr "I2P fonctionnera derrière le plupart des pares-feu, mais votre vitesse et votre intégration avec le réseau s'améliorera s'il y a la redirection du port I2P pour UDP et TCP." +msgstr "I2P fonctionnera derrière la plupart des pare-feux, mais votre vitesse et votre intégration avec le réseau sera améliorée par la redirection des ports UDP et TCP d'I2P." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:521 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:540 msgid "If you can, please poke a hole in your firewall to allow unsolicited UDP and TCP packets to reach you." -msgstr "Si vous pouvez, ouvrez un port dans votre pare-feu afin de permettre la réception des les paquets TCP et UDP non sollicités." +msgstr "If vous pouvez, ouvrez un port dans votre pare-feu pour recevoir les paquets UDP et TCP non sollicités." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:523 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:542 msgid "If you can't, I2P supports UPnP (Universal Plug and Play) and UDP hole punching with \"SSU introductions\" to relay traffic." -msgstr "Si vous ne pouvez pas, I2P est compatible avec UPnp (Universal Plug and Play) et \"UDP hole punching\" avec \"SSU introductions\" afin de relayer le trafic I2P." +msgstr "Sinon, I2P est compatible UPnP (Universal Plug and Play) et perçage de trou UDP par \"représentations SSU\" pour relayer le trafic." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:525 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:544 msgid "Most of the options above are for special situations, for example where UPnP does not work correctly, or a firewall not under your control is doing harm." -msgstr "Le plupart des possibilités décrites ci-avant sont pour les situtations particulieres, par exemple le cas où UPnP ne fonctionne pas correctement, ou un pare-feu empeche la connexion au réseau I2P." +msgstr "La plupart des options ci-dessous concernent des situations particulières, par exemple quand UPnP ne marche pas correctement, ou qu'un pare-feu hors de contrôle fait son pénible." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:527 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:546 msgid "Certain firewalls such as symmetric NATs may not work well with I2P." -msgstr "Il y a des certains types de pare-feu (tel que les NAT symétriques) qui ne fonctionnent pas bien avec I2P." +msgstr "Certains types de pare-feu (tels que les NAT symétriques) empêchent un fonctionnement correct." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:536 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:555 msgid "UPnP is used to communicate with Internet Gateway Devices (IGDs) to detect the external IP address and forward ports." -msgstr "UPnP est utilisé pour communiquer avec des \"Internet Gateway Devices (IGDs)\" afin de détecter l'adresse IP extérieure et de contrôler la redirection des ports." +msgstr "UPnP est utilisé pour communiquer avec des passerelles Internet pour détecter l'adresse IP extérieure et contrôler la redirection des ports." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:538 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:557 msgid "UPnP support is beta, and may not work for any number of reasons" -msgstr "UPnP est toujours en développement, et il peut arrêter de fonctionner correctement à cause de " +msgstr "La gestion par UPnP est toujours en développement, et peut ne pas fonctionner pour plusieurs raisons" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:540 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:559 msgid "No UPnP-compatible device present" -msgstr "Il n'y a pas d'appareil qui est compatible avec UPnP" +msgstr "Aucun appareil compatible UPnP détecté" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:542 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:561 msgid "UPnP disabled on the device" -msgstr "UPnP est desactivé sur l'appareil" +msgstr "UPnP est désactivé sur l'appareil" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:544 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:563 msgid "Software firewall interference with UPnP" -msgstr "Il y a de l'intérference entre un pare-feu en software et UPnP" +msgstr "Interférence entre un pare-feu logiciel et UPnP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:546 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:565 msgid "Bugs in the device's UPnP implementation" -msgstr "Il y a des bogues dans l'implementation d'UPnP dans l'appareil" +msgstr "Bogues dans l'implémentation UPnP de l'appareil" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:548 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:567 msgid "Multiple firewall/routers in the internet connection path" -msgstr "Il y a plusieurs routeurs/pare-feux entre le routeur I2P et l'internet" +msgstr "Il y a plusieurs routeurs/pare-feux entre le routeur I2P et l'Internet" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:550 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:569 msgid "UPnP device change, reset, or address change" -msgstr "Un changement de l'appareil UPnP, une redémarrage, ou une changement d'adresse IP" +msgstr "Changement d'appareil UPnP, redémarrage, ou changement d'adresse IP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:552 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:571 msgid "Review the UPnP status here." -msgstr "Consulter le statut de UPnP ici." +msgstr "Vérifier l'état d'UPnP ici." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:554 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:573 msgid "UPnP may be enabled or disabled above, but a change requires a router restart to take effect." msgstr "UPnP peut être activé ou desactivé au-dessus, mais afin de prendre en compte la changement il faut rédemarrer le routeur I2P." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:556 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:575 msgid "Hostnames entered above will be published in the network database." -msgstr "Les noms d'hôtes qui ont été saisis au-dessus seront publié dans la base de données du réseau I2P." +msgstr "Les noms d'hôtes saisis ci-dessus seront publié dans la base de données du réseau I2P." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:558 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:577 msgid "They are <b>not private</b>." msgstr "Ils ne sont pas <b>privés</b>." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:560 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:579 msgid "Also, <b>do not enter a private IP address</b> like 127.0.0.1 or 192.168.1.1." -msgstr "En plus, <b>ne saisissez pas une adresse IP privée</b> tel que 127.0.0.1 ou 192.168.1.1." +msgstr "De plus, <b>ne saisissez pas une adresse IP privée</b> tel que 127.0.0.1 ou 192.168.1.1." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:562 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:581 msgid "If you specify the wrong IP address or hostname, or do not properly configure your NAT or firewall, your network performance will degrade substantially." -msgstr "Si vous saisissez une mauvaise adresse IP ou nom d'hôte, ou configurer votre NAT ou pare-feu incorrectement, votre intégration avec le réseau I2P dégradera substantiellement." +msgstr "Si vous saisissez une mauvaise adresse IP ou nom d'hôte, ou configurez votre NAT ou pare-feu incorrectement, votre intégration avec le réseau I2P sera substantiellement dégradée." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:564 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:583 msgid "When in doubt, leave the settings at the defaults." -msgstr "Si vous n'êtes pas sûr de vous, laisser la configuration par défaut." +msgstr "Dans le doute, laissez les réglages par défaut." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:566 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:585 msgid "Reachability Help" -msgstr "" +msgstr "Aide sur la joignabilité" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:571 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:590 msgid "If you think you have opened up your firewall and I2P still thinks you are firewalled, remember that you may have multiple firewalls, for example both software packages and external hardware routers." -msgstr "" +msgstr "Si vous pensez que vous avez ouvert votre pare-feu et qu'I2P indique toujours que vous êtes derrière le pare-feu, n'oubliez pas que vous avez peut-être plusieurs pare-feux: par exemple celui de votre box DSL et un pare-feu logiciel dans votre ordinateur." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:574 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:593 msgid "If there is an error, the <a href=\"logs.jsp\">logs</a> may also help diagnose the problem." -msgstr "" +msgstr "S'il y a une erreur, les <a href=\"logs.jsp\">historiques</a> peuvent aider au diagnostic." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:578 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:597 msgid "Your UDP port does not appear to be firewalled." -msgstr "" +msgstr "Votre port UDP ne semble pas bloqué par un pare-feu." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:582 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:601 msgid "Your UDP port appears to be firewalled." -msgstr "" +msgstr "Votre port UDP semble bloqué par un pare-feu." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:584 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:603 msgid "As the firewall detection methods are not 100% reliable, this may occasionally be displayed in error." -msgstr "" +msgstr "Comme les méthodes de détection de pare-feu ne sont pas fiables à 100%, ceci peut occasionnellement générer une erreur." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:586 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:605 msgid "However, if it appears consistently, you should check whether both your external and internal firewalls are open for your port." -msgstr "" +msgstr "Cependant, si ça se reproduit systématiquement, vous devez vérifier que votre box et vos pare-feux internes sont ouverts pour votre port." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:588 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:607 msgid "I2P will work fine when firewalled, there is no reason for concern. When firewalled, the router uses \"introducers\" to relay inbound connections." -msgstr "" +msgstr "I2P fonctionne très bien derrière un pare-feu, ça n'est pas un problème. Derrière un pare-feu, le routeur utilise des \"représentants\" pour relayer les connexions entrantes." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:590 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:609 msgid "However, you will get more participating traffic and help the network more if you can open your firewall(s)." -msgstr "" +msgstr "Cependant, vous obtiendrez plus de trafic participants et aiderez plus le réseau si vous avez la possibilité d'ouvrir vos pare-feux." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:592 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:611 msgid "If you think you have already done so, remember that you may have both a hardware and a software firewall, or be behind an additional, institutional firewall you cannot control." -msgstr "" +msgstr "Si vous pensez que vous l'avez déjà fait, n'oubliez pas que vous avez peut-être un pare-feu matériel et logiciel, ou que vous êtes derrière un pare-feu supplémentaire sur lequel vous n'avez aucun contrôle (p.e. en entreprise)." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:594 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:613 msgid "Also, some routers cannot correctly forward both TCP and UDP on a single port, or may have other limitations or bugs that prevent them from passing traffic through to I2P." -msgstr "" +msgstr "De plus, certains pare-feux ne peuvent pas transférer correctement TCP et UDP sur le même port, ou pourraient avoir d'autres limitations ou des bogues qui les empêcheraient de passer le trafic à I2P." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:598 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:617 msgid "The router is currently testing whether your UDP port is firewalled." -msgstr "" +msgstr "Le routeur teste actuellement si votre port UDP est bloqué." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:602 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:621 msgid "The router is not configured to publish its address, therefore it does not expect incoming connections." -msgstr "" +msgstr "Le routeur n'est pas configuré pour publier son adresse : il n'attend donc pas de connexions entrantes." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:604 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:623 msgid "WARN - Firewalled and Fast" msgstr "WARN - Pare-feu et Rapide" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:606 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:625 msgid "You have configured I2P to share more than 128KBps of bandwidth, but you are firewalled." -msgstr "" +msgstr "Vous avez configuré I2P pour partager plus de 128ko/s de bande passante, mais vous êtes bloqué par un pare-feu." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:608 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:627 msgid "While I2P will work fine in this configuration, if you really have over 128KBps of bandwidth to share, it will be much more helpful to the network if you open your firewall." -msgstr "" +msgstr "Bien qu'I2P fonctionne correctement dans cette configuration, si vous avez vraiment plus de 128ko/s (~1Mb/s) de bande passante à partager, il serait bénéfique pour le réseau que vous ouvriez un port dans votre pare-feu." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:610 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:629 msgid "WARN - Firewalled and Floodfill" msgstr "WARN - Pare-feu et Floodfill" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:612 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:631 msgid "You have configured I2P to be a floodfill router, but you are firewalled." -msgstr "" +msgstr "Vous avez configuré I2P pour être un routeur de remplissage par diffusion, mais vous êtes derrière un pare-feu." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:614 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:633 msgid "For best participation as a floodfill router, you should open your firewall." -msgstr "" +msgstr "Pour une meilleure participation en tant que diffuseur, vous devriez ouvrir votre pare-feu." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:616 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:635 msgid "WARN - Firewalled with Inbound TCP Enabled" msgstr "WARN - Pare-feu avec TCP entrant activé" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:618 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:637 msgid "You have configured inbound TCP, however your UDP port is firewalled, and therefore it is likely that your TCP port is firewalled as well." -msgstr "" +msgstr "Vous avez configuré le TCP entrant, cependant votre port UDP est bloqué et en conséquence il est probable que TCP l'est aussi." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:620 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:639 msgid "If your TCP port is firewalled with inbound TCP enabled, routers will not be able to contact you via TCP, which will hurt the network." -msgstr "" +msgstr "Si votre port TCp est bloqué et les connexions entrantes TCP activées dans la console, les routeurs ne pourront pas vous contacter via TCP, ce qui va perturber le réseau. " -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:622 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:641 msgid "Please open your firewall or disable inbound TCP above." -msgstr "" +msgstr "Merci d'ouvrir votre pare-feu ou de désactiver le TCP entrant ci-dessus." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:624 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:643 msgid "WARN - Firewalled with UDP Disabled" -msgstr "WARN - Pare-feu avec UDP desactivé" +msgstr "WARN - Pare-feu avec UDP désactivé" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:626 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:645 msgid "You have configured inbound TCP, however you have disabled UDP." -msgstr "" +msgstr "Vous avez configuré le TCP entrant, mais vous avez désactivé UDP." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:628 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:647 msgid "You appear to be firewalled on TCP, therefore your router cannot accept inbound connections." -msgstr "" +msgstr "Vous apparaissez comme étant bloqué par un pare-feu pour TCP, et en conséquence votre routeur ne peut pas accepter les connexions entrantes." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:630 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:649 msgid "Please open your firewall or enable UDP." -msgstr "" +msgstr "Merci d'ouvrir votre pare-feu ou d'activer UDP." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:632 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:651 msgid "ERR - Clock Skew" -msgstr "ERR - horloge décalé" +msgstr "ERR - horloge décalée" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:634 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:653 msgid "Your system's clock is skewed, which will make it difficult to participate in the network." -msgstr "" +msgstr "L'horloge système est décalée, ce qui rend la participation au réseau difficile." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:636 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:655 msgid "Correct your clock setting if this error persists." -msgstr "" +msgstr "Corrigez votre réglage d'horloge si cette erreur persiste." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:638 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:657 msgid "ERR - Private TCP Address" msgstr "ERR - Adresse TCP privée" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:640 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:659 msgid "You must never advertise an unroutable IP address such as 127.0.0.1 or 192.168.1.1 as your external address." -msgstr "" +msgstr "Vous ne devez jamais publier une IP non routable telle que 127.0.0.1 ou 192.168.1.1 en tant qu'adresse externe." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:642 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:661 msgid "Correct the address or disable inbound TCP above." -msgstr "" +msgstr "Corrigez cette adresse ou désactivez le TCP entrant ci-dessus." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:644 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:663 msgid "ERR - SymmetricNAT" msgstr "ERR - NAT symétrique" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:646 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:665 msgid "I2P detected that you are firewalled by a Symmetric NAT." -msgstr "" +msgstr "I2P a détecté que vous êtes derrière un NAT symétrique." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:648 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:667 msgid "I2P does not work well behind this type of firewall. You will probably not be able to accept inbound connections, which will limit your participation in the network." -msgstr "" +msgstr "I2P marche mal derrière ce genre de pare-feu. vous ne pourrez sûrement pas accepter de recevoir de connexions entrantes, ce qui limitera votre participation au réseau." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:650 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:669 msgid "ERR - UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart" -msgstr "" +msgstr "ERR - Port UDP en cours d'utilisation - réglez i2np.udp.internalPort=xxxx dans la configuration avancée et redémarrez" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:652 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:671 msgid "I2P was unable to bind to port 8887 or other configured port." -msgstr "" +msgstr "I2P n'a pas pu s'attacher au port configuré." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:654 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:673 msgid "Check to see if another program is using the configured port. If so, stop that program or configure I2P to use a different port." -msgstr "" +msgstr "Vérifiez si un autre programme utilise le port configuré pour I2P. Si oui, arrêtez ce programme ou configurez I2P pour qu'il utilise un port différent (dans Windows tapez netstat dans une boîte de commandes pour lister les ports utilisés par les programmes)." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:656 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:675 msgid "This may be a transient error, if the other program is no longer using the port." -msgstr "" +msgstr "Il s'agit peut-être d'une erreur passagère, si l'autre programme n'utilise plus le port." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:658 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:677 msgid "However, a restart is always required after this error." -msgstr "" +msgstr "Cependant un redémarrage du routeur est toujours requis après cette erreur." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:660 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:679 msgid "ERR - UDP Disabled and Inbound TCP host/port not set" -msgstr "" +msgstr "ERR - UDP est désactivé et l'hôte/port entrants ne sont pas définis." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:662 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:681 msgid "You have not configured inbound TCP with a hostname and port above, however you have disabled UDP." -msgstr "" +msgstr "vous n'avez pas configuré le TCP entrant ci-dessus avec un nom d'hôte et un port, mais vous avez désactivé UDP." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:664 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:683 msgid "Therefore your router cannot accept inbound connections." -msgstr "" +msgstr "Le routeur ne peut donc pas accepter de connexions entrantes." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:666 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:685 msgid "Please configure a TCP host and port above or enable UDP." -msgstr "" +msgstr "Merci de configurer ci-dessus un nom et un port TCP, ou d'activer UDP." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:668 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:687 msgid "ERR - Client Manager I2CP Error - check logs" -msgstr "" +msgstr "ERR - Client Manager I2CP Error - vérifiez les historique" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:670 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:689 msgid "This is usually due to a port 7654 conflict. Check the logs to verify." -msgstr "" +msgstr "Ceci est habituellement dû à un conflit de port 7654. Vérifiez dans l'historique. (et pensez éventuellement à netstat ;-) ) " -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:672 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:691 msgid "Do you have another I2P instance running? Stop the conflicting program and restart I2P." -msgstr "" +msgstr "Avez-vous une autre instance d'I2P en cours d'exécution? Arrêtez le programme en conflit et redémarrez I2P." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:107 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:113 msgid "config advanced" -msgstr "configuration avancé" +msgstr "configuration avancée" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:242 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:263 msgid "I2P Advanced Configuration" -msgstr "Configuration I2P avancé" +msgstr "Configuration I2P avancée" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:299 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:319 msgid "Advanced I2P Configuration" -msgstr "Configuration I2P avancé" +msgstr "Configuration I2P avancée" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:309 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:329 msgid "Some changes may require a restart to take effect." -msgstr "" +msgstr "Certains changement nécessitent un redémarrage pour prendre effet." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:112 msgid "config clients" -msgstr "Clients configuration" +msgstr "configuration clients" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:244 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:265 msgid "I2P Client Configuration" -msgstr "Client I2P configuration" +msgstr "Configuration clients I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:311 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:330 msgid "Client Configuration" -msgstr "Configuration Client" +msgstr "Préférences" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:313 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:332 msgid "The Java clients listed below are started by the router and run in the same JVM." -msgstr "" +msgstr "Les clients Java listés ci-dessous sont démarrés par le routeur et s'exécutent dans la même JVM." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:317 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:338 msgid "To change other client options, edit the file" -msgstr "" +msgstr "Pour changer d'autres options du client, modifiez le fichier" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:324 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:344 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:345 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:423 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:439 msgid "All changes require restart to take effect." -msgstr "" +msgstr "Tous les changements nécessitent un redémarrage pour prendre effet." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:357 +msgid "Advanced Client Interface Configuration" +msgstr "Configuration interface client avancée" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:361 +msgid "External I2CP (I2P Client Protocol) Interface Configuration" +msgstr "Configuration de l'interface I2CP (I2P Client Protocol) externe" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:336 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:367 +msgid "Enabled without SSL" +msgstr "Activé sans SSL" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:373 +msgid "Enabled with SSL required" +msgstr "Activé avec SLL requis" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:379 +msgid "Disabled - Clients outside this Java process may not connect" +msgstr "Désactivé: les clients hors de ce processus Java ne peuvent pas se connecter" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:381 +msgid "I2CP Port" +msgstr "Port I2CP" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:385 +msgid "I2CP Interface" +msgstr "Interface i2CP" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:401 +msgid "Authorization" +msgstr "Autorisation" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:407 +msgid "Require username and password" +msgstr "Utilisateur+Mot de passe requis" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:409 +msgid "Username" +msgstr "Utilisateur" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:413 +msgid "Password" +msgstr "Mot de passe" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:419 +msgid "Any changes made here must also be configured in the external client." +msgstr "Tous les changements apportés ici doivent être répercutés dans le client externe." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:421 +msgid "Many clients do not support SSL or authorization." +msgstr "Nombre de clients ne prennent pas en charge l'authentification ou SSL." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:429 msgid "WebApp Configuration" msgstr "Configuration WebApp" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:338 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:431 msgid "The Java web applications listed below are started by the webConsole client and run in the same JVM as the router. They are usually web applications accessible through the router console. They may be complete applications (e.g. i2psnark),front-ends to another client or application which must be separately enabled (e.g. susidns, i2ptunnel), or have no web interface at all (e.g. addressbook)." -msgstr "" +msgstr "Les applications Web Java listées ci-dessous sont démarrées par le client webConsole et s'exécutent dans la même JVM que le routeur. Il s'agit généralement d'applications web accessibles par la console du routeur. Il peut s'agir d'applications complètes (p.e. i2pSnark), d'interfaces pour d'autres clients ou applications qui doivent être activées séparément (p.e. susidns, i2ptunnel), ou n'ayant absolument aucune interface web (p.e. le carnet d'adresses)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:340 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:433 msgid "A web app may also be disabled by removing the .war file from the webapps directory; however the .war file and web app will reappear when you update your router to a newer version, so disabling the web app here is the preferred method." -msgstr "" +msgstr "Une appli web peut aussi être désactivée en supprimant le ficher .war du répertoire des web apps; mais le fichier et la web app reviendront à l'occasion d'une mise à jour du routeur, et donc la désactivation depuis la console est la méthode recommandée." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:350 -#, fuzzy +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:445 msgid "Plugin Configuration" -msgstr "Configuration Client" +msgstr "Configuration du greffon" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:352 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:447 msgid "The plugins listed below are started by the webConsole client." -msgstr "" +msgstr "Les greffons listés ci-dessous sont démarrés par le client webConsole." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:358 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:455 msgid "Plugin Installation" -msgstr "" +msgstr "Installation de greffon" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:360 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:457 msgid "To install a plugin, enter the download URL:" -msgstr "" +msgstr "Pour installer un greffon, entrez son URL de téléchargement:" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:112 msgid "config keyring" -msgstr "Configuration porte-clés" +msgstr "Configuration du porte-clés" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:228 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:249 msgid "I2P Keyring Configuration" -msgstr "Configuration du Porte-clés I2P" +msgstr "Configuration du porte-clés I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:294 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:317 msgid "The router keyring is used to decrypt encrypted leaseSets." -msgstr "" +msgstr "Le trousseau de clefs du routeur est utilisé pour déchiffrer les jeux de baux (leaseSets) cryptés." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:297 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:320 msgid "The keyring may contain keys for local or remote encrypted destinations." -msgstr "" +msgstr "Le trousseau contient les clés des destinations cryptées locales ou distantes." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:307 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:326 msgid "Manual Keyring Addition" -msgstr "" +msgstr "Ajout manuel de clés" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:309 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:328 msgid "Enter keys for encrypted remote destinations here." -msgstr "" +msgstr "Entrez les clés pour les destinations chiffrées distantes ici." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:312 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:331 msgid "Keys for local destinations must be entered on the" -msgstr "" +msgstr "Les clés des destinations locales doivent être entrées sur la" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:314 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:333 msgid "I2PTunnel page" -msgstr "" +msgstr "page I2PTunnel" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:316 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:335 msgid "Dest. name, hash, or full key" msgstr "Nom de destination, empreinte, ou clé complète" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:318 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:337 msgid "Encryption Key" -msgstr "Clé d'encryption" +msgstr "Clé de cryptage" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:107 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:113 msgid "config logging" -msgstr "configuration enregistrements" +msgstr "configuration des historiques" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:242 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:263 msgid "I2P Logging Configuration" -msgstr "" +msgstr "Configuration des historiques I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:299 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:319 msgid "Configure I2P Logging Options" -msgstr "" +msgstr "Configuration des options d'historiques" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:301 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:321 msgid "Logging filename" -msgstr "" +msgstr "Nom du fichier des historiques" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:305 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:325 msgid "(the symbol '@' will be replaced during log rotation)" -msgstr "" +msgstr "(le caractère \"@\" sera remplacé lors des rotations d'historiques)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:307 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:327 msgid "Log record format" -msgstr "" +msgstr "Format des enregistrements d'historiques" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:311 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:331 msgid "(use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, 'm' = message)" -msgstr "(use 'd' = date, 'c' = classe, 't' = fil d'exécution, 'p' = priorité, 'm' = message)" +msgstr "(utilisez \"d\" = date, \"c\" = classe, \"t\" = tâche, \"p\" = priorité, \"m\" = message)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:313 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:333 msgid "Log date format" -msgstr "" +msgstr "Format de date des historiques" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:317 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:337 msgid "('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' = millisecond)" -msgstr "('MM' = mois, 'dd' = jour, 'HH' = heure, 'mm' = minute, 'ss' = seconde, 'SSS' = milliseconde)" +msgstr "(\"MM\" = mois, \"dd\" = jour, \"HH\" = heure, \"mm\" = minute, \"ss\" = seconde, \"SSS\" = milliseconde)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:319 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:339 msgid "Max log file size" -msgstr "" +msgstr "Taille max des fichiers d'historiques" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:323 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:343 msgid "Default log level" -msgstr "" +msgstr "Niveau d'historisation par défaut" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:327 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:347 msgid "(DEBUG and INFO are not recommended defaults, as they will drastically slow down your router)" -msgstr "" +msgstr "(DEBUG et INFO sont déconseillés, car ils ralentissent double-plus-grâââve votre routeur)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:329 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:349 msgid "Log level overrides" -msgstr "" +msgstr "Exceptions au niveau d'historisation" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:333 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:353 msgid "New override" -msgstr "" +msgstr "Nouvelle exception" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:112 msgid "config peers" msgstr "Configuration des pairs" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:228 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:249 msgid "I2P Peer Configuration" msgstr "Configuration des pairs I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:304 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:323 msgid "Manual Peer Controls" -msgstr "" +msgstr "Contrôle manuel des pairs" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:306 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:325 msgid "Router Hash" -msgstr "Routeur empreinte" +msgstr "Empreinte du routeur" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:310 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:329 msgid "Manually Ban / Unban a Peer" -msgstr "" +msgstr "(Dé)banissement manuel d'un pair" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:312 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:331 msgid "Banning will prevent the participation of this peer in tunnels you create." -msgstr "" +msgstr "Le banissement empêchera ce pair de participer aux tunnels que vous créez." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:341 +msgid "Adjust Profile Bonuses" +msgstr "Ajuster les boni du profil" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:324 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:343 msgid "Bonuses may be positive or negative, and affect the peer's inclusion in Fast and High Capacity tiers. Fast peers are used for client tunnels, and High Capacity peers are used for some exploratory tunnels. Current bonuses are displayed on the" -msgstr "" +msgstr "Les boni peuvent être positifs ou négatifs, et influencent l'affectation des pairs dans les groupes \"Rapides\" et \"Hautes capacités\". Les pairs rapides sont utilisés pour les tunnels clients, et les pairs à hautes capacités pour quelques tunnels exploratoires. Les boni actuels sont affichés sur la" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:326 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:345 msgid "profiles page" -msgstr "page des profiles" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:342 -msgid "Adjust peer bonuses" -msgstr "" +msgstr "page des profils" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:344 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:253 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:363 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:273 msgid "Banned Peers" -msgstr "Pairs interdits" +msgstr "Pairs bannis" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:366 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:384 msgid "Banned IPs" -msgstr "Adresses IP interdits" +msgstr "Adresses IP bannies" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:112 +msgid "config reseeding" +msgstr "Config réamorçage" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:262 +msgid "I2P Reseeding Configuration" +msgstr "Configuration du réamorçage d'I2P" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:318 +msgid "Reseeding Configuration" +msgstr "Configuration réamorçage" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:320 +msgid "Reseeding is the bootstrapping process used to find other routers when you first install I2P, or when your router has too few router references remaining." +msgstr "Le réamorçage est le processus de lancement utilisé pour trouver d'autres routeurs lors de l'installation initiale d'I2P, ou lorsqu'il reste au routeur trop peu de références à d'autre routeurs." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:322 +msgid "If reseeding has failed, you should first check your network connection." +msgstr "Si le réamorçage a échoué, vérifiez d'abord l'état de votre connexion au réseau." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:326 +msgid "Change these only if HTTP is blocked by a restrictive firewall, reseed has failed, and you have access to an HTTP proxy." +msgstr "Changez-les seulement si HTTP est bloqué par un pare-feu restrictif, si le réamorçage a échoué, et si vous avez accès à un mandataire (proxy) HTTP." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:328 +#, java-format +msgid "See {0} for instructions on reseeding manually." +msgstr "Voir les instructions de réamorçage manuel sur {0}." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:328 +msgid "the FAQ" +msgstr "la FAQ" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:330 +msgid "Reseed URL Selection" +msgstr "Sélection de l'URL de réamorçage" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:336 +msgid "Try SSL first then non-SSL" +msgstr "Préférer SSL, sinon, repli sur non-SSL" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:342 +msgid "Use SSL only" +msgstr "Avec SSL seulement" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:348 +msgid "Use non-SSL only" +msgstr "Sans SSL" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:350 +msgid "Reseed URLs" +msgstr "URLs de réamorçage" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:354 +msgid "Enable HTTP proxy (not used for SSL)" +msgstr "Activer le mandataire HTTP (non utilisé pour SSL)" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:358 +msgid "HTTP Proxy Host" +msgstr "Hôte mandataire HTTP" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:362 +msgid "HTTP Proxy Port" +msgstr "Port mandataire HTTP" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:112 msgid "config service" -msgstr "Service Configuration " +msgstr "Configuration du service" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:228 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:249 msgid "I2P Service Configuration" -msgstr "Service I2P Configuration" +msgstr "Configuration du service I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:284 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:303 msgid "Shutdown the router" -msgstr "Fermer le routeur" +msgstr "Arrêter le routeur" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:286 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:305 msgid "Graceful shutdown lets the router satisfy the agreements it has already made before shutting down, but may take a few minutes." -msgstr "Une fermature gracieuse permit au routeur de satisfaire ses accords en place avec d'autres routeurs avant de fermer, mais cela prendra plusieurs minutes." +msgstr "Un arrêt respectueux permet au routeur de satisfaire les accords en place avec d'autres routeurs avant la fermeture, mais cela prendra quelques minutes." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:288 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:307 msgid "If you need to kill the router immediately, that option is available as well." -msgstr "Si vous avez besoin d'arrêter le routeur I2P immédiatement, cette option est aussi disponible." +msgstr "Si vous avez besoin d'arrêter le routeur I2P immédiatement, cette option est également disponible." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:298 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:317 msgid "If you want the router to restart itself after shutting down, you can choose one of the following." -msgstr "" +msgstr "Si vous voulez que le routeur redémarre après l'arrêt, vous pouvez choisir une des possibilités suivantes." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:300 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:319 msgid "This is useful in some situations - for example, if you changed some settings that client applications only read at startup, such as the routerconsole password or the interface it listens on." -msgstr "" +msgstr "C'est utile dans certaines situations: p.e. quand vous faites un réglage que telle application cliente ne lit qu'au démarrage, comme le mot de passe de la console ou l'interface sur lequel elle écoute." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:302 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:321 msgid "A graceful restart will take a few minutes (but your peers will appreciate your patience), while a hard restart does so immediately." -msgstr "Une redémarrage gracieux prendra quelques minutes (mais vos pairs apprécieront votre patience), une redémarrage immédiate est quasi instantané." +msgstr "Un redémarrage respectueux prendra quelques minutes (mais vos pairs apprécieront votre patience), un redémarrage immédiat est quasi instantané." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:304 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:323 msgid "After tearing down the router, it will wait 1 minute before starting back up again." -msgstr "Après la rédemmarage du routeur, il attendra 1 minute avant de se relancer." +msgstr "Après le redémarrage du routeur, il attendra 1 minute avant de se relancer." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:314 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:333 msgid "Systray integration" -msgstr "" +msgstr "Intégration dans la zone de notification" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:316 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:335 msgid "On the windows platform, there is a small application to sit in the system tray, allowing you to view the router's status" -msgstr "" +msgstr "Sur Windows, une icône pour la zone de notification indiquant l'état du routeur " -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:318 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:337 msgid "(later on, I2P client applications will be able to integrate their own functionality into the system tray as well)." -msgstr "" +msgstr "(Ultérieurement, les applications clientes I2P pourront aussi intégrer leurs propres fonctionnalités dans la zone de notification système)." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:320 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:339 msgid "If you are on windows, you can either enable or disable that icon here." -msgstr "" +msgstr "Si vous êtes sur Windows, vous pouvez (dés)activer cette icône ici." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:341 +msgid "Show systray icon" +msgstr "Afficher l'icône de zone de notification" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:343 +msgid "Hide systray icon" +msgstr "Masquer l'icône de zone de notification" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:326 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:345 msgid "Run on startup" -msgstr "Lancer avec le démarrage du routeur" +msgstr "Lancer au démarrage" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:328 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:347 msgid "You can control whether I2P is run on startup or not by selecting one of the following options - I2P will install (or remove) a service accordingly." -msgstr "" +msgstr "Vous pouvez contrôler si I2P est lancé ou pas au démarrage en choisissant une des options suivantes: I2P installera le service en conséquence." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:330 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:349 msgid "If you prefer the command line, you can also run the " -msgstr "" +msgstr "Si vous préférez la ligne commande, vous pouvez aussi exécuter la" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:357 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:348 +msgid "Note" +msgstr "Note" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:340 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:359 msgid "If you are running I2P as service right now, removing it will shut down your router immediately." -msgstr "" +msgstr "Si vous exécutez actuellement I2P en tant que service, l'enlever arrêtera le routeur immédiatement." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:342 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:361 msgid "You may want to consider shutting down gracefully, as above, then running uninstall_i2p_service_winnt.bat." -msgstr "" +msgstr "Vous pouvez faire un arrêt respectueux, comme ci-dessus, puis lancer le fichier uninstall_i2p_service_winnt.bat." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:346 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:365 msgid "Debugging" msgstr "Débogage" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:348 -#, fuzzy +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:367 msgid "View the job queue" -msgstr "queue des tâches" +msgstr "Afficher la file d'attente de travaux" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:352 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:371 msgid "At times, it may be helpful to debug I2P by getting a thread dump. To do so, please select the following option and review the thread dumped to <a href=\"logs.jsp#servicelogs\">wrapper.log</a>." -msgstr "" +msgstr "À l'occasion, il peut être utile de déboguer I2P à l'aide d'un cliché de tâches. Pour ce faire, cliquer sur le bouton ci-dessous et examiner le résultat dans l'historique du <a href=\"logs.jsp#servicelogs\">service Wrapper</a>." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:358 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:377 msgid "Launch browser on router startup?" -msgstr "Lancer explorateur internet pendant le démarrage du routeur ?" +msgstr "Lancer le navigateur au démarrage du routeur?" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:360 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:379 msgid "I2P's main configuration interface is this web console, so for your convenience I2P can launch a web browser on startup pointing at" -msgstr "" +msgstr "La plus grande partie de la configuration d'I2P se fait dans cette console, et donc pour votre confort, I2P peut lancer au démarrage votre navigateur sur" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:107 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:113 msgid "config stats" -msgstr "" +msgstr "config stats" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:229 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:250 msgid "I2P Stats Configuration" -msgstr "Configuration I2P Statistiques" +msgstr "Configuration des statistiques d'I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:300 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:320 msgid "Configure I2P Stat Collection" -msgstr "" +msgstr "Sélection des données à collecter" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:302 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:322 msgid "Enable full stats?" -msgstr "" +msgstr "Activer toutes les statistiques" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:309 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:329 msgid "change requires restart to take effect" -msgstr "" +msgstr "la modification sera prise en compte au prochain démarrage" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:311 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:331 msgid "Stat file" -msgstr "" +msgstr "Fichier des statistiques" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:315 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:335 msgid "Filter" msgstr "Filtre" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:317 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:326 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:337 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:348 msgid "toggle all" -msgstr "basculer tous" +msgstr "basculer tout" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:328 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:350 msgid "Log" -msgstr "Enregistrement" +msgstr "Histo." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:330 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:352 msgid "Graph" -msgstr "Graphe" +msgstr "Graph." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:369 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:391 msgid "Advanced filter" msgstr "Filtre avancé" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:112 msgid "config tunnels" msgstr "Configuration des tunnels" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:241 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:262 msgid "I2P Tunnel Configuration" msgstr "Configuration des tunnels I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:305 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:328 msgid "The default settings work for most people." -msgstr "La configuration défaut fonctionne pour le plupart des utilisateurs" +msgstr "La configuration par défaut fonctionne pour la plupart des utilisateurs." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:309 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:332 msgid "There is a fundamental tradeoff between anonymity and performance." -msgstr "" +msgstr "Il y a une contradiction fondamentale entre anonymat et performances." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:312 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:335 msgid "Tunnels longer than 3 hops (for example 2 hops + 0-2 hops, 3 hops + 0-1 hops, 3 hops + 0-2 hops), or a high quantity + backup quantity, may severely reduce performance or reliability." -msgstr "" +msgstr "Des tunnels à plus de 3 sauts (p.e. 2 sauts + 0-2 sauts, 3 sauts + 0-1 saut, 3 sauts + 0-2 sauts), ou en grand nombre avec une réserve de secours élevée, peuvent gravement réduire les performances ou la fiabilité. " -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:315 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:338 msgid "High CPU and/or high outbound bandwidth usage may result." -msgstr "" +msgstr "Une forte charge UC et/ou utilisation de bande passante sortante peuvent en résulter. " -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:318 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:341 msgid "Change these settings with care, and adjust them if you have problems." -msgstr "" +msgstr "Modifiez ces réglages avec prudence, et fignolez-les en cas de problèmes." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:332 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:351 msgid "Exploratory tunnel setting changes are stored in the router.config file." -msgstr "" +msgstr "Les modifications des réglages de tunnels exploratoires sont enregistrés dans le fichier router.config." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:354 msgid "Client tunnel changes are temporary and are not saved." -msgstr "" +msgstr "Les modifications des tunnels clients sont temporaires et ne sont pas enregistrées." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:337 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:356 msgid "To make permanent client tunnel changes see the" -msgstr "" +msgstr "Pour faire des modifications permanentes à un tunnel client particulier, voyez la" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:339 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:358 msgid "i2ptunnel page" -msgstr "" +msgstr "page i2ptunnel" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:112 msgid "config UI" -msgstr "configuration IHM" +msgstr "configuration de la console" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:241 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:262 msgid "I2P UI Configuration" -msgstr "Configuration de l'IHM I2P" +msgstr "Préférences de la console" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:291 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:314 msgid "Router Console Theme" -msgstr "" +msgstr "Thème de la console" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:309 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:339 msgid "Theme selection disabled for Internet Explorer, sorry." -msgstr "" +msgstr "Sélection de thème indisponible pour Internet Explorer, désolé." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:311 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:341 msgid "If you're not using IE, it's likely that your browser is pretending to be IE; please configure your browser (or proxy) to use a different User Agent string if you'd like to access the console themes." -msgstr "" +msgstr "Si vous n'utilisez pas IE, c'est que votre navigateur tente de le faire croire; configurez-le (ou son proxy) pour qu'il utilise une chaîne User Agent différente si vous souhaitez pouvoir changer de thème." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:315 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:345 msgid "Router Console Language" -msgstr "" +msgstr "Langue de la console" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:319 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:349 msgid "Please contribute to the router console translation project! Contact the developers on IRC #i2p to help." -msgstr "Veuillez contribuer à la traduction du 'router console' ! Contactez les développeurs sur IRC #i2p afin de donner un coup de main." +msgstr "Merci de contribuer à la traduction de la console du routeur ! Contactez les développeurs sur IRC #i2p afin de donner un coup de main." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:323 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:353 msgid "Apply" msgstr "Appliquer" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:112 msgid "config update" -msgstr "Mettre à jour la configuration" +msgstr "mise à jour config" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:228 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:249 msgid "I2P Update Configuration" -msgstr "Configuration du mise à jour I2P" +msgstr "Configuration des mises à jour" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:302 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:321 msgid "Check for I2P and news updates" -msgstr "" +msgstr "Vérification de mises à jour I2P et nouvelles" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:304 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:323 msgid "News & I2P Updates" -msgstr "Actualités et mises à jour I2P" +msgstr "Actualités & mises à jour i2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:308 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:327 msgid "Update In Progress" msgstr "Mise à jour en cours" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:316 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:335 msgid "News URL" -msgstr "Actualités URL" +msgstr "URL des actualités" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:320 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:339 msgid "Refresh frequency" msgstr "Fréquence d'actualisation" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:326 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:345 msgid "Update policy" msgstr "Méthode de mise à jour" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:330 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:349 msgid "Update through the eepProxy?" -msgstr "Mettre à jour utilisant l'eeProxy ?" +msgstr "Mettre à jour via l'eeProxy ?" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:334 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:353 msgid "eepProxy host" msgstr "eeProxy hôte" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:338 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:357 msgid "eepProxy port" -msgstr "" +msgstr "Port eepProxy" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:342 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:361 msgid "Update URLs" msgstr "Mettre à jour à partir de ces URLs" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:346 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:365 msgid "Trusted keys" -msgstr "Clés auxquelles on peut faire confiance" +msgstr "Clés de confiance" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:350 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:369 msgid "Update with unsigned development builds?" -msgstr "Mettre à jour avec une version de développement d'i2p qui n'a pas été signée" +msgstr "Mettre à jour avec les versions intermédiaires de développement non signées?" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:354 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:373 msgid "Unsigned Build URL" -msgstr "L'URL de la version d'i2p qui n'a pas été signée" +msgstr "L'URL de version non signée" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:360 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:379 msgid "I2P updates are disabled because you do not have write permission for the install directory." -msgstr "" +msgstr "Les mises à jours d'I2P sont désactivées car vous n'avez pas le droit d'écriture sur le dossier d'installation. " -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:366 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:385 msgid "Save" -msgstr "Sauvegarder" +msgstr "Enregistrer" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:117 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:121 +msgid "Internal Error" +msgstr "Erreur interne" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:123 +msgid "Router Console" +msgstr "Console du routeur I2P" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:127 +msgid "Configuration" +msgstr "Configuration" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:135 +msgid "Sorry! There has been an internal error." +msgstr "Désolé! Une erreur interne est survenue." + +#. note to translators - both parameters are URLs +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:139 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:254 +#, java-format +msgid "Please report bugs on {0} or {1}." +msgstr "Merci de signaler les bogues sur {0} ou {1}." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:143 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:258 +msgid "You may use the username \"guest\" and password \"guest\" if you do not wish to register." +msgstr "Vous pouvez utiliser l'identifiant \"guest\" et le mot de passe \"guest\" si vous ne souhaitez pas vous inscrire." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:145 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:260 +msgid "Please include this information in bug reports" +msgstr "Veuillez inclure cette information dans les rapports des bugs" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:147 +msgid "Error Details" +msgstr "Détails de l'erreur" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:149 +#, java-format +msgid "Error {0}" +msgstr "Erreur {0}" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:169 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:250 +msgid "I2P Version and Running Environment" +msgstr "Version d'I2P & environnement d'exécution" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:197 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:288 +msgid "Note that system information, log timestamps, and log messages may provide clues to your location; please review everything you include in a bug report." +msgstr "Veuillez prendre note que les informations système, les tampons horaires, et les messages d'historiques contiennent des indices susceptibles de révéler votre identité. Merci de vérifier tout ce que vous incluez dans un rapport de bogue." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:123 msgid "Page Not Found" msgstr "Page introuvable" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:264 msgid "Sorry! You appear to be requesting a non-existent Router Console page or resource." -msgstr "" +msgstr "Désolé! Vous avez demandé une page ou ressource de la console inexistante. " -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:245 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:266 msgid "Error 404" msgstr "Erreur 404" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:250 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:271 msgid "not found" -msgstr "pas trouvé" +msgstr "non trouvé" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:112 msgid "graphs" -msgstr "graphes" +msgstr "graphiques" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:228 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:249 msgid "I2P Performance Graphs" -msgstr "" +msgstr "Graphiques de performances I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:111 msgid "home" -msgstr "" +msgstr "accueil" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:331 +msgid "Welcome to I2P" +msgstr "Bienvenue sur I2P !" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:111 msgid "job queue" -msgstr "queue des tâches" +msgstr "file d'attente" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:248 msgid "I2P Router Job Queue" -msgstr "" +msgstr "File d'attente de travaux du routeur" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:111 msgid "logs" -msgstr "fichier traces" +msgstr "historiques" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:248 msgid "I2P Router Logs" msgstr "Fichier traces du routeur I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:229 -msgid "I2P Version & Running Environment" -msgstr "" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:231 -msgid "Please report bugs on <a href=\"http://trac.i2p2.i2p/newticket\">trac.i2p2.i2p</a>." -msgstr "" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:233 -msgid "Please include this information in bug reports" -msgstr "Veuillez inclure cette information dans les rapports des bugs" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:274 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:303 msgid "Critical Logs" -msgstr "" +msgstr "Historiques critiques" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:278 -#, fuzzy +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:307 msgid "Router Logs" -msgstr "Fichier traces du routeur I2P" +msgstr "Historiques du routeur" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:284 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:313 msgid "Service (Wrapper) Logs" -msgstr "" +msgstr "Historique du service Wrapper" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:111 msgid "network database summary" -msgstr "" +msgstr "Résumé base de données" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:248 msgid "I2P Network Database Summary" -msgstr "" +msgstr "Résumé base de données I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:109 -#, fuzzy +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:115 msgid "WebApp Not Found" -msgstr "Page introuvable" +msgstr "Application web introuvable" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:231 -#, fuzzy +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:252 msgid "Web Application Not Running" -msgstr "Tunnels d'application" +msgstr "Application web non lancée" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:233 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:254 msgid "The requested web application is not running." -msgstr "" +msgstr "L'application web demandée n'est pas lancée." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:256 msgid "Please visit the <a href=\"/configclients.jsp#webapp\">config clients page</a> to start it." -msgstr "" +msgstr "Pour la lancer, rendez-vous sur <a href=\"/configclients.jsp#webapp\">configuration des clients</a>." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:111 msgid "peer connections" -msgstr "connexions pairs" +msgstr "connexions de pairs" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:248 msgid "I2P Network Peers" -msgstr "" +msgstr "Pairs I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:111 msgid "peer profiles" -msgstr "profile des pairs" +msgstr "profils de pairs" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:248 msgid "I2P Network Peer Profiles" -msgstr "" +msgstr "Profils de pairs I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:111 msgid "statistics" msgstr "statistiques" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:245 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:265 msgid "I2P Router Statistics" msgstr "Statistiques du routeur I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:244 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:255 #, java-format msgid "Disable {0} Refresh" -msgstr "Désactiver {0} actualisation" +msgstr "Désactiver l''actualisation automatique {0}" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:111 msgid "tunnel summary" -msgstr "sommaire tunnel" +msgstr "résumé des tunnels" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:248 msgid "I2P Tunnel Summary" -msgstr "tunnel sommaire I2P" +msgstr "Résumé des tunnels I2P" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:111 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:248 +msgid "Peer Profile" +msgstr "Profils de pair" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:275 +#, java-format +msgid "Profile for peer {0}" +msgstr "Profil du pair {0}" + +#~ msgid "Last reseed failed fully (failed reading seed URL)." +#~ msgstr "" +#~ "Échec complet du dernier réamorçage (échec de lecture de l\\''URL source)" + +#~ msgid "Last reseed failed fully (no routerInfo URLs at seed URL)." +#~ msgstr "" +#~ "Échec complet du dernier réamorçage (pas de routerInfo à l\\''URL source)" + +#~ msgid "Last reseed failed partly ({0}% of {1})." +#~ msgstr "Échec partiel du dernier réamorçage ({0}% de {1})." + +#~ msgid "Last reseed failed ({0}% of {1})." +#~ msgstr "Échec du dernier réamorçage ({0}% de {1})." + +#~ msgid "Last reseed failed fully (exception caught)." +#~ msgstr "Échec complet du dernier réamorçage (exception interceptée)." + +#~ msgid "System tray icon enabled." +#~ msgstr "Icône de zone de notification système activée." + +#~ msgid "System tray icon feature not supported on this platform. Sorry!" +#~ msgstr "" +#~ "Fonctionnalité \"Icône de zone de notification système\" non disponible " +#~ "sur cette plateforme. Désolé!" + +#~ msgid "Warning: unable to contact the systray manager" +#~ msgstr "" +#~ "Avertissement: impossible de contacter le gestionnaire de zone de " +#~ "notification." + +#~ msgid "System tray icon disabled." +#~ msgstr "Icône de zone de notification système désactivée." + +#~ msgid "hour" +#~ msgstr "heure" + +#~ msgid "minute" +#~ msgstr "mn" + +#~ msgid "minutes" +#~ msgstr "minutes" + +#~ msgid "Download" +#~ msgstr "Télécharger" + +#~ msgid "" +#~ "Please report bugs on <a href=\"http://trac.i2p2.i2p/newticket\">trac." +#~ "i2p2.i2p</a>." +#~ msgstr "" +#~ "Merci de signaler les bogues sur <a href=\"http://trac.i2p2.i2p/newticket" +#~ "\">trac.i2p2.i2p</a>." #~ msgid "This is useful in some situations" #~ msgstr "C'est utile dans certains cas" + #~ msgid "Start Now" #~ msgstr "Démarrer tout de suite" + #~ msgid "Depth" #~ msgstr "Profondeur" + #~ msgid "view without" #~ msgstr "montrer sans" + #~ msgid "view with" #~ msgstr "montrer avec" + #~ msgid "Show the router's workload, and how it's performing" #~ msgstr "Montrer les tâches en cours" + #~ msgid "Jobs" #~ msgstr "Tâches" + #~ msgid "Tunnels in/out" #~ msgstr "Tunnels entrants/sortants" - diff --git a/apps/routerconsole/locale/messages_nl.po b/apps/routerconsole/locale/messages_nl.po index 53ab8ee9d29477d8888bb1f9de2174d31ca07835..667d5901bac27ef6e3f07a05acf0710fb31e6cc4 100644 --- a/apps/routerconsole/locale/messages_nl.po +++ b/apps/routerconsole/locale/messages_nl.po @@ -6,17 +6,17 @@ # msgid "" msgstr "" -"Project-Id-Version: I2P routerconsole\n" +"Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-12-17 15:03+0000\n" -"PO-Revision-Date: 2010-07-04 15:04+0100\n" -"Last-Translator: duck <duck@mail.i2p>\n" -"Language-Team: duck <duck@mail.i2p>, monkeybrains <monkeybrains@mail.i2p>\n" +"POT-Creation-Date: 2011-03-21 18:30+0000\n" +"PO-Revision-Date: 2011-03-21 18:26+0000\n" +"Last-Translator: ducki2p <ducki2p@gmail.com>\n" +"Language-Team: Dutch <>\n" +"Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -"X-Poedit-Language: Dutch\n" #. NOTE TO TRANSLATORS: Feel free to translate all these as you see fit, there are several options... #. spaces or not, '.' or not, plural or not. Try not to make it too long, it is used in @@ -26,7 +26,7 @@ msgstr "" #. {0,number,####} prevents 1234 from being output as 1,234 in the English locale. #. If you want the digit separator in your locale, translate as {0}. #. alternates: msec, msecs -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1092 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1141 #, java-format msgid "1 ms" msgid_plural "{0,number,####} ms" @@ -36,8 +36,7 @@ msgstr[1] "{0,number,####} ms" #. seconds #. Note to translators: quantity will always be greater than one. #. alternates: secs, sec. 'seconds' is probably too long. -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1097 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:354 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1146 #, java-format msgid "1 sec" msgid_plural "{0} sec" @@ -47,7 +46,7 @@ msgstr[1] "{0} s" #. minutes #. Note to translators: quantity will always be greater than one. #. alternates: mins, min. 'minutes' is probably too long. -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1102 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1151 #, java-format msgid "1 min" msgid_plural "{0} min" @@ -57,42 +56,42 @@ msgstr[1] "{0} min" #. hours #. Note to translators: quantity will always be greater than one. #. alternates: hrs, hr., hrs. -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1107 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1156 #, java-format msgid "1 hour" msgid_plural "{0} hours" msgstr[0] "1 uur" msgstr[1] "{0} uren" -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1109 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:313 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1158 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:314 msgid "n/a" msgstr "nvt" #. days #. Note to translators: quantity will always be greater than one. -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1113 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1162 #, java-format msgid "1 day" msgid_plural "{0} days" msgstr[0] "1 dag" msgstr[1] "{0} dagen" -#: ../../../router/java/src/net/i2p/router/Blocklist.java:126 +#: ../../../router/java/src/net/i2p/router/Blocklist.java:122 #, java-format msgid "Banned by router hash: {0}" msgstr "Verbannen wegens router hash: {0}" -#: ../../../router/java/src/net/i2p/router/Blocklist.java:128 +#: ../../../router/java/src/net/i2p/router/Blocklist.java:124 msgid "Banned by router hash" msgstr "Verbannen wegens router hash" #. Temporary reason, until the job finishes -#: ../../../router/java/src/net/i2p/router/Blocklist.java:673 +#: ../../../router/java/src/net/i2p/router/Blocklist.java:669 msgid "IP banned" msgstr "IP verbannen" -#: ../../../router/java/src/net/i2p/router/Blocklist.java:743 +#: ../../../router/java/src/net/i2p/router/Blocklist.java:739 #, java-format msgid "IP banned by blocklist.txt entry {0}" msgstr "IP verbannen wegens blocklist.txt item {0}" @@ -146,44 +145,43 @@ msgstr "Tunnels geaccepteerd" msgid "Rejecting tunnels" msgstr "Tunnels geweigerd" -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:68 -msgid "" -"Ensure that nothing blocks outbound HTTP, check <a target=\"_top\" href=" -"\"logs.jsp\">logs</a> and if nothing helps, read the <a target=\"_top\" href=" -"\"http://www.i2p2.de/faq.html\">FAQ</a> about reseeding manually." -msgstr "" -"Controlleer of uitgaand HTTP verkeer niet geblokkeerd wordt, kijk in de <a " -"target=\"_top\" href=\"logs.jsp\">logs</a> en wanneer niets anders helpt, " -"zie de <a target=\"_top\" href=\"http://www.i2p2.de/faq.html\">FAQ</a> over " -"handmatig reseeden." - -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:101 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:125 +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:20 msgid "Reseeding" msgstr "Reseeden" -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:124 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:141 #, java-format msgid "Reseed fetched only 1 router." msgid_plural "Reseed fetched only {0} routers." msgstr[0] "Reseed heeft slechts 1 router opgehaald." msgstr[1] "Reseed heeft slechts {0} routers opgehaald." -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:131 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:148 msgid "Reseed failed." msgstr "Reseed gefaald" -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:232 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:149 +#, java-format +msgid "See {0} for help." +msgstr "Zie {0} voor hulp." + +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:150 +msgid "reseed configuration page" +msgstr "reseed configuratie pagina" + +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:293 msgid "Reseeding: fetching seed URL." msgstr "Reseed: opvragen seed URL." -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:273 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:335 #, java-format msgid "" "Reseeding: fetching router info from seed URL ({0} successful, {1} errors)." msgstr "" "Reseeden: opvragen router info van seed URL ({0} succesvol, {1} fouten)." -#: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:510 +#: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:512 msgid "NetDb entry" msgstr "NetDd item" @@ -192,24 +190,25 @@ msgstr "NetDd item" msgid "No transports (hidden or starting up?)" msgstr "Geen transport (verborgen of aan het opstarten?)" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:451 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:450 msgid "Unreachable on any transport" msgstr "Onbereikbaar op alle transports" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:500 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:499 msgid "Router Transport Addresses" msgstr "Router Transport Adressen" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:505 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:504 #, java-format msgid "{0} is used for outbound connections only" msgstr "{0} is alleen gebruikt voor uitgaande connecties" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:519 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:518 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:129 msgid "Help" msgstr "Help" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:520 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:519 msgid "" "Your transport connection limits are automatically set based on your " "configured bandwidth." @@ -217,105 +216,105 @@ msgstr "" "De limieten van je transport verbinding zijn automatisch ingesteld gebaseerd " "op de geconfigureerde bandbreedte." -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:522 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:521 msgid "" "To override these limits, add the settings i2np.ntcp.maxConnections=nnn and " "i2np.udp.maxConnections=nnn on the advanced configuration page." msgstr "" -"Om deze limieten te overschrijven, voeg dan de instelling " -"i2np.ntcp.maxConnections=nnn en i2np.udp.maxConnections=nnn toe aan de " -"geavanceerde configuratie pagina." +"Om deze limieten te overschrijven, voeg dan de instelling i2np.ntcp." +"maxConnections=nnn en i2np.udp.maxConnections=nnn toe aan de geavanceerde " +"configuratie pagina." -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:257 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:523 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258 msgid "Definitions" msgstr "Definities" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:525 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:715 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1887 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:735 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1890 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:24 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:33 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:35 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:81 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:187 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:189 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:238 msgid "Peer" msgstr "Peer" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:525 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524 msgid "The remote peer, identified by router hash" msgstr "De remote peer, geïdentificeerd door de router hash" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:526 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:716 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1891 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:525 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:736 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1894 msgid "Dir" msgstr "Richting" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:527 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:526 msgid "Inbound connection" msgstr "Inkomende connectie" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:529 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:528 msgid "Outbound connection" msgstr "Uitgaande connectie" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:531 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:530 msgid "They offered to introduce us (help other peers traverse our firewall)" msgstr "" "Ze hebben aangeboden ons te introduceren (helpt andere peers om door onze " "firewall te komen)" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:532 msgid "We offered to introduce them (help other peers traverse their firewall)" msgstr "" "We hebben aangeboden ze te introduceren (helpt andere peers om door hun " "firewall te komen)" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533 msgid "How long since a packet has been received / sent" msgstr "Hoe lang sinds een pakket ontvangen / verstuurd is" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:717 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1892 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:737 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1895 msgid "Idle" msgstr "Idle" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:718 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1897 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:738 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1900 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:156 msgid "In/Out" msgstr "In/Uit" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534 msgid "The smoothed inbound / outbound transfer rate (KBytes per second)" msgstr "" "De afgevlakte inkomende / uitgaande overdrachtsnelheid (KBytes per seconde)" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535 msgid "How long ago this connection was established" msgstr "Hoe lang sinds deze connectie is gemaakt" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:719 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1902 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:739 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1905 msgid "Up" msgstr "Up" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:720 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1904 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:740 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1907 msgid "Skew" msgstr "Afwijking" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536 msgid "The difference between the peer's clock and your own" msgstr "Het verschil tussen de klok van de peer en je eigen" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537 msgid "" "The congestion window, which is how many bytes can be sent without an " "acknowledgement" @@ -323,42 +322,42 @@ msgstr "" "Het congestion window, hoeveel bytes verzonden kunnen worden zonder een " "bevestiging" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538 msgid "The number of sent messages awaiting acknowledgement" msgstr "Het aantal verzonden berichten, wachtend op bevestiging" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:540 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539 msgid "The maximum number of concurrent messages to send" msgstr "Het maximum aantal berichten om gelijktijdig te verzenden" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:540 msgid "The number of pending sends which exceed congestion window" msgstr "" "Het aantal wachtende uitgaande berichten dat het congestion window " "overschrijdt" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:542 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541 msgid "The slow start threshold" msgstr "De vertraagde-start drempel" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:542 msgid "The round trip time in milliseconds" msgstr "De rondgangstijd in milliseconden" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1914 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1917 msgid "Dev" msgstr "SD" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543 msgid "The standard deviation of the round trip time in milliseconds" msgstr "De standaarddeviatie van de rondgangstijd in milliseconden" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544 msgid "The retransmit timeout in milliseconds" msgstr "De herzend time-out in milliseconden" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545 msgid "" "Current maximum send packet size / estimated maximum receive packet size " "(bytes)" @@ -366,41 +365,41 @@ msgstr "" "Huidige maximum verzonden pakket grootte / verwachte maximimum ontvangen " "pakket grootte (bytes)" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:721 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1921 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:741 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1924 msgid "TX" msgstr "TX" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546 msgid "The total number of packets sent to the peer" msgstr "Het totaal aantal pakketten verzonden aan de peer" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:722 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1923 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:742 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1926 msgid "RX" msgstr "RX" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547 msgid "The total number of packets received from the peer" msgstr "Het totaal aantal ontvangen pakketten van de peer" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1926 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1929 msgid "Dup TX" msgstr "Dup TX" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548 msgid "The total number of packets retransmitted to the peer" msgstr "Het totaal aantal pakketten dat opnieuw is verzonden aan de peer" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:550 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1928 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1931 msgid "Dup RX" msgstr "Dup RX" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:550 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549 msgid "The total number of duplicate packets received from the peer" msgstr "Het totaal aantal pakketten dat dubbel is ontvangen van de peer" @@ -410,174 +409,175 @@ msgstr "Het totaal aantal pakketten dat dubbel is ontvangen van de peer" msgid "Excessive clock skew: {0}" msgstr "Te grote klok afwijking: {0}" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:710 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:730 msgid "NTCP connections" msgstr "NTCP connecties" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:711 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1883 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:731 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1886 msgid "Limit" msgstr "Limiet" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:712 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1884 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:732 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1887 msgid "Timeout" msgstr "Time-out" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:723 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:743 msgid "Out Queue" msgstr "Uitgaande wachtrij" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:724 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:744 msgid "Backlogged?" msgstr "In achterstand?" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:738 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1946 -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:758 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1949 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:87 msgid "Inbound" msgstr "Inkomend" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:740 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1948 -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:760 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1951 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:87 msgid "Outbound" msgstr "Uitgaand" #. buf.append("<tr> <td colspan=\"11\"><hr></td></tr>\n"); -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:787 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:807 msgid "peers" msgstr "peers" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1882 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1885 msgid "UDP connections" msgstr "UDP connecties" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1889 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1892 msgid "Sort by peer hash" msgstr "Gesorteerd op peer hash" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1891 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1894 msgid "Direction/Introduction" msgstr "Richting/Introductie" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1893 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1896 msgid "Sort by idle inbound" msgstr "Gesorteerd op idle inkomend" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1895 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1898 msgid "Sort by idle outbound" msgstr "Gesorteerd op idle uitgaand" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1898 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1901 msgid "Sort by inbound rate" msgstr "Gesorteerd op inkomende snelheid" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1900 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1903 msgid "Sort by outbound rate" msgstr "Gesorteerd op uitgaande snelheid" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1903 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1906 msgid "Sort by connection uptime" msgstr "Gesorteerd op uptime van de connectie" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1905 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1908 msgid "Sort by clock skew" msgstr "Gesorteerd op klok afwijking" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1908 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1911 msgid "Sort by congestion window" msgstr "Gesorteerd op congestion window" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1910 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1913 msgid "Sort by slow start threshold" msgstr "Gesorteerd op vertraagde-start drempel" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1913 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1916 msgid "Sort by round trip time" msgstr "Gesorteerd op rondgangstijd" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1915 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1918 msgid "Sort by round trip time deviation" msgstr "Gesorteerd op rondgangstijd afwijking" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1917 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1920 msgid "Sort by retransmission timeout" msgstr "Gesorteerd op herzendings time-out" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1920 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1923 msgid "Sort by outbound maximum transmit unit" msgstr "Gesorteerd op uitgaande maximum verzend unit" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1922 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1925 msgid "Sort by packets sent" msgstr "Gesorteerd op verzonden pakketten" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1924 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1927 msgid "Sort by packets received" msgstr "Gesorteerd op ontvangen pakketten" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1927 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1930 msgid "Sort by packets retransmitted" msgstr "Gesorteerd op herzonden pakketten" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1929 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1932 msgid "Sort by packets received more than once" msgstr "Gesorteerd op meerdere keren ontvangen pakketten" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1950 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1953 msgid "We offered to introduce them" msgstr "We hebben aangeboden ze te introduceren" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1952 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1955 msgid "They offered to introduce us" msgstr "Zij hebben aangeboden ons te introduceren" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1956 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1959 msgid "Choked" msgstr "Verstikt" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1964 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1967 msgid "1 fail" msgstr "1 gefaald" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1966 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1969 #, java-format msgid "{0} fails" msgstr "{0} gefaald" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1972 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1975 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:162 msgid "Banned" msgstr "Verbannen" #. buf.append("<tr><td colspan=\"16\"><hr></td></tr>\n"); -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2103 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2106 msgid "SUMMARY" msgstr "SAMENVATTING" -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:145 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:124 msgid "Dropping tunnel requests: Too slow" msgstr "Negeer tunnel aanvragen: Te traag" #. don't even bother, since we are so overloaded locally -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:352 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:267 msgid "Dropping tunnel requests: Overloaded" msgstr "Negeer tunnel aanvragen: Overladen" -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:525 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:470 msgid "Rejecting tunnels: Request overload" msgstr "Weiger tunnels: Overladen met aanvragen" -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:550 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:495 msgid "Rejecting tunnels: Connection limit" msgstr "Weiger tunnels: Connectie limiet" -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:744 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:695 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:716 msgid "Dropping tunnel requests: High load" msgstr "Negeer tunnel aanvragen: Hoge load" -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:753 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:708 msgid "Dropping tunnel requests: Queue time" msgstr "Negeer tunnel aanvragen: Wachttijd" @@ -1507,11 +1507,12 @@ msgstr "Zambia" msgid "Zimbabwe" msgstr "Zimbabwe" -#: ../java/src/net/i2p/router/web/CSSHelper.java:57 +#: ../java/src/net/i2p/router/web/CSSHelper.java:60 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:35 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:37 #: ../java/strings/Strings.java:29 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:233 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:125 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:257 msgid "I2P Router Console" msgstr "I2P Router Console" @@ -1533,246 +1534,255 @@ msgstr "" "Fout bij opslaan van de configuratie (toegepast, maar niet opgeslagen) - " "kijk in de fout logs" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:34 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:335 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:35 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:355 msgid "Save Client Configuration" msgstr "Client Configuratie Opslaan" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:38 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:347 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:39 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:427 +msgid "Save Interface Configuration" +msgstr "Interface Configuratie Opslaan" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:43 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:441 msgid "Save WebApp Configuration" msgstr "WebApp Configuratie Opslaan" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:42 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:357 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:47 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:453 msgid "Save Plugin Configuration" msgstr "Plugin Configuratie Opslaan" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:46 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:363 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:51 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:461 msgid "Install Plugin" msgstr "Installeer Plugin" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:82 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:87 #, java-format msgid "Deleted plugin {0}" msgstr "Plugin {0} verwijderd" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:84 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:89 #, java-format msgid "Error deleting plugin {0}" msgstr "Fout bij verwijderen plugin {0}" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:96 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:101 #, java-format msgid "Stopped plugin {0}" msgstr "Plugin {0} gestopt" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:98 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:103 #, java-format msgid "Error stopping plugin {0}" msgstr "Fout bij stoppen plugin {0}" #. label (IE) -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:119 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:189 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:124 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:255 msgid "Start" msgstr "Start" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:138 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:143 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:49 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:61 +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:33 msgid "Unsupported" msgstr "Niet ondersteund" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:184 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:189 msgid "New client added" msgstr "Nieuwe client toegevoegd" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:188 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:193 msgid "" "Client configuration saved successfully - restart required to take effect." -msgstr "Client configuratie succesvol opgeslagen - herstart nodig" +msgstr "Client configuratie succesvol opgeslagen - herstart nodig." -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:202 -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:213 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:207 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:218 msgid "Bad client index." msgstr "Foute client index." -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:207 -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:218 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:38 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:397 -#: ../java/src/net/i2p/router/web/SummaryHelper.java:379 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:212 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:223 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:392 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:384 msgid "Client" msgstr "Client" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:207 -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:266 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:212 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:271 msgid "started" msgstr "gestart" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:218 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:223 msgid "deleted" msgstr "verwijderd" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:235 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:240 msgid "WebApp configuration saved." msgstr "WebApp configuratie opgeslagen." -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:251 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:256 msgid "Plugin configuration saved." msgstr "Plugin configuratie opgeslagen." -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:266 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:58 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:271 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124 msgid "WebApp" msgstr "WebApp" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:268 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:273 msgid "Failed to start" msgstr "Gefaald te starten" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:273 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:278 msgid "Failed to find server." msgstr "Gefaald om server te vinden." -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:279 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:284 msgid "No plugin URL specified." msgstr "Geen plugin URL gespecificeerd." -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:289 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:294 #, java-format msgid "No update URL specified for {0}" msgstr "Geen update URL gespecificeerd voor {0}" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:297 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:302 -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:315 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:307 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:320 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:325 msgid "Plugin or update download already in progress." msgstr "Plugin of update download is reeds bezig." -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:306 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:311 #: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:118 #, java-format msgid "Downloading plugin from {0}" msgstr "Downloaden plugin van {0}" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:324 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:329 #, java-format msgid "Checking plugin {0} for updates" msgstr "Controlleer plugin {0} voor updates" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:334 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:339 #, java-format msgid "Started plugin {0}" msgstr "Plugin {0} gestart" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:336 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:341 #, java-format msgid "Error starting plugin {0}" msgstr "Fout bij starten plugin {0}" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:21 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:192 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:376 +msgid "" +"Interface configuration saved successfully - restart required to take effect." +msgstr "Interface configuratie succesvol opgeslagen - herstart nodig." + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:85 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:258 msgid "Edit" msgstr "Bewerk" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:30 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:331 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:94 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:351 msgid "Add Client" msgstr "Client Toevoegen" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:38 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102 msgid "Class and arguments" msgstr "Class en argumenten" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:38 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:58 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:82 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148 msgid "Control" msgstr "Controlle" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:38 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:58 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:82 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148 msgid "Run at Startup?" msgstr "Start bij opstarten?" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:58 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:82 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:131 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:197 msgid "Description" msgstr "Omschrijving" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:82 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148 msgid "Plugin" msgstr "Plugin" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:95 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:271 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:161 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:273 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:185 msgid "Version" msgstr "Versie" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:97 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:163 msgid "Signed by" msgstr "Ondertekend door" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:114 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:180 msgid "Date" msgstr "Datum" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:120 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:186 msgid "Author" msgstr "Auteur" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:136 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:202 msgid "License" msgstr "Licentie" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:141 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:207 msgid "Website" msgstr "Website" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:146 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:212 msgid "Update link" msgstr "Update link" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:194 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:260 msgid "Stop" msgstr "Stop" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:196 -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:81 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:313 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:262 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:78 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:331 msgid "Check for updates" msgstr "Controlleer op updates" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:197 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:263 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:235 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:242 msgid "Update" msgstr "Update" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:202 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:268 #, java-format msgid "Are you sure you want to delete {0}?" msgstr "Weet je zeker dat je {0} wilt verwijderen?" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:204 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:270 msgid "Delete" msgstr "Verwijder" #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:18 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:325 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:343 msgid "Add key" msgstr "Sleutel toevoegen" #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:19 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:323 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:341 msgid "Delete key" msgstr "Steutel verwijderen" @@ -1876,7 +1886,7 @@ msgstr "Service" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:101 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:386 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:381 #: ../java/strings/Strings.java:72 msgid "Tunnels" msgstr "Tunnels" @@ -1890,7 +1900,7 @@ msgid "Clients" msgstr "Clients" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:293 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:315 msgid "Keyring" msgstr "Sleutelbos" @@ -1900,13 +1910,13 @@ msgstr "Logging" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:107 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:260 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:255 #: ../java/strings/Strings.java:67 msgid "Peers" msgstr "Peers" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:387 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:389 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:143 msgid "Stats" msgstr "Statistieken" @@ -1917,13 +1927,15 @@ msgstr "Geavanceerd" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:48 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:264 +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:29 #: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:34 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:360 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:516 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:307 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:341 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:377 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:344 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:378 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:534 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:325 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:359 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:370 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:397 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:362 msgid "Save changes" msgstr "Opslaan" @@ -2009,25 +2021,25 @@ msgstr "Updaten van bandbreedte share percentage" msgid "Updated bandwidth limits" msgstr "Updaten van bandbreedte limieten" -#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:39 -#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:47 -#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:50 -#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:57 -#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:60 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:41 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:49 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:52 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:59 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:62 msgid "unknown" msgstr "ombekend" -#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:169 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:172 msgid "bits per second" msgstr "bits per seconde" -#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:170 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:173 #, java-format msgid "or {0} bytes per month maximum" msgstr "of {0} bytes per maand maximaal" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:20 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:315 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:333 msgid "Ban peer until restart" msgstr "Verban peer tot aan herstart" @@ -2047,7 +2059,7 @@ msgid "Invalid peer" msgstr "Ongeldige peer" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:28 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:317 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:335 msgid "Unban peer" msgstr "Hef verbanning van peer op" @@ -2060,7 +2072,7 @@ msgid "is not currently banned" msgstr "is op dit moment niet verbannen" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:39 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:343 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:361 msgid "Adjust peer bonuses" msgstr "Peer bonussen aanpassen" @@ -2072,10 +2084,28 @@ msgstr "Foutieve snelheids waarde" msgid "Bad capacity value" msgstr "Foutieve capaciteits waarde" +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:17 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:368 +msgid "Save changes and reseed now" +msgstr "Sla wijzigingen op en reseed nu" + +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:21 +msgid "Reseeding is already in progress" +msgstr "Reseeden is reeds bezig" + +#. skip the nonce checking in ReseedHandler +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:24 +msgid "Starting reseed process" +msgstr "Reseed proces aan het starten" + +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:66 +msgid "Configuration saved successfully." +msgstr "Configuratie succesvol opgeslagen." + #. Normal browsers send value, IE sends button label #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:32 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:57 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:293 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:311 msgid "Shutdown immediately" msgstr "Onmiddelijk afsluiten" @@ -2122,7 +2152,7 @@ msgid "Restart in {0}" msgstr "Herstart in {0}" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:53 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:291 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:309 msgid "Shutdown gracefully" msgstr "Gecontrolleerd afsluiten" @@ -2135,7 +2165,7 @@ msgid "Shutdown immediately! boom bye bye bad bwoy" msgstr "Onmiddelijk afsluiten! doei" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:61 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:295 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:313 msgid "Cancel graceful shutdown" msgstr "Annuleer gecontrolleerde stop" @@ -2144,7 +2174,7 @@ msgid "Graceful shutdown cancelled" msgstr "Gecontrolleerd afsluiten afgebroken" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:64 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:307 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:325 msgid "Graceful restart" msgstr "Gecontrolleerde herstart" @@ -2153,7 +2183,7 @@ msgid "Graceful restart requested" msgstr "Gecontrolleerde herstart aangevraagd" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:68 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:309 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:327 msgid "Hard restart" msgstr "Harde herstart" @@ -2178,79 +2208,51 @@ msgid "Rekeying after graceful shutdown" msgstr "Hersleuteling na gecontrolleerde stop" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:80 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:353 msgid "Run I2P on startup" msgstr "Start I2P bij opstarten" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:82 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:337 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:355 msgid "Don't run I2P on startup" msgstr "Start I2P niet bij opstarten" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:84 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:355 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:373 msgid "Dump threads" msgstr "Dump threads" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:91 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:323 -msgid "Show systray icon" -msgstr "Toon systray icon" - -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:96 -msgid "System tray icon enabled." -msgstr "System tray icon ingeschakeld." - -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:98 -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:110 -msgid "System tray icon feature not supported on this platform. Sorry!" -msgstr "System tray icon feature not ondersteund op dit platform. Sorry!" - -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:101 -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:113 -msgid "Warning: unable to contact the systray manager" -msgstr "Waarschuwing: kan geen verbinding maken met de systray manager" - -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:103 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:325 -msgid "Hide systray icon" -msgstr "Verberg systray icon" - -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:108 -msgid "System tray icon disabled." -msgstr "System tray icon uitgeschakeld." - -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:115 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:363 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:381 msgid "View console on startup" msgstr "Toon console na opstarten" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:117 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:93 msgid "Console is to be shown on startup" msgstr "Console wordt getoond na opstarten" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:118 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:365 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:94 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:383 msgid "Do not view console on startup" msgstr "Toon console niet na opstarten" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:120 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:96 msgid "Console is not to be shown on startup" msgstr "De console wordt niet getoond na opstarten" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:129 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:105 msgid "Service installed" msgstr "Service geinstalleerd" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:131 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:107 msgid "Warning: unable to install the service" msgstr "Waarschuwing: kan de service niet installeren" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:137 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:113 msgid "Service removed" msgstr "Service verwijderd" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:139 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:115 msgid "Warning: unable to remove the service" msgstr "Waarschuwing: kan de service niet verwijderen" @@ -2304,58 +2306,58 @@ msgid_plural "{0} tunnels" msgstr[0] "1 tunnel" msgstr[1] "{0} tunnels" -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:26 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:35 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:41 msgid "Exploratory tunnels" msgstr "Exploratory tunnels" -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:46 -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:61 -msgid "Client tunnels for" -msgstr "Client tunnels voor" +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:51 +#, java-format +msgid "Client tunnels for {0}" +msgstr "Client tunnels voor {0}" -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:69 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:74 msgid "ANONYMITY WARNING - Settings include 0-hop tunnels." msgstr "ANONIMITEITS WAARSCHUWING - Instellingen bevatten 0-hop tunnels." -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:74 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:79 msgid "ANONYMITY WARNING - Settings include 1-hop tunnels." msgstr "ANONIMITEITS WAARSCHUWING - Instellingen bevatten 1-hop tunnels." -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:77 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82 msgid "PERFORMANCE WARNING - Settings include very long tunnels." msgstr "PRESTATIE WAARSCHUWING - Instellingen bevatten erg lange tunnels." -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:80 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:85 msgid "PERFORMANCE WARNING - Settings include high tunnel quantities." msgstr "PRESTATIE WAARSCHUWING - Instellingen bevatten hoge tunnel aantallen." #. buf.append("<tr><th></th><th>Inbound</th><th>Outbound</th></tr>\n"); #. tunnel depth -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:87 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:92 msgid "Length" msgstr "Lengte" #. tunnel depth variance -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:104 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:109 msgid "Randomization" msgstr "Randomisatie" #. tunnel quantity -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:128 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:133 msgid "Quantity" msgstr "Hoeveelheid" #. tunnel backup quantity -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:145 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:150 msgid "Backup quantity" msgstr "Backup hoeveelheid" -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:167 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:172 msgid "Inbound options" msgstr "Inkomende opties" -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:180 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:185 msgid "Outbound options" msgstr "Uitgaande opties" @@ -2368,87 +2370,91 @@ msgid "Refresh the page to view." msgstr "Ververs de te bekijken pagina." #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51 +msgid "Arabic" +msgstr "Arabisch" + +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 msgid "English" msgstr "Engels" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 msgid "French" msgstr "Frans" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 msgid "German" msgstr "Duits" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 msgid "Spanish" msgstr "Spaans" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53 msgid "Dutch" msgstr "Nederlands" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53 msgid "Portuguese" msgstr "Portugees" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53 msgid "Russian" msgstr "Russies" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:54 msgid "Chinese" msgstr "Chinees" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:54 msgid "Swedish" msgstr "Zweeds" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:88 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:85 msgid "Update available, attempting to download now" msgstr "Update beschikbaar, probeer nu te downloaden" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:90 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:87 msgid "Update available, click button on left to download" msgstr "Update beschikbaar, klik op de linker knop om te downloaden" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:96 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:93 msgid "No update available" msgstr "Geen update beschikbaar" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:104 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:101 msgid "Updating news URL to" msgstr "Updaten nieuws URL in" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:112 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:109 msgid "Updating proxy host to" msgstr "Updaten proxy host in" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:120 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:117 msgid "Updating proxy port to" msgstr "Updaten proxy poort in" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:133 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:130 msgid "Updating refresh frequency to" msgstr "Updaten vernieuw frequentie in" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:140 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:137 msgid "Updating update policy to" msgstr "Updaten update regels in" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:149 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:146 msgid "Updating update URLs." msgstr "Updaten update URLs." -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:158 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:155 msgid "Updating trusted keys." msgstr "Updaten vertrouwde sleutels." -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:166 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:163 msgid "Updating unsigned update URL to" msgstr "Updaten niet-ondertekende update URL in" #: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:88 -#: ../java/src/net/i2p/router/web/GraphHelper.java:148 +#: ../java/src/net/i2p/router/web/GraphHelper.java:167 msgid "Never" msgstr "Nooit" @@ -2468,7 +2474,7 @@ msgstr "Download en alleen controlleren" msgid "Download, verify, and restart" msgstr "Download, controlleer en herstart" -#: ../java/src/net/i2p/router/web/FormHandler.java:174 +#: ../java/src/net/i2p/router/web/FormHandler.java:176 msgid "" "Invalid form submission, probably because you used the 'back' or 'reload' " "button on your browser. Please resubmit." @@ -2476,80 +2482,68 @@ msgstr "" "Ongeldig formulier verzonden, mogelijk omdat je de 'terug' of 'vernieuw' " "knop in je browser hebt gebruikt. Probeer opnieuw te verzenden." -#: ../java/src/net/i2p/router/web/GraphHelper.java:87 +#: ../java/src/net/i2p/router/web/GraphHelper.java:93 msgid "Combined bandwidth graph" msgstr "Gecombineerde bandbreedte grafiek" #. e.g. "statname for 60m" -#: ../java/src/net/i2p/router/web/GraphHelper.java:101 +#: ../java/src/net/i2p/router/web/GraphHelper.java:107 #, java-format msgid "{0} for {1}" msgstr "{0} voor {1}" -#: ../java/src/net/i2p/router/web/GraphHelper.java:138 +#: ../java/src/net/i2p/router/web/GraphHelper.java:146 msgid "Configure Graph Display" msgstr "Configureer Grafiek Weergave" -#: ../java/src/net/i2p/router/web/GraphHelper.java:138 +#: ../java/src/net/i2p/router/web/GraphHelper.java:146 msgid "Select Stats" msgstr "Selecteer Statistieken" -#: ../java/src/net/i2p/router/web/GraphHelper.java:142 +#: ../java/src/net/i2p/router/web/GraphHelper.java:150 msgid "Periods" msgstr "Perioden" -#: ../java/src/net/i2p/router/web/GraphHelper.java:143 +#: ../java/src/net/i2p/router/web/GraphHelper.java:151 msgid "Plot averages" msgstr "Teken gemiddelden" -#: ../java/src/net/i2p/router/web/GraphHelper.java:144 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:417 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:333 +#: ../java/src/net/i2p/router/web/GraphHelper.java:152 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:435 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:351 msgid "or" msgstr "of" -#: ../java/src/net/i2p/router/web/GraphHelper.java:144 +#: ../java/src/net/i2p/router/web/GraphHelper.java:152 msgid "plot events" msgstr "teken gebeurtenissen" -#: ../java/src/net/i2p/router/web/GraphHelper.java:145 +#: ../java/src/net/i2p/router/web/GraphHelper.java:153 msgid "Image sizes" msgstr "Afbeelding grootte" -#: ../java/src/net/i2p/router/web/GraphHelper.java:145 +#: ../java/src/net/i2p/router/web/GraphHelper.java:153 msgid "width" msgstr "breedte" -#: ../java/src/net/i2p/router/web/GraphHelper.java:146 +#: ../java/src/net/i2p/router/web/GraphHelper.java:154 msgid "height" msgstr "hoogte" -#: ../java/src/net/i2p/router/web/GraphHelper.java:146 -#: ../java/src/net/i2p/router/web/GraphHelper.java:147 +#: ../java/src/net/i2p/router/web/GraphHelper.java:154 +#: ../java/src/net/i2p/router/web/GraphHelper.java:155 msgid "pixels" msgstr "pixels" -#: ../java/src/net/i2p/router/web/GraphHelper.java:148 +#: ../java/src/net/i2p/router/web/GraphHelper.java:156 msgid "Refresh delay" msgstr "Ververs vertraging" -#: ../java/src/net/i2p/router/web/GraphHelper.java:148 -msgid "hour" -msgstr "uur" - -#: ../java/src/net/i2p/router/web/GraphHelper.java:148 -msgid "minute" -msgstr "minuut" - -#: ../java/src/net/i2p/router/web/GraphHelper.java:148 -msgid "minutes" -msgstr "minuten" - -#: ../java/src/net/i2p/router/web/GraphHelper.java:149 +#: ../java/src/net/i2p/router/web/GraphHelper.java:171 msgid "Redraw" msgstr "Vernieuw" -#: ../java/src/net/i2p/router/web/GraphHelper.java:181 +#: ../java/src/net/i2p/router/web/GraphHelper.java:203 msgid "Graph settings saved" msgstr "Grafiek instellingen opgeslagen" @@ -2652,96 +2646,96 @@ msgstr "Bekijk alle routers" msgid "Show all routers with full stats" msgstr "Bekijk alle routers met volledige statistieken" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:265 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:266 msgid "Network Database Router Statistics" msgstr "Netwerk Database Router Statistieken" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:271 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:285 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:303 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:273 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:287 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:305 msgid "Count" msgstr "Aantal" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:285 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:287 msgid "Transports" msgstr "Transports" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:303 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:305 msgid "Country" msgstr "Land" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:342 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:344 msgid "Our info" msgstr "Onze info" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:344 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:346 msgid "Peer info for" msgstr "Peer info voor" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:348 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:350 msgid "Full entry" msgstr "Volledige item" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:354 -#: ../java/src/net/i2p/router/web/SummaryHelper.java:110 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:601 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:356 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:115 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:619 msgid "Hidden" msgstr "Verborgen" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:354 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:356 msgid "Updated" msgstr "Geupdate" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:355 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:358 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:357 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:360 #, java-format msgid "{0} ago" msgstr "{0} geleden" #. shouldnt happen -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:357 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:361 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:359 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:363 msgid "Published" msgstr "Gepubliceerd" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:363 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:365 msgid "Address(es)" msgstr "Adres(sen)" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:376 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:378 msgid "cost" msgstr "kosten" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 msgid "Hidden or starting up" msgstr "Verborgen of aan het opstarten" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 msgid "SSU" msgstr "SSU" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 msgid "SSU with introducers" msgstr "SSU met introducers" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404 msgid "NTCP" msgstr "NTCP" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404 msgid "NTCP and SSU" msgstr "NTCP en SSU" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404 msgid "NTCP and SSU with introducers" msgstr "NTCP en SSU met introducers" -#: ../java/src/net/i2p/router/web/NewsFetcher.java:93 +#: ../java/src/net/i2p/router/web/NewsFetcher.java:92 #, java-format msgid "News last updated {0} ago." msgstr "Nieuws {0} geleden voor het laatste geupdate." -#: ../java/src/net/i2p/router/web/NewsFetcher.java:99 +#: ../java/src/net/i2p/router/web/NewsFetcher.java:98 #, java-format msgid "News last checked {0} ago." msgstr "Nieuws {0} geleden voor het laatste gecontrolleerd." @@ -2776,71 +2770,71 @@ msgid "Downloading plugin" msgstr "Downloaden van plugin" #: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:146 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:185 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:245 #, java-format msgid "{0}B transferred" msgstr "{0}B ontvangen" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:152 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:153 msgid "Plugin downloaded" msgstr "Plugin gedownload" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:157 -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:344 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:158 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:356 #, java-format msgid "Cannot create plugin directory {0}" msgstr "Kan plugin directory {0} niet maken" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:166 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:226 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:167 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:299 #, java-format msgid "from {0}" msgstr "van {0}" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:176 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:177 #, java-format msgid "Plugin from {0} is corrupt" msgstr "Plugin van {0} is corrupt" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:187 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:188 #, java-format msgid "Plugin from {0} does not contain the required configuration file" msgstr "Plugin van {0} bevat niet het vereiste configuratie bestand" #. updateStatus("<b>" + "Plugin contains an invalid key" + ' ' + pubkey + ' ' + signer + "</b>"); -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:200 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:201 #, java-format msgid "Plugin from {0} contains an invalid key" msgstr "Plugin van {0} bevat een ongeldige sleutel" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:219 -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:228 -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:237 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:225 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:235 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:249 #, java-format msgid "Plugin signature verification of {0} failed" msgstr "Plugin handtekening verificatie van {0} gefaald" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:252 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:264 #, java-format msgid "Plugin from {0} has invalid name or version" msgstr "Plugin van {0} heeft ingeldige naam of versie" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:257 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:269 #, java-format msgid "Plugin {0} has mismatched versions" msgstr "Plugin {0} heeft een verkeerde combinatie van versies" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:265 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:277 #, java-format msgid "This plugin requires I2P version {0} or higher" msgstr "Deze plugin heeft I2P versie {0} of hoger nodig" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:273 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:285 #, java-format msgid "This plugin requires Java version {0} or higher" msgstr "Deze plugin heeft Java versie {0} of hoger nodig" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:281 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:293 msgid "" "Downloaded plugin is for new installs only, but the plugin is already " "installed" @@ -2848,68 +2842,68 @@ msgstr "" "De gedownloaded plugin is alleen voor nieuwe installaties, maar de plugin is " "al geïnstalleerd" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:293 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:305 msgid "Installed plugin does not contain the required configuration file" msgstr "De geïnstalleerde plugin bevat het vereiste configuratie bestand niet" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:301 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:313 msgid "Signature of downloaded plugin does not match installed plugin" msgstr "" "De handtekening van de gedownloade plugin komt niet overeen met de " "geïnstalleerde plugin" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:308 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:320 #, java-format msgid "Downloaded plugin version {0} is not newer than installed plugin" msgstr "" "De gedownloade plugin versie {0} is niet nieuwer dan de geïnstalleerde plugin" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:315 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:327 #, java-format msgid "Plugin update requires installed plugin version {0} or higher" msgstr "Plugin update vereist de installatie van plugin versie {0} of hoger" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:322 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:334 #, java-format msgid "Plugin update requires installed plugin version {0} or lower" msgstr "Plugin update vereist de installatie van plugin versie {0} of lager" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:339 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:351 msgid "Plugin is for upgrades only, but the plugin is not installed" msgstr "" "De plugin is alleen voor upgrades, maar de plugin is niet geïnstalleerd" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:352 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:364 #, java-format msgid "Failed to install plugin in {0}" msgstr "Installatie van plugin in {0} gefaald" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:359 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:371 #, java-format msgid "Plugin {0} installed, router restart required" msgstr "Plugin {0} geïnstalleerd, router herstart nodig" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:361 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:373 #, java-format msgid "Plugin {0} installed" msgstr "Plugin {0} geïnstalleerd" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:379 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:391 #, java-format msgid "Plugin {0} installed and started" msgstr "Plugin {0} geïnstalleerd en gestart" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:382 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:394 #, java-format msgid "Plugin {0} installed but failed to start, check logs" msgstr "Plugin {0} geïnstalleerd maar gefaald om te starten, kijk in de logs" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:384 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:396 #, java-format msgid "Plugin {0} installed but failed to start" msgstr "Plugin {0} geïnstalleerd maar gefaald om te starten" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:394 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:406 #, java-format msgid "Failed to download plugin from {0}" msgstr "Kan de plugin niet downloaden van {0}" @@ -2920,37 +2914,43 @@ msgstr "Peer Profielen" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:73 #, java-format -msgid "Showing {0} recent profiles." -msgstr "Toon {0} recente profielen." +msgid "Showing 1 recent profile." +msgid_plural "Showing {0} recent profiles." +msgstr[0] "1 recent profiel getoond." +msgstr[1] "{0} recente profielen getoond." #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:75 #, java-format -msgid "Hiding {0} older profiles." -msgstr "Verberg {0} oudere profielen." +msgid "Hiding 1 older profile." +msgid_plural "Hiding {0} older profiles." +msgstr[0] "1 ouder profiel verborgen." +msgstr[1] "{0} oudere profielen verborgen." #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:77 #, java-format -msgid "Hiding {0} standard profiles." -msgstr "Verberg {0} standaard profielen." +msgid "Hiding 1 standard profile." +msgid_plural "Hiding {0} standard profiles." +msgstr[0] "1 standaard profiel verborgen." +msgstr[1] "{0} standaard profielen verborgen." #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:82 msgid "Groups (Caps)" msgstr "Groupen (Caps)" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:83 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:251 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:335 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:252 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:353 msgid "Speed" msgstr "Snelheid" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:84 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:253 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:339 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:254 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:357 msgid "Capacity" msgstr "Capaciteit" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:85 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:255 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:256 msgid "Integration" msgstr "Integratie" @@ -2976,7 +2976,7 @@ msgid "Failing" msgstr "Gefaald" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:131 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:287 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:282 msgid "Integrated" msgstr "Geïntegreerd" @@ -2989,109 +2989,109 @@ msgstr "Onbereikbaar" msgid "Test Fails" msgstr "Test Faalt" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:175 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:177 msgid "profile" msgstr "profiel" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:184 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:186 msgid "Floodfill and Integrated Peers" msgstr "Floodfill en Geïntegreerde Peers" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:188 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:190 msgid "Caps" msgstr "Caps" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:189 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:191 msgid "Integ. Value" msgstr "Integ. Waarde" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:190 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:192 msgid "Last Heard About" msgstr "Laatst Vernomen Over" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:191 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:193 msgid "Last Heard From" msgstr "Laatst Vernomen Van" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:192 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:194 msgid "Last Good Send" msgstr "Laatste Goede Verzending" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:193 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:195 msgid "Last Bad Send" msgstr "Laatste Foute Verzending" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:194 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:196 msgid "10m Resp. Time" msgstr "10m Resp. Tijd" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:195 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:197 msgid "1h Resp. Time" msgstr "1u Resp. Tijd" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:196 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:198 msgid "1d Resp. Time" msgstr "1d Resp. Tijd" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:197 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:199 msgid "Last Good Lookup" msgstr "Laatste Goede Lookup" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:198 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:200 msgid "Last Bad Lookup" msgstr "Laatste Foute Lookup" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:199 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:201 msgid "Last Good Store" msgstr "Laatste Goede Opslag" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:200 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:202 msgid "Last Bad Store" msgstr "Laatste Foute Opslag" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:201 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:203 msgid "1h Fail Rate" msgstr "1u Fout Rato" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:202 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:204 msgid "1d Fail Rate" msgstr "1d Four Rato" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:250 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:251 msgid "Thresholds" msgstr "Drempelwaarden" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:252 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:253 msgid "fast peers" msgstr "snelle peers" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:254 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:255 msgid "high capacity peers" msgstr "hoge capaciteits peers" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:256 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:257 msgid " well integrated peers" msgstr " goed geïntegreerde peers" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259 msgid "as determined by the profile organizer" msgstr "zoals bepaald door de profiel organisator" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259 msgid "groups" msgstr "groepen" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260 msgid "capabilities in the netDb, not used to determine profiles" msgstr "capaciteiten in de netDb, niet gebruikt om profielen te bepalen" #. capabilities -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260 #: ../java/strings/Strings.java:81 msgid "caps" msgstr "caps" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261 msgid "" "peak throughput (bytes per second) over a 1 minute period that the peer has " "sustained in a single tunnel" @@ -3099,46 +3099,51 @@ msgstr "" "piek doorvoer (bytes per seconde) over een 1 minuut periode zoals de peer " "heeft ondervonden in een enkele tunnel" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261 msgid "speed" msgstr "snelheid" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262 msgid "capacity" msgstr "capaciteit" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262 msgid "how many tunnels can we ask them to join in an hour?" msgstr "" "hoeveel tunnels kunnen we ze vragen om zich in een uur bij aan te sluiten?" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263 msgid "how many new peers have they told us about lately?" msgstr "hoeveel nieuwe peers hebben ze ons recentelijk over verteld?" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263 msgid "integration" msgstr "integratie" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:264 msgid "is the peer banned, or unreachable, or failing tunnel tests?" msgstr "is de peer verbannen, of onbereikbaar, of faalt het tunnel tests?" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:264 msgid "status" msgstr "status" -#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:57 +#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:47 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:410 +msgid "none" +msgstr "geen" + +#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:62 #, java-format msgid "Temporary ban expiring in {0}" msgstr "Tijdelijke verbanning verloopt in {0}" -#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:59 +#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:64 #, java-format msgid "Banned until restart or in {0}" msgstr "Verbanning tot volgende herstart of in {0}" -#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:71 +#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:76 msgid "unban now" msgstr "Hef verbanning nu op" @@ -3195,22 +3200,23 @@ msgstr "" #: ../java/src/net/i2p/router/web/StatsGenerator.java:64 msgid "These statistics are primarily used for development and debugging." -msgstr "Deze statistieken worden primair gebruikt voor ontwikkeling en debugging." +msgstr "" +"Deze statistieken worden primair gebruikt voor ontwikkeling en debugging." -#: ../java/src/net/i2p/router/web/StatsGenerator.java:105 -#: ../java/src/net/i2p/router/web/StatsGenerator.java:156 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:106 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:157 msgid "No lifetime events" msgstr "Geen levenslange gebeurtenissen" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:116 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:117 msgid "frequency" msgstr "frequentie" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:120 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:121 msgid "Rolling average events per period" msgstr "Voortschrijdend gemiddelde gebeurtenissen per periode" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:124 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:125 msgid "Highest events per period" msgstr "Hoogste gebeurtenissen per periode" @@ -3221,58 +3227,73 @@ msgstr "Hoogste gebeurtenissen per periode" #. } #. buf.append(" <i>avg interval between updates:</i> (").append(num(curFreq.getAverageInterval())).append("ms, min "); #. buf.append(num(curFreq.getMinAverageInterval())).append("ms)"); -#: ../java/src/net/i2p/router/web/StatsGenerator.java:135 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:136 msgid "Lifetime average events per period" msgstr "Levenslange gemiddelde gebeurtenissen per periode" #. Display the strict average -#: ../java/src/net/i2p/router/web/StatsGenerator.java:140 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:141 msgid "Lifetime average frequency" msgstr "Levenslange gemiddelde frequentie" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:168 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:144 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:234 +#, java-format +msgid "1 event" +msgid_plural "{0} events" +msgstr[0] "1 gebeurtenis" +msgstr[1] "{0} gebeurtenissen" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:169 msgid "rate" msgstr "rato" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:170 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:171 msgid "Average" msgstr "Gemiddelde" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:173 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:174 msgid "Highest average" msgstr "Hoogste gemiddelde" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:202 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:201 +#, java-format +msgid "There was 1 event in this period." +msgid_plural "There were {0} events in this period." +msgstr[0] "Er was 1 gebeurtenis in deze periode." +msgstr[1] "Er waren {0} gebeurtenissen in deze periode." + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:203 #, java-format -msgid "in this period which ended {0} ago." -msgstr "in deze periode welke {0} geleden eindigde." +msgid "The period ended {0} ago." +msgstr "De periode eindigde {0} geleden." -#: ../java/src/net/i2p/router/web/StatsGenerator.java:204 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:205 msgid "No events" msgstr "Geen gebeurtenissen" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:210 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:211 msgid "Average event count" msgstr "Gemiddeld aantal gebeurtenissen" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:212 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:213 msgid "Events in peak period" msgstr "Gebeurtenissen in piek periode" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:220 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:221 msgid "Graph Data" msgstr "Grafiek Data" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:222 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:223 msgid "Graph Event Count" msgstr "Grafiek Aantal Gebeurtenissen" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:225 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:226 msgid "Export Data as XML" msgstr "Exporteer Data als XML" #. Display the strict average -#: ../java/src/net/i2p/router/web/StatsGenerator.java:230 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:231 msgid "Lifetime average value" msgstr "Levenslange gemiddelde waarde" @@ -3337,12 +3358,12 @@ msgid "I2P Internals" msgstr "I2P Intern" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:99 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:384 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:379 msgid "View existing tunnels and tunnel build status" msgstr "Bekijk bestaande tunnels en tunnel opbouw status" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:105 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:258 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:253 msgid "Show all current peer connections" msgstr "Toon alle huidige peer connecties" @@ -3383,7 +3404,7 @@ msgid "Textual router performance statistics" msgstr "Tekstuele router prestatie statistieken" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:147 -#: ../java/src/net/i2p/router/web/SummaryHelper.java:365 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:370 msgid "Local Destinations" msgstr "Lokale Bestemmingen" @@ -3431,206 +3452,208 @@ msgstr "" "Hulp bij het configureren van je firewall en router voor optimale I2P " "prestatie" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:231 -msgid "Download" -msgstr "Download" +#. Note to translators: parameter is a version, e.g. "0.8.4" +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:232 +#, java-format +msgid "Download {0} Update" +msgstr "Download {0} Update" +#. Note to translators: parameter is a date and time, e.g. "02-Mar 20:34 UTC" +#. <br> is optional, to help the browser make the lines even in the button +#. If the translation is shorter than the English, you should probably not include <br> #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:240 -msgid "Download Unsigned" -msgstr "Download Niet-ondertekend" +#, java-format +msgid "Download Unsigned<br>Update {0}" +msgstr "Download Niet-ondertekende <br> Update {0}" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:266 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:261 msgid "Active" msgstr "Actief" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:275 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:270 msgid "Fast" msgstr "Snel" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:281 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:276 msgid "High capacity" msgstr "Grote capaciteit" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:293 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:288 msgid "Known" msgstr "Bekend" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:308 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:303 msgid "Help with firewall configuration" msgstr "Hulp met firewall configuratie" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:310 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:305 msgid "Check NAT/firewall" msgstr "Controlleer NAT/firewall" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:330 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:325 msgid "Reseed" msgstr "Reseed" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:347 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:342 msgid "Configure router bandwidth allocation" msgstr "Configureer router bandbreedte toewijzing" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:349 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:344 msgid "Bandwidth in/out" msgstr "Bandbreedte in/uit" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:369 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:364 msgid "Total" msgstr "Totaal" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:376 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:371 msgid "Used" msgstr "Gebruikt" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:391 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:386 msgid "Exploratory" msgstr "Onderzoekend" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:403 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:398 msgid "Participating" msgstr "Deelnemend" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:409 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:404 msgid "Share ratio" msgstr "Share rato" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:415 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:410 msgid "What's in the router's job queue?" msgstr "Wat is er in de taken wachtrij van de router?" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:417 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:412 msgid "Congestion" msgstr "Verstopping" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:422 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:417 msgid "Job lag" msgstr "Taak vertraging" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:428 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:423 msgid "Message delay" msgstr "Bericht vertraging" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:434 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:429 msgid "Tunnel lag" msgstr "Tunnel vertraging" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:440 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:435 msgid "Backlog" msgstr "Achterstand" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:101 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:106 msgid "ERR-Client Manager I2CP Error - check logs" msgstr "ERR-Client Manager I2CP Fout - controlleer logs" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:108 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:113 #, java-format msgid "ERR-Clock Skew of {0}" msgstr "ERR-Klok Afwijking van {0}" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:117 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:577 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:122 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:595 msgid "OK" msgstr "OK" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:118 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:123 msgid "ERR-Private TCP Address" msgstr "ERR-Privaat TCP Adres" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:120 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:125 msgid "ERR-SymmetricNAT" msgstr "ERR-SymmetricNAT" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:123 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:128 msgid "WARN-Firewalled with Inbound TCP Enabled" msgstr "WARN-Firewall met Inkomende TCP Ingeschakeld" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:125 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:130 msgid "WARN-Firewalled and Floodfill" msgstr "WARN-Firewall en Floodfill" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:127 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:132 msgid "WARN-Firewalled and Fast" msgstr "WARN-Firewall en Snel" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:128 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:581 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:133 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:599 msgid "Firewalled" msgstr "Firewall" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:130 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:135 msgid "" "ERR-UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and " "restart" msgstr "ERR-UDP Poort in Gebruik" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:136 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:141 msgid "ERR-No Active Peers, Check Network Connection and Firewall" msgstr "ERR-Geen Actieve Peers, Controlleer Network Connectie en Firewall" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:139 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:144 msgid "ERR-UDP Disabled and Inbound TCP host/port not set" msgstr "ERR-UDP Uitgeschakeld en Inkomende TCP host/poort niet gezet" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:141 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:146 msgid "WARN-Firewalled with UDP Disabled" msgstr "WARN-Firewall met UDP Uitgeschakeld" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:143 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:597 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:148 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:615 msgid "Testing" msgstr "Testen" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:365 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:370 msgid "Add/remove/edit & control your client and server tunnels" msgstr "" "Toevoegen/verwijderen/wijzigen & beheer je client en server tunnels" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:377 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:382 msgid "Server" msgstr "Server" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:381 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:386 msgid "Show tunnels" msgstr "Toon tunnels" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:392 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:397 msgid "Leases expired" msgstr "Leases verlopen" #. red or yellow light -#: ../java/src/net/i2p/router/web/SummaryHelper.java:392 -#: ../java/src/net/i2p/router/web/SummaryHelper.java:393 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:397 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:398 msgid "Rebuilding" msgstr "Herbouwen" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:393 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:398 msgid "ago" msgstr "geleden" #. green light -#: ../java/src/net/i2p/router/web/SummaryHelper.java:396 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:401 msgid "Ready" msgstr "Gereed" #. yellow light -#: ../java/src/net/i2p/router/web/SummaryHelper.java:400 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:405 msgid "Building" msgstr "Bouwen" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:400 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:405 msgid "Building tunnels" msgstr "Tunnels aan het bouwen" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:405 -msgid "none" -msgstr "geen" - #. tunnel nicknames, taken from i2ptunnel.config so they will display #. nicely under 'local destinations' in the summary bar #. note that if the wording changes in i2ptunnel.config, we have to #. keep the old string here as well for existing installs -#: ../java/src/net/i2p/router/web/SummaryHelper.java:416 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:421 #: ../java/strings/Strings.java:36 msgid "shared clients" msgstr "gedeelde clients" @@ -3660,10 +3683,14 @@ msgstr "nu" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:41 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:63 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:287 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:309 msgid "configure" msgstr "configureer" +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:61 +msgid "Client tunnels for" +msgstr "Client tunnels voor" + #: ../java/src/net/i2p/router/web/TunnelRenderer.java:65 msgid "dead" msgstr "dood" @@ -3788,59 +3815,70 @@ msgstr "Deelnemende Tunnels" msgid "Totals" msgstr "Totalen" -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:66 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:132 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:145 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:178 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:67 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:143 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:238 msgid "Updating" msgstr "Aan het updaten" -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:88 -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:111 -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:116 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:189 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:214 +#. Process the .sud/.su2 file +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:89 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:112 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:117 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:262 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:287 msgid "Update downloaded" msgstr "Update gedownload" -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:91 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:92 #, java-format msgid "Unsigned update file from {0} is corrupt" msgstr "Niet-ondertekende update bestand van {0} is corrupt" -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:111 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:209 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:112 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:282 msgid "Restarting" msgstr "Herstarten" -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:118 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:216 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:119 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:289 msgid "Click Restart to install" msgstr "Klik Herstart om te installeren" -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:120 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:218 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:121 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:291 msgid "Click Shutdown and restart to install" msgstr "Klik Afsluiten and herstart om te installeren" -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:121 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:220 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:122 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:293 #, java-format msgid "Version {0}" msgstr "Versie {0}" -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:126 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:127 #, java-format msgid "Failed copy to {0}" msgstr "Kopie naar {0} gefaald" -#: ../java/src/net/i2p/router/web/UpdateHandler.java:209 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:185 +#, java-format +msgid "Updating from {0}" +msgstr "Updaten van {0}" + +#: ../java/src/net/i2p/router/web/UpdateHandler.java:254 +#, java-format +msgid "No new version found at {0}" +msgstr "Geen nieuwe versie gevonden op {0}" + +#: ../java/src/net/i2p/router/web/UpdateHandler.java:282 msgid "Update verified" msgstr "Update geverifieerd" -#: ../java/src/net/i2p/router/web/UpdateHandler.java:234 -msgid "Transfer failed" -msgstr "Overdracht gefaald" +#: ../java/src/net/i2p/router/web/UpdateHandler.java:308 +#, java-format +msgid "Transfer failed from {0}" +msgstr "Overdracht gefaald van {0}" #. wars for ConfigClientsHelper #: ../java/strings/Strings.java:12 @@ -4089,83 +4127,122 @@ msgstr "Low-level bandbreedte verzend rato" msgid "How many peers we are actively talking with" msgstr "Met hoeveel peers communiceren we actief" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:112 msgid "config networking" msgstr "configureer netwerk" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:224 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:237 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:224 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:234 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:231 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:222 +msgid "Summary Bar" +msgstr "Samenvatting Balk" + #. We have intl defined when this is included, but not when compiled standalone. -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:217 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:230 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:217 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:227 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:222 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:215 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:215 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:215 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:215 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:215 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:215 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:234 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:215 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:237 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:250 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:237 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:247 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:244 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:242 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:235 msgid "Refresh (s)" msgstr "Ververs (s)" #. ditto -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:221 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:234 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:221 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:223 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:231 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:223 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:223 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:223 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:226 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:223 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:223 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:237 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:219 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:241 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:254 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:241 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:251 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:248 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:245 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:239 msgid "Enable" msgstr "Inschakelen" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:262 msgid "I2P Network Configuration" msgstr "I2P Netwerk Configuratie" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:298 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:316 msgid "Bandwidth limiter" msgstr "Bandbreedte beperker" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:300 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:318 msgid "" "I2P will work best if you configure your rates to match the speed of your " "internet connection." @@ -4173,34 +4250,34 @@ msgstr "" "I2P zal beter werken wanneer je de configuratie van de bandbreedte afstemt " "met de snelheid van je internet verbinding." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:304 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:322 msgid "KBps In" msgstr "KBps In" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:318 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:336 msgid "KBps Out" msgstr "KBps Uit" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:334 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:352 msgid "Share" msgstr "Share" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:341 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:309 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:304 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:359 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:327 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:326 msgid "NOTE" msgstr "OPMERKING" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:343 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:361 #, java-format msgid "You have configured I2P to share only {0} KBps." msgstr "Je hebt I2P geconfigureerd om slechts {0} KBps te delen." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:346 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:364 msgid "I2P requires at least 12KBps to enable sharing. " msgstr "I2P vereist tenminste 12KBps om sharing in te schakelen." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:347 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:365 msgid "" "Please enable sharing (participating in tunnels) by configuring more " "bandwidth. " @@ -4208,19 +4285,19 @@ msgstr "" "Schakel sharing in (deelname aan tunnels) door meer bandbreedte toe te " "kennen." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:348 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:366 msgid "" "It improves your anonymity by creating cover traffic, and helps the network." msgstr "" "Het verbeterd je anonimiteit door camouflage verkeer te genereren en help " "het netwerk." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:351 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:369 #, java-format msgid "You have configured I2P to share {0} KBps." msgstr "Je hebt I2P geconfigureerd om {0} KBps te delen." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:354 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:372 msgid "" "The higher the share bandwidth the more you improve your anonymity and help " "the network." @@ -4228,90 +4305,94 @@ msgstr "" "Hoe meer bandbreedte je deelt, des te meer je anonimiteit verbeterd en je " "het netwerk helpt." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:358 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:514 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:305 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:327 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:321 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:339 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:375 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:342 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:322 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:365 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:376 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:532 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:323 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:347 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:425 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:339 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:357 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:366 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:395 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:360 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:351 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:383 msgid "Cancel" msgstr "Annuleer" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:375 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:393 msgid "IP and Transport Configuration" msgstr "IP en Transport Configuratie" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:377 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:395 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:417 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:324 msgid "The default settings will work for most people." msgstr "De standaard instellingen zullen voor de meeste mensen werken." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:379 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:397 msgid "There is help below." msgstr "Help is hieronder." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:381 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:399 msgid "UPnP Configuration" msgstr "UPnP Configuratie" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:385 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:403 msgid "Enable UPnP to open firewall ports" msgstr "Schakel UPnP in om firewall poorten te openen" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:387 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:405 msgid "UPnP status" msgstr "UPnP status" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:389 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:407 msgid "IP Configuration" msgstr "IP Configuratie" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:391 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:461 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:409 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:479 msgid "Externally reachable hostname or IP address" msgstr "Extern bereikbare hostname of IP adres" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:395 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:413 msgid "Use all auto-detect methods" msgstr "Gebruik alle auto-detect methoden" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:399 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:417 msgid "Disable UPnP IP address detection" msgstr "Schakel UPnP IP adres detectie uit" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:403 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:421 msgid "Ignore local interface IP address" msgstr "Negeer IP adres van lokale interface" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:407 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:425 msgid "Use SSU IP address detection only" msgstr "Gebruikt alleen SSU IP adres detectie" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:411 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:479 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:429 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:497 msgid "Specify hostname or IP" msgstr "Specificeer hostname of IP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:417 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:435 msgid "Select Interface" msgstr "Selecteer Interface" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:431 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:449 msgid "Hidden mode - do not publish IP" msgstr "Verborgen modus - publiceer IP niet" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:433 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:451 msgid "(prevents participating traffic)" msgstr "(voorkomt deelnemend verkeer)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:435 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:453 msgid "Action when IP changes" msgstr "Actie wanneer IP wijzigd" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:439 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:457 msgid "" "Laptop mode - Change router identity and UDP port when IP changes for " "enhanced anonymity" @@ -4319,82 +4400,82 @@ msgstr "" "Laptop modus - Wijzig router identiteit en UDP poort wanneeer IP wijzigd for " "meer anonimiteit" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:441 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:459 msgid "Experimental" msgstr "Experimenteel" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:443 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:461 msgid "UDP Configuration:" msgstr "UDP Configuratie:" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:445 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:463 msgid "UDP port:" msgstr "UDP poort:" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:459 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:477 msgid "TCP Configuration" msgstr "TCP Configuratie" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:465 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:483 msgid "Use auto-detected IP address" msgstr "Gebruik auto-detected IP adres" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:467 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:499 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:485 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:517 msgid "currently" msgstr "om dit moment" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:471 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:489 msgid "if we are not firewalled" msgstr "wanneer we niet gefirewalled zijn" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:475 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:493 msgid "Always use auto-detected IP address (Not firewalled)" msgstr "Gebruik altijd auto-detected IP adres (Geen firewall)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:485 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:503 msgid "Disable inbound (Firewalled)" msgstr "Schakel inkomend uit (Firewall)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:489 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:507 msgid "Completely disable" msgstr "Schakel volledig uit" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:491 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:509 msgid "" "(select only if behind a firewall that throttles or blocks outbound TCP)" msgstr "" "(selecteer alleen wanneer je achter een firewall zit dat uitgaand TCP " "beperkt of blokkeert)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:493 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:511 msgid "Externally reachable TCP port" msgstr "Extern bereikbare TCP poort" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:497 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:515 msgid "Use the same port configured for UDP" msgstr "Gebruik dezelfde poort als geconfigureerd voor UDP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:505 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:523 msgid "Specify Port" msgstr "Specificeer Poort" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:509 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:339 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:330 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:527 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:357 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:348 msgid "Note" msgstr "Opmerking" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:512 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:530 msgid "Changing these settings will restart your router." msgstr "Wijziging van deze instellingen herstart je router" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:518 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:536 msgid "Configuration Help" msgstr "Configuratie Help" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:520 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:569 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:538 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:587 msgid "" "While I2P will work fine behind most firewalls, your speeds and network " "integration will generally improve if the I2P port is forwarded for both UDP " @@ -4404,7 +4485,7 @@ msgstr "" "netwerk integratie doorgaans verbeteren wanneer de I2P poort is geforward " "voor zowel UDP als TCP." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:522 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:540 msgid "" "If you can, please poke a hole in your firewall to allow unsolicited UDP and " "TCP packets to reach you." @@ -4412,7 +4493,7 @@ msgstr "" "Indien mogelijk, probeer een opening in je firewall te maken om nieuwe UDP " "en TCP pakketten binnen te laten." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:524 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:542 msgid "" "If you can't, I2P supports UPnP (Universal Plug and Play) and UDP hole " "punching with \"SSU introductions\" to relay traffic." @@ -4420,7 +4501,7 @@ msgstr "" "Indien dit niet mogelijk is, I2P ondersteunt UPnP (Universal Plug en Play) " "en UDP perforatie met \"SSU introducties\" om verkeer te herleiden." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:526 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:544 msgid "" "Most of the options above are for special situations, for example where UPnP " "does not work correctly, or a firewall not under your control is doing harm." @@ -4429,12 +4510,12 @@ msgstr "" "wanneer UPnP niet correct werkt, of wanneer firewall buiten je beheer in de " "weg zit." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:528 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:546 msgid "Certain firewalls such as symmetric NATs may not work well with I2P." msgstr "" "Bepaalde firewalls zoals symmetrische NATs werken mogelijk niet goed met I2P." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:537 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:555 msgid "" "UPnP is used to communicate with Internet Gateway Devices (IGDs) to detect " "the external IP address and forward ports." @@ -4442,39 +4523,39 @@ msgstr "" "UPnP is gebruikt om te communiceren met Internet Gateway Devices (IGDs) om " "het externe IP adres te detecteren en poorten door te sturen." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:539 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:557 msgid "UPnP support is beta, and may not work for any number of reasons" msgstr "UPnP support is beta, en kan om verscheidene redenen niet goed werken" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:541 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:559 msgid "No UPnP-compatible device present" msgstr "Geen UPnP-compatible device aanwezig" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:543 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:561 msgid "UPnP disabled on the device" msgstr "UPnP uitgeschakeld op het device" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:545 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:563 msgid "Software firewall interference with UPnP" msgstr "Software firewall zit UPnP in de weg" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:547 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:565 msgid "Bugs in the device's UPnP implementation" msgstr "Bugs in de device's UPnP implementatie" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:549 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:567 msgid "Multiple firewall/routers in the internet connection path" msgstr "Meerdere firewall/routers in het pad van de internet verbinding" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:551 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:569 msgid "UPnP device change, reset, or address change" msgstr "UPnP device wijziging, reset, of adres wijziging" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:553 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:571 msgid "Review the UPnP status here." msgstr "Bekijk de UPnP status hier." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:555 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:573 msgid "" "UPnP may be enabled or disabled above, but a change requires a router " "restart to take effect." @@ -4482,23 +4563,23 @@ msgstr "" "UPnP kan hierboven in- en uitgeschakeld worden, maar na een wijziging is een " "router herstart nodig." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:557 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:575 msgid "Hostnames entered above will be published in the network database." msgstr "" "Hierboven ingevulde hostnames zullen worden gepubliceerd in de netwerk " "database." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:559 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:577 msgid "They are <b>not private</b>." msgstr "Deze zijn <b>niet privé</b>." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:561 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:579 msgid "" "Also, <b>do not enter a private IP address</b> like 127.0.0.1 or 192.168.1.1." msgstr "" "Tevens, <b>vul geen privé IP addres in</b> zoals 127.0.0.1 of 192.168.1.1." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:563 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:581 msgid "" "If you specify the wrong IP address or hostname, or do not properly " "configure your NAT or firewall, your network performance will degrade " @@ -4507,15 +4588,15 @@ msgstr "" "Als je het verkeerde IP adres of hostnaam invult, of je NAT of firewall niet " "goed te configureert, zal je netwerk prestaties aanzienlijk verslechteren." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:565 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:583 msgid "When in doubt, leave the settings at the defaults." msgstr "In geval van twijfel, laat de instellingen op de standaard waarden." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:567 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:585 msgid "Reachability Help" msgstr "Bereikbaarheids Help" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:572 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:590 msgid "" "If you think you have opened up your firewall and I2P still thinks you are " "firewalled, remember that you may have multiple firewalls, for example both " @@ -4526,7 +4607,7 @@ msgstr "" "firewalls hebt, bijvoorbeeld zowel als software pakket en een externe " "hardware router." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:575 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:593 msgid "" "If there is an error, the <a href=\"logs.jsp\">logs</a> may also help " "diagnose the problem." @@ -4534,15 +4615,15 @@ msgstr "" "Indien er een fout is zijn de <a href=\"logs.jsp\">logs</a> mogelijk hulpvol " "om het probleem te onderzoeken." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:579 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:597 msgid "Your UDP port does not appear to be firewalled." msgstr "Je UDP poort lijkt niet achter een firewall te zitten." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:583 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:601 msgid "Your UDP port appears to be firewalled." msgstr "Je UDP poort lijkt achter een firewall te zitten." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:585 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:603 msgid "" "As the firewall detection methods are not 100% reliable, this may " "occasionally be displayed in error." @@ -4550,7 +4631,7 @@ msgstr "" "Omdat de firewall detectie methode niet 100% betrouwbaar is, kan dit soms " "foutief getoond worden." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:587 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:605 msgid "" "However, if it appears consistently, you should check whether both your " "external and internal firewalls are open for your port." @@ -4558,7 +4639,7 @@ msgstr "" "Indien dit echter consistent optreedt, controlleer in zowel externe als " "interne firewalls of de poort wel geopend is." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:589 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:607 msgid "" "I2P will work fine when firewalled, there is no reason for concern. When " "firewalled, the router uses \"introducers\" to relay inbound connections." @@ -4567,7 +4648,7 @@ msgstr "" "maakt de router gebruik van \"introducers\" om inkomende connecties door te " "sturen." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:591 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:609 msgid "" "However, you will get more participating traffic and help the network more " "if you can open your firewall(s)." @@ -4575,7 +4656,7 @@ msgstr "" "Je krijgt meer deelnemend verkeer en helpt het netwerk meer door de firewall" "(s) te openen." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:593 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:611 msgid "" "If you think you have already done so, remember that you may have both a " "hardware and a software firewall, or be behind an additional, institutional " @@ -4585,7 +4666,7 @@ msgstr "" "hardware als software firewall kan zijn, of dat er een additionele firewall " "(universiteit, provider, etc) kan zijn waar je geen invloed op hebt." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:595 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:613 msgid "" "Also, some routers cannot correctly forward both TCP and UDP on a single " "port, or may have other limitations or bugs that prevent them from passing " @@ -4595,11 +4676,11 @@ msgstr "" "correct door te laten, of hebben andere beperkingen of bugs die voorkomen " "dat I2P verkeer goed doorkomt." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:599 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:617 msgid "The router is currently testing whether your UDP port is firewalled." msgstr "De router test op dit moment of je UDP poort achter een firewall is." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:603 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:621 msgid "" "The router is not configured to publish its address, therefore it does not " "expect incoming connections." @@ -4607,11 +4688,11 @@ msgstr "" "De router is niet geconfigureerd om zijn adres te publiceren, daarom " "verwacht het geen inkomende verbindingen." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:605 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:623 msgid "WARN - Firewalled and Fast" msgstr "WARN - Firewall en Snel" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:607 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:625 msgid "" "You have configured I2P to share more than 128KBps of bandwidth, but you are " "firewalled." @@ -4619,7 +4700,7 @@ msgstr "" "Je hebt I2P geconfigureerd om meer dan 128KBps aan bandbreedte te delen, " "maar je zit achter een firewall." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:609 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:627 msgid "" "While I2P will work fine in this configuration, if you really have over " "128KBps of bandwidth to share, it will be much more helpful to the network " @@ -4628,28 +4709,28 @@ msgstr "" "Alhoewel I2P met deze configuratie prima werkt, zal je 128KBps of meer aan " "bandbreedte het netwerk beter helpen wanneer je je firewall open zet." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:611 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:629 msgid "WARN - Firewalled and Floodfill" msgstr "WARN - Firewall en Floodfill" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:613 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:631 msgid "" "You have configured I2P to be a floodfill router, but you are firewalled." msgstr "" "Je hebt I2P geconfigureerd als floodfill router, maar je zit achter een " "firewall." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:615 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:633 msgid "" "For best participation as a floodfill router, you should open your firewall." msgstr "" "Voor een betere deelname als floodfill router, moet je je firewall openen." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:617 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:635 msgid "WARN - Firewalled with Inbound TCP Enabled" msgstr "WARN - Firewall en Inkomende TCP Ingeschakeld" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:619 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:637 msgid "" "You have configured inbound TCP, however your UDP port is firewalled, and " "therefore it is likely that your TCP port is firewalled as well." @@ -4658,7 +4739,7 @@ msgstr "" "een firewall zit, is het waarschijnlijk dat dit ook voor je TCP poort het " "geval is." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:621 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:639 msgid "" "If your TCP port is firewalled with inbound TCP enabled, routers will not be " "able to contact you via TCP, which will hurt the network." @@ -4667,19 +4748,19 @@ msgstr "" "kunnen routers geen verbinding met je maken via TCP, dit is niet goed voor " "het netwerk." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:623 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:641 msgid "Please open your firewall or disable inbound TCP above." msgstr "Open je firewall of schakel inkomend TCP hierboven uit." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:625 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:643 msgid "WARN - Firewalled with UDP Disabled" msgstr "WARN - Firewall met UDP Uitgeschakeld" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:627 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:645 msgid "You have configured inbound TCP, however you have disabled UDP." msgstr "Je hebt inkomende TCP geconfigureerd, echter UDP is uitgeschakeld." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:629 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:647 msgid "" "You appear to be firewalled on TCP, therefore your router cannot accept " "inbound connections." @@ -4687,15 +4768,15 @@ msgstr "" "Het lijkt erop dat je voor TCP achter een firewall zit, daarom kan je router " "geen inkomende connecties accepteren." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:631 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:649 msgid "Please open your firewall or enable UDP." msgstr "Open je firewall of schakel UDP in." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:633 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:651 msgid "ERR - Clock Skew" msgstr "ERR - Klok Afwijking" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:635 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:653 msgid "" "Your system's clock is skewed, which will make it difficult to participate " "in the network." @@ -4703,15 +4784,15 @@ msgstr "" "Je systeemklok heeft een afwijking, dit zal het moeilijk maken om aan het " "netwerk deel te nemen." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:637 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:655 msgid "Correct your clock setting if this error persists." msgstr "Corrigeer je klok instelling indien deze fout blijft optreden." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:639 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:657 msgid "ERR - Private TCP Address" msgstr "ERR - Privaat TCP Adres" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:641 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:659 msgid "" "You must never advertise an unroutable IP address such as 127.0.0.1 or " "192.168.1.1 as your external address." @@ -4719,20 +4800,20 @@ msgstr "" "Je moet nooit een niet-routeerbaar IP adres zoals 127.0.0.1 of 192.168.1.1 " "adverteren als je externe adres." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:643 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:661 msgid "Correct the address or disable inbound TCP above." msgstr "Corrigeer het adres of schakel inkomend TCP hierboven uit." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:645 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:663 msgid "ERR - SymmetricNAT" msgstr "ERR - SymmetricNAT" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:647 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:665 msgid "I2P detected that you are firewalled by a Symmetric NAT." msgstr "" "I2P heeft gedetecteerd dat je achter een firewall zit door een Symmetric NAT." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:649 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:667 msgid "" "I2P does not work well behind this type of firewall. You will probably not " "be able to accept inbound connections, which will limit your participation " @@ -4741,7 +4822,7 @@ msgstr "" "I2P werkt niet goed achter dit type firewall. Waarschijnlijk kan je geen " "inkomende verbindingen accepteren, " -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:651 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:669 msgid "" "ERR - UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config " "and restart" @@ -4749,12 +4830,12 @@ msgstr "" "ERR - UDP Poort In Gebruik - Zet i2np.udp.internalPort=xxxx in geavanceerde " "configuratie en herstart" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:653 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:671 msgid "I2P was unable to bind to port 8887 or other configured port." msgstr "" "I2P kon niet binden met poort 8887 of een andere geconfigureerde poort." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:655 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:673 msgid "" "Check to see if another program is using the configured port. If so, stop " "that program or configure I2P to use a different port." @@ -4762,7 +4843,7 @@ msgstr "" "Controlleer of een ander programma de geconfigureerde poort gebruikt. Als " "dit zo is, stop dit programma of configureer I2P op een andere poort." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:657 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:675 msgid "" "This may be a transient error, if the other program is no longer using the " "port." @@ -4770,15 +4851,15 @@ msgstr "" "Dit kan een voorbijgaande fout zijn, als het andere programma de poort niet " "meer gebruikt." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:659 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:677 msgid "However, a restart is always required after this error." msgstr "Echter, een herstart is altijd nodig na deze fout." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:661 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:679 msgid "ERR - UDP Disabled and Inbound TCP host/port not set" msgstr "ERR - UDP Uitgeschakeld en Inkomende TCP host/poort niet gezet" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:663 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:681 msgid "" "You have not configured inbound TCP with a hostname and port above, however " "you have disabled UDP." @@ -4786,25 +4867,25 @@ msgstr "" "Je hebt inkomende TCP hierboven niet geconfigureerd met een hostname en " "poort, echter heb je je UDP uitgeschakeld." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:665 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:683 msgid "Therefore your router cannot accept inbound connections." msgstr "Daarom kan je router geen inkomende connecties accepteren." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:667 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:685 msgid "Please configure a TCP host and port above or enable UDP." msgstr "Configureer een TCP host en poort hierboven of schakel UDP in." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:669 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:687 msgid "ERR - Client Manager I2CP Error - check logs" msgstr "ERR - Client Manager I2CP Fout - controlleer logs" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:671 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:689 msgid "This is usually due to a port 7654 conflict. Check the logs to verify." msgstr "" "Dit komt doorgaans door een conflict met poort 7654. Kijk in de logs om dit " "te bevestigen." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:673 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:691 msgid "" "Do you have another I2P instance running? Stop the conflicting program and " "restart I2P." @@ -4812,35 +4893,35 @@ msgstr "" "Heb je een andere I2P instantie draaien? Stop het conflicerende programma en " "herstart I2P." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:107 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:113 msgid "config advanced" msgstr "geavanceerde configuratie" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:241 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:263 msgid "I2P Advanced Configuration" msgstr "I2P Geavanceerde Configuratie" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:301 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:319 msgid "Advanced I2P Configuration" msgstr "Geavanceerde I2P Configuratie" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:311 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:329 msgid "Some changes may require a restart to take effect." msgstr "Voor de toepassing van sommige wijzigingen is een herstart nodig." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:112 msgid "config clients" msgstr "client configuratie" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:265 msgid "I2P Client Configuration" msgstr "I2P Client Configuratie" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:312 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:330 msgid "Client Configuration" msgstr "Client Configuratie" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:314 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:332 msgid "" "The Java clients listed below are started by the router and run in the same " "JVM." @@ -4848,20 +4929,76 @@ msgstr "" "De Java clients in onderstaande lijst zijn gestart door de router en draaien " "in dezelfde JVM." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:318 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:338 msgid "To change other client options, edit the file" msgstr "Om andere client opties te wijzigen, bewerk het bestand" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:325 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:345 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:423 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:439 msgid "All changes require restart to take effect." msgstr "Voor alle wijzigingen is een herstart nodig." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:337 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:357 +msgid "Advanced Client Interface Configuration" +msgstr "Geavanceerde Client Interface Configuratie" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:361 +msgid "External I2CP (I2P Client Protocol) Interface Configuration" +msgstr "Externe I2CP (I2P Client Protocol) Interface Configuratie" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:367 +msgid "Enabled without SSL" +msgstr "Ingeschakeld zonder SSL" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:373 +msgid "Enabled with SSL required" +msgstr "Ingeschakeld met SSL vereist" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:379 +msgid "Disabled - Clients outside this Java process may not connect" +msgstr "" +"Uitgeschakeld - Clients buiten dit Java process mogen geen verbinding maken" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:381 +msgid "I2CP Port" +msgstr "I2CP Poort" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:385 +msgid "I2CP Interface" +msgstr "I2CP Interface" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:401 +msgid "Authorization" +msgstr "Authorisatie" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:407 +msgid "Require username and password" +msgstr "Gebruikersnaam en wachtwoord verplicht" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:409 +msgid "Username" +msgstr "Gebruikersnaam" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:413 +msgid "Password" +msgstr "Wachtwoord" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:419 +msgid "Any changes made here must also be configured in the external client." +msgstr "" +"Alle wijzigingen die hier worden gemaakt moeten ook in de externe client " +"worden geconfigureerd." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:421 +msgid "Many clients do not support SSL or authorization." +msgstr "Veel clients understeunen geen SSL of authorisatie." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:429 msgid "WebApp Configuration" msgstr "WebApp Configuratie" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:339 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:431 msgid "" "The Java web applications listed below are started by the webConsole client " "and run in the same JVM as the router. They are usually web applications " @@ -4877,7 +5014,7 @@ msgstr "" "dat los hiervan ingeschakeld moet worden (zoals susidns, i2ptunnel), of " "zonder web interface (zoals addressbook)." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:341 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:433 msgid "" "A web app may also be disabled by removing the .war file from the webapps " "directory; however the .war file and web app will reappear when you update " @@ -4890,103 +5027,103 @@ msgstr "" "nieuwere versie. Daarom is het aanbevolen om de web app hier uit te " "schakelen." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:351 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:445 msgid "Plugin Configuration" msgstr "Plugin Configuratie" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:353 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:447 msgid "The plugins listed below are started by the webConsole client." msgstr "De plugins hier beneden zijn gestart door de webConsole client." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:359 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:455 msgid "Plugin Installation" msgstr "Plugin Installatie" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:361 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:457 msgid "To install a plugin, enter the download URL:" msgstr "Om een plugin te installeren, voer de download URL in:" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:112 msgid "config keyring" msgstr "configureer sleutelbos" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:249 msgid "I2P Keyring Configuration" msgstr "I2P Sleutelbos Configuratie" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:295 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:317 msgid "The router keyring is used to decrypt encrypted leaseSets." msgstr "" "De sleutelbos van de router is gebruikt om versleutelde leaseSets te " "ontsleutelen." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:298 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:320 msgid "" "The keyring may contain keys for local or remote encrypted destinations." msgstr "" "De sleutelbos kan sleutels bevatten voor lokale en remote versleutelde " "destinations." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:308 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:326 msgid "Manual Keyring Addition" msgstr "Handmatige Sleutelbos Toevoeging" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:310 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:328 msgid "Enter keys for encrypted remote destinations here." msgstr "Voer sleutels in om remote destinations te versleutelen." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:313 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:331 msgid "Keys for local destinations must be entered on the" msgstr "Sleutels voor lokale destinations moeten worden ingevoerd op de" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:315 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:333 msgid "I2PTunnel page" msgstr "I2PTunnel pagina" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:317 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:335 msgid "Dest. name, hash, or full key" msgstr "Dest. naam, hash, of volledige sleutel" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:319 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:337 msgid "Encryption Key" msgstr "Encryptie Sleutel" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:107 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:113 msgid "config logging" msgstr "configureer logging" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:241 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:263 msgid "I2P Logging Configuration" msgstr "I2P Logging Configuratie" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:301 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:319 msgid "Configure I2P Logging Options" msgstr "Configureer I2P Logging Opties" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:303 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:321 msgid "Logging filename" msgstr "Logging bestandsnaam" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:307 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:325 msgid "(the symbol '@' will be replaced during log rotation)" msgstr "(het symbool '@' zal worden vervangen bij het doordraaien van de log)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:309 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:327 msgid "Log record format" msgstr "Log regel formaat" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:313 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:331 msgid "" "(use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, 'm' = message)" msgstr "" "(gebruik 'd' = datum, 'c' = class, 't' = thread, 'p' = prioriteit, 'm' = " "bericht)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:315 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:333 msgid "Log date format" msgstr "Log datum formaat" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:319 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:337 msgid "" "('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' " "= millisecond)" @@ -4994,15 +5131,15 @@ msgstr "" "('MM' = maand, 'dd' = dag, 'HH' = uur, 'mm' = minuut, 'ss' = seconde, 'SSS' " "= milliseconde)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:321 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:339 msgid "Max log file size" msgstr "Max log bestand grootte" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:325 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:343 msgid "Default log level" msgstr "Standaard log niveau" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:329 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:347 msgid "" "(DEBUG and INFO are not recommended defaults, as they will drastically slow " "down your router)" @@ -5010,44 +5147,44 @@ msgstr "" "(DEBUG en INFO zijn geen aanbevolen standaardwaarden, ze zullen je router " "drastisch vertragen)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:331 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:349 msgid "Log level overrides" msgstr "Log niveau overschrijving" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:353 msgid "New override" msgstr "Nieuwe overschrijving" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:112 msgid "config peers" msgstr "configureer peers" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:249 msgid "I2P Peer Configuration" msgstr "I2P Peer Configuratie" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:305 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:323 msgid "Manual Peer Controls" msgstr "Handmatige Peer Beheer" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:307 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:325 msgid "Router Hash" msgstr "Router Hash" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:311 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:329 msgid "Manually Ban / Unban a Peer" msgstr "Handmatig een Peer Verbannen / Verbanning Opheffen" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:313 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:331 msgid "" "Banning will prevent the participation of this peer in tunnels you create." msgstr "Verbanning zorgt ervoor dat deze peer niet deelneemt aan je tunnels." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:323 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:341 msgid "Adjust Profile Bonuses" msgstr "Aanpassing van Profiel Bonussen" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:325 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:343 msgid "" "Bonuses may be positive or negative, and affect the peer's inclusion in Fast " "and High Capacity tiers. Fast peers are used for client tunnels, and High " @@ -5060,32 +5197,110 @@ msgstr "" "gebruikt voor sommige exploratory tunnels. De huidige bonussen worden " "getoond op de" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:327 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:345 msgid "profiles page" msgstr "profielen pagina" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:345 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:251 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:363 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:273 msgid "Banned Peers" msgstr "Verbannen Peers" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:366 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:384 msgid "Banned IPs" msgstr "Verbannen IPs" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:112 +msgid "config reseeding" +msgstr "configureer reseeden" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:262 +msgid "I2P Reseeding Configuration" +msgstr "I2P Reseeden Configuratie" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:318 +msgid "Reseeding Configuration" +msgstr "Reseeden Configuratie" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:320 +msgid "" +"Reseeding is the bootstrapping process used to find other routers when you " +"first install I2P, or when your router has too few router references " +"remaining." +msgstr "" +"Reseeden is het opstart proces dat gebruikt wordt om andere routers te " +"vinden wanneer je I2P voor het eerst installeert, of wanneer je router te " +"weinig router referenties heeft." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:322 +msgid "" +"If reseeding has failed, you should first check your network connection." +msgstr "" +"Wanneer reseeden heeft gefaald moet je eerst je netwerkverbinding " +"controlleren." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:326 +msgid "" +"Change these only if HTTP is blocked by a restrictive firewall, reseed has " +"failed, and you have access to an HTTP proxy." +msgstr "" +"Wijzig deze alleen wanneer HTTP geblokkeerd is door een beperkende firewall, " +"reseeden heeft gefaald en je toegang hebt tot een HTTP proxy." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:328 +#, java-format +msgid "See {0} for instructions on reseeding manually." +msgstr "Zie {0} voor instructies om handmatig te reseeden." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:328 +msgid "the FAQ" +msgstr "de FAQ" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:330 +msgid "Reseed URL Selection" +msgstr "Reseed URL Selectie" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:336 +msgid "Try SSL first then non-SSL" +msgstr "Probeer eerst met SSL, daarna zonder SSL" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:342 +msgid "Use SSL only" +msgstr "Gebruik alleen SSL" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:348 +msgid "Use non-SSL only" +msgstr "Gebruik geen SSL" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:350 +msgid "Reseed URLs" +msgstr "Reseed URLs" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:354 +msgid "Enable HTTP proxy (not used for SSL)" +msgstr "HTTP proxy inschakelen (niet gebruikt voor SSL)" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:358 +msgid "HTTP Proxy Host" +msgstr "HTTP Proxy Host" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:362 +msgid "HTTP Proxy Port" +msgstr "HTTP Proxy Poort" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:112 msgid "config service" msgstr "configureer service" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:249 msgid "I2P Service Configuration" msgstr "I2P Service Configuratie" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:285 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:303 msgid "Shutdown the router" msgstr "Stop de router" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:287 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:305 msgid "" "Graceful shutdown lets the router satisfy the agreements it has already made " "before shutting down, but may take a few minutes." @@ -5094,12 +5309,12 @@ msgstr "" "overeenkomsten vervullen alvorens te stoppen, maar dit kan een aantal " "minuten duren." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:289 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:307 msgid "" "If you need to kill the router immediately, that option is available as well." msgstr "Indien je de router onmiddelijk wilt stoppen, dan is dit ook mogelijk." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:299 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:317 msgid "" "If you want the router to restart itself after shutting down, you can choose " "one of the following." @@ -5107,7 +5322,7 @@ msgstr "" "Indien je de router wilt herstarten na het afsluiten, kies dan één van de " "volgende opties." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:301 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:319 msgid "" "This is useful in some situations - for example, if you changed some " "settings that client applications only read at startup, such as the " @@ -5118,7 +5333,7 @@ msgstr "" "opstarten, zoals het routerconsole wachtwoord of de interface waar het op " "luistert." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:303 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:321 msgid "" "A graceful restart will take a few minutes (but your peers will appreciate " "your patience), while a hard restart does so immediately." @@ -5126,7 +5341,7 @@ msgstr "" "Een gecontrolleerde herstart zal een aantal minuten duren (maar je peers " "stellen je gedult zeer op prijs), terwijl een harde herstart onmiddelijk is." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:305 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:323 msgid "" "After tearing down the router, it will wait 1 minute before starting back up " "again." @@ -5134,35 +5349,43 @@ msgstr "" "Na het stoppen van de router, zal het 1 minuut wachten alvorens opnieuw te " "starten." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:315 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:333 msgid "Systray integration" -msgstr "Systray integratie" +msgstr "Systeemvak integratie" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:317 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:335 msgid "" "On the windows platform, there is a small application to sit in the system " "tray, allowing you to view the router's status" msgstr "" -"Op het windows platform is er een kleine applicatie die in je system tray " -"zit, waarmee de router status te bekijken is" +"Op het Windows platform is er een kleine applicatie in je systeemvak waarmee " +"je de status van de router kan zien" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:319 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:337 msgid "" "(later on, I2P client applications will be able to integrate their own " "functionality into the system tray as well)." msgstr "" -"(in de toekomst zullen I2P client applicaties hun functionaliteit ook in de " -"system tray kunnen integreren)." +"(in de toekomst zullen I2P client applicaties ook hun eigen functionaliteit " +"in het systeemvak kunnen integreren)." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:321 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:339 msgid "If you are on windows, you can either enable or disable that icon here." -msgstr "Indien je windows gebruikt kun je het icon hier in- of uitschakelen." +msgstr "Indien je Windows gebruikt kan je het icoon hier in- of uitschakelen." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:327 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:341 +msgid "Show systray icon" +msgstr "Toon systeemvak icoon" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:343 +msgid "Hide systray icon" +msgstr "Verberg systray icoon" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:345 msgid "Run on startup" msgstr "Aan bij opstarten" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:329 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:347 msgid "" "You can control whether I2P is run on startup or not by selecting one of the " "following options - I2P will install (or remove) a service accordingly." @@ -5170,12 +5393,12 @@ msgstr "" "Je kan bepalen of I2P al dan niet bij het opstarten moet starten met behulp " "van de volgende opties - I2P zal dan de service toevoegen (of verwijderen)." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:331 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:349 msgid "If you prefer the command line, you can also run the " msgstr "" "Indien je de voorkeur geeft aan de command line, kan je het ook starten met " -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:341 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:359 msgid "" "If you are running I2P as service right now, removing it will shut down your " "router immediately." @@ -5183,7 +5406,7 @@ msgstr "" "Indien je op dit moment I2P als service draait zal het verwijderen je router " "onmiddelijk stoppen." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:343 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:361 msgid "" "You may want to consider shutting down gracefully, as above, then running " "uninstall_i2p_service_winnt.bat." @@ -5191,15 +5414,15 @@ msgstr "" "Overweeg om hierboven je router gecontrolleerd te stoppen, en daarna " "uninstall_i2p_service_winnt.bat te draaien." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:347 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:365 msgid "Debugging" msgstr "Debugging" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:349 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:367 msgid "View the job queue" msgstr "Bekijk de taak wachtrij" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:353 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:371 msgid "" "At times, it may be helpful to debug I2P by getting a thread dump. To do so, " "please select the following option and review the thread dumped to <a href=" @@ -5209,11 +5432,11 @@ msgstr "" "doen, selecteer de volgende optie en bekijk de thread dump in de <a href=" "\"logs.jsp#servicelogs\">wrapper.log</a>." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:359 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:377 msgid "Launch browser on router startup?" msgstr "Start browser bij opstarten router?" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:361 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:379 msgid "" "I2P's main configuration interface is this web console, so for your " "convenience I2P can launch a web browser on startup pointing at" @@ -5221,68 +5444,68 @@ msgstr "" "De hoofd configuratie interface van I2P is deze web console, indien gewenst " "kan I2P na het opstarten een web browser starten die verwijst naar" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:107 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:113 msgid "config stats" msgstr "configureer statistieken" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:228 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:250 msgid "I2P Stats Configuration" msgstr "I2P Statistieken Configuratie" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:302 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:320 msgid "Configure I2P Stat Collection" msgstr "Configureer I2P Statistiek Vergaring" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:304 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:322 msgid "Enable full stats?" msgstr "Volledige statistieken inschakelen?" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:311 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:329 msgid "change requires restart to take effect" msgstr "na wijziging is een herstart nodig" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:313 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:331 msgid "Stat file" msgstr "Statistiek bestand" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:317 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:335 msgid "Filter" msgstr "Filter" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:319 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:328 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:337 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:348 msgid "toggle all" msgstr "alles aan/uit" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:330 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:350 msgid "Log" msgstr "Log" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:332 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:352 msgid "Graph" msgstr "Grafiek" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:371 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:391 msgid "Advanced filter" msgstr "Geavanceerd filter" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:112 msgid "config tunnels" msgstr "configureer tunnels" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:262 msgid "I2P Tunnel Configuration" msgstr "I2P Tunnel Configuratie" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:306 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:328 msgid "The default settings work for most people." msgstr "De standaard settings werken voor de meeste mensen." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:310 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:332 msgid "There is a fundamental tradeoff between anonymity and performance." msgstr "Er is een fundamentele afweging tussen anonimiteit en prestatie." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:313 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:335 msgid "" "Tunnels longer than 3 hops (for example 2 hops + 0-2 hops, 3 hops + 0-1 " "hops, 3 hops + 0-2 hops), or a high quantity + backup quantity, may severely " @@ -5292,51 +5515,51 @@ msgstr "" "hops, 3 hops + 0-2 hops), of een hoge hoeveelheid + backup hoeveelheid, " "kunnen leiden tot een vermindering van prestatie of bereikbaarheid." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:316 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:338 msgid "High CPU and/or high outbound bandwidth usage may result." msgstr "CPU gebruik en/of uitgaand bandbreedte kan toenemen." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:319 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:341 msgid "Change these settings with care, and adjust them if you have problems." msgstr "" "Wijzig deze instellingen met zorg, en pas ze aan indien problemen optreden." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:333 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:351 msgid "" "Exploratory tunnel setting changes are stored in the router.config file." msgstr "" "Exploratory tunnel configuratie wijzigingen zijn opgeslagen in het router." "config bestand." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:336 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:354 msgid "Client tunnel changes are temporary and are not saved." msgstr "Client tunnel wijzigingen zijn tijdelijk en worden niet opgeslagen." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:338 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:356 msgid "To make permanent client tunnel changes see the" msgstr "Om permanente client tunnel wijzigingen te maken zie de" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:340 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:358 msgid "i2ptunnel page" msgstr "i2ptunnel pagina" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:112 msgid "config UI" msgstr "configureer UI" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:262 msgid "I2P UI Configuration" msgstr "I2P UI Configuratie" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:292 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:314 msgid "Router Console Theme" msgstr "Router Console Thema" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:310 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:339 msgid "Theme selection disabled for Internet Explorer, sorry." msgstr "Thema selectie is uitgeschakeld voor Internet Explorer, sorry." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:312 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:341 msgid "" "If you're not using IE, it's likely that your browser is pretending to be " "IE; please configure your browser (or proxy) to use a different User Agent " @@ -5346,11 +5569,11 @@ msgstr "" "IE; configureer je browser (of proxy) om een andere User Agent tekst te " "gebruiken indien je de console thema's wilt wijzigen." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:316 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:345 msgid "Router Console Language" msgstr "Router Console Taal" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:320 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:349 msgid "" "Please contribute to the router console translation project! Contact the " "developers on IRC #i2p to help." @@ -5358,71 +5581,71 @@ msgstr "" "Lever een bijdrage aan het router console vertaal project! Neem contact op " "met de ontwikkelaars op IRC #i2p om te helpen." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:324 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:353 msgid "Apply" msgstr "Toepassen" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:112 msgid "config update" msgstr "configureer update" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:249 msgid "I2P Update Configuration" msgstr "I2P Update Configuratie" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:303 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:321 msgid "Check for I2P and news updates" msgstr "Controlleer op I2P en nieuws updates" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:305 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:323 msgid "News & I2P Updates" msgstr "Nieuws & I2P Updates" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:309 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:327 msgid "Update In Progress" msgstr "Bezig Met Upgrade" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:317 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:335 msgid "News URL" msgstr "Nieuws URL" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:321 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:339 msgid "Refresh frequency" msgstr "Ververs frequentie" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:327 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:345 msgid "Update policy" msgstr "Update regels" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:331 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:349 msgid "Update through the eepProxy?" msgstr "Update door de eepProxy?" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:353 msgid "eepProxy host" msgstr "eepProxy host" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:339 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:357 msgid "eepProxy port" msgstr "eepProxy poort" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:343 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:361 msgid "Update URLs" msgstr "Update URLs" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:347 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:365 msgid "Trusted keys" msgstr "Vertrouwde sleutels" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:351 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:369 msgid "Update with unsigned development builds?" msgstr "Update met niet ondertekende ontwikkel builds?" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:355 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:373 msgid "Unsigned Build URL" msgstr "Niet-ondertekende Build URL" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:361 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:379 msgid "" "I2P updates are disabled because you do not have write permission for the " "install directory." @@ -5430,120 +5653,154 @@ msgstr "" "I2P updates zijn uitgeschakeld omdat je geen schrijf rechten hebt op de " "installatie directory." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:367 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:385 msgid "Save" msgstr "Opslaan" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:117 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:121 +msgid "Internal Error" +msgstr "Interne Fout" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:123 +msgid "Router Console" +msgstr "Router Console" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:127 +msgid "Configuration" +msgstr "Configuratie" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:135 +msgid "Sorry! There has been an internal error." +msgstr "Sorry! Er is een interne fout opgetreden." + +#. note to translators - both parameters are URLs +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:139 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:254 +#, java-format +msgid "Please report bugs on {0} or {1}." +msgstr "Rapporteer bugs op {0} of {1}." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:143 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:258 +msgid "" +"You may use the username \"guest\" and password \"guest\" if you do not wish " +"to register." +msgstr "" +"Indien je niet wilt registreren kan je de username \"guest\" en wachtwoord " +"\"guest\" gebruiken." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:145 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:260 +msgid "Please include this information in bug reports" +msgstr "Graag deze informatie in bug reports vermelden" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:147 +msgid "Error Details" +msgstr "Fout Details" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:149 +#, java-format +msgid "Error {0}" +msgstr "Fout {0}" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:169 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:250 +msgid "I2P Version and Running Environment" +msgstr "I2P Versie en Omgevingsinformatie" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:197 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:288 +msgid "" +"Note that system information, log timestamps, and log messages may provide " +"clues to your location; please review everything you include in a bug report." +msgstr "" +"Merk op dat systeem informatie, log timestamps en log berichten mogelijk " +"aanwijzingen kunnen geven over je lokatie; controlleer daarom alles dat je " +"in een bug report opneemt." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:123 msgid "Page Not Found" msgstr "Pagina Niet Gevonden" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:242 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:264 msgid "" "Sorry! You appear to be requesting a non-existent Router Console page or " "resource." msgstr "Sorry! Je benadert een niet bestaande Router Console pagina of bron." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:244 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:266 msgid "Error 404" msgstr "Fout 404" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:249 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:271 msgid "not found" msgstr "niet gevonden" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:112 msgid "graphs" msgstr "grafieken" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:249 msgid "I2P Performance Graphs" msgstr "I2P Prestatie Grafieken" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:111 msgid "home" msgstr "start" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:331 +msgid "Welcome to I2P" +msgstr "Welkom bij I2P" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:111 msgid "job queue" msgstr "taak wachtrij" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:248 msgid "I2P Router Job Queue" msgstr "I2P Router Taak wachtrij" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:111 msgid "logs" msgstr "logs" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:248 msgid "I2P Router Logs" msgstr "I2P Router Logs" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:228 -msgid "I2P Version & Running Environment" -msgstr "I2P Versie & Omgevingsinformatie" - -#. note to translators - both parameters are URLs -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:232 -#, java-format -msgid "Please report bugs on {0} or {1}." -msgstr "Rapporteer bugs op {0} of {1}." - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:236 -msgid "" -"You may use the username \"guest\" and password \"guest\" if you do not wish " -"to register." -msgstr "" -"Indien je niet wilt registreren kan je de username \"guest\" en wachtwoord " -"\"guest\" gebruiken." - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:238 -msgid "Please include this information in bug reports" -msgstr "Graag deze informatie in bug reports vermelden" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:266 -msgid "" -"Note that system information, log timestamps, and log messages may provide " -"clues to your location; please review everything you include in a bug report." -msgstr "" -"Merk op dat systeem informatie, log timestamps en log berichten mogelijk " -"aanwijzingen kunnen geven over je lokatie; controlleer daarom alles dat je in " -"een bug report opneemt." - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:281 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:303 msgid "Critical Logs" msgstr "Kritieke Logs" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:285 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:307 msgid "Router Logs" msgstr "Router Logs" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:291 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:313 msgid "Service (Wrapper) Logs" msgstr "Service (Wrapper) Logs" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:111 msgid "network database summary" msgstr "samenvatting netwerk database" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:248 msgid "I2P Network Database Summary" msgstr "Samenvatting I2P Netwerk Database " -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:109 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:115 msgid "WebApp Not Found" msgstr "WebApp Niet Gevonden" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:230 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:252 msgid "Web Application Not Running" msgstr "Web Applicatie Draai Niet" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:232 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:254 msgid "The requested web application is not running." msgstr "De gevraagde web applicatie draait niet." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:234 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:256 msgid "" "Please visit the <a href=\"/configclients.jsp#webapp\">config clients page</" "a> to start it." @@ -5551,39 +5808,49 @@ msgstr "" "Bezoek de <a href=\"/configclients.jsp#webapp\">config clients pagina</a> om " "het te starten." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:111 msgid "peer connections" msgstr "peer connecties" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:248 msgid "I2P Network Peers" msgstr "I2P Netwerk Peers" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:111 msgid "peer profiles" msgstr "peer profielen" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:248 msgid "I2P Network Peer Profiles" msgstr "I2P Netwerk Peer Profielen" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:111 msgid "statistics" msgstr "statistieken" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:265 msgid "I2P Router Statistics" msgstr "I2P Router Statistieken" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:248 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:255 #, java-format msgid "Disable {0} Refresh" msgstr "{0} Verversing Uitschakelen" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:111 msgid "tunnel summary" msgstr "tunnel samenvatting" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:248 msgid "I2P Tunnel Summary" msgstr "I2P Tunnel Samenvatting" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:111 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:248 +msgid "Peer Profile" +msgstr "Peer Profiel" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:275 +#, java-format +msgid "Profile for peer {0}" +msgstr "Profiel voor peer {0}" diff --git a/apps/routerconsole/locale/messages_ru.po b/apps/routerconsole/locale/messages_ru.po index 41f73635c55406ae0e18f1ba8d0df7582076b182..5a7538fba73e832f92d765496991eaf8d054265a 100644 --- a/apps/routerconsole/locale/messages_ru.po +++ b/apps/routerconsole/locale/messages_ru.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: I2P routerconsole\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-12-13 19:43+0000\n" -"PO-Revision-Date: 2010-12-24 00:11+0500\n" +"POT-Creation-Date: 2011-04-13 16:25+0000\n" +"PO-Revision-Date: 2011-04-13 23:31+0500\n" "Last-Translator: Hidden Z <hiddenz@mail.i2p>\n" "Language-Team: \n" "Language: \n" @@ -28,7 +28,7 @@ msgstr "" #. {0,number,####} prevents 1234 from being output as 1,234 in the English locale. #. If you want the digit separator in your locale, translate as {0}. #. alternates: msec, msecs -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1092 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1140 #, java-format msgid "1 ms" msgid_plural "{0,number,####} ms" @@ -39,8 +39,7 @@ msgstr[2] "{0,number,####} мÑ" #. seconds #. Note to translators: quantity will always be greater than one. #. alternates: secs, sec. 'seconds' is probably too long. -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1097 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:354 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1145 #, java-format msgid "1 sec" msgid_plural "{0} sec" @@ -51,7 +50,7 @@ msgstr[2] "{0} Ñ." #. minutes #. Note to translators: quantity will always be greater than one. #. alternates: mins, min. 'minutes' is probably too long. -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1102 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1150 #, java-format msgid "1 min" msgid_plural "{0} min" @@ -62,7 +61,7 @@ msgstr[2] "{0} мин." #. hours #. Note to translators: quantity will always be greater than one. #. alternates: hrs, hr., hrs. -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1107 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1155 #, java-format msgid "1 hour" msgid_plural "{0} hours" @@ -70,14 +69,14 @@ msgstr[0] "{0} чаÑ" msgstr[1] "{0} чаÑа" msgstr[2] "{0} чаÑов" -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1109 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:313 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1157 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:314 msgid "n/a" msgstr "нет данных" #. days #. Note to translators: quantity will always be greater than one. -#: ../../../core/java/src/net/i2p/data/DataHelper.java:1113 +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1161 #, java-format msgid "1 day" msgid_plural "{0} days" @@ -85,21 +84,21 @@ msgstr[0] "{0} день" msgstr[1] "{0} дней" msgstr[2] "{0} дней" -#: ../../../router/java/src/net/i2p/router/Blocklist.java:126 +#: ../../../router/java/src/net/i2p/router/Blocklist.java:122 #, java-format msgid "Banned by router hash: {0}" msgstr "Забанен по Ñ…Ñшу маршрутизатора: {0}" -#: ../../../router/java/src/net/i2p/router/Blocklist.java:128 +#: ../../../router/java/src/net/i2p/router/Blocklist.java:124 msgid "Banned by router hash" msgstr "Забанен по Ñ…Ñшу маршрутизатора" #. Temporary reason, until the job finishes -#: ../../../router/java/src/net/i2p/router/Blocklist.java:673 +#: ../../../router/java/src/net/i2p/router/Blocklist.java:669 msgid "IP banned" msgstr "IP заблокирован" -#: ../../../router/java/src/net/i2p/router/Blocklist.java:743 +#: ../../../router/java/src/net/i2p/router/Blocklist.java:739 #, java-format msgid "IP banned by blocklist.txt entry {0}" msgstr "IP заблокирован по запиÑи в blocklist.txt: {0}" @@ -153,15 +152,12 @@ msgstr "Принимаем туннели" msgid "Rejecting tunnels" msgstr "Ðе принимаем туннели" -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:67 -msgid "Ensure that nothing blocks outbound HTTP, check <a target=\"_top\" href=\"logs.jsp\">logs</a> and if nothing helps, read the <a target=\"_top\" href=\"http://www.i2p2.de/faq.html\">FAQ</a> about reseeding manually." -msgstr "УбедитеÑÑŒ, что иÑходÑщие HTTP-запроÑÑ‹ ничем не блокируютÑÑ, заглÑните в <a href=logs.jsp>логи</a> и еÑли ничто не помогло, прочтите в <a target=\"_top\" href=\"http://www.i2p2.de/faq.html\">FAQ</a> инÑтрукцию по начальной загрузке вручную." - -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:100 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:125 +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:20 msgid "Reseeding" -msgstr "ПроизводитÑÑ Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ°" +msgstr "ÐÐ°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ°" -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:123 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:141 #, java-format msgid "Reseed fetched only 1 router." msgid_plural "Reseed fetched only {0} routers." @@ -169,20 +165,29 @@ msgstr[0] "При начальной загрузке получены данн msgstr[1] "При начальной загрузке получены данные только о {0} роутерах." msgstr[2] "При начальной загрузке получены данные только о {0} роутерах." -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:130 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:148 msgid "Reseed failed." msgstr "Попытка начальной загрузки провалилаÑÑŒ." -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:231 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:149 +#, java-format +msgid "See {0} for help." +msgstr "Смотрите {0} Ð´Ð»Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰Ð¸." + +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:150 +msgid "reseed configuration page" +msgstr "Ñтраница наÑтройки начальной загрузки" + +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:293 msgid "Reseeding: fetching seed URL." msgstr "ПроизводитÑÑ Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ°: загружаетÑÑ URL каталога маршрутизаторов." -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:272 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:335 #, java-format msgid "Reseeding: fetching router info from seed URL ({0} successful, {1} errors)." msgstr "ПроизводитÑÑ Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ°: получение информации о маршрутизаторах ({0} удачно, {1} ошибок)." -#: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:510 +#: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:512 msgid "NetDb entry" msgstr "показать опиÑание в NetDb" @@ -191,191 +196,192 @@ msgstr "показать опиÑание в NetDb" msgid "No transports (hidden or starting up?)" msgstr "Ðет транÑпортных протоколов (в Ñкрытом режиме или запущен недавно?)" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:451 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:450 msgid "Unreachable on any transport" msgstr "ÐедоÑтупен по вÑем транÑпортным протоколам" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:500 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:499 msgid "Router Transport Addresses" msgstr "ÐдреÑа транÑпортов маршрутизатора" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:505 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:504 #, java-format msgid "{0} is used for outbound connections only" msgstr "{0} иÑпользуетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð´Ð»Ñ Ð¸ÑходÑщих Ñоединений" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:519 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:518 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:129 msgid "Help" msgstr "Справка" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:520 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:519 msgid "Your transport connection limits are automatically set based on your configured bandwidth." msgstr "Лимиты транÑпортных Ñоединений назначены автоматичеÑки на оÑнове заданной вами пропуÑкной ÑпоÑобноÑти." -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:522 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:521 msgid "To override these limits, add the settings i2np.ntcp.maxConnections=nnn and i2np.udp.maxConnections=nnn on the advanced configuration page." msgstr "Ð”Ð»Ñ Ð¿ÐµÑ€ÐµÐ¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñтих лимитов добавьте параметры i2np.ntcp.maxConnections=nnn и i2np.udp.maxConnections=nnn на Ñтранице раÑширенных наÑтроек." -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:257 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:523 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258 msgid "Definitions" msgstr "УÑловные обозначениÑ" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:525 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:715 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1887 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:737 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1890 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:24 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:33 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:35 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:81 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:187 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:189 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:238 msgid "Peer" msgstr "Пир" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:525 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524 msgid "The remote peer, identified by router hash" msgstr "Уникальный идентификатор пира (неÑколько начальных Ñимволов из хеша его маршрутизатора)" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:526 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:716 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1891 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:525 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:738 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1894 msgid "Dir" msgstr "Ðаправление" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:527 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:526 msgid "Inbound connection" msgstr "ВходÑщее Ñоединение" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:529 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:528 msgid "Outbound connection" msgstr "ИÑходÑщее Ñоединение" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:531 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:530 msgid "They offered to introduce us (help other peers traverse our firewall)" msgstr "Ðтот пир предлагает ÑÐµÐ±Ñ Ð² качеÑтве нашего поÑредника (Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы другие пиры могли ÑоединÑÑ‚ÑŒÑÑ Ñ Ð½Ð°Ð¼Ð¸ в обход нашего брандмауÑра)" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:532 msgid "We offered to introduce them (help other peers traverse their firewall)" msgstr "Мы предлагаем ÑÐµÐ±Ñ Ð² качеÑтве поÑредника Ð´Ð»Ñ Ñтого пира (Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы другие пиры могли ÑоединÑÑ‚ÑŒÑÑ Ñ Ð½Ð¸Ð¼ в обход его брандмауÑра)" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533 msgid "How long since a packet has been received / sent" msgstr "Сколько прошло времени поÑле приёма/передачи поÑледнего пакета" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:717 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1892 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:739 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1895 msgid "Idle" msgstr "Ðеактивен" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:718 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1897 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:740 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1900 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:156 msgid "In/Out" msgstr "Приём/Передача" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534 msgid "The smoothed inbound / outbound transfer rate (KBytes per second)" msgstr "УÑреднённые ÑкороÑти приёма / передачи (КБайт/Ñек) " -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535 msgid "How long ago this connection was established" msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¶Ð¸Ð·Ð½Ð¸ ÑоединениÑ" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:719 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1902 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:741 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1905 msgid "Up" msgstr "Подключен" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:720 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1904 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:742 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1907 msgid "Skew" msgstr "Сдвиг" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536 msgid "The difference between the peer's clock and your own" msgstr "Разница хода чаÑов между пиром и нами" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537 msgid "The congestion window, which is how many bytes can be sent without an acknowledgement" msgstr "<i>Congestion Window.</i> Окно наÑÑ‹Ñ‰ÐµÐ½Ð¸Ñ â€” количеÑтво байт, которое мы можем поÑлать до Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538 msgid "The number of sent messages awaiting acknowledgement" msgstr "КоличеÑтво отправленных Ñообщений ожидающих подтверждениÑ" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:540 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539 msgid "The maximum number of concurrent messages to send" msgstr "МакÑимальное количеÑтво параллельно отправлÑемых Ñообщений" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:540 msgid "The number of pending sends which exceed congestion window" msgstr "КоличеÑтво ожидающих поÑылок превоÑходÑщих размер окна наÑыщениÑ" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:542 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541 msgid "The slow start threshold" msgstr "<i>Slow Start Threshold.</i> Величина порога медленного Ñтарта" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:542 msgid "The round trip time in milliseconds" msgstr "<i>Round-Trip Time.</i> Ð’Ñ€ÐµÐ¼Ñ Ð¼ÐµÐ¶Ð´Ñƒ отправкой запроÑа и получением ответа (миллиÑекунды)" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1914 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1917 msgid "Dev" msgstr "Отклонение" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543 msgid "The standard deviation of the round trip time in milliseconds" msgstr "СреднеквадратичеÑкое отклонение RTT (миллиÑекунды)" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544 msgid "The retransmit timeout in milliseconds" msgstr "<i>Retransmit Time-Out.</i> Ð’Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€ÐµÐ´ повторной поÑылкой пакета (миллиÑекунды)" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545 msgid "Current maximum send packet size / estimated maximum receive packet size (bytes)" msgstr "<i>Maximum Transfer Unit.</i> Текущий макÑимальный размер иÑходÑщего пакета / макÑимальный размер принÑтого пакета (байт) " -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:721 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1921 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:743 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1924 msgid "TX" msgstr "Передано" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546 msgid "The total number of packets sent to the peer" msgstr "Общее количеÑтво поÑланных пиру пакетов" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:722 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1923 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:744 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1926 msgid "RX" msgstr "ПринÑто" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547 msgid "The total number of packets received from the peer" msgstr "Общее количеÑтво принÑÑ‚Ñ‹Ñ… от пира пакетов" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1926 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1929 msgid "Dup TX" msgstr "Повт. принÑто" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548 msgid "The total number of packets retransmitted to the peer" msgstr "Общее количеÑтво повторно поÑланных пиру пакетов" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:550 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1928 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1931 msgid "Dup RX" msgstr "Повт. передано" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:550 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549 msgid "The total number of duplicate packets received from the peer" msgstr "Общее количеÑтво повторно принÑÑ‚Ñ‹Ñ… от пира пакетов" @@ -385,174 +391,175 @@ msgstr "Общее количеÑтво повторно принÑÑ‚Ñ‹Ñ… от msgid "Excessive clock skew: {0}" msgstr "Чрезмерное раÑхождение времени: {0}" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:710 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:732 msgid "NTCP connections" msgstr "NTCP ÑоединениÑ" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:711 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1883 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:733 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1886 msgid "Limit" msgstr "Ограничение" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:712 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1884 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:734 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1887 msgid "Timeout" msgstr "Таймаут" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:723 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:745 msgid "Out Queue" msgstr "ИÑходÑÑ‰Ð°Ñ Ð¾Ñ‡ÐµÑ€ÐµÐ´ÑŒ" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:724 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:746 msgid "Backlogged?" msgstr "Ð’ очереди?" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:738 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1946 -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:760 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1949 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:87 msgid "Inbound" msgstr "ВходÑщие" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:740 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1948 -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:762 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1951 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:87 msgid "Outbound" msgstr "ИÑходÑщие" #. buf.append("<tr> <td colspan=\"11\"><hr></td></tr>\n"); -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:787 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:809 msgid "peers" msgstr "пиров" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1882 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1885 msgid "UDP connections" msgstr "UDP ÑоединениÑ" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1889 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1892 msgid "Sort by peer hash" msgstr "Сортировать по идентификатору пира" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1891 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1894 msgid "Direction/Introduction" msgstr "Ðаправление / ПоÑредничеÑтво" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1893 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1896 msgid "Sort by idle inbound" msgstr "Сортировать по неактивноÑти приёма" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1895 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1898 msgid "Sort by idle outbound" msgstr "Сортировать по неактивноÑти передачи" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1898 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1901 msgid "Sort by inbound rate" msgstr "Сортировать по ÑкороÑти приёма" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1900 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1903 msgid "Sort by outbound rate" msgstr "Сортировать по ÑкороÑти передачи" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1903 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1906 msgid "Sort by connection uptime" msgstr "Сортировать по времени жизни ÑоединениÑ" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1905 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1908 msgid "Sort by clock skew" msgstr "Сортировать по раÑхождению чаÑов" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1908 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1911 msgid "Sort by congestion window" msgstr "Сортировать по размеру окна наÑыщениÑ" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1910 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1913 msgid "Sort by slow start threshold" msgstr "Сортировать по размеру порога медленного Ñтарта" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1913 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1916 msgid "Sort by round trip time" msgstr "Сортировать по времени Ð¿Ñ€Ð¾Ñ…Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ñигнала" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1915 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1918 msgid "Sort by round trip time deviation" msgstr "Сортировать по отклонению времени Ð¿Ñ€Ð¾Ñ…Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ñигнала" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1917 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1920 msgid "Sort by retransmission timeout" msgstr "Сортировать по таймауту передачи" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1920 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1923 msgid "Sort by outbound maximum transmit unit" msgstr "Сортировать по размеру иÑходÑщего MTU" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1922 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1925 msgid "Sort by packets sent" msgstr "Сортировать по количеÑтву поÑланных пакетов" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1924 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1927 msgid "Sort by packets received" msgstr "Сортировать по количеÑтву принÑÑ‚Ñ‹Ñ… пакетов" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1927 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1930 msgid "Sort by packets retransmitted" msgstr "Сортировать по количеÑтву повторно поÑланных пакетов" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1929 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1932 msgid "Sort by packets received more than once" msgstr "Сортировать по количеÑтву повторно принÑÑ‚Ñ‹Ñ… пакетов" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1950 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1953 msgid "We offered to introduce them" msgstr "Мы предлагаем ÑÐµÐ±Ñ Ð² качеÑтве поÑредника Ð´Ð»Ñ Ñтого пира" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1952 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1955 msgid "They offered to introduce us" msgstr "Ðтот пир предлагает ÑÐµÐ±Ñ Ð² качеÑтве нашего поÑредника" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1956 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1959 msgid "Choked" msgstr "ДроÑÑелирован" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1964 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1967 msgid "1 fail" msgstr "1 Ñбой" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1966 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1969 #, java-format msgid "{0} fails" msgstr "{0} ÑбоÑ(-ев)" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1972 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1975 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:162 msgid "Banned" msgstr "Забанен" #. buf.append("<tr><td colspan=\"16\"><hr></td></tr>\n"); -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2103 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2106 msgid "SUMMARY" msgstr "ИТОГО" -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:145 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:124 msgid "Dropping tunnel requests: Too slow" msgstr "Игнорируем запроÑÑ‹ туннелей: Ð’Ñ€ÐµÐ¼Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿Ñ€ÐµÐ²Ñ‹Ñило ожидаемое" #. don't even bother, since we are so overloaded locally -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:352 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:267 msgid "Dropping tunnel requests: Overloaded" msgstr "Игнорируем запроÑÑ‹ туннелей: Слишком выÑÐ¾ÐºÐ°Ñ Ð½Ð°Ð³Ñ€ÑƒÐ·ÐºÐ°" -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:525 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:470 msgid "Rejecting tunnels: Request overload" msgstr "Ðе принимаем туннели: Слишком много запроÑов" -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:550 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:495 msgid "Rejecting tunnels: Connection limit" msgstr "Ðе принимаем туннели: ДоÑтигнут предел количеÑтва Ñоединений" -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:744 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:695 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:716 msgid "Dropping tunnel requests: High load" msgstr "Игнорируем запроÑÑ‹ туннелей: Ð’Ñ‹ÑÐ¾ÐºÐ°Ñ Ð½Ð°Ð³Ñ€ÑƒÐ·ÐºÐ°" -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:753 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:708 msgid "Dropping tunnel requests: Queue time" msgstr "Игнорируем запроÑÑ‹ туннелей: Слишком большое Ð²Ñ€ÐµÐ¼Ñ Ð¿Ñ€ÐµÐ±Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð² очереди" @@ -1483,11 +1490,12 @@ msgstr "ЗамбиÑ" msgid "Zimbabwe" msgstr "Зимбабве" -#: ../java/src/net/i2p/router/web/CSSHelper.java:57 +#: ../java/src/net/i2p/router/web/CSSHelper.java:60 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:35 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:37 #: ../java/strings/Strings.java:29 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:233 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:125 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:257 msgid "I2P Router Console" msgstr "КонÑоль маршрутизатора I2P" @@ -1505,245 +1513,253 @@ msgstr "ÐаÑтройки Ñохранены" msgid "Error saving the configuration (applied but not saved) - please see the error logs" msgstr "Ðе удалоÑÑŒ Ñохранить наÑтройки (применены, но не Ñохранены) — заглÑните в логи ошибок" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:34 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:335 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:35 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:355 msgid "Save Client Configuration" msgstr "Сохранить наÑтройки клиентов" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:38 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:347 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:39 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:427 +msgid "Save Interface Configuration" +msgstr "Сохранить наÑтройки интерфейÑа" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:43 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:441 msgid "Save WebApp Configuration" msgstr "Сохранить наÑтройки веб-апплетов" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:42 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:357 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:47 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:453 msgid "Save Plugin Configuration" msgstr "Сохранить наÑтройки плагинов" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:46 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:363 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:51 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:461 msgid "Install Plugin" msgstr "УÑтановить плагин" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:82 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:87 #, java-format msgid "Deleted plugin {0}" msgstr "Удален плагин {0}" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:84 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:89 #, java-format msgid "Error deleting plugin {0}" msgstr "Ошибка при удалении плагина {0}" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:96 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:101 #, java-format msgid "Stopped plugin {0}" msgstr "ОÑтановлен плагин {0}" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:98 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:103 #, java-format msgid "Error stopping plugin {0}" msgstr "Ошибка при оÑтановке плагина {0}" #. label (IE) -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:119 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:189 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:124 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:255 msgid "Start" msgstr "ЗапуÑтить" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:138 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:143 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:49 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:61 +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:33 msgid "Unsupported" msgstr "Ðе поддерживаетÑÑ" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:184 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:189 msgid "New client added" msgstr "Добавлен новый клиент" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:188 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:193 msgid "Client configuration saved successfully - restart required to take effect." msgstr "ÐаÑтройки клиентов Ñохранены, требуетÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк маршрутизатора Ð´Ð»Ñ Ð²ÑÑ‚ÑƒÐ¿Ð»ÐµÐ½Ð¸Ñ Ð² Ñилу." -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:202 -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:213 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:207 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:218 msgid "Bad client index." msgstr "Ð˜Ð½Ð´ÐµÐºÑ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð° не найден в ÑпиÑке." -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:207 -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:218 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:38 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:397 -#: ../java/src/net/i2p/router/web/SummaryHelper.java:379 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:212 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:223 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:392 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:384 msgid "Client" msgstr "КлиентÑкие" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:207 -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:266 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:212 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:271 msgid "started" msgstr "запущен" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:218 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:223 msgid "deleted" msgstr "удален" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:235 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:240 msgid "WebApp configuration saved." msgstr "ÐаÑтройки веб-апплета Ñохранены." -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:251 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:256 msgid "Plugin configuration saved." msgstr "ÐаÑтройки плагина Ñохранены." -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:266 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:58 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:271 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124 msgid "WebApp" msgstr "Веб-апплет" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:268 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:273 msgid "Failed to start" msgstr "Ðе удалоÑÑŒ запуÑтить" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:273 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:278 msgid "Failed to find server." msgstr "Ðе удалоÑÑŒ найти Ñервер." -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:279 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:284 msgid "No plugin URL specified." msgstr "Ðе указан URL загрузки плагина" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:289 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:294 #, java-format msgid "No update URL specified for {0}" msgstr "Ðе указан URL загрузки плагина {0}" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:297 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:302 -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:315 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:307 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:320 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:325 msgid "Plugin or update download already in progress." msgstr "Загрузка плагина или Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑƒÐ¶Ðµ запущена." -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:306 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:311 #: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:118 #, java-format msgid "Downloading plugin from {0}" msgstr "ПроизводитÑÑ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ° плагина Ñ {0}" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:324 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:329 #, java-format msgid "Checking plugin {0} for updates" msgstr "ПроверÑетÑÑ Ð½Ð°Ð»Ð¸Ñ‡Ð¸Ðµ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð° {0}" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:334 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:339 #, java-format msgid "Started plugin {0}" msgstr "Запущен плагин {0}" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:336 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:341 #, java-format msgid "Error starting plugin {0}" msgstr "Ошибка при запуÑке плагина {0}" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:21 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:192 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:376 +msgid "Interface configuration saved successfully - restart required to take effect." +msgstr "ÐаÑтройки интерфейÑа уÑпешно Ñохранены, требуетÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк маршрутизатора Ð´Ð»Ñ Ð²ÑÑ‚ÑƒÐ¿Ð»ÐµÐ½Ð¸Ñ Ð² Ñилу." + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:85 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:258 msgid "Edit" msgstr "Редактировать" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:30 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:331 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:94 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:351 msgid "Add Client" msgstr "Добавить клиент" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:38 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102 msgid "Class and arguments" msgstr "Ðазвание клаÑÑа и параметры" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:38 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:58 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:82 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148 msgid "Control" msgstr "Управление" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:38 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:58 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:82 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148 msgid "Run at Startup?" msgstr "ЗапуÑкать автоматичеÑки?" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:58 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:82 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:131 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:197 msgid "Description" msgstr "ОпиÑание" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:82 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148 msgid "Plugin" msgstr "Плагин" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:95 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:271 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:161 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:273 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:185 msgid "Version" msgstr "ВерÑиÑ" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:97 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:163 msgid "Signed by" msgstr "ПодпиÑано" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:114 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:180 msgid "Date" msgstr "Дата" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:120 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:186 msgid "Author" msgstr "Ðвтор" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:136 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:202 msgid "License" msgstr "ЛицензиÑ" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:141 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:207 msgid "Website" msgstr "Веб-Ñайт" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:146 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:212 msgid "Update link" msgstr "ÐÐ´Ñ€ÐµÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:194 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:260 msgid "Stop" msgstr "ОÑтановить" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:196 -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:81 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:313 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:262 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:78 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:331 msgid "Check for updates" msgstr "Проверить обновлениÑ" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:197 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:263 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:235 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:242 msgid "Update" msgstr "Обновление" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:202 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:268 #, java-format msgid "Are you sure you want to delete {0}?" msgstr "Ð’Ñ‹ дейÑтвительно хотите удалить {0}?" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:204 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:270 msgid "Delete" msgstr "Удалить" #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:18 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:325 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:343 msgid "Add key" msgstr "Добавить ключ" #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:19 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:323 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:341 msgid "Delete key" msgstr "Удалить ключ" @@ -1845,7 +1861,7 @@ msgstr "Служба" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:101 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:386 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:381 #: ../java/strings/Strings.java:72 msgid "Tunnels" msgstr "Туннели" @@ -1859,7 +1875,7 @@ msgid "Clients" msgstr "Ðпплеты" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:293 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:315 msgid "Keyring" msgstr "Ключи" @@ -1869,13 +1885,13 @@ msgstr "Логи" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:107 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:260 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:255 #: ../java/strings/Strings.java:67 msgid "Peers" msgstr "Пиры" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:387 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:389 #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:143 msgid "Stats" msgstr "СтатиÑтика" @@ -1886,13 +1902,15 @@ msgstr "РаÑширенные" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:48 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:264 +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:29 #: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:34 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:360 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:516 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:307 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:341 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:377 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:344 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:378 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:534 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:325 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:359 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:370 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:397 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:362 msgid "Save changes" msgstr "Сохранить наÑтройки" @@ -1978,25 +1996,25 @@ msgstr "Обновление доли транзитного трафика" msgid "Updated bandwidth limits" msgstr "ÐаÑтройки ограничений ÑкороÑти Ñохранены" -#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:39 -#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:47 -#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:50 -#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:57 -#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:60 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:41 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:49 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:52 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:59 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:62 msgid "unknown" msgstr "неизвеÑтен" -#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:169 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:172 msgid "bits per second" msgstr "бит/Ñекунду" -#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:170 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:173 #, java-format msgid "or {0} bytes per month maximum" msgstr "или {0} байт/меÑÑц макÑимум" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:20 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:315 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:333 msgid "Ban peer until restart" msgstr "Забанить пира до перезапуÑка маршрутизатора" @@ -2016,7 +2034,7 @@ msgid "Invalid peer" msgstr "Ðекорректное опиÑание пира" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:28 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:317 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:335 msgid "Unban peer" msgstr "Разбанить пира" @@ -2029,7 +2047,7 @@ msgid "is not currently banned" msgstr "на данный момент не забанен" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:39 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:343 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:361 msgid "Adjust peer bonuses" msgstr "Изменить бонуÑÑ‹" @@ -2041,10 +2059,28 @@ msgstr "Ðекорректное значение ÑкороÑти" msgid "Bad capacity value" msgstr "Ðекорректное значение ёмкоÑти" +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:17 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:368 +msgid "Save changes and reseed now" +msgstr "Сохранить наÑтройки и выполнить начальную загрузку" + +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:21 +msgid "Reseeding is already in progress" +msgstr "Загрузка начального ÑпиÑка узлов (reseeding) уже в процеÑÑе" + +#. skip the nonce checking in ReseedHandler +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:24 +msgid "Starting reseed process" +msgstr "ЗапуÑкаетÑÑ Ð¿Ñ€Ð¾Ñ†ÐµÑÑ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸ начального ÑпиÑка узлов (reseed)" + +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:66 +msgid "Configuration saved successfully." +msgstr "ÐаÑтройки уÑпешно Ñохранены." + #. Normal browsers send value, IE sends button label #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:32 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:57 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:293 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:311 msgid "Shutdown immediately" msgstr "Выключить немедленно" @@ -2091,7 +2127,7 @@ msgid "Restart in {0}" msgstr "ПерезапуÑк через {0}" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:53 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:291 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:309 msgid "Shutdown gracefully" msgstr "Выключить плавно" @@ -2104,7 +2140,7 @@ msgid "Shutdown immediately! boom bye bye bad bwoy" msgstr "Выключаем немедленно!" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:61 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:295 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:313 msgid "Cancel graceful shutdown" msgstr "Отменить плавное выключение" @@ -2113,7 +2149,7 @@ msgid "Graceful shutdown cancelled" msgstr "Плавное отключение отменено" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:64 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:307 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:325 msgid "Graceful restart" msgstr "ПерезапуÑтить плавно" @@ -2122,7 +2158,7 @@ msgid "Graceful restart requested" msgstr "Запущен плавный перезапуÑк" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:68 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:309 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:327 msgid "Hard restart" msgstr "ПерезапуÑтить немедленно" @@ -2147,79 +2183,51 @@ msgid "Rekeying after graceful shutdown" msgstr "Смена ключа поÑле плавного выключениÑ" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:80 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:353 msgid "Run I2P on startup" msgstr "ЗапуÑкать I2P при Ñтарте" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:82 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:337 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:355 msgid "Don't run I2P on startup" msgstr "Ðе запуÑкать I2P при Ñтарте" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:84 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:355 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:373 msgid "Dump threads" msgstr "ВывеÑти ÑпиÑок потоков" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:91 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:323 -msgid "Show systray icon" -msgstr "Показать значок ÑтатуÑа" - -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:96 -msgid "System tray icon enabled." -msgstr "Включен значок-индикатор ÑтатуÑа в облаÑти уведомлений." - -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:98 -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:110 -msgid "System tray icon feature not supported on this platform. Sorry!" -msgstr "Вывод индикаторов в облаÑти уведомлений на Ñтой платформе не поддерживаетÑÑ. Извините!" - -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:101 -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:113 -msgid "Warning: unable to contact the systray manager" -msgstr "Предупреждение: Ðе удалоÑÑŒ ÑоединитьÑÑ Ñ Ð¼ÐµÐ½ÐµÐ´Ð¶ÐµÑ€Ð¾Ð¼ облаÑти уведомлений" - -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:103 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:325 -msgid "Hide systray icon" -msgstr "СпрÑтать значок ÑтатуÑа" - -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:108 -msgid "System tray icon disabled." -msgstr "Выключен значок-индикатор ÑтатуÑа в облаÑти уведомлений." - -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:115 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:363 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:381 msgid "View console on startup" msgstr "Открывать веб-конÑоль при запуÑке I2P" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:117 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:93 msgid "Console is to be shown on startup" msgstr "Веб-конÑоль будет открыватьÑÑ Ð¿Ñ€Ð¸ запуÑке I2P" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:118 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:365 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:94 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:383 msgid "Do not view console on startup" msgstr "Ðе открывать веб-конÑоль при запуÑке I2P" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:120 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:96 msgid "Console is not to be shown on startup" msgstr "Веб-конÑоль не будет открыватьÑÑ Ð¿Ñ€Ð¸ запуÑке I2P" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:129 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:105 msgid "Service installed" msgstr "Служба уÑтановлена" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:131 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:107 msgid "Warning: unable to install the service" msgstr "Предупреждение: не удалоÑÑŒ уÑтановить Ñлужбу" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:137 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:113 msgid "Service removed" msgstr "Служба удалена" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:139 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:115 msgid "Warning: unable to remove the service" msgstr "Предупреждение: не удалоÑÑŒ удалить Ñлужбу" @@ -2267,58 +2275,58 @@ msgstr[0] "{0} туннель" msgstr[1] "{0} туннелÑ" msgstr[2] "{0} туннелей" -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:26 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:35 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:41 msgid "Exploratory tunnels" msgstr "Зондирующие туннели" -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:46 -#: ../java/src/net/i2p/router/web/TunnelRenderer.java:61 -msgid "Client tunnels for" -msgstr "КлиентÑкие туннели длÑ:" +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:51 +#, java-format +msgid "Client tunnels for {0}" +msgstr "КлиентÑкие туннели Ð´Ð»Ñ {0}" -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:69 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:74 msgid "ANONYMITY WARNING - Settings include 0-hop tunnels." msgstr "ОПÐСÐО ДЛЯ ÐÐОÐИМÐОСТИ — ÐаÑтройки задают 0-хоповые туннели." -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:74 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:79 msgid "ANONYMITY WARNING - Settings include 1-hop tunnels." msgstr "ОПÐСÐО ДЛЯ ÐÐОÐИМÐОСТИ — ÐаÑтройки задают 1-хоповые туннели." -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:77 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82 msgid "PERFORMANCE WARNING - Settings include very long tunnels." msgstr "ОПÐСÐО ДЛЯ ПРОИЗВОДИТЕЛЬÐОСТИ — ÐаÑтройки задают Ñлишком длинные туннели." -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:80 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:85 msgid "PERFORMANCE WARNING - Settings include high tunnel quantities." msgstr "ОПÐСÐО ДЛЯ ПРОИЗВОДИТЕЛЬÐОСТИ — ÐаÑтройки задают Ñлишком большие количеÑтва туннелей." #. buf.append("<tr><th></th><th>Inbound</th><th>Outbound</th></tr>\n"); #. tunnel depth -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:87 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:92 msgid "Length" msgstr "Длина" #. tunnel depth variance -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:104 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:109 msgid "Randomization" msgstr "РазброÑ" #. tunnel quantity -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:128 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:133 msgid "Quantity" msgstr "КоличеÑтво" #. tunnel backup quantity -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:145 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:150 msgid "Backup quantity" msgstr "Резервное количеÑтво" -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:167 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:172 msgid "Inbound options" msgstr "Дополнительные параметры Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñщих" -#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:180 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:185 msgid "Outbound options" msgstr "Дополнительные параметры Ð´Ð»Ñ Ð¸ÑходÑщих" @@ -2331,87 +2339,91 @@ msgid "Refresh the page to view." msgstr "Обновите Ñтраницу Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра." #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51 +msgid "Arabic" +msgstr "ÐрабÑкий" + +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 msgid "English" msgstr "English" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 msgid "French" msgstr "Français" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 msgid "German" msgstr "Deutsch" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 msgid "Spanish" msgstr "ИÑпанÑкий" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53 msgid "Dutch" msgstr "Nederlands" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53 msgid "Portuguese" msgstr "ПортугальÑкий" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53 msgid "Russian" msgstr "РуÑÑкий" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:54 msgid "Chinese" msgstr "ä¸æ–‡" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:54 msgid "Swedish" msgstr "Svenska" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:88 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:85 msgid "Update available, attempting to download now" msgstr "ДоÑтупно обновление, пытаемÑÑ Ð·Ð°Ð³Ñ€ÑƒÐ·Ð¸Ñ‚ÑŒ" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:90 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:87 msgid "Update available, click button on left to download" msgstr "ДоÑтупно обновление, нажмите кнопку Ñлева Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:96 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:93 msgid "No update available" msgstr "Ðет доÑтупных обновлений" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:104 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:101 msgid "Updating news URL to" msgstr "Ðовый URL новоÑтей" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:112 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:109 msgid "Updating proxy host to" msgstr "Ðовый Ð°Ð´Ñ€ÐµÑ I2P-прокÑи" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:120 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:117 msgid "Updating proxy port to" msgstr "Ðовый порт I2P-прокÑи" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:133 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:130 msgid "Updating refresh frequency to" msgstr "Ðовый интервал проверки обновлений" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:140 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:137 msgid "Updating update policy to" msgstr "Ðовый режим обновлений" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:149 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:146 msgid "Updating update URLs." msgstr "Ðовые URL обновлений" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:158 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:155 msgid "Updating trusted keys." msgstr "Обновление ÑпиÑка доверенных ключей." -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:166 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:163 msgid "Updating unsigned update URL to" msgstr "Ðовый URL неподпиÑанной теÑтовой Ñборки" #: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:88 -#: ../java/src/net/i2p/router/web/GraphHelper.java:148 +#: ../java/src/net/i2p/router/web/GraphHelper.java:167 msgid "Never" msgstr "Ðикогда" @@ -2431,84 +2443,72 @@ msgstr "Только Ñкачать и проверить целоÑтноÑÑ‚ÑŒ msgid "Download, verify, and restart" msgstr "Скачать, проверить и обновить I2P" -#: ../java/src/net/i2p/router/web/FormHandler.java:174 +#: ../java/src/net/i2p/router/web/FormHandler.java:176 msgid "Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit." msgstr "Форма не принÑта, Ñкорее вÑего Ñто произошло из-за того, что Ð’Ñ‹ нажимали кнопку \"Ðазад\" или \"Обновить\" в браузере. ПожалуйÑта, заполните форму заново." -#: ../java/src/net/i2p/router/web/GraphHelper.java:87 +#: ../java/src/net/i2p/router/web/GraphHelper.java:93 msgid "Combined bandwidth graph" msgstr "График загрузки канала" #. e.g. "statname for 60m" -#: ../java/src/net/i2p/router/web/GraphHelper.java:101 +#: ../java/src/net/i2p/router/web/GraphHelper.java:107 #, java-format msgid "{0} for {1}" msgstr "{0} за {1}" -#: ../java/src/net/i2p/router/web/GraphHelper.java:138 +#: ../java/src/net/i2p/router/web/GraphHelper.java:146 msgid "Configure Graph Display" msgstr "ÐаÑтройка показа графиков" -#: ../java/src/net/i2p/router/web/GraphHelper.java:138 +#: ../java/src/net/i2p/router/web/GraphHelper.java:146 msgid "Select Stats" msgstr "Выбрать параметры" -#: ../java/src/net/i2p/router/web/GraphHelper.java:142 +#: ../java/src/net/i2p/router/web/GraphHelper.java:150 msgid "Periods" msgstr "КоличеÑтво интервалов" -#: ../java/src/net/i2p/router/web/GraphHelper.java:143 +#: ../java/src/net/i2p/router/web/GraphHelper.java:151 msgid "Plot averages" msgstr "Строить график Ñредних значений" -#: ../java/src/net/i2p/router/web/GraphHelper.java:144 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:417 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:333 +#: ../java/src/net/i2p/router/web/GraphHelper.java:152 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:435 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:351 msgid "or" msgstr "или" -#: ../java/src/net/i2p/router/web/GraphHelper.java:144 +#: ../java/src/net/i2p/router/web/GraphHelper.java:152 msgid "plot events" msgstr "Ñтроить график количеÑтва Ñобытий" -#: ../java/src/net/i2p/router/web/GraphHelper.java:145 +#: ../java/src/net/i2p/router/web/GraphHelper.java:153 msgid "Image sizes" msgstr "Размеры графиков" -#: ../java/src/net/i2p/router/web/GraphHelper.java:145 +#: ../java/src/net/i2p/router/web/GraphHelper.java:153 msgid "width" msgstr "ширина" -#: ../java/src/net/i2p/router/web/GraphHelper.java:146 +#: ../java/src/net/i2p/router/web/GraphHelper.java:154 msgid "height" msgstr "выÑота" -#: ../java/src/net/i2p/router/web/GraphHelper.java:146 -#: ../java/src/net/i2p/router/web/GraphHelper.java:147 +#: ../java/src/net/i2p/router/web/GraphHelper.java:154 +#: ../java/src/net/i2p/router/web/GraphHelper.java:155 msgid "pixels" msgstr "пикÑелей" -#: ../java/src/net/i2p/router/web/GraphHelper.java:148 +#: ../java/src/net/i2p/router/web/GraphHelper.java:156 msgid "Refresh delay" msgstr "Интервал обновлениÑ" -#: ../java/src/net/i2p/router/web/GraphHelper.java:148 -msgid "hour" -msgstr "чаÑ" - -#: ../java/src/net/i2p/router/web/GraphHelper.java:148 -msgid "minute" -msgstr "минута" - -#: ../java/src/net/i2p/router/web/GraphHelper.java:148 -msgid "minutes" -msgstr "минут(Ñ‹)" - -#: ../java/src/net/i2p/router/web/GraphHelper.java:149 +#: ../java/src/net/i2p/router/web/GraphHelper.java:171 msgid "Redraw" msgstr "ПерериÑовать" -#: ../java/src/net/i2p/router/web/GraphHelper.java:181 +#: ../java/src/net/i2p/router/web/GraphHelper.java:203 msgid "Graph settings saved" msgstr "ÐаÑтройки графиков Ñохранены" @@ -2525,71 +2525,71 @@ msgstr "Файл не найден" msgid "No log messages" msgstr "Ðет Ñообщений" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:80 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:79 msgid "Network Database RouterInfo Lookup" msgstr "ПроÑмотр RouterInfo" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:95 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:94 #: ../java/strings/Strings.java:68 msgid "Router" msgstr "Маршрутизатор" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:95 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:94 msgid "not found in network database" msgstr "не найден в Ñетевой базе данных" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:107 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:106 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:215 msgid "Network Database Contents" msgstr "ПроÑмотр Ñетевой базы данных" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:108 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:107 msgid "View RouterInfo" msgstr "Показать ÑпиÑок RouterInfo" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:109 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:108 msgid "LeaseSets" msgstr "СпиÑок LeaseSet" # This term intentionally left in English -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:131 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:130 msgid "LeaseSet" msgstr "LeaseSet" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:133 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:132 msgid "Local" msgstr "Локальный" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:135 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:134 msgid "Unpublished" msgstr "Ðеопубликованный" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:136 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:143 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:135 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:142 msgid "Destination" msgstr "ÐÐ´Ñ€ÐµÑ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:153 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:152 #, java-format msgid "Expires in {0}" msgstr "ИÑтекает через {0}" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:155 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:154 #, java-format msgid "Expired {0} ago" msgstr "ИÑтек {0} назад" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:167 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:166 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:156 msgid "Gateway" msgstr "Шлюз" # This term intentionally left in English -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:167 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:166 msgid "Lease" msgstr "Lease" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:169 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:168 msgid "Tunnel" msgstr "Туннель" @@ -2613,97 +2613,97 @@ msgstr "Показать полный ÑпиÑок" msgid "Show all routers with full stats" msgstr "Показать полный ÑпиÑок Ñ Ð¿Ð¾Ð»Ð½Ð¾Ð¹ ÑтатиÑтикой" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:265 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:266 msgid "Network Database Router Statistics" msgstr "СтатиÑтика маршрутизаторов" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:271 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:285 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:303 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:273 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:287 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:305 msgid "Count" msgstr "КоличеÑтво" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:285 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:287 msgid "Transports" msgstr "ТранÑпортный протокол" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:303 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:305 msgid "Country" msgstr "Страна" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:342 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:344 msgid "Our info" msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ наÑ" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:344 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:346 msgid "Peer info for" msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ пире" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:348 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:350 msgid "Full entry" msgstr "Показать полную запиÑÑŒ" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:354 -#: ../java/src/net/i2p/router/web/SummaryHelper.java:110 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:601 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:356 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:115 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:619 msgid "Hidden" msgstr "Скрытый" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:354 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:356 msgid "Updated" msgstr "Обновленный" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:355 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:358 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:357 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:360 #, java-format msgid "{0} ago" msgstr "{0} назад" #. shouldnt happen -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:357 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:361 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:359 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:363 msgid "Published" msgstr "Опубликовано" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:363 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:365 msgid "Address(es)" msgstr "ÐдреÑ(а)" # This term intentionally left in English -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:376 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:378 msgid "cost" msgstr "cost" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 msgid "Hidden or starting up" msgstr "Ð’ Ñкрытом режиме или недавно запущен" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 msgid "SSU" msgstr "SSU" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 msgid "SSU with introducers" msgstr "SSU через поÑредников" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404 msgid "NTCP" msgstr "NTCP" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404 msgid "NTCP and SSU" msgstr "NTCP и SSU" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:404 msgid "NTCP and SSU with introducers" msgstr "NTCP и SSU через поÑредников" -#: ../java/src/net/i2p/router/web/NewsFetcher.java:93 +#: ../java/src/net/i2p/router/web/NewsFetcher.java:92 #, java-format msgid "News last updated {0} ago." msgstr "ÐовоÑти поÑледний раз обновлÑлиÑÑŒ {0} назад." -#: ../java/src/net/i2p/router/web/NewsFetcher.java:99 +#: ../java/src/net/i2p/router/web/NewsFetcher.java:98 #, java-format msgid "News last checked {0} ago." msgstr "ÐовоÑти поÑледний раз проверÑлиÑÑŒ {0} назад." @@ -2738,132 +2738,132 @@ msgid "Downloading plugin" msgstr "ЗагружаетÑÑ Ð¿Ð»Ð°Ð³Ð¸Ð½" #: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:146 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:185 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:245 #, java-format msgid "{0}B transferred" msgstr "{0} байт Ñкачано" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:152 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:153 msgid "Plugin downloaded" msgstr "Плагин загружен" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:157 -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:344 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:158 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:356 #, java-format msgid "Cannot create plugin directory {0}" msgstr "Ðе удалоÑÑŒ Ñоздать директорию плагина {0}" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:166 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:226 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:167 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:299 #, java-format msgid "from {0}" msgstr "из {0}" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:176 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:177 #, java-format msgid "Plugin from {0} is corrupt" msgstr "Загруженный из {0} плагин поврежден" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:187 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:188 #, java-format msgid "Plugin from {0} does not contain the required configuration file" msgstr "Загруженный из {0} плагин не Ñодержит необходимого файла наÑтроек" #. updateStatus("<b>" + "Plugin contains an invalid key" + ' ' + pubkey + ' ' + signer + "</b>"); -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:200 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:201 #, java-format msgid "Plugin from {0} contains an invalid key" msgstr "Загруженный из {0} плагин Ñодержит некорректный ключ" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:219 -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:228 -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:237 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:225 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:235 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:249 #, java-format msgid "Plugin signature verification of {0} failed" msgstr "Плагин {0} Ñодержит недейÑтвительную подпиÑÑŒ" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:252 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:264 #, java-format msgid "Plugin from {0} has invalid name or version" msgstr "Загруженный из {0} плагин имеет некорректное название или верÑию" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:257 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:269 #, java-format msgid "Plugin {0} has mismatched versions" msgstr "Плагин {0} Ñодержит неÑовпадающие верÑии" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:265 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:277 #, java-format msgid "This plugin requires I2P version {0} or higher" msgstr "Ð”Ð»Ñ Ñтого плагина требуетÑÑ Ð²ÐµÑ€ÑÐ¸Ñ I2P {0} и выше" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:273 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:285 #, java-format msgid "This plugin requires Java version {0} or higher" msgstr "Ð”Ð»Ñ Ñтого плагина требуетÑÑ Ð²ÐµÑ€ÑÐ¸Ñ Java {0} и выше" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:281 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:293 msgid "Downloaded plugin is for new installs only, but the plugin is already installed" msgstr "Загруженный инÑталлÑтор плагина предназначен только Ð´Ð»Ñ Ð¿ÐµÑ€Ð²Ð¾Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð¾Ð¹ уÑтановки, но такой плагин уже уÑтановлен" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:293 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:305 msgid "Installed plugin does not contain the required configuration file" msgstr "УÑтановленный плагин не Ñодержит необходимого файла наÑтроек" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:301 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:313 msgid "Signature of downloaded plugin does not match installed plugin" msgstr "ПодпиÑÑŒ загруженного плагина не Ñовпадает Ñ ÑƒÑтановленным плагином" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:308 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:320 #, java-format msgid "Downloaded plugin version {0} is not newer than installed plugin" msgstr "ВерÑÐ¸Ñ Ñкачанного плагина {0} не новее верÑии уже уÑтановленного плагина" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:315 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:327 #, java-format msgid "Plugin update requires installed plugin version {0} or higher" msgstr "Ð”Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð° требуетÑÑ ÑƒÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð° {0} и выше" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:322 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:334 #, java-format msgid "Plugin update requires installed plugin version {0} or lower" msgstr "Ð”Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð° требуетÑÑ ÑƒÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð° {0} и ниже" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:339 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:351 msgid "Plugin is for upgrades only, but the plugin is not installed" msgstr "Загруженный инÑталлÑтор плагина предназначен только Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ, но такой плагин ещё не был уÑтановлен" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:352 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:364 #, java-format msgid "Failed to install plugin in {0}" msgstr "Ðе удалоÑÑŒ уÑтановить плагин в {0}" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:359 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:371 #, java-format msgid "Plugin {0} installed, router restart required" msgstr "Плагин {0} уÑтановлен, требуетÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк маршрутизатора" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:361 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:373 #, java-format msgid "Plugin {0} installed" msgstr "Плагин {0} уÑтановлен" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:379 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:391 #, java-format msgid "Plugin {0} installed and started" msgstr "Плагин {0} уÑтановлен и запущен" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:382 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:394 #, java-format msgid "Plugin {0} installed but failed to start, check logs" msgstr "Плагин {0} уÑтановлен, но при его запуÑке произошел Ñбой, заглÑните в логи" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:384 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:396 #, java-format msgid "Plugin {0} installed but failed to start" msgstr "Плагин {0} уÑтановлен, но при его запуÑке произошел Ñбой" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:394 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:406 #, java-format msgid "Failed to download plugin from {0}" msgstr "Ðе удалоÑÑŒ Ñкачать плагин из {0}" @@ -2874,37 +2874,46 @@ msgstr "Профили пиров" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:73 #, java-format -msgid "Showing {0} recent profiles." -msgstr "Показано {0} недавно обновленных профилей" +msgid "Showing 1 recent profile." +msgid_plural "Showing {0} recent profiles." +msgstr[0] "Показан {0} недавно обновленный профиль." +msgstr[1] "Показано {0} недавно обновленных профилÑ." +msgstr[2] "Показано {0} недавно обновленных профилей." #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:75 #, java-format -msgid "Hiding {0} older profiles." -msgstr "Скрыто {0} уÑтаревших профилей." +msgid "Hiding 1 older profile." +msgid_plural "Hiding {0} older profiles." +msgstr[0] "Скрыт {0} уÑтаревший профиль." +msgstr[1] "Скрыто {0} более Ñтарых профилÑ." +msgstr[2] "Скрыто {0} более Ñтарых профилей." #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:77 #, java-format -msgid "Hiding {0} standard profiles." -msgstr "Также Ñкрыто {0} Ñтандартных профилей (кликните Ð´Ð»Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°)." +msgid "Hiding 1 standard profile." +msgid_plural "Hiding {0} standard profiles." +msgstr[0] "Скрыт {0} Ñтандартный профиль." +msgstr[1] "Скрыто {0} Ñтандартный профилÑ." +msgstr[2] "Скрыто {0} Ñтандартных профилей." #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:82 msgid "Groups (Caps)" msgstr "Входит в группы (Caps)" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:83 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:251 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:335 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:252 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:353 msgid "Speed" msgstr "СкороÑÑ‚ÑŒ" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:84 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:253 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:339 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:254 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:357 msgid "Capacity" msgstr "ÐмкоÑÑ‚ÑŒ" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:85 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:255 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:256 msgid "Integration" msgstr "ИнтеграциÑ" @@ -2930,7 +2939,7 @@ msgid "Failing" msgstr "Сбоит" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:131 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:287 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:282 msgid "Integrated" msgstr "Интегрированные" @@ -2943,153 +2952,158 @@ msgstr "ÐедоÑтупен" msgid "Test Fails" msgstr "Ðеудачных теÑтов" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:175 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:177 msgid "profile" msgstr "профиль" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:184 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:186 msgid "Floodfill and Integrated Peers" msgstr "Floodfill и хорошо интегрированные пиры" # This term intentionally left in English -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:188 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:190 msgid "Caps" msgstr "Caps" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:189 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:191 msgid "Integ. Value" msgstr "Интег. Значение" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:190 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:192 msgid "Last Heard About" msgstr "ПоÑледний раз Ñлышали о" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:191 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:193 msgid "Last Heard From" msgstr "ПоÑледний приём" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:192 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:194 msgid "Last Good Send" msgstr "ПоÑледнÑÑ ÑƒÐ´Ð°Ñ‡Ð½Ð°Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð°" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:193 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:195 msgid "Last Bad Send" msgstr "ПоÑледнÑÑ Ð½ÐµÑƒÐ´Ð°Ñ‡Ð½Ð°Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð°" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:194 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:196 msgid "10m Resp. Time" msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¾Ñ‚ÐºÐ»Ð¸ÐºÐ° (поÑледние 10 мин)" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:195 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:197 msgid "1h Resp. Time" msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¾Ñ‚ÐºÐ»Ð¸ÐºÐ° (поÑледний 1 чаÑ)" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:196 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:198 msgid "1d Resp. Time" msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¾Ñ‚ÐºÐ»Ð¸ÐºÐ° (поÑледний 1 день)" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:197 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:199 msgid "Last Good Lookup" msgstr "ПоÑледний удачный поиÑк" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:198 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:200 msgid "Last Bad Lookup" msgstr "ПоÑледний неудачный поиÑк" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:199 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:201 msgid "Last Good Store" msgstr "ПоÑледнее удачное размещение" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:200 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:202 msgid "Last Bad Store" msgstr "ПоÑледнее неудачное размещение" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:201 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:203 msgid "1h Fail Rate" msgstr "Уровень отказов за 1 чаÑ" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:202 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:204 msgid "1d Fail Rate" msgstr "Уровень отказов за 1 день" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:250 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:251 msgid "Thresholds" msgstr "Пороговые значениÑ" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:252 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:253 msgid "fast peers" msgstr "быÑтрые пиры" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:254 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:255 msgid "high capacity peers" msgstr "выÑокоёмкие пиры" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:256 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:257 msgid " well integrated peers" msgstr "хорошо интегрированные пиры" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259 msgid "as determined by the profile organizer" msgstr "определÑетÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки модулем ProfileOrganizer на оÑновании Ñобранной информации о производительноÑти пира" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:258 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259 msgid "groups" msgstr "группы" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260 msgid "capabilities in the netDb, not used to determine profiles" msgstr "Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ пире, предоÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ñетевой базой данных; Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ иÑпользуетÑÑ" # This term intentionally left in English #. capabilities -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260 #: ../java/strings/Strings.java:81 msgid "caps" msgstr "caps" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261 msgid "peak throughput (bytes per second) over a 1 minute period that the peer has sustained in a single tunnel" msgstr "Ð¿Ð¸ÐºÐ¾Ð²Ð°Ñ ÑкороÑÑ‚ÑŒ (байты/Ñекунду) Ð²Ñ‹Ð´Ð°Ð½Ð½Ð°Ñ Ð¿Ð¸Ñ€Ð¾Ð¼ на одном туннеле за 1-минутый период" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261 msgid "speed" msgstr "ÑкороÑÑ‚ÑŒ" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262 msgid "capacity" msgstr "ёмкоÑÑ‚ÑŒ" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:261 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262 msgid "how many tunnels can we ask them to join in an hour?" msgstr "к Ñкольким туннелÑм мы можем попроÑить Ñтого пира подÑоединитьÑÑ Ð·Ð° чаÑ?" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263 msgid "how many new peers have they told us about lately?" msgstr "о Ñкольких новых пирах Ñтот пир нам Ñообщил в поÑледнее времÑ?" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:262 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263 msgid "integration" msgstr "интеграциÑ" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:264 msgid "is the peer banned, or unreachable, or failing tunnel tests?" msgstr "забанен ли Ñтот пир, недоÑтупен, дает ошибки на теÑтах?" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:263 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:264 msgid "status" msgstr "ÑтатуÑ" -#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:57 +#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:47 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:410 +msgid "none" +msgstr "нет" + +#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:62 #, java-format msgid "Temporary ban expiring in {0}" msgstr "Временный бан иÑтекает через {0}" -#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:59 +#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:64 #, java-format msgid "Banned until restart or in {0}" msgstr "Забанен до перезапуÑка или иÑÑ‚ÐµÑ‡ÐµÐ½Ð¸Ñ {0}" -#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:71 +#: ../java/src/net/i2p/router/web/ShitlistRenderer.java:76 msgid "unban now" msgstr "разбанить" @@ -3144,20 +3158,20 @@ msgstr "Собираемые данные округлÑÑŽÑ‚ÑÑ Ð·Ð° 1-мину msgid "These statistics are primarily used for development and debugging." msgstr "Ðта ÑтатиÑтика в оÑновном иÑпользуетÑÑ Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ и отладки." -#: ../java/src/net/i2p/router/web/StatsGenerator.java:105 -#: ../java/src/net/i2p/router/web/StatsGenerator.java:156 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:106 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:157 msgid "No lifetime events" msgstr "Ðет Ñобытий за Ð²Ñ€ÐµÐ¼Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:116 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:117 msgid "frequency" msgstr "чаÑтота" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:120 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:121 msgid "Rolling average events per period" msgstr "СкользÑщее Ñреднее количеÑтво Ñобытий за период" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:124 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:125 msgid "Highest events per period" msgstr "МакÑимально количеÑтво Ñобытий за период" @@ -3168,58 +3182,75 @@ msgstr "МакÑимально количеÑтво Ñобытий за пери #. } #. buf.append(" <i>avg interval between updates:</i> (").append(num(curFreq.getAverageInterval())).append("ms, min "); #. buf.append(num(curFreq.getMinAverageInterval())).append("ms)"); -#: ../java/src/net/i2p/router/web/StatsGenerator.java:135 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:136 msgid "Lifetime average events per period" msgstr "Среднее количеÑтво Ñобытий за период" #. Display the strict average -#: ../java/src/net/i2p/router/web/StatsGenerator.java:140 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:141 msgid "Lifetime average frequency" msgstr "СреднÑÑ Ñ‡Ð°Ñтота за Ð²Ñ€ÐµÐ¼Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:168 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:144 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:234 +#, java-format +msgid "1 event" +msgid_plural "{0} events" +msgstr[0] "{0} Ñобытие" +msgstr[1] "{0} ÑобытиÑ" +msgstr[2] "{0} Ñобытий" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:169 msgid "rate" msgstr "интервал" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:170 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:171 msgid "Average" msgstr "Среднее" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:173 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:174 msgid "Highest average" msgstr "МакÑимальное Ñреднее" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:202 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:201 +#, java-format +msgid "There was 1 event in this period." +msgid_plural "There were {0} events in this period." +msgstr[0] "Было {0} Ñобытие в Ñтом периоде." +msgstr[1] "Было {0} ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð² Ñтом периоде." +msgstr[2] "Было {0} Ñобытий в Ñтом периоде." + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:203 #, java-format -msgid "in this period which ended {0} ago." -msgstr "в Ñтом периоде который закончилÑÑ {0} назад." +msgid "The period ended {0} ago." +msgstr "Период закончилÑÑ {0} назад." -#: ../java/src/net/i2p/router/web/StatsGenerator.java:204 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:205 msgid "No events" msgstr "Ðет Ñобытий" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:210 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:211 msgid "Average event count" msgstr "Среднее чиÑло Ñобытий" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:212 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:213 msgid "Events in peak period" msgstr "Событий за период пика" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:220 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:221 msgid "Graph Data" msgstr "График данных" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:222 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:223 msgid "Graph Event Count" msgstr "График количеÑтва Ñобытий" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:225 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:226 msgid "Export Data as XML" msgstr "ÐкÑпорт данных в XML" #. Display the strict average -#: ../java/src/net/i2p/router/web/StatsGenerator.java:230 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:231 msgid "Lifetime average value" msgstr "Среднее значение за Ð²Ñ€ÐµÐ¼Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹" @@ -3280,12 +3311,12 @@ msgid "I2P Internals" msgstr "ÐаÑтройки I2P" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:99 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:384 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:379 msgid "View existing tunnels and tunnel build status" msgstr "Обзор ÑпиÑка ÑущеÑтвующих туннелей и ÑтатуÑа ÑтроÑщихÑÑ" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:105 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:258 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:253 msgid "Show all current peer connections" msgstr "ПроÑмотр ÑпиÑка текущих ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Ð¿Ð¸Ñ€Ð°Ð¼Ð¸" @@ -3327,7 +3358,7 @@ msgid "Textual router performance statistics" msgstr "СтатиÑтика производительноÑти маршрутизатора в текÑтовом виде" #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:147 -#: ../java/src/net/i2p/router/web/SummaryHelper.java:365 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:370 msgid "Local Destinations" msgstr "Локальные туннели" @@ -3372,203 +3403,205 @@ msgstr "Ð’Ñ€ÐµÐ¼Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹" msgid "Help with configuring your firewall and router for optimal I2P performance" msgstr "Помощь в наÑтройке брандмауÑра и маршрутизатора Ð´Ð»Ñ Ð¾Ð±ÐµÑÐ¿ÐµÑ‡ÐµÐ½Ð¸Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð¾Ð¹ производительноÑти I2P" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:231 -msgid "Download" -msgstr "Скачать" +#. Note to translators: parameter is a version, e.g. "0.8.4" +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:232 +#, java-format +msgid "Download {0} Update" +msgstr "Скачать обновление {0}" +#. Note to translators: parameter is a date and time, e.g. "02-Mar 20:34 UTC" +#. <br> is optional, to help the browser make the lines even in the button +#. If the translation is shorter than the English, you should probably not include <br> #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:240 -msgid "Download Unsigned" -msgstr "Скачать неподпиÑанное" +#, java-format +msgid "Download Unsigned<br>Update {0}" +msgstr "Скачать неподпиÑанное<br>обновление {0}" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:266 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:261 msgid "Active" msgstr "Ðктивные" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:275 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:270 msgid "Fast" msgstr "БыÑтрые" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:281 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:276 msgid "High capacity" msgstr "Ð’Ñ‹Ñокоёмкие" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:293 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:288 msgid "Known" msgstr "ИзвеÑтные" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:308 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:303 msgid "Help with firewall configuration" msgstr "Помощь в наÑтройке брандмауÑра" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:310 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:305 msgid "Check NAT/firewall" msgstr "Проверьте наÑтройки NAT/брандмауÑров." -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:330 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:325 msgid "Reseed" msgstr "Повторить начальную загрузку" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:347 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:342 msgid "Configure router bandwidth allocation" msgstr "ÐаÑтройка ограничений ÑкороÑти" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:349 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:344 msgid "Bandwidth in/out" msgstr "Трафик (вх./иÑÑ….)" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:369 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:364 msgid "Total" msgstr "Ð’Ñего" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:376 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:371 msgid "Used" msgstr "Объём" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:391 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:386 msgid "Exploratory" msgstr "Зондирующие" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:403 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:398 msgid "Participating" msgstr "Транзитные" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:409 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:404 msgid "Share ratio" msgstr "Ð”Ð¾Ð»Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð¸Ñ‚Ð°" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:415 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:410 msgid "What's in the router's job queue?" msgstr "ПроÑмотр очереди заданий маршрутизатора." -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:417 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:412 msgid "Congestion" msgstr "ЗанÑтоÑÑ‚ÑŒ" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:422 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:417 msgid "Job lag" msgstr "Задержка задач" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:428 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:423 msgid "Message delay" msgstr "Задежка Ñообщений" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:434 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:429 msgid "Tunnel lag" msgstr "Задержка туннелей" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:440 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:435 msgid "Backlog" msgstr "Очередь" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:101 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:106 msgid "ERR-Client Manager I2CP Error - check logs" msgstr "ОШИБКР- ошибка менеджера I2CP - заглÑните в логи" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:108 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:113 #, java-format msgid "ERR-Clock Skew of {0}" msgstr "ОШИБКР- ЧаÑÑ‹ Ñбиты (раÑхождение {0})" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:117 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:577 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:122 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:595 msgid "OK" msgstr "OK" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:118 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:123 msgid "ERR-Private TCP Address" msgstr "ОШИБКР- ЧаÑтный TCP ÐдреÑ" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:120 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:125 msgid "ERR-SymmetricNAT" msgstr "ОШИБКР- Симмметричный NAT" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:123 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:128 msgid "WARN-Firewalled with Inbound TCP Enabled" msgstr "ПРЕДУПРЕЖДЕÐИЕ - Заблокирован извне при включенном на вход TCP" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:125 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:130 msgid "WARN-Firewalled and Floodfill" msgstr "ПРЕДУПРЕЖДЕÐИЕ - Заблокирован извне и Floodfill" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:127 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:132 msgid "WARN-Firewalled and Fast" msgstr "ПРЕДУПРЕЖДЕÐИЕ - Заблокирован извне и БыÑтрый" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:128 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:581 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:133 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:599 msgid "Firewalled" msgstr "Заблокирован извне" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:130 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:135 msgid "ERR-UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart" msgstr "ОШИБКР- UDP-порт уже занÑÑ‚ - перенаÑтройте i2np.udp.internalPort=xxxx в дополнительных наÑтройках и перезапуÑтите маршрутизатор" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:136 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:141 msgid "ERR-No Active Peers, Check Network Connection and Firewall" msgstr "ОШИБКР- Ðет активных пиров, проверьте подключение к Ñети и брандмауÑÑ€" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:139 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:144 msgid "ERR-UDP Disabled and Inbound TCP host/port not set" msgstr "ОШИБКР- UDP отключено и не заданы адреÑ/порт Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñщих TCP-Ñоединений" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:141 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:146 msgid "WARN-Firewalled with UDP Disabled" msgstr "ПРЕДУПРЕЖДЕÐИЕ - Заблокирован извне при отключенном UDP" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:143 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:597 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:148 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:615 msgid "Testing" msgstr "Проверка" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:365 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:370 msgid "Add/remove/edit & control your client and server tunnels" msgstr "Управление клиентÑкими и Ñерверными туннелÑми" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:377 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:382 msgid "Server" msgstr "Сервер" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:381 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:386 msgid "Show tunnels" msgstr "Перейти к ÑпиÑку туннелей" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:392 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:397 msgid "Leases expired" msgstr "Срок аренды иÑтек" #. red or yellow light -#: ../java/src/net/i2p/router/web/SummaryHelper.java:392 -#: ../java/src/net/i2p/router/web/SummaryHelper.java:393 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:397 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:398 msgid "Rebuilding" msgstr "ПоÑтроение заново" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:393 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:398 msgid "ago" msgstr "назад" #. green light -#: ../java/src/net/i2p/router/web/SummaryHelper.java:396 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:401 msgid "Ready" msgstr "Готов к работе" #. yellow light -#: ../java/src/net/i2p/router/web/SummaryHelper.java:400 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:405 msgid "Building" msgstr "ПоÑтроение" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:400 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:405 msgid "Building tunnels" msgstr "ПоÑтроение туннелей" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:405 -msgid "none" -msgstr "нет" - #. tunnel nicknames, taken from i2ptunnel.config so they will display #. nicely under 'local destinations' in the summary bar #. note that if the wording changes in i2ptunnel.config, we have to #. keep the old string here as well for existing installs -#: ../java/src/net/i2p/router/web/SummaryHelper.java:416 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:421 #: ../java/strings/Strings.java:36 msgid "shared clients" msgstr "коллективные клиенты" @@ -3598,10 +3631,14 @@ msgstr "текущ." #: ../java/src/net/i2p/router/web/TunnelRenderer.java:41 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:63 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:287 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:309 msgid "configure" msgstr "наÑтроить" +#: ../java/src/net/i2p/router/web/TunnelRenderer.java:61 +msgid "Client tunnels for" +msgstr "КлиентÑкие туннели длÑ:" + #: ../java/src/net/i2p/router/web/TunnelRenderer.java:65 msgid "dead" msgstr "мертв" @@ -3726,59 +3763,70 @@ msgstr "Транзитных туннелей" msgid "Totals" msgstr "Ð’Ñего" -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:66 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:132 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:145 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:178 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:67 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:143 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:238 msgid "Updating" msgstr "ЗагружаетÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ðµ" -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:88 -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:111 -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:116 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:189 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:214 +#. Process the .sud/.su2 file +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:89 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:112 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:117 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:262 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:287 msgid "Update downloaded" msgstr "Обновление загружено" -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:91 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:92 #, java-format msgid "Unsigned update file from {0} is corrupt" msgstr "Обнаружено повреждение в неподпиÑанном обновлении загруженном из {0}" -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:111 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:209 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:112 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:282 msgid "Restarting" msgstr "ПроизводитÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк" -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:118 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:216 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:119 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:289 msgid "Click Restart to install" msgstr "ПерезапуÑтите I2P-маршрутизатор Ð´Ð»Ñ ÑƒÑтановки" -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:120 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:218 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:121 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:291 msgid "Click Shutdown and restart to install" msgstr "ОÑтановите и Ñнова запуÑтите I2P-маршрутизатор Ð´Ð»Ñ ÑƒÑтановки" -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:121 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:220 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:122 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:293 #, java-format msgid "Version {0}" msgstr "ВерÑÐ¸Ñ {0}" -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:126 +#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:127 #, java-format msgid "Failed copy to {0}" msgstr "Ðе удалоÑÑŒ Ñкопировать в {0}" -#: ../java/src/net/i2p/router/web/UpdateHandler.java:209 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:185 +#, java-format +msgid "Updating from {0}" +msgstr "Обновление из {0}" + +#: ../java/src/net/i2p/router/web/UpdateHandler.java:254 +#, java-format +msgid "No new version found at {0}" +msgstr "ÐÐ¾Ð²Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð½Ðµ обнаружена на {0}" + +#: ../java/src/net/i2p/router/web/UpdateHandler.java:282 msgid "Update verified" msgstr "ПодлинноÑÑ‚ÑŒ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐµÐ½Ð°" -#: ../java/src/net/i2p/router/web/UpdateHandler.java:234 -msgid "Transfer failed" -msgstr "Ðе удалоÑÑŒ загрузить" +#: ../java/src/net/i2p/router/web/UpdateHandler.java:308 +#, java-format +msgid "Transfer failed from {0}" +msgstr "Ðе удалоÑÑŒ произвеÑти передачу файлов от {0}" #. wars for ConfigClientsHelper #: ../java/strings/Strings.java:12 @@ -4052,1198 +4100,1451 @@ msgstr "ÐÐ¸Ð·ÐºÐ¾ÑƒÑ€Ð¾Ð²Ð½ÐµÐ²Ð°Ñ ÑкороÑÑ‚ÑŒ передачи" msgid "How many peers we are actively talking with" msgstr "КоличеÑтво пиров, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼Ð¸ мы активно общаемÑÑ" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:112 msgid "config networking" msgstr "наÑтройки Ñети" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:224 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:237 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:224 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:234 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005ffr_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:231 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:222 +msgid "Summary Bar" +msgstr "Панель ÑоÑтоÑниÑ" + #. We have intl defined when this is included, but not when compiled standalone. -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:217 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:230 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:217 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:227 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:222 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:215 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:215 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:215 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:215 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:215 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:215 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:234 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:215 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:237 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:250 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:237 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:247 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:236 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005ffr_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:244 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:242 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:235 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:235 msgid "Refresh (s)" msgstr "Интервал автообновлениÑ<br> панели (Ñек.)" #. ditto -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:221 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:234 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:221 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:223 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:231 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:223 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:223 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:223 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:226 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:223 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:223 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:219 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:237 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:219 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:241 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:254 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:241 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:251 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005ffr_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:248 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:245 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:239 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:239 msgid "Enable" msgstr "Включить" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:262 msgid "I2P Network Configuration" msgstr "ÐаÑтройки Ñетевых ÑвойÑтв I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:298 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:316 msgid "Bandwidth limiter" msgstr "Ограничение ÑкороÑти" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:300 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:318 msgid "I2P will work best if you configure your rates to match the speed of your internet connection." msgstr "I2P будет работать лучше, еÑли Ð’Ñ‹ наÑтроите ограничение ÑкороÑти в ÑоответÑтвии Ñо ÑкороÑтью Вашего Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº Интернету." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:304 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:322 msgid "KBps In" msgstr "Килобайт/Ñекунду (на приём)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:318 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:336 msgid "KBps Out" msgstr "Килобайт/Ñекунду (на отдачу)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:334 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:352 msgid "Share" msgstr "Ð”Ð¾Ð»Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð¸Ñ‚Ð½Ð¾Ð³Ð¾ трафика" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:341 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:309 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:304 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:359 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:327 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:326 msgid "NOTE" msgstr "ПРИМЕЧÐÐИЕ" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:343 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:361 #, java-format msgid "You have configured I2P to share only {0} KBps." msgstr "Ð’Ñ‹ наÑтроили очень низкий лимит Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð¸Ñ‚Ð½Ð¾Ð³Ð¾ трафика (вÑего {0} килобайт/Ñекунду)." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:346 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:364 msgid "I2P requires at least 12KBps to enable sharing. " msgstr "I2P нужно как минимум 12 килобайт/Ñекунду Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñтой функции. " -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:347 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:365 msgid "Please enable sharing (participating in tunnels) by configuring more bandwidth. " msgstr "ПожалуйÑта, повыÑьте долю транзитного трафика. " -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:348 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:366 msgid "It improves your anonymity by creating cover traffic, and helps the network." msgstr "Ðто одновременно повыÑит Вашу анонимноÑÑ‚ÑŒ (Ð±Ð»Ð°Ð³Ð¾Ð´Ð°Ñ€Ñ Ð¼Ð°Ñкирующему транзитному трафику) и поможет Ñети." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:351 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:369 #, java-format msgid "You have configured I2P to share {0} KBps." msgstr "Ð’Ñ‹ задали долю транзитного трафика {0} килобайт/Ñекунду." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:354 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:372 msgid "The higher the share bandwidth the more you improve your anonymity and help the network." msgstr "Чем выше Ð´Ð¾Ð»Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð¸Ñ‚Ð½Ð¾Ð³Ð¾ трафика, тем выше Ваша анонимноÑÑ‚ÑŒ и больше Ваша помощь Ñети." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:358 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:514 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:305 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:327 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:321 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:339 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:375 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:342 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:322 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:365 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:376 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:532 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:323 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:347 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:425 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:339 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:357 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:366 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:395 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:360 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:351 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:383 msgid "Cancel" msgstr "Отменить" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:375 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:393 msgid "IP and Transport Configuration" msgstr "ÐаÑтройки IP и транÑпортных протоколов" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:377 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:395 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:417 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:324 msgid "The default settings will work for most people." msgstr "БольшинÑтву пользователей подойдут наÑтройки по умолчанию." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:379 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:397 msgid "There is help below." msgstr "Ð’ конце Ñтраницы приведена Ñправка по наÑтройкам." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:381 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:399 msgid "UPnP Configuration" msgstr "ÐаÑтройки UPnP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:385 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:403 msgid "Enable UPnP to open firewall ports" msgstr "ИÑпользовать UPnP Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкого Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð¿Ð¾Ñ€Ñ‚Ð¾Ð² на брандмауÑре/роутере" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:387 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:405 msgid "UPnP status" msgstr "ÑÑ‚Ð°Ñ‚ÑƒÑ UPnP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:389 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:407 msgid "IP Configuration" msgstr "ÐаÑтройки IP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:391 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:461 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:409 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:479 msgid "Externally reachable hostname or IP address" msgstr " Ð˜Ð¼Ñ Ñ…Ð¾Ñта или IP-Ð°Ð´Ñ€ÐµÑ Ð´Ð¾Ñтупные из интернета" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:395 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:413 msgid "Use all auto-detect methods" msgstr "ОпределÑÑ‚ÑŒ автоматичеÑки вÑеми доÑтупными ÑпоÑобами" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:399 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:417 msgid "Disable UPnP IP address detection" msgstr "ОпределÑÑ‚ÑŒ автоматичеÑки (без иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ UPnP)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:403 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:421 msgid "Ignore local interface IP address" msgstr "ОпределÑÑ‚ÑŒ автоматичеÑки (без иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ IP-адреÑов локальных Ñетевых интерфейÑов)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:407 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:425 msgid "Use SSU IP address detection only" msgstr "ОпределÑÑ‚ÑŒ автоматичеÑки (только через SSU)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:411 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:479 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:429 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:497 msgid "Specify hostname or IP" msgstr "Задать хоÑÑ‚ или IP вручную" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:417 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:435 msgid "Select Interface" msgstr "Выбрать Ñетевой интерфейÑ" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:431 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:449 msgid "Hidden mode - do not publish IP" msgstr "Скрытый режим, не публиковать IP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:433 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:451 msgid "(prevents participating traffic)" msgstr "(такой режим предотвращает транзит трафика)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:435 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:453 msgid "Action when IP changes" msgstr "ДейÑтвие при Ñмене IP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:439 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:457 msgid "Laptop mode - Change router identity and UDP port when IP changes for enhanced anonymity" msgstr "Режим мобильного компьютера: автоматичеÑки менÑÑ‚ÑŒ идентификатор маршрутизатора и UDP-порт поÑле Ñмены IP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:441 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:459 msgid "Experimental" msgstr "ÑкÑпериментальный режим, повышает анонимноÑÑ‚ÑŒ" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:443 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:461 msgid "UDP Configuration:" msgstr "ÐаÑтройки UDP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:445 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:463 msgid "UDP port:" msgstr "UDP-порт:" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:459 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:477 msgid "TCP Configuration" msgstr "ÐаÑтройки TCP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:465 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:483 msgid "Use auto-detected IP address" msgstr "ИÑпользовать автоматичеÑки определенный IP-адреÑ" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:467 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:499 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:485 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:517 msgid "currently" msgstr "ÑейчаÑ" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:471 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:489 msgid "if we are not firewalled" msgstr "еÑли входÑщий порт не заблокирован" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:475 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:493 msgid "Always use auto-detected IP address (Not firewalled)" msgstr "Ð’Ñегда иÑпользовать автоматичеÑки определенный IP-адреÑ" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:485 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:503 msgid "Disable inbound (Firewalled)" msgstr "Отключить поддержку входÑщих Ñоединений" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:489 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:507 msgid "Completely disable" msgstr "ПолноÑтью отключить поддержку TCP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:491 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:509 msgid "(select only if behind a firewall that throttles or blocks outbound TCP)" msgstr "(иÑпользуйте Ñтот режим только при наличии в ÑиÑтеме брандмауÑра, который замедлÑет или блокирует иÑходÑщие TCP-ÑоединениÑ)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:493 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:511 msgid "Externally reachable TCP port" msgstr "ДоÑтупный из интернета TCP-порт" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:497 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:515 msgid "Use the same port configured for UDP" msgstr "ИÑпользовать наÑтройки UDP-порта" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:505 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:523 msgid "Specify Port" msgstr "Задать порт вручную" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:509 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:339 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:330 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:527 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:357 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:348 msgid "Note" msgstr "Ð’ÐИМÐÐИЕ" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:512 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:530 msgid "Changing these settings will restart your router." msgstr "Изменение Ñтих наÑтроек повлечет перезапуÑк I2P маршрутизатора." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:518 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:536 msgid "Configuration Help" msgstr "Справка по наÑтройкам Ñети" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:520 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:569 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:538 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:587 msgid "While I2P will work fine behind most firewalls, your speeds and network integration will generally improve if the I2P port is forwarded for both UDP and TCP." msgstr "Ð¥Ð¾Ñ‚Ñ I2P без проблем работает за большинÑтвом брандмауÑров, ÑкороÑÑ‚ÑŒ и уровень интеграции в Ñеть будут гораздо лучше, еÑли открыть порт Вашего I2P-маршрутизатора Ð´Ð»Ñ UDP и TCP Ñоединений из интернета." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:522 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:540 msgid "If you can, please poke a hole in your firewall to allow unsolicited UDP and TCP packets to reach you." msgstr "Попробуйте открыть доÑтуп на Вашем брандмауÑре Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð»ÑŒÐ½Ñ‹Ñ… входÑщих UDP и TCP пакетов на порт I2P." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:524 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:542 msgid "If you can't, I2P supports UPnP (Universal Plug and Play) and UDP hole punching with \"SSU introductions\" to relay traffic." msgstr "Ðичего Ñтрашного, еÑли такой возможноÑти нет. I2P поддерживает UPnP (Universal Plug and Play) и обход NAT Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ SSU-поÑредников." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:526 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:544 msgid "Most of the options above are for special situations, for example where UPnP does not work correctly, or a firewall not under your control is doing harm." msgstr "ÐаÑтройки выше, в оÑновном, предназначены Ð´Ð»Ñ Ð¾Ñобых Ñитуаций. Ðапример, некорректно Ñработал UPnP или возник конфликт брандмауÑра и I2P." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:528 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:546 msgid "Certain firewalls such as symmetric NATs may not work well with I2P." msgstr "Ðекоторые виды брандмауÑров могут быть чаÑтично неÑовмеÑтимы Ñ I2P (например, Ñимметричные NAT)." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:537 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:555 msgid "UPnP is used to communicate with Internet Gateway Devices (IGDs) to detect the external IP address and forward ports." msgstr "UPnP иÑпользуетÑÑ Ð´Ð»Ñ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ Ñ IGD (Internet Gateway Devices) при определении внешнего IP-адреÑа и переадреÑации портов." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:539 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:557 msgid "UPnP support is beta, and may not work for any number of reasons" msgstr "Поддержка UPnP находитÑÑ Ð² разработке (бета-верÑиÑ). Ð’ Ñледующих ÑлучаÑÑ… UPnP возможно не будет работать" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:541 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:559 msgid "No UPnP-compatible device present" msgstr "Ðе обнаружено UPnP-ÑовмеÑтимых уÑтройÑтв" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:543 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:561 msgid "UPnP disabled on the device" msgstr "UPnP отключено на уÑтройÑтве" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:545 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:563 msgid "Software firewall interference with UPnP" msgstr "Программный брандмауÑÑ€ мешает корректной работе UPnP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:547 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:565 msgid "Bugs in the device's UPnP implementation" msgstr "UPnP в уÑтройÑтве реализовано Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°Ð¼Ð¸ " -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:549 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:567 msgid "Multiple firewall/routers in the internet connection path" msgstr "ÐеÑколько маршрутизаторов/брандмауÑров на пути к интернету" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:551 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:569 msgid "UPnP device change, reset, or address change" msgstr "Смена/ÑÐ±Ñ€Ð¾Ñ UPnP-уÑтройÑтва или изменение адреÑа " -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:553 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:571 msgid "Review the UPnP status here." msgstr "ПоÑмотреть ÑÑ‚Ð°Ñ‚ÑƒÑ UPnP можно тут." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:555 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:573 msgid "UPnP may be enabled or disabled above, but a change requires a router restart to take effect." msgstr "UPnP можно включить/выключить в наÑтройках выше. ÐаÑтройка вÑтупит в Ñилу только поÑле перезапуÑка I2P-маршрутизатора." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:557 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:575 msgid "Hostnames entered above will be published in the network database." msgstr "ЕÑли Ð’Ñ‹ задали вручную имена хоÑтов, они будут опубликованы в Ñетевой базе." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:559 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:577 msgid "They are <b>not private</b>." msgstr "<b>Ðе вводите локальные внутриÑетевые имена.</b>" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:561 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:579 msgid "Also, <b>do not enter a private IP address</b> like 127.0.0.1 or 192.168.1.1." msgstr "Также <b>не вводите IP из локальных диапазонов</b>, такие как 127.0.0.1 или 192.168.1.1." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:563 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:581 msgid "If you specify the wrong IP address or hostname, or do not properly configure your NAT or firewall, your network performance will degrade substantially." msgstr "ПроизводительноÑÑ‚ÑŒ Вашего ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ I2P-Ñетью может Ñильно поÑтрадать, еÑли Ð’Ñ‹ введете неверный IP-адреÑ, неверное Ð¸Ð¼Ñ Ñ…Ð¾Ñта или неправильно наÑтроите NAT/брандмауÑÑ€." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:565 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:583 msgid "When in doubt, leave the settings at the defaults." msgstr "ЕÑли ÑомневаетеÑÑŒ — оÑтавьте наÑтройки по умолчанию." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:567 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:585 msgid "Reachability Help" msgstr "Справка по ÑтатуÑу Ñетевой доÑтупноÑти" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:572 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:590 msgid "If you think you have opened up your firewall and I2P still thinks you are firewalled, remember that you may have multiple firewalls, for example both software packages and external hardware routers." msgstr "Возможно Ð’Ñ‹ ÑобÑтвенноручно открыли порт на Вашем брандмауÑре, а I2P вÑе еще показывает, что порт закрыт. Имейте в виду, что брандмауÑров может быть неÑколько, например, локальный программный и внешний аппаратный." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:575 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:593 msgid "If there is an error, the <a href=\"logs.jsp\">logs</a> may also help diagnose the problem." msgstr "Ð’ Ñлучае ошибок <a href=\"logs.jsp\">логи</a> могут помочь диагноÑтировать проблему." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:579 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:597 msgid "Your UDP port does not appear to be firewalled." msgstr "Ваш UDP-порт доÑтупен извне." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:583 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:601 msgid "Your UDP port appears to be firewalled." msgstr "Ваш UDP-порт заблокирован брандмауÑром и не может принимать входÑщие ÑоединениÑ." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:585 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:603 msgid "As the firewall detection methods are not 100% reliable, this may occasionally be displayed in error." msgstr "Иногда Ñто Ñообщение не ÑоответÑтвует дейÑтвительноÑти (методы Ð¾Ð±Ð½Ð°Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð±Ñ€Ð°Ð½Ð´Ð¼Ð°ÑƒÑров пока не идеальны)." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:587 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:605 msgid "However, if it appears consistently, you should check whether both your external and internal firewalls are open for your port." msgstr "Ðо еÑли оно поÑвлÑетÑÑ Ð¿Ð¾ÑтоÑнно, Вам Ñледует проверить, что на вÑех брандмауÑрах порт Ð´Ð»Ñ I2P открыт." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:589 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:607 msgid "I2P will work fine when firewalled, there is no reason for concern. When firewalled, the router uses \"introducers\" to relay inbound connections." msgstr "Повода Ð´Ð»Ñ Ð¿Ð°Ð½Ð¸ÐºÐ¸ нет, I2P Ñможет работать даже Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ñ‹Ð¼ портом при помощи заранее выбранных «поÑредников» Ð´Ð»Ñ Ñ€ÐµÑ‚Ñ€Ð°Ð½ÑлÑции входÑщих Ñоединений." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:591 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:609 msgid "However, you will get more participating traffic and help the network more if you can open your firewall(s)." msgstr "С другой Ñтороны, при работе Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ñ‹Ð¼ портом Ð’Ñ‹ получите гораздо больше транзитного трафика и Ñможете помочь Ñети." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:593 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:611 msgid "If you think you have already done so, remember that you may have both a hardware and a software firewall, or be behind an additional, institutional firewall you cannot control." msgstr "Возможно Ð’Ñ‹ ÑобÑтвенноручно открыли порт на Вашем брандмауÑре, но ошибка вÑÑ‘ равно поÑвлÑетÑÑ. Имейте в виду, что Ð’Ñ‹ можете быть одновременно за программным и аппаратным брандмауÑрами или за дополнительным корпоративным брандмауÑром (который Ð’Ñ‹ не можете контролировать)." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:595 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:613 msgid "Also, some routers cannot correctly forward both TCP and UDP on a single port, or may have other limitations or bugs that prevent them from passing traffic through to I2P." msgstr "Кроме того, некоторые маршрутизаторы не могут корректно переадреÑовать одновременно TCP и UDP на один порт или имеют другие ограничениÑ, мешающие нормальному прохождению трафика до I2P." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:599 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:617 msgid "The router is currently testing whether your UDP port is firewalled." msgstr "Маршрутизатор проверÑет возможноÑÑ‚ÑŒ принÑÑ‚Ð¸Ñ Ð²Ñ…Ð¾Ð´Ñщих Ñоединений на UDP-порт." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:603 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:621 msgid "The router is not configured to publish its address, therefore it does not expect incoming connections." msgstr "Ð’ наÑтройках I2P-маршрутизатора запрещена Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ ÐµÐ³Ð¾ адреÑа, как результат, маршрутизатор не ожидает входÑщих Ñоединений." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:605 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:623 msgid "WARN - Firewalled and Fast" msgstr "ПРЕДУПРЕЖДЕÐИЕ - Заблокирован извне и БыÑтрый" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:607 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:625 msgid "You have configured I2P to share more than 128KBps of bandwidth, but you are firewalled." msgstr "Ð’Ñ‹ наÑтроили долю транзитного трафика выше 128 килобайт/Ñекунду, при Ñтом у Ð’Ð°Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ð½ входÑщий порт." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:609 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:627 msgid "While I2P will work fine in this configuration, if you really have over 128KBps of bandwidth to share, it will be much more helpful to the network if you open your firewall." msgstr "I2P будет работать нормально в такой конфигурации, но Ð’Ñ‹ можете помочь Ñети разблокировав входÑщий порт, еÑли у Ð’Ð°Ñ Ð´ÐµÐ¹Ñтвительно быÑтрый интернет." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:611 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:629 msgid "WARN - Firewalled and Floodfill" msgstr "ПРЕДУПРЕЖДЕÐИЕ - Заблокирован извне и Floodfill" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:613 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:631 msgid "You have configured I2P to be a floodfill router, but you are firewalled." msgstr "Ð’Ñ‹ наÑтроили I2P работать в режиме floodfill-маршрутизатора, при Ñтом у Ð’Ð°Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ð½ входÑщий порт." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:615 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:633 msgid "For best participation as a floodfill router, you should open your firewall." msgstr "Ð”Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð¾Ð¹ работы в качеÑтве floodfill-маршрутизатора Вам нужно разблокировать входÑщий порт." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:617 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:635 msgid "WARN - Firewalled with Inbound TCP Enabled" msgstr "ПРЕДУПРЕЖДЕÐИЕ - Заблокирован извне при включенном на вход TCP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:619 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:637 msgid "You have configured inbound TCP, however your UDP port is firewalled, and therefore it is likely that your TCP port is firewalled as well." msgstr "Ð’Ñ‹ разрешили входÑщие TCP-ÑоединениÑ, но при Ñтом Ваш UDP-порт заблокирован, Ñледовательно, Ñкорее вÑего, TCP-порт тоже заблокирован." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:621 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:639 msgid "If your TCP port is firewalled with inbound TCP enabled, routers will not be able to contact you via TCP, which will hurt the network." msgstr "ЕÑли у Ð’Ð°Ñ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ñ‹ входÑщие TCP-ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ заблокированном TCP-порте, то другие маршрутизаторы не Ñмогут к Вам подÑоединитьÑÑ Ð¿Ð¾ TCP. Ðто повредит производительноÑти Ñети. " -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:623 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:641 msgid "Please open your firewall or disable inbound TCP above." msgstr "ПожалуйÑта, проверьте ÑоÑтоÑние TCP-порта и разблокируйте его или отключите поддержку входÑщих TCP-Ñоединений." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:625 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:643 msgid "WARN - Firewalled with UDP Disabled" msgstr "ПРЕДУПРЕЖДЕÐИЕ - Заблокирован извне при отключенном UDP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:627 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:645 msgid "You have configured inbound TCP, however you have disabled UDP." msgstr "Ð’Ñ‹ отключили поддержку UDP, однако Ваш TCP-порт заблокирован и в результате Ваш маршрутизатор не может принимать входÑщие ÑоединениÑ." # This string intentionally left blank -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:629 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:647 msgid "You appear to be firewalled on TCP, therefore your router cannot accept inbound connections." msgstr " " -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:631 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:649 msgid "Please open your firewall or enable UDP." msgstr "ПожалуйÑта, разблокируйте порт или включите поддержку UDP." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:633 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:651 msgid "ERR - Clock Skew" msgstr "ОШИБКР- ЧаÑÑ‹ Ñбиты" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:635 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:653 msgid "Your system's clock is skewed, which will make it difficult to participate in the network." msgstr "Ваши ÑиÑтемные чаÑÑ‹ Ñильно отÑтают/Ñпешат. Ðто помешает Вашему учаÑтию в Ñети." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:637 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:655 msgid "Correct your clock setting if this error persists." msgstr "Поправьте наÑтройки времени, еÑли Ð’Ñ‹ поÑтоÑнно видите Ñто Ñообщение об ошибке." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:639 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:657 msgid "ERR - Private TCP Address" msgstr "ОШИБКР- ЧаÑтный TCP ÐдреÑ" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:641 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:659 msgid "You must never advertise an unroutable IP address such as 127.0.0.1 or 192.168.1.1 as your external address." msgstr "Ðе публикуйте локальные IP-адреÑа (такие как 127.0.0.1 или 192.168.1.1) в качеÑтве Ñвоего внешнего IP-адреÑа." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:643 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:661 msgid "Correct the address or disable inbound TCP above." msgstr "ИÑправьте Ð°Ð´Ñ€ÐµÑ Ð¸Ð»Ð¸ отключите поддержку входÑщих TCP-Ñоединений." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:645 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:663 msgid "ERR - SymmetricNAT" msgstr "ОШИБКР- Симметричный NAT" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:647 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:665 msgid "I2P detected that you are firewalled by a Symmetric NAT." msgstr "I2P обнаружил, что Ð’Ñ‹ за Ñимметричным NAT." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:649 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:667 msgid "I2P does not work well behind this type of firewall. You will probably not be able to accept inbound connections, which will limit your participation in the network." msgstr "I2P не очень хорошо работает за таким типом брандмауÑров. Скорее вÑего Ð’Ñ‹ не Ñможете принимать входÑщие ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¸ Ñто Ñнизит ÑффективноÑÑ‚ÑŒ Вашего учаÑÑ‚Ð¸Ñ Ð² Ñети." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:651 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:669 msgid "ERR - UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart" msgstr "ОШИБКР- UDP-порт уже занÑÑ‚ - перенаÑтройте i2np.udp.internalPort=xxxx в дополнительных наÑтройках и перезапуÑтите маршрутизатор" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:653 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:671 msgid "I2P was unable to bind to port 8887 or other configured port." msgstr "I2P не удалоÑÑŒ ÑвÑзать порт 8887 (или тот, что у Ð’Ð°Ñ Ð½Ð°Ñтроен)." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:655 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:673 msgid "Check to see if another program is using the configured port. If so, stop that program or configure I2P to use a different port." msgstr "Проверьте, не занÑÑ‚ ли Ñтот порт другим приложением. ЕÑли такое приложение нашлоÑÑŒ, оÑтановите его или задайте другой порт в наÑтройках I2P." # This string intentionally left blank -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:657 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:675 msgid "This may be a transient error, if the other program is no longer using the port." msgstr " " -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:659 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:677 msgid "However, a restart is always required after this error." msgstr "ПоÑле Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ Ñтой ошибки необходим перезапуÑк I2P." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:661 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:679 msgid "ERR - UDP Disabled and Inbound TCP host/port not set" msgstr "ОШИБКР- UDP отключено и не заданы адреÑ/порт Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñщих TCP-Ñоединений" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:663 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:681 msgid "You have not configured inbound TCP with a hostname and port above, however you have disabled UDP." msgstr "Ð’Ñ‹ не задали адреÑ/порт Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñщих TCP-Ñоединений и одновременно отключили поддержку UDP, в результате Ваш маршрутизатор не может принимать входÑщие ÑоединениÑ." # This string intentionally left blank -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:665 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:683 msgid "Therefore your router cannot accept inbound connections." msgstr " " -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:667 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:685 msgid "Please configure a TCP host and port above or enable UDP." msgstr "ПожалуйÑта, наÑтройте адреÑ/порт Ð´Ð»Ñ TCP или включите поддержку UDP." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:669 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:687 msgid "ERR - Client Manager I2CP Error - check logs" msgstr "ОШИБКР- ошибка менеджера I2CP - заглÑните в логи" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:671 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:689 msgid "This is usually due to a port 7654 conflict. Check the logs to verify." msgstr "Ðта ошибка обычно возникает из-за конфликта порта 7654. ЗаглÑните в логи чтобы убедитьÑÑ." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:673 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:691 msgid "Do you have another I2P instance running? Stop the conflicting program and restart I2P." msgstr "Ðе запущена ли у Ð²Ð°Ñ ÐµÑ‰Ñ‘ одна ÐºÐ¾Ð¿Ð¸Ñ I2P? ОÑтановите вызвавшую конфликт программу и перезапуÑтите I2P." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:107 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:113 msgid "config advanced" msgstr "дополнительные наÑтройки" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:241 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:263 msgid "I2P Advanced Configuration" msgstr "Дополнительные наÑтройки I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:301 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:319 msgid "Advanced I2P Configuration" msgstr "Дополнительные наÑтройки I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:311 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:329 msgid "Some changes may require a restart to take effect." msgstr "Ð”Ð»Ñ Ð²ÑÑ‚ÑƒÐ¿Ð»ÐµÐ½Ð¸Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… изменений в Ñилу может потребоватьÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк I2P-маршрутизатора." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:112 msgid "config clients" msgstr "наÑтройки клиентов" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:265 msgid "I2P Client Configuration" msgstr "ÐаÑтройки клиентов I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:312 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:330 msgid "Client Configuration" msgstr "ÐаÑтройки клиентов" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:314 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:332 msgid "The Java clients listed below are started by the router and run in the same JVM." msgstr "ПеречиÑленные ниже Java-клиенты запуÑкаютÑÑ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð¾Ð¼ внутри Ñвоей JVM." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:318 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:338 msgid "To change other client options, edit the file" msgstr "Ð”Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… клиентÑких наÑтроек отредактируйте файл" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:325 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:345 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:423 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:439 msgid "All changes require restart to take effect." msgstr "Ð”Ð»Ñ Ð²ÑÑ‚ÑƒÐ¿Ð»ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½Ñ‘Ð½Ð½Ñ‹Ñ… наÑтроек в Ñилу потребуетÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк маршрутизатора." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:337 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:357 +msgid "Advanced Client Interface Configuration" +msgstr "Дополнительные наÑтройки клиентÑкого интерфейÑа" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:361 +msgid "External I2CP (I2P Client Protocol) Interface Configuration" +msgstr "ÐаÑтройки внешнего интерфейÑа I2CP (I2P Client Protocol)" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:367 +msgid "Enabled without SSL" +msgstr "Включен без Ñ‚Ñ€ÐµÐ±Ð¾Ð²Ð°Ð½Ð¸Ñ SSL" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:373 +msgid "Enabled with SSL required" +msgstr "Включен Ñ Ñ‚Ñ€ÐµÐ±Ð¾Ð²Ð°Ð½Ð¸ÐµÐ¼ SSL" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:379 +msgid "Disabled - Clients outside this Java process may not connect" +msgstr "Выключен - клиенты Ñнаружи данного Java-процеÑÑа могут не ÑоединÑÑ‚ÑŒÑÑ" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:381 +msgid "I2CP Port" +msgstr "Порт I2CP" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:385 +msgid "I2CP Interface" +msgstr "I2CP-интерфейÑ" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:401 +msgid "Authorization" +msgstr "ÐÐ²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ " + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:407 +msgid "Require username and password" +msgstr "Требовать Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ пароль" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:409 +msgid "Username" +msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:413 +msgid "Password" +msgstr "Пароль" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:419 +msgid "Any changes made here must also be configured in the external client." +msgstr "Любые изменениÑ, Ñделанные здеÑÑŒ, так же должны быть выполнены во внешнем клиенте." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:421 +msgid "Many clients do not support SSL or authorization." +msgstr "Многие клиенты не поддерживают SSL или авторизацию." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:429 msgid "WebApp Configuration" msgstr "ÐаÑтройки веб-апплетов" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:339 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:431 msgid "The Java web applications listed below are started by the webConsole client and run in the same JVM as the router. They are usually web applications accessible through the router console. They may be complete applications (e.g. i2psnark),front-ends to another client or application which must be separately enabled (e.g. susidns, i2ptunnel), or have no web interface at all (e.g. addressbook)." msgstr "ПеречиÑленные ниже Java веб-апплеты запуÑкаютÑÑ ÐºÐ¾Ð½Ñолью маршрутизатора внутри JVM маршрутизатора. Обычно Ñти Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð´Ð¾Ñтупны через конÑоль маршрутизатора. Ðто могут быть как ÑамоÑтоÑтельные Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ (например, i2psnark), так и интерфейÑÑ‹ к другим приложениÑм или клиентам, которые надо включать отдельно (например, susidns, i2ptunnel), либо могут вообще не иметь веб-интерфейÑа (например, addressbook)." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:341 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:433 msgid "A web app may also be disabled by removing the .war file from the webapps directory; however the .war file and web app will reappear when you update your router to a newer version, so disabling the web app here is the preferred method." msgstr "Веб-апплет также можно отключить, проÑто удалив .war-файл из директории webapps. Однако при обновлении маршрутизатора и .war-файл и ÑоответÑтвующее приложение будут возвращены на Ñвои меÑта, поÑтому отключение веб-апплетов через Ñту Ñтраницу Ñто более корректный ÑпоÑоб." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:351 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:445 msgid "Plugin Configuration" msgstr "ÐаÑтройки плагинов" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:353 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:447 msgid "The plugins listed below are started by the webConsole client." msgstr "ПеречиÑленные ниже плагины запуÑкаютÑÑ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð¾Ð¼ webConsole." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:359 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:455 msgid "Plugin Installation" msgstr "УÑтановка плагина" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:361 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:457 msgid "To install a plugin, enter the download URL:" msgstr "Ð”Ð»Ñ ÑƒÑтановки нового плагина введите URL:" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:112 msgid "config keyring" msgstr "наÑтройки ключей" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:249 msgid "I2P Keyring Configuration" msgstr "ÐаÑтройки ÑвÑзки ключей I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:295 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:317 msgid "The router keyring is used to decrypt encrypted leaseSets." msgstr "Маршрутизатор иÑпользует ÑвÑзку ключей Ð´Ð»Ñ Ð´ÐµÑˆÐ¸Ñ„Ñ€Ð¾Ð²ÐºÐ¸ зашифрованных LeaseSet." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:298 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:320 msgid "The keyring may contain keys for local or remote encrypted destinations." msgstr "СвÑзка ключей может хранить ключи как Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ñ‹Ñ…, так и Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð½Ñ‹Ñ… зашифрованных адреÑов назначениÑ." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:308 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:326 msgid "Manual Keyring Addition" msgstr "Добавление ключей" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:310 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:328 msgid "Enter keys for encrypted remote destinations here." msgstr "ЗдеÑÑŒ добавлÑÑŽÑ‚ÑÑ ÐºÐ»ÑŽÑ‡Ð¸ Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð½Ñ‹Ñ… адреÑов назначениÑ." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:313 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:331 msgid "Keys for local destinations must be entered on the" msgstr "Ключи Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ñ‹Ñ… адреÑов Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð½Ð°ÑтраиваютÑÑ Ð²" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:315 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:333 msgid "I2PTunnel page" msgstr "Менеджере Туннелей" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:317 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:335 msgid "Dest. name, hash, or full key" msgstr "Ð˜Ð¼Ñ Ð°Ð´Ñ€ÐµÑа назначениÑ, Ñ…Ñш или полный ключ" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:319 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:337 msgid "Encryption Key" msgstr "Ключ шифрованиÑ" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:107 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:113 msgid "config logging" msgstr "наÑтройки логированиÑ" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:241 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:263 msgid "I2P Logging Configuration" msgstr "ÐаÑтройки Ð»Ð¾Ð³Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:301 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:319 msgid "Configure I2P Logging Options" msgstr "ÐаÑтройка опций Ð»Ð¾Ð³Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:303 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:321 msgid "Logging filename" msgstr "Лог-файл" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:307 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:325 msgid "(the symbol '@' will be replaced during log rotation)" msgstr "(во Ð²Ñ€ÐµÐ¼Ñ Ñ€Ð¾Ñ‚Ð°Ñ†Ð¸Ð¸ лога Ñимвол @ будет заменен на номер)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:309 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:327 msgid "Log record format" msgstr "Формат запиÑи" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:313 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:331 msgid "(use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, 'm' = message)" msgstr "(d = дата, c = клаÑÑ, t = поток, p = приоритет, m = Ñообщение)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:315 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:333 msgid "Log date format" msgstr "Формат даты" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:319 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:337 msgid "('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' = millisecond)" msgstr "(MM = меÑÑц, dd = день, HH = чаÑÑ‹, mm = минуты, ss = Ñекунды, SSS = миллиÑекунды)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:321 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:339 msgid "Max log file size" msgstr "МакÑимальный размер лог-файла" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:325 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:343 msgid "Default log level" msgstr "Уровень детализации по умолчанию" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:329 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:347 msgid "(DEBUG and INFO are not recommended defaults, as they will drastically slow down your router)" msgstr "(не рекомендуетÑÑ Ð¸Ñпользовать уровни DEBUG и INFO Ð´Ð»Ñ Ð¿Ð¾ÑтоÑнного иÑпользованиÑ, так как они Ñильно замедлÑÑ‚ работу Вашего маршрутизатора)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:331 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:349 msgid "Log level overrides" msgstr "ÐŸÐµÑ€ÐµÐ¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑƒÑ€Ð¾Ð²Ð½Ñ Ð»Ð¾Ð³Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:353 msgid "New override" msgstr "Ðовое переопределение" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:112 msgid "config peers" msgstr "наÑтройки пиров" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:249 msgid "I2P Peer Configuration" msgstr "ÐаÑтройки пиров I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:305 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:323 msgid "Manual Peer Controls" msgstr "Ручное управление пирами" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:307 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:325 msgid "Router Hash" msgstr "Хеш маршрутизатора" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:311 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:329 msgid "Manually Ban / Unban a Peer" msgstr "Вручную забанить/разбанить Ñтого пира" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:313 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:331 msgid "Banning will prevent the participation of this peer in tunnels you create." msgstr "Бан запретит учаÑтие указанного пира в Ñоздаваемых Вами туннелÑÑ…." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:323 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:341 msgid "Adjust Profile Bonuses" msgstr "ÐаÑтроить бонуÑÑ‹ Ð´Ð»Ñ Ñтого пира" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:325 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:343 msgid "Bonuses may be positive or negative, and affect the peer's inclusion in Fast and High Capacity tiers. Fast peers are used for client tunnels, and High Capacity peers are used for some exploratory tunnels. Current bonuses are displayed on the" msgstr "БонуÑÑ‹ могут быть положительными и отрицательными и вводÑÑ‚ÑÑ Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸ÐµÐ¼ пира в группы «БыÑтрые» и «ВыÑокоёмкие» (БыÑтрые пиры иÑпользуютÑÑ Ð´Ð»Ñ Ð¿Ð¾ÑÑ‚Ñ€Ð¾ÐµÐ½Ð¸Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ñких туннелей, Ð’Ñ‹Ñокоёмкие пиры иÑпользуютÑÑ Ð´Ð»Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… зондирующих туннелей). Текущие бонуÑÑ‹ можно поÑмотреть на" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:327 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:345 msgid "profiles page" msgstr "Ñтранице профилей пиров" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:345 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:251 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:363 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:273 msgid "Banned Peers" msgstr "Забаненные пиры" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:366 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:384 msgid "Banned IPs" msgstr "Забаненные IP-адреÑа" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:112 +msgid "config reseeding" +msgstr "наÑтройка reseeding" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:262 +msgid "I2P Reseeding Configuration" +msgstr "ÐаÑтройки начального Ð¾Ð±Ð½Ð°Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ ÑƒÐ·Ð»Ð¾Ð² I2P" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:318 +msgid "Reseeding Configuration" +msgstr "ÐаÑтройки начального Ð¾Ð±Ð½Ð°Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ ÑƒÐ·Ð»Ð¾Ð² (reseeding)" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:320 +msgid "Reseeding is the bootstrapping process used to find other routers when you first install I2P, or when your router has too few router references remaining." +msgstr "Загрузка начального ÑпиÑка узлов (reseeding) - Ñто процеÑÑ Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð¾Ð¹ загрузки (бутÑтрап), иÑпользуемый Ð´Ð»Ñ Ð½Ð°Ñ…Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… роутеров, когда вы впервые уÑтановили I2P, или когда ваш роутер имеет Ñлишком мало данных о других роутерах." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:322 +msgid "If reseeding has failed, you should first check your network connection." +msgstr "ЕÑли Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ° не удалаÑÑŒ, первым делом вы должны проверить Ñоединение Ñ Ñетью." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:326 +msgid "Change these only if HTTP is blocked by a restrictive firewall, reseed has failed, and you have access to an HTTP proxy." +msgstr "МенÑйте Ñти параметры только еÑли HTTP заблокирован на брандмауÑре, Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ° не удалаÑÑŒ, и вы имеете доÑтуп к HTTP-прокÑи." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:328 +#, java-format +msgid "See {0} for instructions on reseeding manually." +msgstr "Смотрите {0} на предмет инÑтрукций как выполнить начальную загрузку вручную." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:328 +msgid "the FAQ" +msgstr "FAQ" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:330 +msgid "Reseed URL Selection" +msgstr "Выбор URL Ð´Ð»Ñ Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð¾Ð¹ загрузки" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:336 +msgid "Try SSL first then non-SSL" +msgstr "Сперва пробовать SSL, потом не-SSL" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:342 +msgid "Use SSL only" +msgstr "ИÑпользовать только SSL" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:348 +msgid "Use non-SSL only" +msgstr "ИÑпользовать только не-SSL" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:350 +msgid "Reseed URLs" +msgstr "ÐдреÑа reseed-узлов" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:354 +msgid "Enable HTTP proxy (not used for SSL)" +msgstr "ИÑпользовать HTTP-прокÑи (не иÑпользуетÑÑ Ð´Ð»Ñ SSL)" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:358 +msgid "HTTP Proxy Host" +msgstr "ХоÑÑ‚ HTTP-прокÑи" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:362 +msgid "HTTP Proxy Port" +msgstr "Порт HTTP-прокÑи" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:112 msgid "config service" msgstr "наÑтройки Ñлужбы" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:249 msgid "I2P Service Configuration" msgstr "ÐаÑтройки Ñлужбы I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:285 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:303 msgid "Shutdown the router" msgstr "Выключить маршрутизатор" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:287 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:305 msgid "Graceful shutdown lets the router satisfy the agreements it has already made before shutting down, but may take a few minutes." msgstr "Плавное выключение позволÑет маршрутизатору перед оÑтановкой отработать вÑе поÑтавленные задачи, но при Ñтом на процеÑÑ Ð²Ñ‹ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñ‚Ñ€ÐµÐ±ÑƒÐµÑ‚ÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ðµ времÑ." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:289 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:307 msgid "If you need to kill the router immediately, that option is available as well." msgstr "ЕÑли маршрутизатор должен быть выключен немедленно, Ð’Ñ‹ можете выбрать ÑоответÑтвующую команду." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:299 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:317 msgid "If you want the router to restart itself after shutting down, you can choose one of the following." msgstr "Иногда, Вам нужно перегрузить маршрутизатор (например, поÑле Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±Ð°Ð·Ð¾Ð²Ñ‹Ñ… наÑтроек, которые ÑчитываютÑÑ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸ÐµÐ¼ только во Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿ÑƒÑка). Ð’ Ñтом Ñлучае, Вам доÑтупны два варианта. Плавный перезапуÑк займет неÑколько минут (но зато пиры, иÑпользующие Ваш маршрутизатор, будут Вам благодарны за терпение). ЕÑли Ð’Ñ‹ не можете ждать, выбирайте немедленный перезапуÑк. Ð’ Ñлучае немедленного перезапуÑка маршрутизатор запуÑтитÑÑ Ñ‡ÐµÑ€ÐµÐ· одну минуту." # This string intentionally left blank -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:301 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:319 msgid "This is useful in some situations - for example, if you changed some settings that client applications only read at startup, such as the routerconsole password or the interface it listens on." msgstr " " # This string intentionally left blank -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:303 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:321 msgid "A graceful restart will take a few minutes (but your peers will appreciate your patience), while a hard restart does so immediately." msgstr " " # This string intentionally left blank -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:305 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:323 msgid "After tearing down the router, it will wait 1 minute before starting back up again." msgstr " " -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:315 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:333 msgid "Systray integration" msgstr "Ð˜Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ð¸Ñ Ð² облаÑÑ‚ÑŒ уведомлений" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:317 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:335 msgid "On the windows platform, there is a small application to sit in the system tray, allowing you to view the router's status" msgstr "ЕÑли Ð’Ñ‹ работаете под Windows, у Ð’Ð°Ñ ÐµÑÑ‚ÑŒ возможноÑÑ‚ÑŒ отÑлеживать ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð° через значок в облаÑти уведомлений" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:319 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:337 msgid "(later on, I2P client applications will be able to integrate their own functionality into the system tray as well)." msgstr "(когда-нибудь и клиентÑкие Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ I2P будут там доÑтупны)." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:321 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:339 msgid "If you are on windows, you can either enable or disable that icon here." msgstr "ЕÑли Ð’Ñ‹ пользуетеÑÑŒ I2P под Windows, то здеÑÑŒ Ð’Ñ‹ можете наÑтроить отображение Ñтого значка." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:327 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:341 +msgid "Show systray icon" +msgstr "Показать значок ÑтатуÑа" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:343 +msgid "Hide systray icon" +msgstr "СпрÑтать значок ÑтатуÑа" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:345 msgid "Run on startup" msgstr "ÐвтоматичеÑкий запуÑк I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:329 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:347 msgid "You can control whether I2P is run on startup or not by selecting one of the following options - I2P will install (or remove) a service accordingly." msgstr "Ð’Ñ‹ можете наÑтроить автоматичеÑкую загрузку маршрутизатора при каждом запуÑке Windows. Ð’ завиÑимоÑти от выбранной кнопки I2P немедленно уÑтановит или удалит Ñвою Ñлужбу из ÑпиÑка Ñлужб Windows." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:331 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:349 msgid "If you prefer the command line, you can also run the " msgstr "ЕÑли Вам удобно работать через командную Ñтроку, попробуйте иÑпользовать " -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:341 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:359 msgid "If you are running I2P as service right now, removing it will shut down your router immediately." msgstr "ЕÑли Ñлужба I2P уже была запущена, при выборе варианта <b>\"Ðе запуÑкать I2P при Ñтарте\"</b> маршрутизатор будет моментально оÑтановлен." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:343 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:361 msgid "You may want to consider shutting down gracefully, as above, then running uninstall_i2p_service_winnt.bat." msgstr "Возможно лучше плавно оÑтановить маршрутизатор и поÑле Ñтого запуÑтить файл C:\\Program Files\\I2P\\uninstall_i2p_service_winnt.bat." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:347 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:365 msgid "Debugging" msgstr "Отладка" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:349 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:367 msgid "View the job queue" msgstr "ПроÑмотр очереди заданий" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:353 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:371 msgid "At times, it may be helpful to debug I2P by getting a thread dump. To do so, please select the following option and review the thread dumped to <a href=\"logs.jsp#servicelogs\">wrapper.log</a>." msgstr "Ð’ некоторых ÑлучаÑÑ… Ð´Ð»Ñ Ð¾Ñ‚Ð»Ð°Ð´ÐºÐ¸ может пригодитьÑÑ ÑпиÑок ÑоÑтоÑний потоков I2P-маршутизатора. Ð”Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñ‚Ð°ÐºÐ¾Ð³Ð¾ ÑпиÑка нажмите Ñту кнопку. СпиÑок будет Ñохранен в файле <a href=\"logs.jsp#servicelogs\">wrapper.log</a>." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:359 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:377 msgid "Launch browser on router startup?" msgstr "ЗапуÑкать браузер при Ñтарте I2P?" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:361 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:379 msgid "I2P's main configuration interface is this web console, so for your convenience I2P can launch a web browser on startup pointing at" msgstr "ОÑновной Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð½Ð°Ñтройки I2P Ñто веб-конÑоль. ЗдеÑÑŒ можно выбрать автоматичеÑкое открытие при запуÑке маршрутизатора Ñтраницы" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:107 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:113 msgid "config stats" msgstr "наÑтройки ÑтатиÑтики" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:228 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:250 msgid "I2P Stats Configuration" msgstr "ÐаÑтройки ÑтатиÑтики I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:302 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:320 msgid "Configure I2P Stat Collection" msgstr "ÐаÑтройки Ñбора ÑтатиÑтики I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:304 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:322 msgid "Enable full stats?" msgstr "Включить полную ÑтатиÑтику?" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:311 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:329 msgid "change requires restart to take effect" msgstr "Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²ÑтупÑÑ‚ в Ñилу только поÑле перезапуÑка маршрутизатора" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:313 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:331 msgid "Stat file" msgstr "Файл ÑтатиÑтики" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:317 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:335 msgid "Filter" msgstr "Фильтр" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:319 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:328 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:337 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:348 msgid "toggle all" msgstr "переключить вÑе" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:330 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:350 msgid "Log" msgstr "Лог" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:332 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:352 msgid "Graph" msgstr "График" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:371 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:391 msgid "Advanced filter" msgstr "Дополнительный фильтр" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:112 msgid "config tunnels" msgstr "наÑтройки туннелей" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:262 msgid "I2P Tunnel Configuration" msgstr "ÐаÑтройки туннелей I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:306 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:328 msgid "The default settings work for most people." msgstr "БольшинÑтву пользователей подойдут наÑтройки по умолчанию. " -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:310 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:332 msgid "There is a fundamental tradeoff between anonymity and performance." msgstr "Примите во внимание, что между анонимноÑтью и ÑффективноÑтью еÑÑ‚ÑŒ Ð¾Ð±Ñ€Ð°Ñ‚Ð½Ð°Ñ ÑвÑзь — длинные туннели более анонимны, но хуже работают." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:313 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:335 msgid "Tunnels longer than 3 hops (for example 2 hops + 0-2 hops, 3 hops + 0-1 hops, 3 hops + 0-2 hops), or a high quantity + backup quantity, may severely reduce performance or reliability." msgstr " Туннели длиннее 3 хопов, а также большое количеÑтво туннелей (как обычных, так и резервных) могут привеÑти к Ñнижению производительноÑти/надежноÑти работы маршрутизатора." # This string intentionally left blank -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:316 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:338 msgid "High CPU and/or high outbound bandwidth usage may result." msgstr " " -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:319 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:341 msgid "Change these settings with care, and adjust them if you have problems." msgstr "ОÑторожно вноÑите Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÑущеÑтвующие наÑтройки и возвращайте в положение по умолчанию, еÑли у Ð’Ð°Ñ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ»Ð¸ проблемы." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:333 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:351 msgid "Exploratory tunnel setting changes are stored in the router.config file." msgstr "ÐаÑтройки зондирующих туннелей ÑохранÑÑŽÑ‚ÑÑ Ð² файле router.config." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:336 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:354 msgid "Client tunnel changes are temporary and are not saved." msgstr "ÐаÑтройки клиентÑких туннелей нигде не ÑохранÑÑŽÑ‚ÑÑ Ð¸ дейÑтвуют только до перезапуÑка." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:338 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:356 msgid "To make permanent client tunnel changes see the" msgstr "Ð”Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð¿ÐµÑ€Ð¼Ð°Ð½ÐµÐ½Ñ‚Ð½Ñ‹Ñ… изменений в наÑтройках клиентÑких туннелей воÑпользуйтеÑÑŒ" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:340 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:358 msgid "i2ptunnel page" msgstr "менеджером туннелей" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:112 msgid "config UI" msgstr "наÑтройки интерфейÑа" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:240 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:262 msgid "I2P UI Configuration" msgstr "ÐаÑтройки пользовательÑкого интерфейÑа I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:292 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:314 msgid "Router Console Theme" msgstr "Тема Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñоли маршрутизатора" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:310 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:339 msgid "Theme selection disabled for Internet Explorer, sorry." msgstr "Переключатель тем отключен Ð´Ð»Ñ Internet Explorer, извините" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:312 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:341 msgid "If you're not using IE, it's likely that your browser is pretending to be IE; please configure your browser (or proxy) to use a different User Agent string if you'd like to access the console themes." msgstr "ЕÑли вы не иÑпользуете IE, то, Ñкорее вÑего, Ваш браузер Ñконфигурирован предÑтавлÑÑ‚ÑŒÑÑ ÐºÐ°Ðº IE. ПожалуйÑта измените Ñтроку User-Agent в наÑтройках Вашего браузера (или прокÑи-Ñервера), еÑли хотите иÑпользовать темы оформлениÑ" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:316 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:345 msgid "Router Console Language" msgstr "Язык конÑоли маршрутизатора" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:320 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:349 msgid "Please contribute to the router console translation project! Contact the developers on IRC #i2p to help." msgstr "ПожалуйÑта, помогите проекту перевода конÑоли маршрутизатора! Разработчики доÑтупны Ð´Ð»Ñ ÑвÑзи на IRC-канале #i2p" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:324 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:353 msgid "Apply" msgstr "Применить" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:112 msgid "config update" msgstr "наÑтройки обновлениÑ" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:249 msgid "I2P Update Configuration" msgstr "ÐаÑтройки обновлений I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:303 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:321 msgid "Check for I2P and news updates" msgstr "ÐаÑтройки проверки обновлений и новоÑтей I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:305 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:323 msgid "News & I2P Updates" msgstr "ÐовоÑти и Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:309 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:327 msgid "Update In Progress" msgstr "ВыполнÑетÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ðµ" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:317 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:335 msgid "News URL" msgstr "URL новоÑтей" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:321 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:339 msgid "Refresh frequency" msgstr "Интервал проверки" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:327 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:345 msgid "Update policy" msgstr "Режим обновлениÑ" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:331 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:349 msgid "Update through the eepProxy?" msgstr "ОбновлÑÑ‚ÑŒ через I2P-прокÑи?" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:353 msgid "eepProxy host" msgstr "ÐÐ´Ñ€ÐµÑ I2P-прокÑи" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:339 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:357 msgid "eepProxy port" msgstr "Порт I2P-прокÑи" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:343 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:361 msgid "Update URLs" msgstr "URL обновлений" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:347 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:365 msgid "Trusted keys" msgstr "Доверенные ключи" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:351 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:369 msgid "Update with unsigned development builds?" msgstr "ОбновлÑÑ‚ÑŒ до неподпиÑанной теÑтовой Ñборки?" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:355 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:373 msgid "Unsigned Build URL" msgstr "URL неподпиÑанной теÑтовой Ñборки" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:361 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:379 msgid "I2P updates are disabled because you do not have write permission for the install directory." msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð°Ð²Ñ‚Ð¾Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ I2P недоÑтупна: у Ð’Ð°Ñ Ð½ÐµÑ‚ прав на запиÑÑŒ в директорию I2P." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:367 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:385 msgid "Save" msgstr "Сохранить" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:117 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:121 +msgid "Internal Error" +msgstr "ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:123 +msgid "Router Console" +msgstr "КонÑоль маршрутизатора I2P" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:127 +msgid "Configuration" +msgstr "ÐаÑтройки" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:135 +msgid "Sorry! There has been an internal error." +msgstr "К Ñожалению, была обнаружена внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°." + +#. note to translators - both parameters are URLs +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:139 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:254 +#, java-format +msgid "Please report bugs on {0} or {1}." +msgstr "ПожалуйÑта Ñообщайте об ошибках в багтрекер по адреÑу {0} или {1}." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:143 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:258 +msgid "You may use the username \"guest\" and password \"guest\" if you do not wish to register." +msgstr "Ð’Ñ‹ можете иÑпользовать Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \"guest\" и пароль \"guest\" еÑли не хотите региÑтрироватьÑÑ." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:145 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:260 +msgid "Please include this information in bug reports" +msgstr "ПожалуйÑта, добавлÑйте Ñту информацию в Ваши ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ð± ошибках" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:147 +msgid "Error Details" +msgstr "ПодробноÑти ошибки" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:149 +#, java-format +msgid "Error {0}" +msgstr "Ошибка {0}" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:169 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:250 +msgid "I2P Version and Running Environment" +msgstr "ВерÑÐ¸Ñ I2P и Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ Ñреде выполнениÑ" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:197 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:288 +msgid "Note that system information, log timestamps, and log messages may provide clues to your location; please review everything you include in a bug report." +msgstr "Имейте в виду, что Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ ÑиÑтеме, временные метки в логах, и Ñами логи могут помочь выÑвить ваше меÑтоположение; пожалуйÑта проверьте вÑÑ‘, что вы включаете в Ñообщение об ошибке." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:123 msgid "Page Not Found" msgstr "Страница не найдена" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:242 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:264 msgid "Sorry! You appear to be requesting a non-existent Router Console page or resource." msgstr "Страница конÑоли маршрутизатора, которую вы запроÑили, не ÑущеÑтвует." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:244 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:266 msgid "Error 404" msgstr "Ошибка 404" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:249 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:271 msgid "not found" msgstr "не найдено" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:106 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:112 msgid "graphs" msgstr "графики" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:249 msgid "I2P Performance Graphs" msgstr "Графики производительноÑти I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:111 msgid "home" msgstr "ДомашнÑÑ Ñтраница" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:331 +msgid "Welcome to I2P" +msgstr "Добро пожаловать в I2P" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:111 msgid "job queue" msgstr "очередь заданий" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:248 msgid "I2P Router Job Queue" msgstr "Очередь заданий маршрутизатора I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:111 msgid "logs" msgstr "логи" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:248 msgid "I2P Router Logs" msgstr "Логи маршрутизатора I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:228 -msgid "I2P Version & Running Environment" -msgstr "ВерÑÐ¸Ñ I2P & Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ Ñреде выполнениÑ" - -#. note to translators - both parameters are URLs -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:232 -#, java-format -msgid "Please report bugs on {0} or {1}." -msgstr "ПожалуйÑта Ñообщайте об ошибках в багтрекер по адреÑу {0} или {1}." - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:236 -msgid "You may use the username \"guest\" and password \"guest\" if you do not wish to register." -msgstr "Ð’Ñ‹ можете иÑпользовать Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \"guest\" и пароль \"guest\" еÑли не хотите региÑтрироватьÑÑ." - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:238 -msgid "Please include this information in bug reports" -msgstr "ПожалуйÑта, добавлÑйте Ñту информацию в Ваши ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ð± ошибках" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:266 -msgid "Note that system information, log timestamps, and log messages may provide clues to your location; please review everything you include in a bug report." -msgstr "Имейте в виду, что Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ ÑиÑтеме, временные метки в логах, и Ñами логи могут помочь выÑвить ваше меÑтоположение; пожалуйÑта проверьте вÑÑ‘, что вы включаете в Ñообщение об ошибке." - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:281 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:303 msgid "Critical Logs" msgstr "Логи критичеÑких ошибок" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:285 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:307 msgid "Router Logs" msgstr "Логи маршрутизатора" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:291 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:313 msgid "Service (Wrapper) Logs" msgstr "Логи Ñлужбы (wrapper)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:111 msgid "network database summary" msgstr "ÑÐµÑ‚ÐµÐ²Ð°Ñ Ð±Ð°Ð·Ð° данных" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:248 msgid "I2P Network Database Summary" msgstr "Обзор Ñетевой базы данных I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:109 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:115 msgid "WebApp Not Found" msgstr "Веб-апплет не найден" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:230 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:252 msgid "Web Application Not Running" msgstr "Веб-приложение не запущено" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:232 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:254 msgid "The requested web application is not running." msgstr "Запрошенное веб-приложение не запущено." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:234 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:256 msgid "Please visit the <a href=\"/configclients.jsp#webapp\">config clients page</a> to start it." msgstr "ПожалуйÑта, запуÑтите его Ñо <a href=\"/configclients.jsp#webapp\">Ñтраницы наÑтроек веб-апплетов</a>." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:111 msgid "peer connections" msgstr "обзор пиров" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:248 msgid "I2P Network Peers" msgstr "Ð¡Ð¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Ð¿Ð¸Ñ€Ð°Ð¼Ð¸ I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:111 msgid "peer profiles" msgstr "профили пиров" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:248 msgid "I2P Network Peer Profiles" msgstr "Профили пиров Ñети I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:111 msgid "statistics" msgstr "ÑтатиÑтика" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:243 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:265 msgid "I2P Router Statistics" msgstr "СтатиÑтика маршрутизатора I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:248 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:255 #, java-format msgid "Disable {0} Refresh" msgstr "Отключить {0} автообновление" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:105 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:111 msgid "tunnel summary" msgstr "обзор туннелей" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:248 msgid "I2P Tunnel Summary" msgstr "Обзор туннелей I2P" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:111 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:248 +msgid "Peer Profile" +msgstr "Профиль пира" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:275 +#, java-format +msgid "Profile for peer {0}" +msgstr "Профиль пира {0}" + +#~ msgid "Download" +#~ msgstr "Скачать" + +#~ msgid "System tray icon enabled." +#~ msgstr "Включен значок-индикатор ÑтатуÑа в облаÑти уведомлений." + +#~ msgid "System tray icon feature not supported on this platform. Sorry!" +#~ msgstr "" +#~ "Вывод индикаторов в облаÑти уведомлений на Ñтой платформе не " +#~ "поддерживаетÑÑ. Извините!" + +#~ msgid "Warning: unable to contact the systray manager" +#~ msgstr "" +#~ "Предупреждение: Ðе удалоÑÑŒ ÑоединитьÑÑ Ñ Ð¼ÐµÐ½ÐµÐ´Ð¶ÐµÑ€Ð¾Ð¼ облаÑти уведомлений" + +#~ msgid "System tray icon disabled." +#~ msgstr "Выключен значок-индикатор ÑтатуÑа в облаÑти уведомлений." + +#~ msgid "" +#~ "Ensure that nothing blocks outbound HTTP, check <a target=\"_top\" href=" +#~ "\"logs.jsp\">logs</a> and if nothing helps, read the <a target=\"_top\" " +#~ "href=\"http://www.i2p2.de/faq.html\">FAQ</a> about reseeding manually." +#~ msgstr "" +#~ "УбедитеÑÑŒ, что иÑходÑщие HTTP-запроÑÑ‹ ничем не блокируютÑÑ, заглÑните в " +#~ "<a href=logs.jsp>логи</a> и еÑли ничто не помогло, прочтите в <a target=" +#~ "\"_top\" href=\"http://www.i2p2.de/faq.html\">FAQ</a> инÑтрукцию по " +#~ "начальной загрузке вручную." + +#~ msgid "hour" +#~ msgstr "чаÑ" + +#~ msgid "minute" +#~ msgstr "минута" + +#~ msgid "minutes" +#~ msgstr "минут(Ñ‹)" + #~ msgid "Last reseed failed fully (failed reading seed URL)." #~ msgstr "" #~ "ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ° начальной загрузки полноÑтью провалилаÑÑŒ (не удалоÑÑŒ " @@ -5271,9 +5572,6 @@ msgstr "Обзор туннелей I2P" #~ msgid "avg value" #~ msgstr "Ñреднее значение" -#~ msgid "events" -#~ msgstr "Ñобытий" - #~ msgid "lifetime average" #~ msgstr "Ñреднее за Ð²Ñ€ÐµÐ¼Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹" diff --git a/apps/routerconsole/locale/messages_zh.po b/apps/routerconsole/locale/messages_zh.po index 4e7419ac05cb9f6a3bcf389afdac56f21bd4413a..8a75c5a3fbc02bec9c6e816b1867151dab0d1485 100644 --- a/apps/routerconsole/locale/messages_zh.po +++ b/apps/routerconsole/locale/messages_zh.po @@ -8,10 +8,11 @@ msgid "" msgstr "" "Project-Id-Version: I2P routerconsole\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-04 02:45+0000\n" +"POT-Creation-Date: 2011-03-03 18:28+0000\n" "PO-Revision-Date: \n" -"Last-Translator: walking <walking@mail.i2p>\n" +"Last-Translator: \n" "Language-Team: \n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -19,21 +20,75 @@ msgstr "" "X-Poedit-Country: CHINA\n" "Plural-Forms: nplurals=1; plural=0\n" -#: ../../../router/java/src/net/i2p/router/Blocklist.java:126 +#. NOTE TO TRANSLATORS: Feel free to translate all these as you see fit, there are several options... +#. spaces or not, '.' or not, plural or not. Try not to make it too long, it is used in +#. a lot of tables. +#. milliseconds +#. Note to translators, may be negative or zero, 2999 maximum. +#. {0,number,####} prevents 1234 from being output as 1,234 in the English locale. +#. If you want the digit separator in your locale, translate as {0}. +#. alternates: msec, msecs +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1141 +#, java-format +msgid "1 ms" +msgid_plural "{0,number,####} ms" +msgstr[0] "{0,number,####} ms" + +#. seconds +#. Note to translators: quantity will always be greater than one. +#. alternates: secs, sec. 'seconds' is probably too long. +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1146 +#, java-format +msgid "1 sec" +msgid_plural "{0} sec" +msgstr[0] "{0} sec" + +#. minutes +#. Note to translators: quantity will always be greater than one. +#. alternates: mins, min. 'minutes' is probably too long. +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1151 +#, java-format +msgid "1 min" +msgid_plural "{0} min" +msgstr[0] "{0} min" + +#. hours +#. Note to translators: quantity will always be greater than one. +#. alternates: hrs, hr., hrs. +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1156 +#, java-format +msgid "1 hour" +msgid_plural "{0} hours" +msgstr[0] "{0} hr" + +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1158 +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:313 +msgid "n/a" +msgstr "N/A" + +#. days +#. Note to translators: quantity will always be greater than one. +#: ../../../core/java/src/net/i2p/data/DataHelper.java:1162 +#, java-format +msgid "1 day" +msgid_plural "{0} days" +msgstr[0] "{0} 天" + +#: ../../../router/java/src/net/i2p/router/Blocklist.java:122 #, java-format msgid "Banned by router hash: {0}" msgstr "按路由器 HASH å°æ€: {0}" -#: ../../../router/java/src/net/i2p/router/Blocklist.java:128 +#: ../../../router/java/src/net/i2p/router/Blocklist.java:124 msgid "Banned by router hash" msgstr "已按路由 HASH å°æ€" #. Temporary reason, until the job finishes -#: ../../../router/java/src/net/i2p/router/Blocklist.java:673 +#: ../../../router/java/src/net/i2p/router/Blocklist.java:669 msgid "IP banned" msgstr "IPå°é”" -#: ../../../router/java/src/net/i2p/router/Blocklist.java:743 +#: ../../../router/java/src/net/i2p/router/Blocklist.java:739 #, java-format msgid "IP banned by blocklist.txt entry {0}" msgstr "按IP黑åå•blocklist.txtå°æ€çš„节点{0}" @@ -83,50 +138,45 @@ msgstr "接收共享隧é“" #. if (_context.router().getRouterInfo().getBandwidthTier().equals("K")) #. setTunnelStatus("Not expecting tunnel requests: Advertised bandwidth too low"); #. else -#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:487 +#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:488 msgid "Rejecting tunnels" msgstr "æ‹’ç»å‚与共享隧é“" -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:48 -msgid "Ensure that nothing blocks outbound HTTP, check <a target=\"_top\" href=\"logs.jsp\">logs</a> and if nothing helps, read the <a target=\"_top\" href=\"http://www.i2p2.de/faq.html\">FAQ</a> about reseeding manually." -msgstr "请ä¿è¯HTTP通信没有å—阻,检查 <a target=\"_top\" href=\"logs.jsp\">日志</a> ,如果问题ä»æ— 法解决,请å‚ç…§ <a target=\"_top\" href=\"http://www.i2p2.de/faq.html\">FAQ</a> 进行手动补ç§ã€‚" - -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:80 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:105 +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:20 msgid "Reseeding" -msgstr "æ£åœ¨è¡¥ç§(引导网络å¯åŠ¨)..." +msgstr "网络引导" -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:144 -msgid "Reseeding: fetching seed URL." -msgstr "æ£åœ¨è¡¥ç§:获å–è¡¥ç§è¿žæŽ¥..." - -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:150 -msgid "Last reseed failed fully (failed reading seed URL)." -msgstr "上次补ç§å°è¯•å¤±è´¥(读å–è¡¥ç§URL失败)。" +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:128 +#, java-format +msgid "Reseed fetched only 1 router." +msgid_plural "Reseed fetched only {0} routers." +msgstr[0] "网络引导åªå‘现了 {0} 个I2P用户。" -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:176 -msgid "Last reseed failed fully (no routerInfo URLs at seed URL)." -msgstr "上次补ç§å°è¯•å¤±è´¥(è¡¥ç§æœåŠ¡å™¨æœªè¿”回任何路由信æ¯URL)。" +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:135 +msgid "Reseed failed." +msgstr "网络引导失败" -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:189 +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:136 #, java-format -msgid "Reseeding: fetching router info from seed URL ({0} successful, {1} errors)." -msgstr "æ£åœ¨è¡¥ç§:从补ç§æœåŠ¡å™¨èŽ·å–路由信æ¯({0}æˆåŠŸï¼Œ{1}失败)。" +msgid "See {0} for help." +msgstr "帮助å‚è§ {0}。" -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:210 -#, java-format -msgid "Last reseed failed partly ({0}% of {1})." -msgstr "上次补ç§éƒ¨åˆ†å¤±è´¥({0}%失败,共{1})" +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:137 +msgid "reseed configuration page" +msgstr "网络引导设置页é¢" -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:215 -#, java-format -msgid "Last reseed failed ({0}% of {1})." -msgstr "上次补ç§å¤±è´¥({0}%失败,共{1})" +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:239 +msgid "Reseeding: fetching seed URL." +msgstr "æ£åœ¨è¡¥ç§:获å–è¡¥ç§è¿žæŽ¥..." -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:225 -msgid "Last reseed failed fully (exception caught)." -msgstr "上次补ç§å¤±è´¥(exception caught)." +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:281 +#, java-format +msgid "" +"Reseeding: fetching router info from seed URL ({0} successful, {1} errors)." +msgstr "æ£åœ¨è¡¥ç§:从补ç§æœåŠ¡å™¨èŽ·å–路由信æ¯({0}æˆåŠŸï¼Œ{1}失败)。" -#: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:510 +#: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:512 msgid "NetDb entry" msgstr "NetDb 项目" @@ -135,27 +185,46 @@ msgstr "NetDb 项目" msgid "No transports (hidden or starting up?)" msgstr "æ— æ•°æ®ä¼ 输(éšèº«æˆ–æ£åœ¨å¯åŠ¨)" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:457 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:450 msgid "Unreachable on any transport" msgstr "å„ä¼ è¾“æ–¹å¼å‡ä¸å¯è¾¾" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:508 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:499 msgid "Router Transport Addresses" msgstr "è·¯ç”±ä¼ è¾“åœ°å€" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:514 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:504 #, java-format msgid "{0} is used for outbound connections only" msgstr "{0} 仅被用作出站连接" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:528 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:518 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:123 +msgid "Help" +msgstr "帮助" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:519 +msgid "" +"Your transport connection limits are automatically set based on your " +"configured bandwidth." +msgstr "æœ€å¤§ä¼ è¾“è¿žæŽ¥æ•°ä¼šæ ¹æ®æ‚¨çš„带宽设置自动调整。" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:521 +msgid "" +"To override these limits, add the settings i2np.ntcp.maxConnections=nnn and " +"i2np.udp.maxConnections=nnn on the advanced configuration page." +msgstr "" +"è¦è‡ªå®šä¹‰è¿žæŽ¥æ•°é™åˆ¶ï¼Œæ‚¨å¯ä»¥åœ¨é«˜çº§é…置页é¢ä¸ä½¿ç”¨å‚æ•° i2np.ntcp." +"maxConnections=nnn åŠ i2np.udp.maxConnections=nnn 。" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:523 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:257 msgid "Definitions" msgstr "定义" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:529 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:715 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1885 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:735 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1890 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:24 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:33 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:35 @@ -165,149 +234,153 @@ msgstr "定义" msgid "Peer" msgstr "节点" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:529 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524 msgid "The remote peer, identified by router hash" msgstr "以路由Hash区分的远程节点" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:530 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:716 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1889 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:525 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:736 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1894 msgid "Dir" msgstr "类别" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:531 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:526 msgid "Inbound connection" msgstr "进站连接" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:528 msgid "Outbound connection" msgstr "出站连接" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:530 msgid "They offered to introduce us (help other peers traverse our firewall)" msgstr "对方节点为ä¸ç»§å¸®åŠ©æˆ‘方穿越防ç«å¢™" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:532 msgid "We offered to introduce them (help other peers traverse their firewall)" msgstr "我方为ä¸ç»§å¸®åŠ©å…¶ä»–节点穿越防ç«å¢™" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533 msgid "How long since a packet has been received / sent" msgstr "最近一次数æ®ä¼ 输è·çŽ°åœ¨çš„时间" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:717 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1890 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:737 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1895 msgid "Idle" msgstr "空闲" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:718 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1895 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:738 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1900 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:156 msgid "In/Out" msgstr "å…¥/出" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534 msgid "The smoothed inbound / outbound transfer rate (KBytes per second)" msgstr "è¿›/å‡ºç«™å¹³æ»‘ä¼ è¾“çŽ‡(Kbyte/s)" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:540 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535 msgid "How long ago this connection was established" msgstr "连接建立时间" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:540 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:719 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1900 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:739 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1905 msgid "Up" msgstr "寿命" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:720 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1902 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:740 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1907 msgid "Skew" msgstr "时滞" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536 msgid "The difference between the peer's clock and your own" msgstr "节点与本地时钟间的时滞" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:542 -msgid "The congestion window, which is how many bytes can be sent without an acknowledgement" +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537 +msgid "" +"The congestion window, which is how many bytes can be sent without an " +"acknowledgement" msgstr "拥塞窗å£ï¼Œå³æ¯æ¬¡ç¡®è®¤å‰å¯å‘é€çš„å—节é‡" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538 msgid "The number of sent messages awaiting acknowledgement" msgstr "ç‰å¾…确认的已å‘é€æ•°æ®åŒ…æ•°é‡" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539 msgid "The maximum number of concurrent messages to send" msgstr "并å‘消æ¯çš„最大å‘é€é‡" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:540 msgid "The number of pending sends which exceed congestion window" msgstr "超过拥塞窗å£çš„å¾…å‘é€æ•°é‡" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541 msgid "The slow start threshold" msgstr "æ…¢å¯åŠ¨é—¨æ§›" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:542 msgid "The round trip time in milliseconds" msgstr "往返时间å•ä½æ¯«ç§’" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1912 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1917 msgid "Dev" msgstr "åå·®" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543 msgid "The standard deviation of the round trip time in milliseconds" msgstr "çŽ¯è¡Œæ—¶é—´çš„æ ‡å‡†å·®å•ä½æ¯«ç§’" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544 msgid "The retransmit timeout in milliseconds" msgstr "é‡ä¼ 输超时时间å•ä½æ¯«ç§’" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:550 -msgid "Current maximum send packet size / estimated maximum receive packet size (bytes)" +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545 +msgid "" +"Current maximum send packet size / estimated maximum receive packet size " +"(bytes)" msgstr "当å‰å‘é€æ•°æ®åŒ…的最大大å°/预计接收数æ®åŒ…的最大大å°(å—节)" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:551 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:721 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1919 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:741 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1924 msgid "TX" msgstr "å‘包" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:551 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546 msgid "The total number of packets sent to the peer" msgstr "å‘节点å‘é€çš„æ•°æ®åŒ…总é‡" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:552 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:722 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1921 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:742 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1926 msgid "RX" msgstr "接包" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:552 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547 msgid "The total number of packets received from the peer" msgstr "从节点接收到数æ®åŒ…总é‡" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:553 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1924 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1929 msgid "Dup TX" msgstr "é‡å‘包" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:553 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548 msgid "The total number of packets retransmitted to the peer" msgstr "å‘节点å‘é€çš„é‡å¤æ•°æ®åŒ…总é‡" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:554 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1926 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1931 msgid "Dup RX" msgstr "é‡æŽ¥åŒ…" -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:554 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549 msgid "The total number of duplicate packets received from the peer" msgstr "从节点接收到的é‡å¤æ•°æ®åŒ…总é‡" @@ -317,174 +390,175 @@ msgstr "从节点接收到的é‡å¤æ•°æ®åŒ…总é‡" msgid "Excessive clock skew: {0}" msgstr "严é‡æ—¶æ»ž:{0}" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:710 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:730 msgid "NTCP connections" msgstr "NTCP连接" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:711 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1881 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:731 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1886 msgid "Limit" msgstr "é™åˆ¶" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:712 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1882 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:732 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1887 msgid "Timeout" msgstr "超时" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:723 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:743 msgid "Out Queue" msgstr "出队" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:724 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:744 msgid "Backlogged?" msgstr "积压?" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:738 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1944 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:758 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1949 #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82 msgid "Inbound" msgstr "入站" -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:740 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1946 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:760 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1951 #: ../java/src/net/i2p/router/web/ConfigTunnelsHelper.java:82 msgid "Outbound" msgstr "出站" #. buf.append("<tr> <td colspan=\"11\"><hr></td></tr>\n"); -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:787 +#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:807 msgid "peers" msgstr "节点" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1880 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1885 msgid "UDP connections" msgstr "UDP连接" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1887 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1892 msgid "Sort by peer hash" msgstr "按节点Hash" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1889 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1894 msgid "Direction/Introduction" msgstr "æ–¹å‘" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1891 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1896 msgid "Sort by idle inbound" msgstr "出站空闲" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1893 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1898 msgid "Sort by idle outbound" msgstr "入站空闲" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1896 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1901 msgid "Sort by inbound rate" msgstr "按入站速度" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1898 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1903 msgid "Sort by outbound rate" msgstr "按出站速度" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1901 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1906 msgid "Sort by connection uptime" msgstr "按连接时间" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1903 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1908 msgid "Sort by clock skew" msgstr "按时滞" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1906 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1911 msgid "Sort by congestion window" msgstr "按拥塞窗å£" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1908 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1913 msgid "Sort by slow start threshold" msgstr "按å¯åŠ¨é—¨æ§›" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1911 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1916 msgid "Sort by round trip time" msgstr "按往返时间" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1913 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1918 msgid "Sort by round trip time deviation" msgstr "按RTTåå·®" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1915 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1920 msgid "Sort by retransmission timeout" msgstr "按é‡ä¼ 输超时时间" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1918 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1923 msgid "Sort by outbound maximum transmit unit" msgstr "æŒ‰å‡ºç«™æœ€å¤§ä¼ è¾“å•å…ƒ" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1920 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1925 msgid "Sort by packets sent" msgstr "按已å‘é€æ•°æ®åŒ…" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1922 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1927 msgid "Sort by packets received" msgstr "按已接收数æ®åŒ…" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1925 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1930 msgid "Sort by packets retransmitted" msgstr "按é‡ä¼ æ•°æ®åŒ…" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1927 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1932 msgid "Sort by packets received more than once" msgstr "按é‡å¤æ•°æ®åŒ…" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1948 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1953 msgid "We offered to introduce them" msgstr "ä¸ç»§å®¢æˆ·" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1950 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1955 msgid "They offered to introduce us" msgstr "ä¸ç»§" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1954 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1959 msgid "Choked" -msgstr "" +msgstr "阻塞" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1962 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1967 msgid "1 fail" msgstr "失败 1 次" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1964 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1969 #, java-format msgid "{0} fails" msgstr "失败 {0} 次" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1970 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1975 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:162 msgid "Banned" msgstr "å·²å°é”" #. buf.append("<tr><td colspan=\"16\"><hr></td></tr>\n"); -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2102 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:2106 msgid "SUMMARY" msgstr "总结" -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:145 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:124 msgid "Dropping tunnel requests: Too slow" msgstr "忽略共享请求:速度太慢" #. don't even bother, since we are so overloaded locally -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:352 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:267 msgid "Dropping tunnel requests: Overloaded" msgstr "忽略共享请求:路由过载" -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:525 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:460 msgid "Rejecting tunnels: Request overload" msgstr "æ‹’ç»å…±äº«ï¼šè¯·æ±‚过多" -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:550 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:485 msgid "Rejecting tunnels: Connection limit" msgstr "æ‹’ç»å…±äº«ï¼šè¿žæŽ¥å—é™" -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:744 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:685 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:706 msgid "Dropping tunnel requests: High load" msgstr "忽略共享请求:高负载" -#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:753 +#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:698 msgid "Dropping tunnel requests: Queue time" msgstr "忽略共享请求:队列积压" @@ -550,876 +624,876 @@ msgstr "澳大利亚" msgid "Aruba" msgstr "阿é²å·´" -#: ../java/build/Countries.java:18 +#: ../java/build/Countries.java:19 msgid "Azerbaijan" msgstr "阿塞拜疆" -#: ../java/build/Countries.java:19 +#: ../java/build/Countries.java:20 msgid "Bosnia and Herzegovina" msgstr "波黑" -#: ../java/build/Countries.java:20 +#: ../java/build/Countries.java:21 msgid "Barbados" msgstr "巴巴多斯" -#: ../java/build/Countries.java:21 +#: ../java/build/Countries.java:22 msgid "Bangladesh" msgstr "åŸåŠ 拉" -#: ../java/build/Countries.java:22 +#: ../java/build/Countries.java:23 msgid "Belgium" msgstr "比利时" -#: ../java/build/Countries.java:23 +#: ../java/build/Countries.java:24 msgid "Burkina Faso" msgstr "布基纳法索" -#: ../java/build/Countries.java:24 +#: ../java/build/Countries.java:25 msgid "Bulgaria" msgstr "ä¿åŠ 利亚" -#: ../java/build/Countries.java:25 +#: ../java/build/Countries.java:26 msgid "Bahrain" msgstr "å·´æž—" -#: ../java/build/Countries.java:26 +#: ../java/build/Countries.java:27 msgid "Burundi" msgstr "ä¸ä¸¹" -#: ../java/build/Countries.java:27 +#: ../java/build/Countries.java:28 msgid "Benin" msgstr "è´å®" -#: ../java/build/Countries.java:28 +#: ../java/build/Countries.java:29 msgid "Bermuda" msgstr "百慕大" -#: ../java/build/Countries.java:29 +#: ../java/build/Countries.java:30 msgid "Brunei Darussalam" msgstr "文莱达é²è¨å…°" -#: ../java/build/Countries.java:30 +#: ../java/build/Countries.java:31 msgid "Bolivia" msgstr "玻利维亚" -#: ../java/build/Countries.java:31 +#: ../java/build/Countries.java:32 msgid "Brazil" msgstr "巴西" -#: ../java/build/Countries.java:32 +#: ../java/build/Countries.java:33 msgid "Bahamas" msgstr "巴哈马" -#: ../java/build/Countries.java:33 +#: ../java/build/Countries.java:34 msgid "Bhutan" msgstr "ä¸ä¸¹" -#: ../java/build/Countries.java:34 +#: ../java/build/Countries.java:35 msgid "Bouvet Island" msgstr "布韦群岛" -#: ../java/build/Countries.java:35 +#: ../java/build/Countries.java:36 msgid "Botswana" msgstr "伯兹瓦纳" -#: ../java/build/Countries.java:36 +#: ../java/build/Countries.java:37 msgid "Belarus" msgstr "白俄罗斯" -#: ../java/build/Countries.java:37 +#: ../java/build/Countries.java:38 msgid "Belize" msgstr "伯利兹" -#: ../java/build/Countries.java:38 +#: ../java/build/Countries.java:39 msgid "Canada" msgstr "åŠ æ‹¿å¤§" -#: ../java/build/Countries.java:39 +#: ../java/build/Countries.java:40 msgid "The Democratic Republic of the Congo" msgstr "刚果" -#: ../java/build/Countries.java:40 +#: ../java/build/Countries.java:41 msgid "Central African Republic" msgstr "ä¸éž" -#: ../java/build/Countries.java:41 +#: ../java/build/Countries.java:42 msgid "Congo" msgstr "Congo" -#: ../java/build/Countries.java:42 +#: ../java/build/Countries.java:43 msgid "Switzerland" msgstr "瑞士" -#: ../java/build/Countries.java:43 +#: ../java/build/Countries.java:44 msgid "Cote D'Ivoire" msgstr "象牙海岸" -#: ../java/build/Countries.java:44 +#: ../java/build/Countries.java:45 msgid "Cook Islands" msgstr "库克群岛" -#: ../java/build/Countries.java:45 +#: ../java/build/Countries.java:46 msgid "Chile" msgstr "智利" -#: ../java/build/Countries.java:46 +#: ../java/build/Countries.java:47 msgid "Cameroon" msgstr "喀麦隆" -#: ../java/build/Countries.java:47 +#: ../java/build/Countries.java:48 msgid "China" msgstr "ä¸å›½" -#: ../java/build/Countries.java:48 +#: ../java/build/Countries.java:49 msgid "Colombia" msgstr "哥伦比亚" -#: ../java/build/Countries.java:49 +#: ../java/build/Countries.java:50 msgid "Costa Rica" msgstr "å“¥æ–¯è¾¾é»ŽåŠ " -#: ../java/build/Countries.java:50 +#: ../java/build/Countries.java:51 msgid "Serbia and Montenegro" msgstr "塞尔维亚与黑山" -#: ../java/build/Countries.java:51 +#: ../java/build/Countries.java:52 msgid "Cuba" msgstr "å¤å·´" -#: ../java/build/Countries.java:52 +#: ../java/build/Countries.java:53 msgid "Cape Verde" msgstr "佛得角" -#: ../java/build/Countries.java:53 +#: ../java/build/Countries.java:54 msgid "Cyprus" msgstr "塞浦路斯" -#: ../java/build/Countries.java:54 +#: ../java/build/Countries.java:55 msgid "Czech Republic" msgstr "æ·å…‹" -#: ../java/build/Countries.java:55 +#: ../java/build/Countries.java:56 msgid "Germany" msgstr "德国" -#: ../java/build/Countries.java:56 +#: ../java/build/Countries.java:57 msgid "Djibouti" msgstr "å‰å¸ƒæ" -#: ../java/build/Countries.java:57 +#: ../java/build/Countries.java:58 msgid "Denmark" msgstr "丹麦" -#: ../java/build/Countries.java:58 +#: ../java/build/Countries.java:59 msgid "Dominica" msgstr "多米尼" -#: ../java/build/Countries.java:59 +#: ../java/build/Countries.java:60 msgid "Dominican Republic" msgstr "å¤šç±³å°¼åŠ è”邦" -#: ../java/build/Countries.java:60 +#: ../java/build/Countries.java:61 msgid "Algeria" msgstr "阿尔åŠåˆ©äºš" -#: ../java/build/Countries.java:61 +#: ../java/build/Countries.java:62 msgid "Ecuador" msgstr "厄瓜多尔" -#: ../java/build/Countries.java:62 +#: ../java/build/Countries.java:63 msgid "Estonia" msgstr "爱沙尼亚" -#: ../java/build/Countries.java:63 +#: ../java/build/Countries.java:64 msgid "Egypt" msgstr "埃åŠ" -#: ../java/build/Countries.java:64 +#: ../java/build/Countries.java:65 msgid "Eritrea" msgstr "厄立特里亚" -#: ../java/build/Countries.java:65 +#: ../java/build/Countries.java:66 msgid "Spain" msgstr "西ç牙" -#: ../java/build/Countries.java:66 +#: ../java/build/Countries.java:67 msgid "Ethiopia" msgstr "埃塞俄比亚" -#: ../java/build/Countries.java:67 +#: ../java/build/Countries.java:68 msgid "Finland" msgstr "芬兰" -#: ../java/build/Countries.java:68 +#: ../java/build/Countries.java:69 msgid "Fiji" msgstr "æ–济" -#: ../java/build/Countries.java:69 +#: ../java/build/Countries.java:70 msgid "Falkland Islands (Malvinas)" msgstr "ç¦å…‹å…°ç¾¤å²›" -#: ../java/build/Countries.java:70 +#: ../java/build/Countries.java:71 msgid "Federated States of Micronesia" msgstr "密克罗尼西亚" -#: ../java/build/Countries.java:71 +#: ../java/build/Countries.java:72 msgid "Faroe Islands" msgstr "法罗群岛" -#: ../java/build/Countries.java:72 +#: ../java/build/Countries.java:73 msgid "France" msgstr "法国" -#: ../java/build/Countries.java:73 +#: ../java/build/Countries.java:74 msgid "Gabon" msgstr "åŠ è“¬" -#: ../java/build/Countries.java:74 +#: ../java/build/Countries.java:75 msgid "United Kingdom" msgstr "英国" -#: ../java/build/Countries.java:75 +#: ../java/build/Countries.java:76 msgid "Grenada" msgstr "æ ¼æž—çº³è¾¾" -#: ../java/build/Countries.java:76 +#: ../java/build/Countries.java:77 msgid "Georgia" msgstr "æ ¼é²å‰äºš" -#: ../java/build/Countries.java:77 +#: ../java/build/Countries.java:78 msgid "French Guiana" msgstr "åœäºšé‚£" -#: ../java/build/Countries.java:78 +#: ../java/build/Countries.java:79 msgid "Ghana" msgstr "åŠ çº³" -#: ../java/build/Countries.java:79 +#: ../java/build/Countries.java:80 msgid "Gibraltar" msgstr "直布罗陀" -#: ../java/build/Countries.java:80 +#: ../java/build/Countries.java:81 msgid "Greenland" msgstr "æ ¼é™µå…°ç¾¤å²›" -#: ../java/build/Countries.java:81 +#: ../java/build/Countries.java:82 msgid "Gambia" msgstr "冈比亚" -#: ../java/build/Countries.java:82 +#: ../java/build/Countries.java:83 msgid "Guinea" msgstr "å‡ å†…äºš" -#: ../java/build/Countries.java:83 +#: ../java/build/Countries.java:84 msgid "Guadeloupe" msgstr "瓜德罗普岛" -#: ../java/build/Countries.java:84 +#: ../java/build/Countries.java:85 msgid "Equatorial Guinea" msgstr "赤é“å‡ å†…äºš" -#: ../java/build/Countries.java:85 +#: ../java/build/Countries.java:86 msgid "Greece" msgstr "希腊" -#: ../java/build/Countries.java:86 +#: ../java/build/Countries.java:87 msgid "South Georgia and the South Sandwich Islands" msgstr "å—乔治亚岛和å—桑德韦奇岛" -#: ../java/build/Countries.java:87 +#: ../java/build/Countries.java:88 msgid "Guatemala" msgstr "å±åœ°é©¬æ‹‰" -#: ../java/build/Countries.java:88 +#: ../java/build/Countries.java:89 msgid "Guam" msgstr "关岛" -#: ../java/build/Countries.java:89 +#: ../java/build/Countries.java:90 msgid "Guinea-Bissau" msgstr "å‡ å†…äºšæ¯”ç»" -#: ../java/build/Countries.java:90 +#: ../java/build/Countries.java:91 msgid "Guyana" msgstr "åœäºšé‚£" -#: ../java/build/Countries.java:91 +#: ../java/build/Countries.java:92 msgid "Hong Kong" msgstr "香港" -#: ../java/build/Countries.java:92 +#: ../java/build/Countries.java:93 msgid "Honduras" msgstr "洪都拉斯" -#: ../java/build/Countries.java:93 +#: ../java/build/Countries.java:94 msgid "Croatia" msgstr "克罗蒂亚" -#: ../java/build/Countries.java:94 +#: ../java/build/Countries.java:95 msgid "Haiti" msgstr "海地" -#: ../java/build/Countries.java:95 +#: ../java/build/Countries.java:96 msgid "Hungary" msgstr "匈牙利" -#: ../java/build/Countries.java:96 +#: ../java/build/Countries.java:97 msgid "Indonesia" msgstr "å°å°¼" -#: ../java/build/Countries.java:97 +#: ../java/build/Countries.java:98 msgid "Ireland" msgstr "爱尔兰" -#: ../java/build/Countries.java:98 +#: ../java/build/Countries.java:99 msgid "Israel" msgstr "以色列" -#: ../java/build/Countries.java:99 +#: ../java/build/Countries.java:101 msgid "India" msgstr "å°åº¦" -#: ../java/build/Countries.java:100 +#: ../java/build/Countries.java:102 msgid "British Indian Ocean Territory" msgstr "英属å°åº¦æ´‹åœ°åŒº" -#: ../java/build/Countries.java:101 +#: ../java/build/Countries.java:103 msgid "Iraq" msgstr "伊拉克" -#: ../java/build/Countries.java:102 +#: ../java/build/Countries.java:104 msgid "Islamic Republic of Iran" msgstr "伊朗" -#: ../java/build/Countries.java:103 +#: ../java/build/Countries.java:105 msgid "Iceland" msgstr "冰岛" -#: ../java/build/Countries.java:104 +#: ../java/build/Countries.java:106 msgid "Italy" msgstr "æ„大利" -#: ../java/build/Countries.java:105 +#: ../java/build/Countries.java:108 msgid "Jamaica" msgstr "ç‰™ä¹°åŠ " -#: ../java/build/Countries.java:106 +#: ../java/build/Countries.java:109 msgid "Jordan" msgstr "约旦" -#: ../java/build/Countries.java:107 +#: ../java/build/Countries.java:110 msgid "Japan" msgstr "日本" -#: ../java/build/Countries.java:108 +#: ../java/build/Countries.java:111 msgid "Kenya" msgstr "肯尼亚" -#: ../java/build/Countries.java:109 +#: ../java/build/Countries.java:112 msgid "Kyrgyzstan" msgstr "å‰å°”å‰æ–¯æ–¯å¦" -#: ../java/build/Countries.java:110 +#: ../java/build/Countries.java:113 msgid "Cambodia" msgstr "柬埔塞" -#: ../java/build/Countries.java:111 +#: ../java/build/Countries.java:114 msgid "Kiribati" msgstr "基里巴斯" -#: ../java/build/Countries.java:112 +#: ../java/build/Countries.java:115 msgid "Comoros" msgstr "科摩罗" -#: ../java/build/Countries.java:113 +#: ../java/build/Countries.java:116 msgid "Saint Kitts and Nevis" msgstr "圣克里斯多ç¦ä¸Žå°¼ç»´æ–¯" -#: ../java/build/Countries.java:114 +#: ../java/build/Countries.java:117 msgid "Republic of Korea" msgstr "韩国" -#: ../java/build/Countries.java:115 +#: ../java/build/Countries.java:118 msgid "Kuwait" msgstr "科å¨ç‰¹" -#: ../java/build/Countries.java:116 +#: ../java/build/Countries.java:119 msgid "Cayman Islands" msgstr "开曼群岛" -#: ../java/build/Countries.java:117 +#: ../java/build/Countries.java:120 msgid "Kazakhstan" msgstr "哈è¨å…‹æ–¯å¦" -#: ../java/build/Countries.java:118 +#: ../java/build/Countries.java:121 msgid "Lao People's Democratic Republic" msgstr "è€æŒ" -#: ../java/build/Countries.java:119 +#: ../java/build/Countries.java:122 msgid "Lebanon" msgstr "黎巴嫩" -#: ../java/build/Countries.java:120 +#: ../java/build/Countries.java:123 msgid "Saint Lucia" msgstr "圣露西亚岛" -#: ../java/build/Countries.java:121 +#: ../java/build/Countries.java:124 msgid "Liechtenstein" msgstr "列支敦士登" -#: ../java/build/Countries.java:122 +#: ../java/build/Countries.java:125 msgid "Sri Lanka" msgstr "斯里兰å¡" -#: ../java/build/Countries.java:123 +#: ../java/build/Countries.java:126 msgid "Liberia" msgstr "利比里亚" -#: ../java/build/Countries.java:124 +#: ../java/build/Countries.java:127 msgid "Lesotho" msgstr "莱索托" -#: ../java/build/Countries.java:125 +#: ../java/build/Countries.java:128 msgid "Lithuania" msgstr "立陶宛" -#: ../java/build/Countries.java:126 +#: ../java/build/Countries.java:129 msgid "Luxembourg" msgstr "å¢æ£®å ¡" -#: ../java/build/Countries.java:127 +#: ../java/build/Countries.java:130 msgid "Latvia" msgstr "拉脱维亚" -#: ../java/build/Countries.java:128 +#: ../java/build/Countries.java:131 msgid "Libyan Arab Jamahiriya" msgstr "利比亚" -#: ../java/build/Countries.java:129 +#: ../java/build/Countries.java:132 msgid "Morocco" msgstr "摩洛哥" -#: ../java/build/Countries.java:130 +#: ../java/build/Countries.java:133 msgid "Monaco" msgstr "摩纳哥" -#: ../java/build/Countries.java:131 +#: ../java/build/Countries.java:134 msgid "Republic of Moldova" msgstr "摩尔多瓦" -#: ../java/build/Countries.java:132 +#: ../java/build/Countries.java:137 msgid "Madagascar" msgstr "é©¬è¾¾åŠ æ–¯åŠ " -#: ../java/build/Countries.java:133 +#: ../java/build/Countries.java:138 msgid "Marshall Islands" msgstr "马ç»å°”群岛" -#: ../java/build/Countries.java:134 +#: ../java/build/Countries.java:139 msgid "The Former Yugoslav Republic of Macedonia" msgstr "å‰å—斯拉夫之马其顿共和国" -#: ../java/build/Countries.java:135 +#: ../java/build/Countries.java:140 msgid "Mali" msgstr "马里" -#: ../java/build/Countries.java:136 +#: ../java/build/Countries.java:141 msgid "Myanmar" msgstr "缅甸" -#: ../java/build/Countries.java:137 +#: ../java/build/Countries.java:142 msgid "Mongolia" msgstr "è’™å¤" -#: ../java/build/Countries.java:138 +#: ../java/build/Countries.java:143 msgid "Macao" msgstr "澳门" -#: ../java/build/Countries.java:139 +#: ../java/build/Countries.java:144 msgid "Northern Mariana Islands" msgstr "北马里亚纳群岛" -#: ../java/build/Countries.java:140 +#: ../java/build/Countries.java:145 msgid "Martinique" msgstr "马æ尼克岛" -#: ../java/build/Countries.java:141 +#: ../java/build/Countries.java:146 msgid "Mauritania" msgstr "毛里塔尼亚" -#: ../java/build/Countries.java:142 +#: ../java/build/Countries.java:147 msgid "Montserrat" msgstr "蒙特塞拉特" -#: ../java/build/Countries.java:143 +#: ../java/build/Countries.java:148 msgid "Malta" msgstr "马尔他" -#: ../java/build/Countries.java:144 +#: ../java/build/Countries.java:149 msgid "Mauritius" msgstr "毛里求斯" -#: ../java/build/Countries.java:145 +#: ../java/build/Countries.java:150 msgid "Maldives" msgstr "马尔代夫" -#: ../java/build/Countries.java:146 +#: ../java/build/Countries.java:151 msgid "Malawi" msgstr "马拉维" -#: ../java/build/Countries.java:147 +#: ../java/build/Countries.java:152 msgid "Mexico" msgstr "墨西哥" -#: ../java/build/Countries.java:148 +#: ../java/build/Countries.java:153 msgid "Malaysia" msgstr "马æ¥è¥¿äºš" -#: ../java/build/Countries.java:149 +#: ../java/build/Countries.java:154 msgid "Mozambique" msgstr "莫桑比克" -#: ../java/build/Countries.java:150 +#: ../java/build/Countries.java:155 msgid "Namibia" msgstr "纳米比亚" -#: ../java/build/Countries.java:151 +#: ../java/build/Countries.java:156 msgid "New Caledonia" msgstr "新喀里多尼亚" -#: ../java/build/Countries.java:152 +#: ../java/build/Countries.java:157 msgid "Niger" msgstr "尼日尔" -#: ../java/build/Countries.java:153 +#: ../java/build/Countries.java:158 msgid "Norfolk Island" msgstr "å°¼åŠ æ‹‰ç“œ" -#: ../java/build/Countries.java:154 +#: ../java/build/Countries.java:159 msgid "Nigeria" msgstr "尼日利亚" -#: ../java/build/Countries.java:155 +#: ../java/build/Countries.java:160 msgid "Nicaragua" msgstr "å°¼åŠ æ‹‰ç“œ" -#: ../java/build/Countries.java:156 +#: ../java/build/Countries.java:161 msgid "Netherlands" msgstr "è·å…°" -#: ../java/build/Countries.java:157 +#: ../java/build/Countries.java:162 msgid "Norway" msgstr "挪å¨" -#: ../java/build/Countries.java:158 +#: ../java/build/Countries.java:163 msgid "Nepal" msgstr "尼泊尔" -#: ../java/build/Countries.java:159 +#: ../java/build/Countries.java:164 msgid "Nauru" msgstr "ç‘™é²" -#: ../java/build/Countries.java:160 +#: ../java/build/Countries.java:165 msgid "Niue" msgstr "纽埃岛" -#: ../java/build/Countries.java:161 +#: ../java/build/Countries.java:166 msgid "New Zealand" msgstr "新西兰" -#: ../java/build/Countries.java:162 +#: ../java/build/Countries.java:167 msgid "Oman" msgstr "阿曼" -#: ../java/build/Countries.java:163 +#: ../java/build/Countries.java:168 msgid "Panama" msgstr "巴拿马" -#: ../java/build/Countries.java:164 +#: ../java/build/Countries.java:169 msgid "Peru" msgstr "秘é²" -#: ../java/build/Countries.java:165 +#: ../java/build/Countries.java:170 msgid "French Polynesia" msgstr "玻利尼西亚" -#: ../java/build/Countries.java:166 +#: ../java/build/Countries.java:171 msgid "Papua New Guinea" msgstr "å·´å¸ƒäºšæ–°å‡ å†…äºš" -#: ../java/build/Countries.java:167 +#: ../java/build/Countries.java:172 msgid "Philippines" msgstr "è²å¾‹å®¾" -#: ../java/build/Countries.java:168 +#: ../java/build/Countries.java:173 msgid "Pakistan" msgstr "巴基斯å¦" -#: ../java/build/Countries.java:169 +#: ../java/build/Countries.java:174 msgid "Poland" msgstr "波兰" -#: ../java/build/Countries.java:170 +#: ../java/build/Countries.java:175 msgid "Saint Pierre and Miquelon" msgstr "圣皮埃尔岛和密克隆" -#: ../java/build/Countries.java:171 +#: ../java/build/Countries.java:176 msgid "Puerto Rico" msgstr "波多黎å„" -#: ../java/build/Countries.java:172 +#: ../java/build/Countries.java:177 msgid "Palestinian Territory" msgstr "å·´å‹’æ–¯å¦åœ°åŒº" -#: ../java/build/Countries.java:173 +#: ../java/build/Countries.java:178 msgid "Portugal" msgstr "è‘¡è„牙" -#: ../java/build/Countries.java:174 +#: ../java/build/Countries.java:179 msgid "Palau" msgstr "帕劳" -#: ../java/build/Countries.java:175 +#: ../java/build/Countries.java:180 msgid "Paraguay" msgstr "巴拉åœ" -#: ../java/build/Countries.java:176 +#: ../java/build/Countries.java:181 msgid "Qatar" msgstr "å¡å¡”å°”" -#: ../java/build/Countries.java:177 +#: ../java/build/Countries.java:182 msgid "Reunion" msgstr "留尼汪岛" -#: ../java/build/Countries.java:178 +#: ../java/build/Countries.java:183 msgid "Romania" msgstr "罗马尼亚" -#: ../java/build/Countries.java:179 +#: ../java/build/Countries.java:184 msgid "Serbia" msgstr "塞尔维亚" -#: ../java/build/Countries.java:180 +#: ../java/build/Countries.java:185 msgid "Russian Federation" msgstr "ä¿„è”邦" -#: ../java/build/Countries.java:181 +#: ../java/build/Countries.java:186 msgid "Rwanda" msgstr "å¢æ—ºè¾¾" -#: ../java/build/Countries.java:182 +#: ../java/build/Countries.java:187 msgid "Saudi Arabia" msgstr "沙特阿拉伯" -#: ../java/build/Countries.java:183 +#: ../java/build/Countries.java:188 msgid "Solomon Islands" msgstr "所罗门群岛" -#: ../java/build/Countries.java:184 +#: ../java/build/Countries.java:189 msgid "Seychelles" msgstr "塞舌尔" -#: ../java/build/Countries.java:185 +#: ../java/build/Countries.java:190 msgid "Sudan" msgstr "è‹ä¸¹" -#: ../java/build/Countries.java:186 +#: ../java/build/Countries.java:191 msgid "Sweden" msgstr "ç‘žå…¸" -#: ../java/build/Countries.java:187 +#: ../java/build/Countries.java:192 msgid "Singapore" msgstr "æ–°åŠ å¡" -#: ../java/build/Countries.java:188 +#: ../java/build/Countries.java:193 msgid "Slovenia" msgstr "斯洛文尼亚" -#: ../java/build/Countries.java:189 +#: ../java/build/Countries.java:194 msgid "Slovakia" msgstr "斯洛ä¼å…‹" -#: ../java/build/Countries.java:190 +#: ../java/build/Countries.java:195 msgid "Sierra Leone" msgstr "塞拉利昂" -#: ../java/build/Countries.java:191 +#: ../java/build/Countries.java:196 msgid "San Marino" msgstr "圣马力诺" -#: ../java/build/Countries.java:192 +#: ../java/build/Countries.java:197 msgid "Senegal" msgstr "å¡žå†…åŠ å°”" -#: ../java/build/Countries.java:193 +#: ../java/build/Countries.java:198 msgid "Somalia" msgstr "索马里" -#: ../java/build/Countries.java:194 +#: ../java/build/Countries.java:199 msgid "Suriname" msgstr "è‹é‡Œå—" -#: ../java/build/Countries.java:195 +#: ../java/build/Countries.java:200 msgid "Sao Tome and Principe" msgstr "圣多美与普林西比共和国" -#: ../java/build/Countries.java:196 +#: ../java/build/Countries.java:201 msgid "El Salvador" msgstr "è¨å°”瓦多" -#: ../java/build/Countries.java:197 +#: ../java/build/Countries.java:202 msgid "Syrian Arab Republic" msgstr "å™åˆ©äºš" -#: ../java/build/Countries.java:198 +#: ../java/build/Countries.java:203 msgid "Swaziland" msgstr "æ–¯å¨å£«å…°" -#: ../java/build/Countries.java:199 +#: ../java/build/Countries.java:204 msgid "Turks and Caicos Islands" msgstr "特克斯和凯科斯群岛" -#: ../java/build/Countries.java:200 +#: ../java/build/Countries.java:205 msgid "Chad" msgstr "ä¹å¾—" -#: ../java/build/Countries.java:201 +#: ../java/build/Countries.java:206 msgid "French Southern Territories" msgstr "法属å—åŠçƒé¢†åœ°" -#: ../java/build/Countries.java:202 +#: ../java/build/Countries.java:207 msgid "Togo" msgstr "多哥" -#: ../java/build/Countries.java:203 +#: ../java/build/Countries.java:208 msgid "Thailand" msgstr "泰国" -#: ../java/build/Countries.java:204 +#: ../java/build/Countries.java:209 msgid "Tajikistan" msgstr "å¡”å‰å…‹æ–¯å¦" -#: ../java/build/Countries.java:205 +#: ../java/build/Countries.java:210 msgid "Tokelau" msgstr "托克劳群岛" -#: ../java/build/Countries.java:206 +#: ../java/build/Countries.java:211 msgid "Timor-Leste" msgstr "东å¸æ±¶" -#: ../java/build/Countries.java:207 +#: ../java/build/Countries.java:212 msgid "Turkmenistan" msgstr "土库曼斯å¦" -#: ../java/build/Countries.java:208 +#: ../java/build/Countries.java:213 msgid "Tunisia" msgstr "çªå°¼æ–¯" -#: ../java/build/Countries.java:209 +#: ../java/build/Countries.java:214 msgid "Tonga" msgstr "æ±¤åŠ " -#: ../java/build/Countries.java:210 +#: ../java/build/Countries.java:215 msgid "Turkey" msgstr "土耳其" -#: ../java/build/Countries.java:211 +#: ../java/build/Countries.java:216 msgid "Trinidad and Tobago" msgstr "特立尼达和多巴哥" -#: ../java/build/Countries.java:212 +#: ../java/build/Countries.java:217 msgid "Tuvalu" msgstr "图瓦é²" -#: ../java/build/Countries.java:213 +#: ../java/build/Countries.java:218 msgid "Taiwan" msgstr "å°æ¹¾" -#: ../java/build/Countries.java:214 +#: ../java/build/Countries.java:219 msgid "United Republic of Tanzania" msgstr "å¦æ¡‘尼亚" -#: ../java/build/Countries.java:215 +#: ../java/build/Countries.java:220 msgid "Ukraine" msgstr "乌克兰" -#: ../java/build/Countries.java:216 +#: ../java/build/Countries.java:221 msgid "Uganda" msgstr "乌干达" -#: ../java/build/Countries.java:217 +#: ../java/build/Countries.java:222 msgid "United States Minor Outlying Islands" msgstr "美国本土外å°å²›å±¿" -#: ../java/build/Countries.java:218 +#: ../java/build/Countries.java:223 msgid "United States" msgstr "美国" -#: ../java/build/Countries.java:219 +#: ../java/build/Countries.java:224 msgid "Uruguay" msgstr "乌拉åœ" -#: ../java/build/Countries.java:220 +#: ../java/build/Countries.java:225 msgid "Uzbekistan" msgstr "乌兹别克斯å¦" -#: ../java/build/Countries.java:221 +#: ../java/build/Countries.java:226 msgid "Holy See (Vatican City State)" msgstr "梵地冈" -#: ../java/build/Countries.java:222 +#: ../java/build/Countries.java:227 msgid "Saint Vincent and the Grenadines" msgstr "åœ£æ–‡æ£®ç‰¹å’Œæ ¼æž—çº³ä¸æ–¯" -#: ../java/build/Countries.java:223 +#: ../java/build/Countries.java:228 msgid "Venezuela" msgstr "委内瑞拉" -#: ../java/build/Countries.java:224 -#: ../java/build/Countries.java:225 +#: ../java/build/Countries.java:229 ../java/build/Countries.java:230 msgid "Virgin Islands" msgstr "维京群岛" -#: ../java/build/Countries.java:226 +#: ../java/build/Countries.java:231 msgid "Viet Nam" msgstr "越å—" -#: ../java/build/Countries.java:227 +#: ../java/build/Countries.java:232 msgid "Vanuatu" msgstr "瓦努阿图" -#: ../java/build/Countries.java:228 +#: ../java/build/Countries.java:233 msgid "Wallis and Futuna" msgstr "瓦利斯群岛和富图纳群岛" -#: ../java/build/Countries.java:229 +#: ../java/build/Countries.java:234 msgid "Samoa" msgstr "东è¨æ‘©äºš" -#: ../java/build/Countries.java:230 +#: ../java/build/Countries.java:235 msgid "Yemen" msgstr "也门" -#: ../java/build/Countries.java:231 +#: ../java/build/Countries.java:236 msgid "Mayotte" msgstr "马约特" -#: ../java/build/Countries.java:232 +#: ../java/build/Countries.java:237 msgid "South Africa" msgstr "å—éž" -#: ../java/build/Countries.java:233 +#: ../java/build/Countries.java:238 msgid "Zambia" msgstr "赞比亚" -#: ../java/build/Countries.java:234 +#: ../java/build/Countries.java:239 msgid "Zimbabwe" msgstr "津巴布韦" -#: ../java/src/net/i2p/router/web/CSSHelper.java:57 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:34 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:36 +#: ../java/src/net/i2p/router/web/CSSHelper.java:58 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:35 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:37 #: ../java/strings/Strings.java:29 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:234 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:119 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:233 msgid "I2P Router Console" msgstr "I2P 路由控制å°" @@ -1434,248 +1508,262 @@ msgstr "设置ä¿å˜æˆåŠŸ" #: ../java/src/net/i2p/router/web/ConfigAdvancedHandler.java:71 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:268 -msgid "Error saving the configuration (applied but not saved) - please see the error logs" +msgid "" +"Error saving the configuration (applied but not saved) - please see the " +"error logs" msgstr "é…ç½®ä¿å˜å‡ºé”™(已应用但未ä¿å˜) - å‚è§é”™è¯¯æ—¥å¿—" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:34 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:334 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:35 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:335 msgid "Save Client Configuration" msgstr "ä¿å˜å®¢æˆ·ç¨‹åºè®¾ç½®" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:38 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:346 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:39 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:405 +msgid "Save Interface Configuration" +msgstr "ä¿å˜æŽ¥å£é…ç½®" + +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:43 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:417 msgid "Save WebApp Configuration" msgstr "ä¿å˜ WebApp 设置" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:42 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:356 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:47 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:427 msgid "Save Plugin Configuration" msgstr "ä¿å˜æ’件é…ç½®" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:46 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:362 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:51 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:433 msgid "Install Plugin" msgstr "安装æ’件" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:82 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:87 #, java-format msgid "Deleted plugin {0}" msgstr "åˆ é™¤æ’件 {0}" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:84 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:89 #, java-format msgid "Error deleting plugin {0}" msgstr "åˆ é™¤æ’件 {0} æ—¶å‘生错误" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:96 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:101 #, java-format msgid "Stopped plugin {0}" msgstr "æ’件 {0} å·²åœç”¨" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:98 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:103 #, java-format msgid "Error stopping plugin {0}" msgstr "åœç”¨æ’件 {0} æ—¶å‘生错误" #. label (IE) -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:119 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:189 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:124 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:255 msgid "Start" msgstr "å¯åŠ¨" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:138 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:143 #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:49 #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:61 +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:33 msgid "Unsupported" msgstr "未支æŒçš„" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:184 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:189 msgid "New client added" msgstr "æ–°å®¢æˆ·ç«¯æ·»åŠ å®Œæ¯•" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:188 -msgid "Client configuration saved successfully - restart required to take effect." +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:193 +msgid "" +"Client configuration saved successfully - restart required to take effect." msgstr "客户程åºè®¾ç½®ä¿å˜æˆåŠŸ - 程åºé‡å¯åŽç”Ÿæ•ˆ" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:202 -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:213 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:207 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:218 msgid "Bad client index." msgstr "客户程åºç´¢å¼•æ— 效" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:207 -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:218 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:38 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:387 -#: ../java/src/net/i2p/router/web/SummaryHelper.java:379 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:212 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:223 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:397 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:384 msgid "Client" msgstr "客户" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:207 -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:266 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:212 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:271 msgid "started" msgstr "å·²å¯åŠ¨" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:218 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:223 msgid "deleted" msgstr "å·²åˆ é™¤" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:235 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:240 msgid "WebApp configuration saved." msgstr "WebApp 设置已ä¿å˜" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:251 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:256 msgid "Plugin configuration saved." msgstr "æ’件é…置已ä¿å˜" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:266 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:58 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:271 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124 msgid "WebApp" msgstr "Web程åº" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:268 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:273 msgid "Failed to start" msgstr "å¯åŠ¨å¤±è´¥" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:273 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:278 msgid "Failed to find server." msgstr "æœåŠ¡å™¨æˆ–æœåŠ¡ç¨‹åºæŸ¥æ‰¾å¤±è´¥ã€‚" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:279 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:284 msgid "No plugin URL specified." msgstr "未指定æ’件链接" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:289 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:294 #, java-format msgid "No update URL specified for {0}" msgstr "{0} 未指定更新链接" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:297 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:302 -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:315 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:307 #: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:320 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:325 msgid "Plugin or update download already in progress." msgstr "æ’件/更新包的下载æ£åœ¨è¿›è¡Œ" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:306 -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:117 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:311 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:118 #, java-format msgid "Downloading plugin from {0}" msgstr "æ£åœ¨ä»Ž {0} 下载æ’件" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:324 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:329 #, java-format msgid "Checking plugin {0} for updates" msgstr "æ£åœ¨æ£€æŸ¥æ’件 {0} 是å¦å˜åœ¨æ›´æ–°" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:334 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:339 #, java-format msgid "Started plugin {0}" msgstr "æ’件 {0} å·²è¿è¡Œ" -#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:336 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:341 #, java-format msgid "Error starting plugin {0}" msgstr "æ’件å¯åŠ¨é”™è¯¯ {0}" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:21 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:192 +#: ../java/src/net/i2p/router/web/ConfigClientsHandler.java:376 +msgid "" +"Interface configuration saved successfully - restart required to take effect." +msgstr "接å£é…ç½®ä¿å˜æˆåŠŸ - I2Pé‡å¯åŽç”Ÿæ•ˆ" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:85 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:258 msgid "Edit" msgstr "编辑" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:30 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:330 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:94 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:331 msgid "Add Client" msgstr "æ·»åŠ å®¢æˆ·ç«¯" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:38 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102 msgid "Class and arguments" msgstr "类与å‚æ•°" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:38 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:58 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:82 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148 msgid "Control" msgstr "控制项" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:38 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:58 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:82 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:102 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148 msgid "Run at Startup?" msgstr "å¯åŠ¨æ—¶è¿è¡Œï¼Ÿ" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:58 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:82 -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:131 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:124 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:197 msgid "Description" msgstr "æè¿°" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:82 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:148 msgid "Plugin" msgstr "æ’件" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:95 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:268 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:180 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:161 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:271 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:185 msgid "Version" msgstr "版本" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:97 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:163 msgid "Signed by" msgstr "æ•°å—ç¾å者:" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:114 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:180 msgid "Date" msgstr "日期" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:120 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:186 msgid "Author" msgstr "作者" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:136 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:202 msgid "License" msgstr "许å¯è¯" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:141 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:207 msgid "Website" msgstr "网站" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:146 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:212 msgid "Update link" msgstr "更新链接" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:194 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:260 msgid "Stop" msgstr "åœæ¢" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:196 -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:81 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:312 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:262 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:78 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:313 msgid "Check for updates" msgstr "检查更新" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:197 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:263 #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:230 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:237 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:235 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:242 msgid "Update" msgstr "æ›´æ–°" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:202 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:268 #, java-format msgid "Are you sure you want to delete {0}?" msgstr "您确定è¦åˆ 除 {0} ?" -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:204 +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:270 msgid "Delete" msgstr "åˆ é™¤" #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:18 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:324 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:325 msgid "Add key" msgstr "æ·»åŠ å¯†é’¥" #: ../java/src/net/i2p/router/web/ConfigKeyringHandler.java:19 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:322 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:323 msgid "Delete key" msgstr "åˆ é™¤å¯†é’¥" @@ -1713,40 +1801,61 @@ msgstr "在钥匙环未找到" msgid "Invalid destination" msgstr "ç›®æ ‡æ— æ•ˆ" -#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:46 -msgid "Add additional logging statements above. Example: net.i2p.router.tunnel=WARN" +#: ../java/src/net/i2p/router/web/ConfigLoggingHandler.java:82 +msgid "Log overrides updated" +msgstr "日志å‚数已更新" + +#: ../java/src/net/i2p/router/web/ConfigLoggingHandler.java:160 +msgid "Log configuration saved" +msgstr "日志设置已ä¿å˜" + +#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:48 +msgid "" +"Add additional logging statements above. Example: net.i2p.router.tunnel=WARN" msgstr "" +"é¢å¤–的日志å‚æ•°å¯ä»¥åœ¨ä¸Šæ–¹çš„文本框ä¸åŠ 入,例如: net.i2p.router.tunnel=WARN" -#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:47 -msgid "Or put entries in the logger.config file. Example: logger.record.net.i2p.router.tunnel=WARN" +#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:49 +msgid "" +"Or put entries in the logger.config file. Example: logger.record.net.i2p." +"router.tunnel=WARN" msgstr "" +"æˆ–åŠ å…¥logger.config文件ä¸ã€‚例如 logger.record.net.i2p.router.tunnel=WARN" -#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:48 +#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:50 msgid "Valid levels are DEBUG, INFO, WARN, ERROR, CRIT" -msgstr "" +msgstr "å¯ç”¨çš„日志ç‰çº§åŒ…括 DEBUG, INFO, WARN, ERROR, CRIT" -#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:52 +#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68 msgid "CRIT" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:52 +#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68 msgid "DEBUG" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:52 +#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68 msgid "ERROR" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:52 +#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68 msgid "INFO" msgstr "" -#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:52 +#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:68 msgid "WARN" msgstr "" +#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:88 +msgid "Remove" +msgstr "åˆ é™¤" + +#: ../java/src/net/i2p/router/web/ConfigLoggingHelper.java:125 +msgid "Select a class to add" +msgstr "选择è¦æ·»åŠ çš„ç±»" + #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:199 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:204 msgid "Network" msgstr "网络" @@ -1755,8 +1864,8 @@ msgid "Service" msgstr "æœåŠ¡" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:100 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:376 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:101 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:386 #: ../java/strings/Strings.java:72 msgid "Tunnels" msgstr "隧é“" @@ -1770,7 +1879,7 @@ msgid "Clients" msgstr "客户端" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:292 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:293 msgid "Keyring" msgstr "钥匙环" @@ -1779,15 +1888,15 @@ msgid "Logging" msgstr "日志" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:106 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:255 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:107 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:260 #: ../java/strings/Strings.java:67 msgid "Peers" msgstr "节点" #: ../java/src/net/i2p/router/web/ConfigNavHelper.java:19 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:382 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:142 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:387 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:143 msgid "Stats" msgstr "统计" @@ -1797,13 +1906,15 @@ msgstr "高级" #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:48 #: ../java/src/net/i2p/router/web/ConfigNetHandler.java:264 -#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:35 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:359 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:515 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:305 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:335 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:375 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:343 +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:29 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:34 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:360 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:516 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:307 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:341 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:352 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:377 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:344 msgid "Save changes" msgstr "ä¿å˜ä¿®æ”¹" @@ -1889,25 +2000,25 @@ msgstr "æ£åœ¨æ›´æ–°å…±äº«å¸¦å®½æ¯”例" msgid "Updated bandwidth limits" msgstr "带宽é™åˆ¶æ›´æ–°å®Œæ¯•" -#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:39 -#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:47 -#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:50 -#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:57 -#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:60 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:41 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:49 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:52 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:59 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:62 msgid "unknown" msgstr "未知" -#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:169 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:172 msgid "bits per second" msgstr "Bit/s" -#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:170 +#: ../java/src/net/i2p/router/web/ConfigNetHelper.java:173 #, java-format msgid "or {0} bytes per month maximum" msgstr "或最多 {0} Byte/月(å‡è®¾å§‹ç»ˆ 7 天 x 24å°æ—¶å¼€æœº)" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:20 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:314 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:315 msgid "Ban peer until restart" msgstr "å°æ€èŠ‚点直到é‡å¯" @@ -1927,7 +2038,7 @@ msgid "Invalid peer" msgstr "æ— æ•ˆèŠ‚ç‚¹" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:28 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:316 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:317 msgid "Unban peer" msgstr "节点解å°" @@ -1940,8 +2051,8 @@ msgid "is not currently banned" msgstr "ç›®å‰æœªå°é”" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:39 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:322 -msgid "Adjust Profile Bonuses" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:343 +msgid "Adjust peer bonuses" msgstr "调整节点评分" #: ../java/src/net/i2p/router/web/ConfigPeerHandler.java:47 @@ -1952,10 +2063,28 @@ msgstr "é€Ÿåº¦å€¼æ— æ•ˆ" msgid "Bad capacity value" msgstr "容é‡å€¼æ— 效" +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:17 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:350 +msgid "Save changes and reseed now" +msgstr "ä¿å˜ä¿®æ”¹+立刻开始网络引导" + +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:21 +msgid "Reseeding is already in progress" +msgstr "网络引导ä¸" + +#. skip the nonce checking in ReseedHandler +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:24 +msgid "Starting reseed process" +msgstr "æ£åœ¨å¼€å§‹å¼•å¯¼è¿‡ç¨‹" + +#: ../java/src/net/i2p/router/web/ConfigReseedHandler.java:66 +msgid "Configuration saved successfully." +msgstr "设置ä¿å˜æˆåŠŸ" + #. Normal browsers send value, IE sends button label #: ../java/src/net/i2p/router/web/ConfigRestartBean.java:32 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:57 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:292 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:293 msgid "Shutdown immediately" msgstr "立刻关é—" @@ -2002,7 +2131,7 @@ msgid "Restart in {0}" msgstr "{0} åŽé‡å¯" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:53 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:290 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:291 msgid "Shutdown gracefully" msgstr "平滑关é—" @@ -2015,7 +2144,7 @@ msgid "Shutdown immediately! boom bye bye bad bwoy" msgstr "ç«‹å³å…³é—ï¼ä¸æŽ¨è" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:61 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:294 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:295 msgid "Cancel graceful shutdown" msgstr "å–消平滑关é—" @@ -2024,7 +2153,7 @@ msgid "Graceful shutdown cancelled" msgstr "平滑关é—å·²å–消" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:64 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:306 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:307 msgid "Graceful restart" msgstr "平滑é‡å¯" @@ -2033,7 +2162,7 @@ msgid "Graceful restart requested" msgstr "平滑é‡å¯å·²è¯·æ±‚" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:68 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:308 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:309 msgid "Hard restart" msgstr "硬é‡å¯" @@ -2058,107 +2187,85 @@ msgid "Rekeying after graceful shutdown" msgstr "平滑关é—åŽæ›´æ¢å¯†é’¥" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:80 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:334 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:335 msgid "Run I2P on startup" msgstr "系统å¯åŠ¨æ—¶è¿è¡ŒI2P" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:82 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:336 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:337 msgid "Don't run I2P on startup" msgstr "系统å¯åŠ¨æ—¶ä¸è¿è¡ŒI2P" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:84 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:354 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:355 msgid "Dump threads" msgstr "" #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:91 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:322 -msgid "Show systray icon" -msgstr "æ˜¾ç¤ºæ‰˜ç›˜å›¾æ ‡" - -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:96 -msgid "System tray icon enabled." -msgstr "ç³»ç»Ÿæ‰˜ç›˜å›¾æ ‡å·²å¯ç”¨" - -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:98 -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:110 -msgid "System tray icon feature not supported on this platform. Sorry!" -msgstr "您的平å°ä¸æ”¯æŒç³»ç»Ÿæ‰˜ç›˜å›¾æ ‡åŠŸèƒ½" - -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:101 -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:113 -msgid "Warning: unable to contact the systray manager" -msgstr "è¦å‘Šï¼šä¸Žæ‰˜ç›˜ç®¡ç†å™¨é€šè®¯å¤±è´¥" - -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:103 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:324 -msgid "Hide systray icon" -msgstr "éšè—ç³»ç»Ÿå›¾æ ‡" - -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:108 -msgid "System tray icon disabled." -msgstr "系统托盘已ç¦ç”¨" - -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:115 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:362 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:363 msgid "View console on startup" msgstr "程åºå¯åŠ¨æ—¶æ˜¾ç¤ºæŽ§åˆ¶å°" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:117 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:93 msgid "Console is to be shown on startup" msgstr "å¯åŠ¨åŽæ˜¾ç¤ºæŽ§åˆ¶å°" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:118 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:364 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:94 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:365 msgid "Do not view console on startup" msgstr "å¯åŠ¨åŽä¸æ‰“开控制å°" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:120 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:96 msgid "Console is not to be shown on startup" msgstr "å¯åŠ¨åŽä¸æ˜¾ç¤ºæŽ§åˆ¶å°" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:129 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:105 msgid "Service installed" msgstr "æœåŠ¡å·²å®‰è£…" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:131 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:107 msgid "Warning: unable to install the service" msgstr "è¦å‘Šï¼šæ— 法安装æœåŠ¡" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:137 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:113 msgid "Service removed" msgstr "æœåŠ¡å·²å¸è½½" -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:139 +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:115 msgid "Warning: unable to remove the service" msgstr "è¦å‘Šï¼šæ— 法å¸è½½æœåŠ¡" -#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:118 +#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:111 msgid "Stat filter and location updated successfully to" msgstr "统计数æ®è¿‡æ»¤å™¨åŠä½ç½®æˆåŠŸæ›´æ–°è‡³" -#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:120 +#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:113 msgid "Failed to update the stat filter and location" msgstr "统计数æ®è¿‡æ»¤å™¨åŠåœ°å€æ›´æ–°å¤±è´¥" -#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:121 -msgid "Graph list updated, may take up to 60s to be reflected here and on the <a href=\"graphs.jsp\">Graphs Page</a>" -msgstr "曲线图列表已更新,更新åŽçš„内容å¯èƒ½éœ€è¦æœ€å¤š 60s 的时间æ‰èƒ½åœ¨è¿™é‡ŒåŠ <a href=\"graphs.jsp\">统计图表</a>页é¢ä¸åæ˜ å‡ºæ¥ã€‚" +#: ../java/src/net/i2p/router/web/ConfigStatsHandler.java:114 +msgid "" +"Graph list updated, may take up to 60s to be reflected here and on the <a " +"href=\"graphs.jsp\">Graphs Page</a>" +msgstr "" +"曲线图列表已更新,更新åŽçš„内容å¯èƒ½éœ€è¦æœ€å¤š 60s 的时间æ‰èƒ½åœ¨è¿™é‡ŒåŠ <a href=" +"\"graphs.jsp\">统计图表</a>页é¢ä¸åæ˜ å‡ºæ¥ã€‚" #. the count isn't really correct anyway, since we don't check for actual changes #. addFormNotice("Updated settings for " + updated + " pools."); -#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:137 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:135 msgid "Updated settings for all pools." msgstr "隧é“æ± æ›´æ–°å®Œæ¯•" -#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:142 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:140 msgid "Exploratory tunnel configuration saved successfully." msgstr "探索隧é“设置ä¿å˜æˆåŠŸã€‚" -#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:144 +#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:142 #: ../java/src/net/i2p/router/web/ConfigUIHandler.java:36 -msgid "Error saving the configuration (applied but not saved) - please see the error logs." +msgid "" +"Error saving the configuration (applied but not saved) - please see the " +"error logs." msgstr "é…ç½®ä¿å˜å‡ºé”™(已应用但未ä¿å˜) - å‚è§é”™è¯¯æ—¥å¿—" #. * dummies for translation @@ -2238,79 +2345,91 @@ msgid "Refresh the page to view." msgstr "刷新页é¢åŽæŸ¥çœ‹ã€‚" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51 +msgid "Arabic" +msgstr "" + +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 msgid "English" msgstr "英è¯" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 msgid "French" msgstr "法è¯" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:51 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 msgid "German" msgstr "å¾·è¯" #: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 -msgid "Chinese" -msgstr "ä¸æ–‡" +msgid "Spanish" +msgstr "西ç牙è¯" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53 msgid "Dutch" msgstr "è·å…°è¯" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53 +msgid "Portuguese" +msgstr "è‘¡è„牙è¯" + +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:53 msgid "Russian" msgstr "ä¿„è¯" -#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:52 +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:54 +msgid "Chinese" +msgstr "ä¸æ–‡" + +#: ../java/src/net/i2p/router/web/ConfigUIHelper.java:54 msgid "Swedish" msgstr "瑞士è¯" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:88 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:85 msgid "Update available, attempting to download now" msgstr "有更新å¯ç”¨ï¼Œæ£åœ¨å°è¯•ä¸‹è½½" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:90 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:87 msgid "Update available, click button on left to download" msgstr "有更新å¯ç”¨ï¼Œç‚¹å·¦ä¾§æŒ‰é’®ä¸‹è½½" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:96 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:93 msgid "No update available" msgstr "æ— æ›´æ–°" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:104 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:101 msgid "Updating news URL to" msgstr "æ£åœ¨æ›´æ–°æ–°é—»é“¾æŽ¥è‡³" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:112 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:109 msgid "Updating proxy host to" msgstr "æ£åœ¨æ›´æ–°ä»£ç†ä¸»æœºè‡³" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:120 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:117 msgid "Updating proxy port to" msgstr "æ£åœ¨æ›´æ–°ä»£ç†ç«¯å£è‡³" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:133 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:130 msgid "Updating refresh frequency to" msgstr "æ£åœ¨æ›´æ–°æ›´æ–°é¢‘率为" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:140 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:137 msgid "Updating update policy to" msgstr "æ£åœ¨æ›´æ–°æ›´æ–°ç–略为" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:149 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:146 msgid "Updating update URLs." msgstr "æ£åœ¨æ›´æ–°æ›´æ–°é“¾æŽ¥è‡³" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:158 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:155 msgid "Updating trusted keys." msgstr "æ£åœ¨æ›´æ–°å¯ä¿¡å…¬é’¥ä¸º" -#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:166 +#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:163 msgid "Updating unsigned update URL to" msgstr "æ£åœ¨æ›´æ–°æœªç¾å软件链接至" #: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:88 -#: ../java/src/net/i2p/router/web/GraphHelper.java:138 +#: ../java/src/net/i2p/router/web/GraphHelper.java:167 msgid "Never" msgstr "从ä¸" @@ -2330,264 +2449,266 @@ msgstr "仅下载并验è¯" msgid "Download, verify, and restart" msgstr "仅下载ã€éªŒè¯å¹¶é‡å¯" -#: ../java/src/net/i2p/router/web/FormHandler.java:163 -msgid "Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit." +#: ../java/src/net/i2p/router/web/FormHandler.java:174 +msgid "" +"Invalid form submission, probably because you used the 'back' or 'reload' " +"button on your browser. Please resubmit." msgstr "表å•æäº¤æ— æ•ˆï¼Œå¯èƒ½çš„åŽŸå› æ˜¯æ‚¨ä½¿ç”¨äº†â€œåŽé€€â€æˆ–“刷新â€æŒ‰é’®ã€‚请é‡æ–°æ交。" -#: ../java/src/net/i2p/router/web/GraphHelper.java:82 +#: ../java/src/net/i2p/router/web/GraphHelper.java:93 msgid "Combined bandwidth graph" msgstr "å¤åˆå¸¦å®½å›¾" #. e.g. "statname for 60m" -#: ../java/src/net/i2p/router/web/GraphHelper.java:96 +#: ../java/src/net/i2p/router/web/GraphHelper.java:107 #, java-format msgid "{0} for {1}" msgstr "过去 {1} 统计 {0}" -#: ../java/src/net/i2p/router/web/GraphHelper.java:130 +#: ../java/src/net/i2p/router/web/GraphHelper.java:146 msgid "Configure Graph Display" msgstr "图表显示设置" -#: ../java/src/net/i2p/router/web/GraphHelper.java:130 +#: ../java/src/net/i2p/router/web/GraphHelper.java:146 msgid "Select Stats" msgstr "选择统计项" -#: ../java/src/net/i2p/router/web/GraphHelper.java:132 +#: ../java/src/net/i2p/router/web/GraphHelper.java:150 msgid "Periods" msgstr "周期" -#: ../java/src/net/i2p/router/web/GraphHelper.java:133 +#: ../java/src/net/i2p/router/web/GraphHelper.java:151 msgid "Plot averages" msgstr "事件å‡å€¼" -#: ../java/src/net/i2p/router/web/GraphHelper.java:134 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:416 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:332 +#: ../java/src/net/i2p/router/web/GraphHelper.java:152 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:417 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:333 msgid "or" msgstr "或" -#: ../java/src/net/i2p/router/web/GraphHelper.java:134 +#: ../java/src/net/i2p/router/web/GraphHelper.java:152 msgid "plot events" msgstr "事件数é‡" -#: ../java/src/net/i2p/router/web/GraphHelper.java:135 +#: ../java/src/net/i2p/router/web/GraphHelper.java:153 msgid "Image sizes" msgstr "图åƒå°ºå¯¸" -#: ../java/src/net/i2p/router/web/GraphHelper.java:135 +#: ../java/src/net/i2p/router/web/GraphHelper.java:153 msgid "width" msgstr "宽度" -#: ../java/src/net/i2p/router/web/GraphHelper.java:136 +#: ../java/src/net/i2p/router/web/GraphHelper.java:154 msgid "height" msgstr "高度" -#: ../java/src/net/i2p/router/web/GraphHelper.java:136 -#: ../java/src/net/i2p/router/web/GraphHelper.java:137 +#: ../java/src/net/i2p/router/web/GraphHelper.java:154 +#: ../java/src/net/i2p/router/web/GraphHelper.java:155 msgid "pixels" msgstr "åƒç´ " -#: ../java/src/net/i2p/router/web/GraphHelper.java:138 +#: ../java/src/net/i2p/router/web/GraphHelper.java:156 msgid "Refresh delay" msgstr "刷新延迟" -#: ../java/src/net/i2p/router/web/GraphHelper.java:138 -msgid "hour" -msgstr "å°æ—¶" - -#: ../java/src/net/i2p/router/web/GraphHelper.java:138 -msgid "minute" -msgstr "分钟" - -#: ../java/src/net/i2p/router/web/GraphHelper.java:138 -msgid "minutes" -msgstr "分钟" - -#: ../java/src/net/i2p/router/web/GraphHelper.java:139 +#: ../java/src/net/i2p/router/web/GraphHelper.java:171 msgid "Redraw" msgstr "é‡ç»˜" +#: ../java/src/net/i2p/router/web/GraphHelper.java:203 +msgid "Graph settings saved" +msgstr "图表设置已ä¿å˜" + #: ../java/src/net/i2p/router/web/LogsHelper.java:13 #: ../java/src/net/i2p/router/web/LogsHelper.java:37 msgid "File location" msgstr "文件ä½ç½®" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:77 +#: ../java/src/net/i2p/router/web/LogsHelper.java:34 +msgid "File not found" +msgstr "文件未找到" + +#: ../java/src/net/i2p/router/web/LogsHelper.java:52 +msgid "No log messages" +msgstr "日志ä¸æ— 消æ¯" + +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:80 msgid "Network Database RouterInfo Lookup" msgstr "网络数æ®åº“ RouterInfo 检索" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:92 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:95 #: ../java/strings/Strings.java:68 msgid "Router" msgstr "路由器" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:92 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:95 msgid "not found in network database" msgstr "在网络数æ®åº“概况未找到" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:104 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:212 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:107 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:215 msgid "Network Database Contents" msgstr "网络数æ®åº“内容" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:105 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:108 msgid "View RouterInfo" msgstr "æµè§ˆ RouterInfo" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:106 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:109 msgid "LeaseSets" msgstr "èµé›†" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:128 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:131 msgid "LeaseSet" msgstr "èµé›†" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:130 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:133 msgid "Local" msgstr "本地" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:132 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:135 msgid "Unpublished" msgstr "未å‘布" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:133 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:140 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:136 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:143 msgid "Destination" msgstr "ç›®æ ‡" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:150 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:153 #, java-format msgid "Expires in {0}" msgstr "{0} åŽè¿‡æœŸ" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:152 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:155 #, java-format msgid "Expired {0} ago" msgstr "{0}å‰è¿‡æœŸ" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:164 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:167 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:156 msgid "Gateway" msgstr "网关" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:164 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:167 msgid "Lease" msgstr "租èµ" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:166 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:169 msgid "Tunnel" msgstr "隧é“" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:212 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:215 msgid "View LeaseSets" msgstr "查看èµé›†" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:214 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:217 msgid "Not initialized" msgstr "未åˆå§‹åŒ–" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:223 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:226 msgid "Routers" msgstr "路由器" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:225 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:228 msgid "Show all routers" msgstr "显示所有路由器" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:227 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:230 msgid "Show all routers with full stats" msgstr "显示所有路由åŠç»Ÿè®¡" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:262 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:265 msgid "Network Database Router Statistics" msgstr "NetDb路由器统计" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:268 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:282 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:300 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:271 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:285 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:303 msgid "Count" msgstr "计数" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:282 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:285 msgid "Transports" msgstr "ä¼ è¾“" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:300 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:303 msgid "Country" msgstr "国家" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:339 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:342 msgid "Our info" msgstr "我方信æ¯" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:341 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:344 msgid "Peer info for" msgstr "节点信æ¯" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:345 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:348 msgid "Full entry" msgstr "完整项" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:351 -#: ../java/src/net/i2p/router/web/SummaryHelper.java:110 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:600 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:354 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:115 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:601 msgid "Hidden" msgstr "éšèº«" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:351 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:354 msgid "Updated" msgstr "已更新" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:352 #: ../java/src/net/i2p/router/web/NetDbRenderer.java:355 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:358 #, java-format msgid "{0} ago" msgstr "{0}å‰" #. shouldnt happen -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:354 -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:358 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:357 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:361 msgid "Published" msgstr "å‘布" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:360 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:363 msgid "Address(es)" msgstr "地å€" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:373 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:376 msgid "cost" msgstr "开销" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:397 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402 msgid "Hidden or starting up" msgstr "éšèº«æˆ–æ£åœ¨å¯åŠ¨" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:397 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402 msgid "SSU" msgstr "" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:397 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:402 msgid "SSU with introducers" msgstr "使用ä¸ä»‹çš„SSU连接" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:398 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 msgid "NTCP" msgstr "" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:398 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 msgid "NTCP and SSU" msgstr "NTCP 与 SSU" -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:398 +#: ../java/src/net/i2p/router/web/NetDbRenderer.java:403 msgid "NTCP and SSU with introducers" msgstr "使用ä¸ä»‹çš„NTCP与SSU连接" -#: ../java/src/net/i2p/router/web/NewsFetcher.java:82 +#: ../java/src/net/i2p/router/web/NewsFetcher.java:93 #, java-format msgid "News last updated {0} ago." msgstr "新闻更新于{0}å‰" -#: ../java/src/net/i2p/router/web/NewsFetcher.java:88 +#: ../java/src/net/i2p/router/web/NewsFetcher.java:99 #, java-format msgid "News last checked {0} ago." msgstr "最近一次查收新闻在{0}å‰" @@ -2617,137 +2738,139 @@ msgstr "æ’件 {0} 有更新" msgid "Update check failed for plugin {0}" msgstr "æ’件 {0} 更新检测失败" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:138 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:139 msgid "Downloading plugin" msgstr "æ£åœ¨ä¸‹è½½æ’件" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:145 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:179 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:146 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:244 #, java-format msgid "{0}B transferred" msgstr "å·²ä¼ è¾“ {0}B" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:151 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:153 msgid "Plugin downloaded" msgstr "æ’件下载完æˆ" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:156 -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:343 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:158 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:356 #, java-format msgid "Cannot create plugin directory {0}" msgstr "æ— æ³•åˆ›å»ºæ’件目录 {0}" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:165 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:220 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:167 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:298 #, java-format msgid "from {0}" msgstr "自 {0}" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:175 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:177 #, java-format msgid "Plugin from {0} is corrupt" msgstr "ç”± {0} 获å–çš„æ’件已æŸå。" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:186 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:188 #, java-format msgid "Plugin from {0} does not contain the required configuration file" msgstr "ç”± {0} 获å–çš„æ’件缺少必è¦çš„é…置文件" #. updateStatus("<b>" + "Plugin contains an invalid key" + ' ' + pubkey + ' ' + signer + "</b>"); -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:199 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:201 #, java-format msgid "Plugin from {0} contains an invalid key" msgstr "ç”± {0} 获å–çš„æ’件ç¾åå¯†é’¥æ— æ•ˆ" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:218 -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:227 -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:236 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:225 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:235 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:249 #, java-format msgid "Plugin signature verification of {0} failed" msgstr "æ’件 {0} çš„ç¾å验è¯å¤±è´¥ã€‚" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:251 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:264 #, java-format msgid "Plugin from {0} has invalid name or version" msgstr "从 {0} 获å–çš„æ’件缺少有效的å称或版本" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:256 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:269 #, java-format msgid "Plugin {0} has mismatched versions" msgstr "æ’件 {0} 的内部版本ä¸ç¬¦ã€‚" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:264 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:277 #, java-format msgid "This plugin requires I2P version {0} or higher" msgstr "æ’件需è¦I2P版本 {0} 或更高" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:272 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:285 #, java-format msgid "This plugin requires Java version {0} or higher" msgstr "æ’ä»¶éœ€è¦ Java 版本 {0} 或更高" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:280 -msgid "Downloaded plugin is for new installs only, but the plugin is already installed" +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:293 +msgid "" +"Downloaded plugin is for new installs only, but the plugin is already " +"installed" msgstr "所下æ’件包仅用于全新安装,但您已ç»å®‰è£…过该æ’件" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:292 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:305 msgid "Installed plugin does not contain the required configuration file" msgstr "已安装æ’件缺少所需的é…置文件" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:300 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:313 msgid "Signature of downloaded plugin does not match installed plugin" msgstr "所下æ’件的ç¾å(人)与所安装æ’件的ç¾åä¸ç¬¦" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:307 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:320 #, java-format msgid "Downloaded plugin version {0} is not newer than installed plugin" msgstr "所下æ’件版本 {0} 没有已安装æ’件的版本新" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:314 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:327 #, java-format msgid "Plugin update requires installed plugin version {0} or higher" msgstr "æ’件更新包需è¦å®‰è£…æ’件的版本为 {0} 或更高" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:321 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:334 #, java-format msgid "Plugin update requires installed plugin version {0} or lower" msgstr "æ’件更新包需è¦å®‰è£…æ’件的版本ä¸é«˜äºŽ {0}" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:338 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:351 msgid "Plugin is for upgrades only, but the plugin is not installed" msgstr "æ’件更新包包找ä¸åˆ°å¯¹åº”的原版æ’件" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:351 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:364 #, java-format msgid "Failed to install plugin in {0}" msgstr "æ— æ³•å°†æ’件安装至目录{0}" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:358 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:371 #, java-format msgid "Plugin {0} installed, router restart required" msgstr "æ’件 {0} 已安装,é‡å¯I2PåŽç”Ÿæ•ˆ" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:360 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:373 #, java-format msgid "Plugin {0} installed" msgstr "æ’件 {0} 已安装" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:369 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:391 #, java-format msgid "Plugin {0} installed and started" msgstr "æ’件 {0} 已安装并å¯åŠ¨" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:371 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:394 #, java-format msgid "Plugin {0} installed but failed to start, check logs" msgstr "æ’件 {0} 已安装但å¯åŠ¨å¤±è´¥ï¼Œè¯·æ£€æŸ¥æ—¥å¿—。" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:373 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:396 #, java-format msgid "Plugin {0} installed but failed to start" msgstr "æ’件 {0} 已安装但å¯åŠ¨å¤±è´¥" -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:383 +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:406 #, java-format msgid "Failed to download plugin from {0}" msgstr "é‡ {0} 下载æ’件失败" @@ -2777,13 +2900,13 @@ msgstr "分组(容é‡)" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:83 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:251 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:334 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:335 msgid "Speed" msgstr "速度" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:84 #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:253 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:338 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:339 msgid "Capacity" msgstr "容é‡" @@ -2814,7 +2937,7 @@ msgid "Failing" msgstr "失败" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:131 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:281 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:287 msgid "Integrated" msgstr "已整åˆèŠ‚点" @@ -2930,7 +3053,9 @@ msgid "caps" msgstr "容é‡" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260 -msgid "peak throughput (bytes per second) over a 1 minute period that the peer has sustained in a single tunnel" +msgid "" +"peak throughput (bytes per second) over a 1 minute period that the peer has " +"sustained in a single tunnel" msgstr "该节点一分钟由å•ä¸€éš§é“通过的数æ®å³°å€¼(byte/s)。" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:260 @@ -2961,10 +3086,6 @@ msgstr "是å¦èŠ‚点被å°ç¦ï¼Œä¸å¯è¾¾ï¼Œæˆ–在隧é“测试ä¸å¤±è´¥ï¼Ÿ" msgid "status" msgstr "状æ€" -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:313 -msgid "n/a" -msgstr "" - #: ../java/src/net/i2p/router/web/ShitlistRenderer.java:57 #, java-format msgid "Temporary ban expiring in {0}" @@ -2980,427 +3101,488 @@ msgid "unban now" msgstr "ç«‹å³è§£å°" #. Note to translators: all runtime zh translation disabled in this file, no font available in RRD -#: ../java/src/net/i2p/router/web/StatSummarizer.java:174 +#: ../java/src/net/i2p/router/web/StatSummarizer.java:223 msgid "Bandwidth usage" msgstr "带宽å 用" -#: ../java/src/net/i2p/router/web/StatSummarizer.java:181 +#: ../java/src/net/i2p/router/web/StatSummarizer.java:230 msgid "Outbound bytes/sec" msgstr "出站(byte/s)" #. def.line(sendName, Color.BLUE, "Outbound bytes/sec", 3); -#: ../java/src/net/i2p/router/web/StatSummarizer.java:183 +#: ../java/src/net/i2p/router/web/StatSummarizer.java:232 msgid "Inbound bytes/sec" msgstr "入站(byte/s)" -#: ../java/src/net/i2p/router/web/StatSummarizer.java:186 -#: ../java/src/net/i2p/router/web/StatSummarizer.java:187 -#: ../java/src/net/i2p/router/web/StatSummarizer.java:188 -#: ../java/src/net/i2p/router/web/StatSummarizer.java:189 +#: ../java/src/net/i2p/router/web/StatSummarizer.java:235 +#: ../java/src/net/i2p/router/web/StatSummarizer.java:236 +#: ../java/src/net/i2p/router/web/StatSummarizer.java:237 +#: ../java/src/net/i2p/router/web/StatSummarizer.java:238 msgid "bytes/sec" -msgstr "" +msgstr "byte/s" -#: ../java/src/net/i2p/router/web/StatSummarizer.java:186 +#: ../java/src/net/i2p/router/web/StatSummarizer.java:235 msgid "out average" msgstr "出站平å‡å€¼" -#: ../java/src/net/i2p/router/web/StatSummarizer.java:187 -#: ../java/src/net/i2p/router/web/StatSummarizer.java:189 -#: ../java/src/net/i2p/router/web/SummaryRenderer.java:110 +#: ../java/src/net/i2p/router/web/StatSummarizer.java:236 +#: ../java/src/net/i2p/router/web/StatSummarizer.java:238 +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:115 msgid "max" msgstr "最大" -#: ../java/src/net/i2p/router/web/StatSummarizer.java:188 +#: ../java/src/net/i2p/router/web/StatSummarizer.java:237 msgid "in average" msgstr "入站平å‡å€¼" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:56 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:57 msgid "GO" -msgstr "" +msgstr "执行" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:59 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:60 msgid "Statistics gathered during this router's uptime" msgstr "路由è¿è¡Œæ—¶æ”¶é›†çš„统计数æ®" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:62 -msgid "The data gathered is quantized over a 1 minute period, so should just be used as an estimate." +#: ../java/src/net/i2p/router/web/StatsGenerator.java:63 +msgid "" +"The data gathered is quantized over a 1 minute period, so should just be " +"used as an estimate." msgstr "所采集数æ®é‡åŒ–周期为1分钟,仅供å‚考。" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:108 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:64 +msgid "These statistics are primarily used for development and debugging." +msgstr "统计主è¦ç”¨äºŽI2Pçš„å¼€å‘和调试。" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:105 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:156 +msgid "No lifetime events" +msgstr "å…¨ç¨‹æ— äº‹ä»¶" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:116 msgid "frequency" msgstr "更新频率" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:142 -msgid "No lifetime events" -msgstr "自è¿è¡Œèµ·æ— 事件" +#: ../java/src/net/i2p/router/web/StatsGenerator.java:120 +msgid "Rolling average events per period" +msgstr "æ¯å‘¨æœŸäº‹ä»¶æ»šåŠ¨å‡å€¼" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:124 +msgid "Highest events per period" +msgstr "æ¯å‘¨æœŸäº‹ä»¶å³°å€¼" + +#. if (showAll && (curFreq.getMaxAverageEventsPerPeriod() > 0) && (curFreq.getAverageEventsPerPeriod() > 0) ) { +#. buf.append("(current is "); +#. buf.append(pct(curFreq.getAverageEventsPerPeriod()/curFreq.getMaxAverageEventsPerPeriod())); +#. buf.append(" of max)"); +#. } +#. buf.append(" <i>avg interval between updates:</i> (").append(num(curFreq.getAverageInterval())).append("ms, min "); +#. buf.append(num(curFreq.getMinAverageInterval())).append("ms)"); +#: ../java/src/net/i2p/router/web/StatsGenerator.java:135 +msgid "Lifetime average events per period" +msgstr "全程æ¯å‘¨æœŸäº‹ä»¶å‡å€¼" + +#. Display the strict average +#: ../java/src/net/i2p/router/web/StatsGenerator.java:140 +msgid "Lifetime average frequency" +msgstr "全程平å‡é¢‘率" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:154 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:168 msgid "rate" msgstr "速度" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:156 -msgid "avg value" +#: ../java/src/net/i2p/router/web/StatsGenerator.java:170 +msgid "Average" msgstr "å‡å€¼" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:185 -msgid "events" -msgstr "事件" +#: ../java/src/net/i2p/router/web/StatsGenerator.java:173 +msgid "Highest average" +msgstr "最高å‡å€¼" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:191 +#. breaking the sentence like before makes translation in my language impossible. +#: ../java/src/net/i2p/router/web/StatsGenerator.java:201 +#, java-format +msgid "There were {0} event(s) in this period" +msgstr "本周期共有{0}个事件," + +#. buf.append(' '); +#: ../java/src/net/i2p/router/web/StatsGenerator.java:203 +#, java-format +msgid " which ended {0} ago." +msgstr "于{0}å‰ç»“æŸã€‚" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:205 msgid "No events" msgstr "æ— äº‹ä»¶" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:197 -msgid "lifetime average" -msgstr "总平å‡å€¼" +#: ../java/src/net/i2p/router/web/StatsGenerator.java:211 +msgid "Average event count" +msgstr "å¹³å‡äº‹ä»¶è®¡æ•°" -#: ../java/src/net/i2p/router/web/StatsGenerator.java:199 -msgid "peak average" -msgstr "峰值平å‡å€¼" +#: ../java/src/net/i2p/router/web/StatsGenerator.java:213 +msgid "Events in peak period" +msgstr "事件峰值" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:221 +msgid "Graph Data" +msgstr "图表数æ®" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:223 +msgid "Graph Event Count" +msgstr "图表事件计数" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:226 +msgid "Export Data as XML" +msgstr "导出数æ®ä¸ºXML" #. Display the strict average -#: ../java/src/net/i2p/router/web/StatsGenerator.java:217 -msgid "lifetime average value" -msgstr "总平å‡å€¼" +#: ../java/src/net/i2p/router/web/StatsGenerator.java:231 +msgid "Lifetime average value" +msgstr "全程å‡å€¼" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:40 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:41 msgid "I2P Router Help & FAQ" msgstr "I2P 使用帮助与常è§é—®ç”" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:42 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:43 msgid "Help & FAQ" msgstr "" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:54 -msgid "Configure startup of clients and webapps (services); manually start dormant services" +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:55 +msgid "" +"Configure startup of clients and webapps (services); manually start dormant " +"services" msgstr "设置客户程åºåŠWeb程åº(æœåŠ¡)çš„å¯åŠ¨ï¼›æ‰‹åŠ¨å¯åŠ¨é‡è¦æœåŠ¡" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:56 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:57 msgid "I2P Services" msgstr "I2P æœåŠ¡" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:62 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:63 msgid "Manage your I2P hosts file here (I2P domain name resolution)" msgstr "管ç†æ‚¨çš„ I2P HOST表(I2P域å解æžè¡¨)" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:64 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:65 msgid "Addressbook" msgstr "地å€ç°¿" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:68 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:69 msgid "Built-in anonymous BitTorrent Client" msgstr "内建的匿å BitTorrent 客户端" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:70 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:71 msgid "Torrents" msgstr "匿åBT" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:74 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:75 msgid "Anonymous webmail client" msgstr "匿åWeb邮件客户端" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:76 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:77 msgid "Webmail" msgstr "匿å邮箱" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:80 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:81 msgid "Anonymous resident webserver" msgstr "内置的匿åWebæœåŠ¡å™¨" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:82 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:83 msgid "Webserver" msgstr "匿å主页æœåŠ¡å™¨" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:90 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:91 msgid "Configure I2P Router" msgstr "设置 I2P 路由器" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:92 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:93 msgid "I2P Internals" msgstr "I2P内部设置" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:98 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:374 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:99 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:384 msgid "View existing tunnels and tunnel build status" msgstr "查看现å˜éš§é“åŠéš§é“的建立状æ€" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:104 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:253 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:105 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:258 msgid "Show all current peer connections" msgstr "显示当å‰æ‰€æœ‰çš„节点连接" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:110 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:111 msgid "Show recent peer performance profiles" msgstr "显示当å‰èŠ‚点的性能记录" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:112 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:113 msgid "Profiles" msgstr "节点信æ¯" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:116 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:117 msgid "Show list of all known I2P routers" msgstr "包å«æ‰€æœ‰å·²çŸ¥I2P路由器的列表" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:118 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:119 msgid "NetDB" msgstr "NetDB" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:122 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:123 msgid "Health Report" msgstr "路由器å¥åº·çŠ¶å†µæŠ¥å‘Š" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:124 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:125 msgid "Logs" msgstr "日志" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:134 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:135 msgid "Graph router performance" msgstr "路由性能统计图" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:136 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:137 msgid "Graphs" msgstr "图表" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:140 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:141 msgid "Textual router performance statistics" msgstr "路由性能文å—统计" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:146 -#: ../java/src/net/i2p/router/web/SummaryHelper.java:365 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:147 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:370 msgid "Local Destinations" msgstr "本地æœåŠ¡" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:148 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:149 #: ../java/strings/Strings.java:62 msgid "I2PTunnel" msgstr "I2P隧é“" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:159 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:164 msgid "I2P Router Help" msgstr "I2P路由帮助" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:161 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:166 msgid "General" msgstr "功能概况" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:166 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:171 msgid "Local Identity" msgstr "本地身份" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:170 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:175 msgid "Your unique I2P router identity is" msgstr "您I2P路由的唯一身份为" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:174 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:179 msgid "never reveal it to anyone" msgstr "切勿将其告诉任何人" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:176 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:181 msgid "show" msgstr "显示" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:187 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:192 msgid "How long we've been running for this session" msgstr "本次路由è¿è¡Œæ—¶é—´" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:190 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:195 msgid "Uptime" msgstr "è¿è¡Œæ—¶é—´" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:197 -msgid "Help with configuring your firewall and router for optimal I2P performance" +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:202 +msgid "" +"Help with configuring your firewall and router for optimal I2P performance" msgstr "如何æ£ç¡®é…置防ç«å¢™å’Œ(物ç†)路由器优化I2P性能" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:226 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:231 msgid "Download" msgstr "下载" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:235 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:240 msgid "Download Unsigned" msgstr "下载未ç¾åæ›´æ–°" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:261 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:266 msgid "Active" msgstr "活动节点" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:269 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:275 msgid "Fast" msgstr "快速节点" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:275 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:281 msgid "High capacity" msgstr "高容é‡èŠ‚点" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:287 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:293 msgid "Known" msgstr "已知节点" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:302 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:308 msgid "Help with firewall configuration" msgstr "如何é…置防ç«å¢™" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:304 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:310 msgid "Check NAT/firewall" msgstr "检查NAT/防ç«å¢™" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:324 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:330 msgid "Reseed" msgstr "è¡¥ç§(æœç´¢èŠ‚点å¯åŠ¨ç½‘络)" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:341 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:347 msgid "Configure router bandwidth allocation" msgstr "设置路由的带宽分é…" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:343 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:349 msgid "Bandwidth in/out" msgstr "带宽(è¿›/出站)" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:359 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:369 msgid "Total" msgstr "总计" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:366 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:376 msgid "Used" msgstr "已用" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:381 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:391 msgid "Exploratory" msgstr "探测" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:393 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:403 msgid "Participating" msgstr "共享" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:399 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:409 msgid "Share ratio" msgstr "共享/å 用" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:405 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:415 msgid "What's in the router's job queue?" msgstr "查看路由的作业队列" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:407 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:417 msgid "Congestion" msgstr "æ‹¥å µ" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:412 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:422 msgid "Job lag" msgstr "作业延迟" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:418 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:428 msgid "Message delay" msgstr "消æ¯å»¶è¿Ÿ" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:424 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:434 msgid "Tunnel lag" msgstr "隧é“延迟" -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:430 +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:440 msgid "Backlog" msgstr "积压" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:101 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:106 msgid "ERR-Client Manager I2CP Error - check logs" msgstr "错误-客户程åºç®¡ç†å™¨I2CP错误 - 请看日志" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:108 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:113 #, java-format msgid "ERR-Clock Skew of {0}" msgstr "错误-系统时滞 {0}" # æš‚ä¸ç¿»è¯‘,确定/良好 å¯èƒ½å½±å“按钮的翻译 -#: ../java/src/net/i2p/router/web/SummaryHelper.java:117 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:576 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:122 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:577 msgid "OK" msgstr "æ£å¸¸" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:118 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:123 msgid "ERR-Private TCP Address" msgstr "错误-TCPç§æœ‰åœ°å€" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:120 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:125 msgid "ERR-SymmetricNAT" msgstr "错误-SymmeticNAT" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:123 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:128 msgid "WARN-Firewalled with Inbound TCP Enabled" msgstr "è¦å‘Š-入站TCPå¼€å¯ä½†å› 防ç«å¢™å—é™" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:125 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:130 msgid "WARN-Firewalled and Floodfill" msgstr "è¦å‘Š-ç§åèŠ‚ç‚¹å› é˜²ç«å¢™å—é™" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:127 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:132 msgid "WARN-Firewalled and Fast" msgstr "è¦å‘Š-å¿«é€ŸèŠ‚ç‚¹å› é˜²ç«å¢™å—é™" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:128 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:580 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:133 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:581 msgid "Firewalled" msgstr "防ç«å¢™é™åˆ¶" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:130 -msgid "ERR-UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart" -msgstr "错误-UDP端å£å·²å 用 - 在高级设置ä¸è®¾ç½® i2np.udp.internalPort=新端å£å¹¶é‡å¯ç¨‹åº" +#: ../java/src/net/i2p/router/web/SummaryHelper.java:135 +msgid "" +"ERR-UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and " +"restart" +msgstr "" +"错误-UDP端å£å·²å 用 - 在高级设置ä¸è®¾ç½® i2np.udp.internalPort=新端å£å¹¶é‡å¯ç¨‹åº" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:136 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:141 msgid "ERR-No Active Peers, Check Network Connection and Firewall" msgstr "错误-æ— æ´»åŠ¨èŠ‚ç‚¹ï¼Œè¯·æ£€æŸ¥ç½‘ç»œè¿žæŽ¥åŠé˜²ç«å¢™" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:139 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:144 msgid "ERR-UDP Disabled and Inbound TCP host/port not set" msgstr "错误-UDPå·²ç¦ç”¨ä¸”TCP入站主机与端å£æœªè®¾ç½®" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:141 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:146 msgid "WARN-Firewalled with UDP Disabled" msgstr "è¦å‘Š-å› é˜²ç«å¢™å—é™ä¸”UDP被ç¦ç”¨" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:143 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:596 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:148 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:597 msgid "Testing" msgstr "测试ä¸" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:365 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:370 msgid "Add/remove/edit & control your client and server tunnels" msgstr "æ·»åŠ ã€åˆ 除ã€ç¼–辑或控制客户程åºéš§é“å’ŒæœåŠ¡éš§é“" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:377 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:382 msgid "Server" msgstr "æœåŠ¡" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:381 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:386 msgid "Show tunnels" msgstr "显示隧é“" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:392 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:397 msgid "Leases expired" msgstr "Lease已过期" #. red or yellow light -#: ../java/src/net/i2p/router/web/SummaryHelper.java:392 -#: ../java/src/net/i2p/router/web/SummaryHelper.java:393 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:397 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:398 msgid "Rebuilding" msgstr "æ£åœ¨é‡å»º" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:393 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:398 msgid "ago" msgstr "å‰" #. green light -#: ../java/src/net/i2p/router/web/SummaryHelper.java:396 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:401 msgid "Ready" msgstr "就绪" #. yellow light -#: ../java/src/net/i2p/router/web/SummaryHelper.java:400 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:405 msgid "Building" msgstr "创建ä¸" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:400 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:405 msgid "Building tunnels" msgstr "æ£åœ¨éš§é“创建" -#: ../java/src/net/i2p/router/web/SummaryHelper.java:405 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:410 msgid "none" msgstr "æ— " @@ -3408,37 +3590,37 @@ msgstr "æ— " #. nicely under 'local destinations' in the summary bar #. note that if the wording changes in i2ptunnel.config, we have to #. keep the old string here as well for existing installs -#: ../java/src/net/i2p/router/web/SummaryHelper.java:416 +#: ../java/src/net/i2p/router/web/SummaryHelper.java:421 #: ../java/strings/Strings.java:36 msgid "shared clients" msgstr "共享客户端" #. Note to translators: all runtime zh translation disabled in this file, no font available in RRD -#: ../java/src/net/i2p/router/web/SummaryRenderer.java:84 +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:89 #, java-format msgid "events in {0}" msgstr "事件/{0}" -#: ../java/src/net/i2p/router/web/SummaryRenderer.java:86 +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:91 #, java-format msgid "averaged for {0}" msgstr "{0} å¹³å‡å€¼" -#: ../java/src/net/i2p/router/web/SummaryRenderer.java:96 +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:101 msgid "Events per period" msgstr "事件/周期" -#: ../java/src/net/i2p/router/web/SummaryRenderer.java:109 +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:114 msgid "avg" msgstr "å¹³å‡" -#: ../java/src/net/i2p/router/web/SummaryRenderer.java:111 +#: ../java/src/net/i2p/router/web/SummaryRenderer.java:116 msgid "now" msgstr "当å‰" #: ../java/src/net/i2p/router/web/TunnelRenderer.java:41 #: ../java/src/net/i2p/router/web/TunnelRenderer.java:63 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:280 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:287 msgid "configure" msgstr "设置" @@ -3567,17 +3749,17 @@ msgid "Totals" msgstr "总计" #: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:66 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:132 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:145 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:172 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:142 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:237 msgid "Updating" msgstr "æ£åœ¨æ›´æ–°" +#. Process the .sud/.su2 file #: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:88 #: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:111 #: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:116 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:183 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:208 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:261 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:286 msgid "Update downloaded" msgstr "å‡æ›´æ–°å·²ä¸‹è½½" @@ -3587,22 +3769,22 @@ msgid "Unsigned update file from {0} is corrupt" msgstr "æ¥è‡ª {0} 的未ç¾å更新包已æŸå" #: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:111 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:203 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:281 msgid "Restarting" msgstr "æ£åœ¨é‡å¯" #: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:118 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:210 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:288 msgid "Click Restart to install" msgstr "点击ã€é‡å¯ã€‘完æˆå®‰è£…" #: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:120 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:212 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:290 msgid "Click Shutdown and restart to install" msgstr "点击ã€å…³é—】并é‡æ–°å¯åŠ¨I2På³å¯å®Œæˆå®‰è£…。" #: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:121 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:214 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:292 #, java-format msgid "Version {0}" msgstr "版本 {0}" @@ -3612,13 +3794,24 @@ msgstr "版本 {0}" msgid "Failed copy to {0}" msgstr "æ— æ³•å¤åˆ¶åˆ°{0}" -#: ../java/src/net/i2p/router/web/UpdateHandler.java:203 +#: ../java/src/net/i2p/router/web/UpdateHandler.java:184 +#, java-format +msgid "Updating from {0}" +msgstr "æ£åœ¨ä»Ž {0} 获å–æ›´æ–°" + +#: ../java/src/net/i2p/router/web/UpdateHandler.java:253 +#, java-format +msgid "No new version found at {0}" +msgstr " {0} 上éžæœ‰å‘现新版" + +#: ../java/src/net/i2p/router/web/UpdateHandler.java:281 msgid "Update verified" msgstr "更新已验è¯" -#: ../java/src/net/i2p/router/web/UpdateHandler.java:228 -msgid "Transfer failed" -msgstr "æ•°æ®ä¼ 输失败" +#: ../java/src/net/i2p/router/web/UpdateHandler.java:307 +#, java-format +msgid "Transfer failed from {0}" +msgstr "æ¥åœ¨{0}çš„æ•°æ®ä¼ 输失败" #. wars for ConfigClientsHelper #: ../java/strings/Strings.java:12 @@ -3872,577 +4065,693 @@ msgid "config networking" msgstr "连网设置" #. We have intl defined when this is included, but not when compiled standalone. -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:217 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:218 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:217 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:217 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:231 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:217 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:217 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:218 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:217 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:217 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:217 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:228 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:217 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:223 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:216 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:235 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:216 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:216 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:217 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:216 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:216 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:230 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:216 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:216 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:216 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:217 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:216 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:216 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:216 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:219 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:216 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:219 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:219 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:219 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:219 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:222 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:215 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:215 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:215 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:219 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:219 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:215 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:215 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:215 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:234 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:215 msgid "Refresh (s)" msgstr "刷新(秒)" #. ditto -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:221 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:222 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:221 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:221 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:235 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:221 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:221 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:222 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:221 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:221 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:221 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:224 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:232 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:221 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:224 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:224 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:224 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:227 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:224 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:224 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:220 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:238 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:221 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:234 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:221 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:231 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:220 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:226 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:219 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:219 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:219 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:223 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:219 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:219 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:219 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:237 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:219 msgid "Enable" msgstr "å¯ç”¨" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:241 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:240 msgid "I2P Network Configuration" msgstr "I2P 连网设置" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:297 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:298 msgid "Bandwidth limiter" msgstr "带宽é™åˆ¶" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:299 -msgid "I2P will work best if you configure your rates to match the speed of your internet connection." +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:300 +msgid "" +"I2P will work best if you configure your rates to match the speed of your " +"internet connection." msgstr "与è”网环境相符的速度能使I2P以最佳的状æ€å·¥ä½œã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:303 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:304 msgid "KBps In" msgstr "KBps 入站" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:317 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:318 msgid "KBps Out" msgstr "KBps 出站" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:333 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:334 msgid "Share" msgstr "共享" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:340 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:307 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:303 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:341 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:309 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:304 msgid "NOTE" msgstr "注æ„" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:342 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:343 #, java-format msgid "You have configured I2P to share only {0} KBps." msgstr "您设置I2P仅共享 {0} KBps" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:345 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:346 msgid "I2P requires at least 12KBps to enable sharing. " msgstr "I2P 需è¦è‡³å°‘ 12KBps æ‰èƒ½è¿›è¡Œå…±äº«ã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:346 -msgid "Please enable sharing (participating in tunnels) by configuring more bandwidth. " +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:347 +msgid "" +"Please enable sharing (participating in tunnels) by configuring more " +"bandwidth. " msgstr "请设置更多的带宽以便å¯ç”¨å…±äº«åŠŸèƒ½(åŠ å…¥åˆ°å…¶ä»–èŠ‚ç‚¹çš„éš§é“创建ä¸)。" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:347 -msgid "It improves your anonymity by creating cover traffic, and helps the network." +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:348 +msgid "" +"It improves your anonymity by creating cover traffic, and helps the network." msgstr "é€šè¿‡åˆ¶é€ æ··æ·†æµé‡å…±äº«èƒ½å¢žå¼ºæ‚¨çš„匿å性,帮助网络æˆé•¿ã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:350 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:351 #, java-format msgid "You have configured I2P to share {0} KBps." msgstr "您设置I2P共享 {0} KBps" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:353 -msgid "The higher the share bandwidth the more you improve your anonymity and help the network." +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:354 +msgid "" +"The higher the share bandwidth the more you improve your anonymity and help " +"the network." msgstr "共享的带宽越多,您的匿å性越强åŒæ—¶èƒ½å¸®åŠ©ç½‘络æˆé•¿ã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:357 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:513 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:303 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:326 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:320 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:333 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:373 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:341 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:321 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:364 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:358 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:514 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:305 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:327 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:403 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:321 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:339 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:348 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:375 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:342 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:322 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:365 msgid "Cancel" msgstr "å–消" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:374 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:375 msgid "IP and Transport Configuration" msgstr "IP ä¸Žä¼ è¾“è®¾ç½®" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:376 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:377 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:395 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:306 msgid "The default settings will work for most people." msgstr "默认设置适于大多数人。" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:378 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:379 msgid "There is help below." msgstr "页é¢ä¸‹æ–¹æœ‰å¸®åŠ©ä¿¡æ¯" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:380 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:381 msgid "UPnP Configuration" msgstr "UPnP 设置" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:384 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:385 msgid "Enable UPnP to open firewall ports" msgstr "å¯ç”¨UPnP以打开防ç«å¢™ç«¯å£" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:386 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:387 msgid "UPnP status" msgstr "UPnP 统计" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:388 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:389 msgid "IP Configuration" msgstr "IP 设置" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:390 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:460 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:391 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:461 msgid "Externally reachable hostname or IP address" msgstr "公网å¯è®¿é—®çš„本机域å或IP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:394 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:395 msgid "Use all auto-detect methods" msgstr "使用全部自动探测方法" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:398 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:399 msgid "Disable UPnP IP address detection" msgstr "ç¦ç”¨UPnP IP 地å€æŽ¢æµ‹" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:402 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:403 msgid "Ignore local interface IP address" msgstr "忽略本地接å£çš„ IP 地å€" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:406 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:407 msgid "Use SSU IP address detection only" msgstr "仅使用SSU IP 地å€æŽ¢æµ‹" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:410 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:478 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:411 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:479 msgid "Specify hostname or IP" msgstr "指定主机å或IP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:416 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:417 msgid "Select Interface" msgstr "选择网络接å£" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:430 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:431 msgid "Hidden mode - do not publish IP" msgstr "éšèº«æ¨¡å¼ - ä¸å‘布IP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:432 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:433 msgid "(prevents participating traffic)" msgstr "(阻æ¢å…±äº«æµé‡)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:434 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:435 msgid "Action when IP changes" msgstr "IP改å˜åŽåº”" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:438 -msgid "Laptop mode - Change router identity and UDP port when IP changes for enhanced anonymity" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:439 +msgid "" +"Laptop mode - Change router identity and UDP port when IP changes for " +"enhanced anonymity" msgstr "ç¬”è®°æœ¬æ¨¡å¼ - IPå˜åŒ–åŽæ”¹å˜è·¯ç”±èº«ä»½åŠUDP端å£(拨å·ç”¨æˆ·æ…Žç”¨)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:440 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:441 msgid "Experimental" msgstr "试验性" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:442 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:443 msgid "UDP Configuration:" msgstr "UDP 设置:" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:444 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:445 msgid "UDP port:" msgstr "UDP端å£" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:458 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:459 msgid "TCP Configuration" msgstr "TCP 连接设置" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:464 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:465 msgid "Use auto-detected IP address" msgstr "使用自动检测得到的 IP 地å€" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:466 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:498 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:467 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:499 msgid "currently" msgstr "ç›®å‰" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:470 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:471 msgid "if we are not firewalled" msgstr "如果没有å—到防ç«å¢™é˜»æŒ¡" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:474 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:475 msgid "Always use auto-detected IP address (Not firewalled)" msgstr "总是使用自动探测到的IP地å€(没有防ç«å¢™é™åˆ¶)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:484 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:485 msgid "Disable inbound (Firewalled)" msgstr "ç¦æ¢å…¥ç«™è¿žæŽ¥(å—防ç«å¢™é™åˆ¶)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:488 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:489 msgid "Completely disable" msgstr "完全ç¦ç”¨" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:490 -msgid "(select only if behind a firewall that throttles or blocks outbound TCP)" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:491 +msgid "" +"(select only if behind a firewall that throttles or blocks outbound TCP)" msgstr "仅在å—到防ç«å¢™çš„æµé‡é™åˆ¶æˆ–入站连接é™åˆ¶æ—¶ä½¿ç”¨" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:492 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:493 msgid "Externally reachable TCP port" msgstr "公网å¯è®¿é—®çš„TCP端å£" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:496 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:497 msgid "Use the same port configured for UDP" msgstr "使用与UDP相åŒçš„端å£" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:504 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:505 msgid "Specify Port" msgstr "指定端å£" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:508 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:338 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:329 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:509 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:339 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:330 msgid "Note" msgstr "注æ„" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:511 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:512 msgid "Changing these settings will restart your router." msgstr "修改这些设置将必须é‡å¯è·¯ç”±å™¨ã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:517 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:518 msgid "Configuration Help" msgstr "设置帮助" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:519 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:568 -msgid "While I2P will work fine behind most firewalls, your speeds and network integration will generally improve if the I2P port is forwarded for both UDP and TCP." -msgstr "I2På¯ä»¥ä¸Žå¤§å¤šæ•°é˜²ç«å¢™å…±å˜ï¼Œå¦‚æžœI2P端å£(第一次安装时éšæœºé€‰æ‹©)进行了UDP/TCPæ˜ å°„ï¼Œæ‚¨çš„é€Ÿåº¦å’Œç½‘ç»œæ•´åˆåº¦ä¼šé€æ¸æå‡ã€‚" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:520 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:569 +msgid "" +"While I2P will work fine behind most firewalls, your speeds and network " +"integration will generally improve if the I2P port is forwarded for both UDP " +"and TCP." +msgstr "" +"I2På¯ä»¥ä¸Žå¤§å¤šæ•°é˜²ç«å¢™å…±å˜ï¼Œå¦‚æžœI2P端å£(第一次安装时éšæœºé€‰æ‹©)进行了UDP/TCPæ˜ " +"射,您的速度和网络整åˆåº¦ä¼šé€æ¸æå‡ã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:521 -msgid "If you can, please poke a hole in your firewall to allow unsolicited UDP and TCP packets to reach you." +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:522 +msgid "" +"If you can, please poke a hole in your firewall to allow unsolicited UDP and " +"TCP packets to reach you." msgstr "如果å¯èƒ½ï¼Œè¯·åœ¨é˜²ç«å¢™ä¸æ·»åŠ 端å£å¹¶å…许入站UDP/TCPæ•°æ®åŒ…通过。" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:523 -msgid "If you can't, I2P supports UPnP (Universal Plug and Play) and UDP hole punching with \"SSU introductions\" to relay traffic." -msgstr "如果ä¸èƒ½ï¼ŒI2P支æŒUPnP(Universal Plug and Play)或借助“SSUä¸ä»‹â€è¿›è¡ŒUDP端å£ç©¿é€ï¼Œé€šè¿‡å®ƒä»¬ä¹Ÿå¯ä»¥ä¸ç»§æ•°æ®ã€‚" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:524 +msgid "" +"If you can't, I2P supports UPnP (Universal Plug and Play) and UDP hole " +"punching with \"SSU introductions\" to relay traffic." +msgstr "" +"如果ä¸èƒ½ï¼ŒI2P支æŒUPnP(Universal Plug and Play)或借助“SSUä¸ä»‹â€è¿›è¡ŒUDP端å£ç©¿" +"é€ï¼Œé€šè¿‡å®ƒä»¬ä¹Ÿå¯ä»¥ä¸ç»§æ•°æ®ã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:525 -msgid "Most of the options above are for special situations, for example where UPnP does not work correctly, or a firewall not under your control is doing harm." -msgstr "上述大部分设置仅为特殊情况准备,例如UPnPä¸èƒ½æ£å¸¸å·¥ä½œï¼Œæˆ–外部防ç«å¢™å°é”网络。" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:526 +msgid "" +"Most of the options above are for special situations, for example where UPnP " +"does not work correctly, or a firewall not under your control is doing harm." +msgstr "" +"上述大部分设置仅为特殊情况准备,例如UPnPä¸èƒ½æ£å¸¸å·¥ä½œï¼Œæˆ–外部防ç«å¢™å°é”网络。" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:527 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:528 msgid "Certain firewalls such as symmetric NATs may not work well with I2P." msgstr "在æŸäº›é˜²ç«å¢™ä¸‹ä¾‹å¦‚Symmetric,I2På¯èƒ½æ— 法有效利用NAT工作。" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:536 -msgid "UPnP is used to communicate with Internet Gateway Devices (IGDs) to detect the external IP address and forward ports." +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:537 +msgid "" +"UPnP is used to communicate with Internet Gateway Devices (IGDs) to detect " +"the external IP address and forward ports." msgstr "UPnP与公网网关设备(IGD)通讯å¯ä»¥æ£€æµ‹å¤–部IPå’Œæ˜ å°„ç«¯å£ã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:538 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:539 msgid "UPnP support is beta, and may not work for any number of reasons" msgstr "UPnP支æŒä»åœ¨æµ‹è¯•é˜¶æ®µï¼Œå¯èƒ½ç”±äºŽä¸€äº›åŽŸå› æ— æ³•æ£å¸¸å·¥ä½œã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:540 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:541 msgid "No UPnP-compatible device present" msgstr "没有å‘现UPnP兼容设备" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:542 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:543 msgid "UPnP disabled on the device" msgstr "设备上的UPnP支æŒå·²ç¦ç”¨" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:544 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:545 msgid "Software firewall interference with UPnP" msgstr "软件防ç«å¢™é˜»æ¢UPnP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:546 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:547 msgid "Bugs in the device's UPnP implementation" msgstr "设备的UPnP支æŒæœ‰Bug" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:548 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:549 msgid "Multiple firewall/routers in the internet connection path" msgstr "公网连接ä¸å˜åœ¨å¤šä¸ªé˜²ç«å¢™/路由器" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:550 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:551 msgid "UPnP device change, reset, or address change" msgstr "UPnP设备改å˜ã€é‡ç½®æˆ–地å€è¿ç§»" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:552 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:553 msgid "Review the UPnP status here." msgstr "在这里检查UPnP状æ€ã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:554 -msgid "UPnP may be enabled or disabled above, but a change requires a router restart to take effect." +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:555 +msgid "" +"UPnP may be enabled or disabled above, but a change requires a router " +"restart to take effect." msgstr "UPnP çš„å…³é—或开å¯å‡éœ€è¦ç¨‹åºé‡å¯åŽç”Ÿæ•ˆã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:556 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:557 msgid "Hostnames entered above will be published in the network database." msgstr "上é¢è¾“入的主机å称将在网络数æ®åº“(NetDB)ä¸å‘布。" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:558 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:559 msgid "They are <b>not private</b>." msgstr "他们并<b>éžç§æœ‰åœ°å€</b>。" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:560 -msgid "Also, <b>do not enter a private IP address</b> like 127.0.0.1 or 192.168.1.1." +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:561 +msgid "" +"Also, <b>do not enter a private IP address</b> like 127.0.0.1 or 192.168.1.1." msgstr "æ¤å¤–,<b>请勿输入如127.0.0.1或192.168.1.1ç‰ç§æœ‰åœ°å€</b>" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:562 -msgid "If you specify the wrong IP address or hostname, or do not properly configure your NAT or firewall, your network performance will degrade substantially." -msgstr "如果您设置了错误的IP地å€æˆ–主机å称,或NAT/防ç«å¢™é…ç½®ä¸å½“,您的网络性能将å—到明显影å“。" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:563 +msgid "" +"If you specify the wrong IP address or hostname, or do not properly " +"configure your NAT or firewall, your network performance will degrade " +"substantially." +msgstr "" +"如果您设置了错误的IP地å€æˆ–主机å称,或NAT/防ç«å¢™é…ç½®ä¸å½“,您的网络性能将å—到" +"明显影å“。" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:564 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:565 msgid "When in doubt, leave the settings at the defaults." msgstr "如果对设置有疑问,请ä¿ç•™é»˜è®¤è®¾ç½®ã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:566 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:567 msgid "Reachability Help" msgstr "连通性帮助" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:571 -msgid "If you think you have opened up your firewall and I2P still thinks you are firewalled, remember that you may have multiple firewalls, for example both software packages and external hardware routers." -msgstr "如果您认为已ç»æ‰“开了防ç«å¢™ï¼Œä½†I2Pä»ç„¶æŠ¥å‘Šæ‚¨å—到防ç«å¢™é˜»éš”,请想想您是å¦å¯èƒ½æœ‰å¤šå±‚防ç«å¢™ï¼Œä¾‹å¦‚软件防护墙和外部的硬件路由器。" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:572 +msgid "" +"If you think you have opened up your firewall and I2P still thinks you are " +"firewalled, remember that you may have multiple firewalls, for example both " +"software packages and external hardware routers." +msgstr "" +"如果您认为已ç»æ‰“开了防ç«å¢™ï¼Œä½†I2Pä»ç„¶æŠ¥å‘Šæ‚¨å—到防ç«å¢™é˜»éš”,请想想您是å¦å¯èƒ½æœ‰" +"多层防ç«å¢™ï¼Œä¾‹å¦‚软件防护墙和外部的硬件路由器。" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:574 -msgid "If there is an error, the <a href=\"logs.jsp\">logs</a> may also help diagnose the problem." +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:575 +msgid "" +"If there is an error, the <a href=\"logs.jsp\">logs</a> may also help " +"diagnose the problem." msgstr "如果å˜åœ¨é”™è¯¯ï¼Œ<a href=\"logs.jsp\">日志</a>å¯ä»¥å¸®åŠ©æ‚¨è¯Šæ–问题。" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:578 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:579 msgid "Your UDP port does not appear to be firewalled." msgstr "您的UDP端å£ä¼¼ä¹Žä¸€åˆ‡æ£å¸¸ã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:582 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:583 msgid "Your UDP port appears to be firewalled." msgstr "您的UDP端å£ä¼¼ä¹Žå› 防ç«å¢™è€Œè¿žæŽ¥å—é™ã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:584 -msgid "As the firewall detection methods are not 100% reliable, this may occasionally be displayed in error." +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:585 +msgid "" +"As the firewall detection methods are not 100% reliable, this may " +"occasionally be displayed in error." msgstr "由于防ç«å¢™æ£€æµ‹æ–¹æ³•å¹¶éž100%å¯é ,有时也å¯èƒ½é”™è¯¯åœ°æ˜¾ç¤ºæ¤æ¤æ示。" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:586 -msgid "However, if it appears consistently, you should check whether both your external and internal firewalls are open for your port." +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:587 +msgid "" +"However, if it appears consistently, you should check whether both your " +"external and internal firewalls are open for your port." msgstr "然而,如果总是出现æ¤æ示,您应检查外部或内部防ç«å¢™æ˜¯å¦æ‰“开了I2P端å£ã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:588 -msgid "I2P will work fine when firewalled, there is no reason for concern. When firewalled, the router uses \"introducers\" to relay inbound connections." -msgstr "å³ä½¿å—到防ç«å¢™é˜»æ‹¦ï¼ŒI2P也能够æ£å¸¸å·¥ä½œï¼Œæ— 需担心。å—到防ç«å¢™é˜»éš”时,路由器将通过“ä¸ä»‹(Introducers)â€ä¸ç»§å…¥ç«™è¿žæŽ¥ã€‚" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:589 +msgid "" +"I2P will work fine when firewalled, there is no reason for concern. When " +"firewalled, the router uses \"introducers\" to relay inbound connections." +msgstr "" +"å³ä½¿å—到防ç«å¢™é˜»æ‹¦ï¼ŒI2P也能够æ£å¸¸å·¥ä½œï¼Œæ— 需担心。å—到防ç«å¢™é˜»éš”时,路由器将通" +"过“ä¸ä»‹(Introducers)â€ä¸ç»§å…¥ç«™è¿žæŽ¥ã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:590 -msgid "However, you will get more participating traffic and help the network more if you can open your firewall(s)." -msgstr "然而,如果您能打开防ç«å¢™ç«¯å£ï¼Œæ‚¨æ‰èƒ½å¾—到的共享æµé‡ï¼Œæ›´å¥½çš„帮助I2P网络。" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:591 +msgid "" +"However, you will get more participating traffic and help the network more " +"if you can open your firewall(s)." +msgstr "" +"然而,如果您能打开防ç«å¢™ç«¯å£ï¼Œæ‚¨æ‰èƒ½å¾—到的共享æµé‡ï¼Œæ›´å¥½çš„帮助I2P网络。" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:592 -msgid "If you think you have already done so, remember that you may have both a hardware and a software firewall, or be behind an additional, institutional firewall you cannot control." -msgstr "如果您确信已ç»æ‰“开了防ç«å¢™ï¼Œè¯·æƒ³æƒ³æ˜¯ä¸æ˜¯åŒæ—¶å˜åœ¨ç¡¬ä»¶å’Œè½¯ä»¶é˜²ç«å¢™ï¼Œæˆ–å˜åœ¨æ‚¨æ— 法控制的é¢å¤–的机构性的防ç«å¢™ã€‚" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:593 +msgid "" +"If you think you have already done so, remember that you may have both a " +"hardware and a software firewall, or be behind an additional, institutional " +"firewall you cannot control." +msgstr "" +"如果您确信已ç»æ‰“开了防ç«å¢™ï¼Œè¯·æƒ³æƒ³æ˜¯ä¸æ˜¯åŒæ—¶å˜åœ¨ç¡¬ä»¶å’Œè½¯ä»¶é˜²ç«å¢™ï¼Œæˆ–å˜åœ¨æ‚¨æ— " +"法控制的é¢å¤–的机构性的防ç«å¢™ã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:594 -msgid "Also, some routers cannot correctly forward both TCP and UDP on a single port, or may have other limitations or bugs that prevent them from passing traffic through to I2P." -msgstr "当然,æŸäº›è·¯ç”±å™¨å¯èƒ½æ— 法æ£ç¡®æ˜ å°„åŒæ—¶ä½¿ç”¨TCPå’ŒUDPå议的端å£ï¼Œæˆ–å˜åœ¨å…¶ä»–é™åˆ¶æˆ–缺陷,障ç¢äº†æ•°æ®è¿›å…¥I2P网络。" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:595 +msgid "" +"Also, some routers cannot correctly forward both TCP and UDP on a single " +"port, or may have other limitations or bugs that prevent them from passing " +"traffic through to I2P." +msgstr "" +"当然,æŸäº›è·¯ç”±å™¨å¯èƒ½æ— 法æ£ç¡®æ˜ å°„åŒæ—¶ä½¿ç”¨TCPå’ŒUDPå议的端å£ï¼Œæˆ–å˜åœ¨å…¶ä»–é™åˆ¶æˆ–" +"缺陷,障ç¢äº†æ•°æ®è¿›å…¥I2P网络。" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:598 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:599 msgid "The router is currently testing whether your UDP port is firewalled." msgstr "路由器æ£åœ¨æµ‹è¯•æ‚¨çš„UDP端å£æ˜¯å¦è¢«é˜²ç«å¢™é˜»æŒ¡ã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:602 -msgid "The router is not configured to publish its address, therefore it does not expect incoming connections." +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:603 +msgid "" +"The router is not configured to publish its address, therefore it does not " +"expect incoming connections." msgstr "路由器被设置为ç¦æ¢å‘布IP地å€ï¼Œå› æ¤å¹¶ä¸éœ€è¦å…¥ç«™è¿žæŽ¥ã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:604 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:605 msgid "WARN - Firewalled and Fast" msgstr "è¦å‘Š - å¿«é€ŸèŠ‚ç‚¹ï¼Œå› é˜²ç«å¢™å—é™" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:606 -msgid "You have configured I2P to share more than 128KBps of bandwidth, but you are firewalled." +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:607 +msgid "" +"You have configured I2P to share more than 128KBps of bandwidth, but you are " +"firewalled." msgstr "您设置I2P共享超过128KBpsçš„å¸¦å®½ï¼Œä½†æ‚¨çš„è¿žæŽ¥å› é˜²ç«å¢™å—阻。" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:608 -msgid "While I2P will work fine in this configuration, if you really have over 128KBps of bandwidth to share, it will be much more helpful to the network if you open your firewall." -msgstr "尽管在æ¤ç§é…置情况下I2På¯ä»¥æ£å¸¸å·¥ä½œï¼Œä½†å¦‚果您的确能够分享超过128kps的带宽,打开防ç«å¢™ç«¯å£å®ƒèƒ½å·¥ä½œçš„更好帮助网络ä¸å…¶ä»–的人。" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:609 +msgid "" +"While I2P will work fine in this configuration, if you really have over " +"128KBps of bandwidth to share, it will be much more helpful to the network " +"if you open your firewall." +msgstr "" +"尽管在æ¤ç§é…置情况下I2På¯ä»¥æ£å¸¸å·¥ä½œï¼Œä½†å¦‚果您的确能够分享超过128kps的带宽,打" +"开防ç«å¢™ç«¯å£å®ƒèƒ½å·¥ä½œçš„更好帮助网络ä¸å…¶ä»–的人。" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:610 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:611 msgid "WARN - Firewalled and Floodfill" msgstr "è¦å‘Š - ç§åèŠ‚ç‚¹ï¼Œå› é˜²ç«å¢™å—é™" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:612 -msgid "You have configured I2P to be a floodfill router, but you are firewalled." +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:613 +msgid "" +"You have configured I2P to be a floodfill router, but you are firewalled." msgstr "您已将I2P设置为ç§åè·¯ç”±ï¼Œä½†æ‚¨çš„è¿žæŽ¥å·²å› é˜²ç«å¢™å—阻。" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:614 -msgid "For best participation as a floodfill router, you should open your firewall." +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:615 +msgid "" +"For best participation as a floodfill router, you should open your firewall." msgstr "为了ç§å路由能够更好的å‚与到I2P网络ä¸ï¼Œè¯·æ‚¨çš„防ç«å¢™ä¸æ‰“开端å£ã€‚" # æš‚ä¸ç¿»è¯‘方便å馈 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:616 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:617 msgid "WARN - Firewalled with Inbound TCP Enabled" msgstr "è¦å‘Š - 入站TCPå¼€å¯ï¼Œä½†å› 防ç«å¢™å—é™" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:618 -msgid "You have configured inbound TCP, however your UDP port is firewalled, and therefore it is likely that your TCP port is firewalled as well." -msgstr "您设置了使用入站TCP连接,åŒæ—¶æ‚¨çš„UDP端å£å› 防ç«å¢™å—阻,由æ¤çœ‹æ¥æ‚¨çš„TCP端å£ä¹Ÿè¢«é˜²ç«å¢™é˜»æŒ¡ã€‚" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:619 +msgid "" +"You have configured inbound TCP, however your UDP port is firewalled, and " +"therefore it is likely that your TCP port is firewalled as well." +msgstr "" +"您设置了使用入站TCP连接,åŒæ—¶æ‚¨çš„UDP端å£å› 防ç«å¢™å—阻,由æ¤çœ‹æ¥æ‚¨çš„TCP端å£ä¹Ÿè¢«" +"防ç«å¢™é˜»æŒ¡ã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:620 -msgid "If your TCP port is firewalled with inbound TCP enabled, routers will not be able to contact you via TCP, which will hurt the network." -msgstr "如果您在TCP端å£å› 防ç«å¢™å—阻的情况下å¯ç”¨å…¥ç«™TCPè¿žæŽ¥ï¼Œå…¶ä»–è·¯ç”±å™¨èŠ‚ç‚¹å°†æ— æ³•ä¸Žæ‚¨å»ºç«‹è¿žæŽ¥ï¼Œé€ æˆç½‘络å—阻。" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:621 +msgid "" +"If your TCP port is firewalled with inbound TCP enabled, routers will not be " +"able to contact you via TCP, which will hurt the network." +msgstr "" +"如果您在TCP端å£å› 防ç«å¢™å—阻的情况下å¯ç”¨å…¥ç«™TCPè¿žæŽ¥ï¼Œå…¶ä»–è·¯ç”±å™¨èŠ‚ç‚¹å°†æ— æ³•ä¸Žæ‚¨" +"å»ºç«‹è¿žæŽ¥ï¼Œé€ æˆç½‘络å—阻。" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:622 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:623 msgid "Please open your firewall or disable inbound TCP above." msgstr "请打开您的防ç«å¢™ç«¯å£æˆ–ç¦ç”¨ä¸Šé¢çš„入站TCP连接。" # æš‚ä¸ç¿»è¯‘ -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:624 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:625 msgid "WARN - Firewalled with UDP Disabled" msgstr "è¦å‘Š - å› é˜²ç«å¢™å—é™ï¼Œä¸”UDP被ç¦ç”¨" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:626 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:627 msgid "You have configured inbound TCP, however you have disabled UDP." msgstr "您设置了使用TCP连接,然而ç¦ç”¨äº†UDP连接。" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:628 -msgid "You appear to be firewalled on TCP, therefore your router cannot accept inbound connections." +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:629 +msgid "" +"You appear to be firewalled on TCP, therefore your router cannot accept " +"inbound connections." msgstr "您的TCPè¿žæŽ¥ä¼¼ä¹Žå› é˜²ç«å¢™å—é˜»ï¼Œå¯¼è‡´æ‚¨çš„è·¯ç”±å™¨æ— æ³•æŽ¥æ”¶å…¥ç«™è¿žæŽ¥ã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:630 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:631 msgid "Please open your firewall or enable UDP." msgstr "请打开防ç«å¢™ç«¯å£æˆ–å¯ç”¨UDP。" # æš‚ä¸ç¿»è¯‘,方便错误å馈 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:632 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:633 msgid "ERR - Clock Skew" msgstr "错误 - 系统时滞" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:634 -msgid "Your system's clock is skewed, which will make it difficult to participate in the network." +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:635 +msgid "" +"Your system's clock is skewed, which will make it difficult to participate " +"in the network." msgstr "如果您的系统时钟太快或太慢,将影å“计算机接入网络。" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:636 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:637 msgid "Correct your clock setting if this error persists." msgstr "如果错误æŒç»ï¼Œè¯·æ ¡å¯¹æ‚¨çš„系统时间。" # æš‚ä¸ç¿»è¯‘,方便错误å馈 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:638 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:639 msgid "ERR - Private TCP Address" msgstr "错误 - ç§æœ‰TCP地å€" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:640 -msgid "You must never advertise an unroutable IP address such as 127.0.0.1 or 192.168.1.1 as your external address." -msgstr "您ä¸èƒ½å‘å¸ƒä¸€ä¸ªå…¬ç½‘æ— æ³•è®¿é—®çš„ IP 地å€ï¼Œä¾‹å¦‚127.0.0.1或192.168.1.1一类的内网地å€ã€‚" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:641 +msgid "" +"You must never advertise an unroutable IP address such as 127.0.0.1 or " +"192.168.1.1 as your external address." +msgstr "" +"您ä¸èƒ½å‘å¸ƒä¸€ä¸ªå…¬ç½‘æ— æ³•è®¿é—®çš„ IP 地å€ï¼Œä¾‹å¦‚127.0.0.1或192.168.1.1一类的内网地" +"å€ã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:642 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:643 msgid "Correct the address or disable inbound TCP above." msgstr "æ£ç¡®è®¾ç½®IP地å€æˆ–ç¦ç”¨ä¸Šé¢çš„入站TCP连接。" # æš‚ä¸ç¿»è¯‘,方便错误å馈 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:644 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:645 msgid "ERR - SymmetricNAT" msgstr "错误 - SymmetricNAT" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:646 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:647 msgid "I2P detected that you are firewalled by a Symmetric NAT." msgstr "I2P检测到您å—到Symmetic NAT的阻挡。" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:648 -msgid "I2P does not work well behind this type of firewall. You will probably not be able to accept inbound connections, which will limit your participation in the network." -msgstr "I2Pæ— æ³•ä¸Žæ¤ç±»é˜²ç«å¢™å¾ˆå¥½çš„并å˜ã€‚您å¯èƒ½æ— 法接收入站连接,这会障ç¢æ‚¨è¿žå…¥I2P网络。" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:649 +msgid "" +"I2P does not work well behind this type of firewall. You will probably not " +"be able to accept inbound connections, which will limit your participation " +"in the network." +msgstr "" +"I2Pæ— æ³•ä¸Žæ¤ç±»é˜²ç«å¢™å¾ˆå¥½çš„并å˜ã€‚您å¯èƒ½æ— 法接收入站连接,这会障ç¢æ‚¨è¿žå…¥I2P网" +"络。" # æš‚ä¸ç¿»è¯‘,方便问题å馈 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:650 -msgid "ERR - UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart" -msgstr "错误 - UDP端å£å·²å 用 - 在高级设置ä¸è®¾ç½® i2np.udp.internalPort=æ–°ç«¯å£ å¹¶é‡å¯ç¨‹åº" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:651 +msgid "" +"ERR - UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config " +"and restart" +msgstr "" +"错误 - UDP端å£å·²å 用 - 在高级设置ä¸è®¾ç½® i2np.udp.internalPort=æ–°ç«¯å£ å¹¶é‡å¯ç¨‹" +"åº" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:652 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:653 msgid "I2P was unable to bind to port 8887 or other configured port." msgstr "I2Pæ— æ³•ç»‘å®šåˆ°ç«¯å£8887或其他指定的端å£ä¸Šã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:654 -msgid "Check to see if another program is using the configured port. If so, stop that program or configure I2P to use a different port." -msgstr "检查是å¦æœ‰å…¶ä»–程åºæ£åœ¨ä½¿ç”¨äº†I2P的端å£ï¼Œå¦‚果是,关é—æ¤ç¨‹åºæˆ–设置I2P使用ä¸åŒçš„端å£ã€‚" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:655 +msgid "" +"Check to see if another program is using the configured port. If so, stop " +"that program or configure I2P to use a different port." +msgstr "" +"检查是å¦æœ‰å…¶ä»–程åºæ£åœ¨ä½¿ç”¨äº†I2P的端å£ï¼Œå¦‚果是,关é—æ¤ç¨‹åºæˆ–设置I2P使用ä¸åŒçš„" +"端å£ã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:656 -msgid "This may be a transient error, if the other program is no longer using the port." +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:657 +msgid "" +"This may be a transient error, if the other program is no longer using the " +"port." msgstr "如果其他程åºä¸å†ä½¿ç”¨æ¤ç«¯å£ï¼Œè¿™å¯èƒ½æ˜¯ä¸´æ—¶æ€§çš„错误。" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:658 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:659 msgid "However, a restart is always required after this error." msgstr "然而,å‘生æ¤é”™è¯¯åŽä¸€èˆ¬éœ€è¦é‡å¯ç¨‹åºæ‰èƒ½è§£å†³ã€‚" # æš‚ä¸ç¿»è¯‘,方便错误å馈 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:660 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:661 msgid "ERR - UDP Disabled and Inbound TCP host/port not set" msgstr "错误 - UDPå·²ç¦ç”¨ï¼Œä¸”TCP入站主机与端å£æœªè®¾ç½®" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:662 -msgid "You have not configured inbound TCP with a hostname and port above, however you have disabled UDP." +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:663 +msgid "" +"You have not configured inbound TCP with a hostname and port above, however " +"you have disabled UDP." msgstr "您没有设置入站TCP的主机å称和端å£ï¼ŒåŒæ—¶åˆå…³é—了UDP。" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:664 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:665 msgid "Therefore your router cannot accept inbound connections." msgstr "å› æ¤æ‚¨çš„è·¯ç”±å™¨æ— æ³•æŽ¥æ”¶å…¥ç«™è¿žæŽ¥ã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:666 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:667 msgid "Please configure a TCP host and port above or enable UDP." msgstr "请在å‰é¢è®¾ç½®TCP主机和端å£æˆ–å¯ç”¨UDP" # 错误æ示暂ä¸ç¿»è¯‘,以便错误å馈。 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:668 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:669 msgid "ERR - Client Manager I2CP Error - check logs" msgstr "错误 - 客户程åºç®¡ç†å™¨ I2CP 错误 - 请看日志" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:670 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:671 msgid "This is usually due to a port 7654 conflict. Check the logs to verify." msgstr "这通常为7654端å£å†²çªæ‰€è‡´ï¼Œè¯·æŸ¥çœ‹æ—¥å¿—ç¡®è®¤åŽŸå› ã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:672 -msgid "Do you have another I2P instance running? Stop the conflicting program and restart I2P." +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:673 +msgid "" +"Do you have another I2P instance running? Stop the conflicting program and " +"restart I2P." msgstr "您是å¦å·²ç»è¿è¡Œäº†å¦ä¸€ä¸ªI2P实例?请关掉冲çªçš„程åºå¹¶é‡å¯I2P。" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:107 msgid "config advanced" msgstr "高级设置" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:242 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:241 msgid "I2P Advanced Configuration" msgstr "I2P 高级设置" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:299 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:301 msgid "Advanced I2P Configuration" msgstr "I2P 高级设置" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:309 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:311 msgid "Some changes may require a restart to take effect." msgstr "æŸäº›è®¾ç½®éœ€è¦ç¨‹åºé‡å¯åŽç”Ÿæ•ˆã€‚" @@ -4450,52 +4759,123 @@ msgstr "æŸäº›è®¾ç½®éœ€è¦ç¨‹åºé‡å¯åŽç”Ÿæ•ˆã€‚" msgid "config clients" msgstr "客户程åºè®¾ç½®" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:244 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:243 msgid "I2P Client Configuration" msgstr "I2P 客户程åºè®¾ç½®" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:311 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:312 msgid "Client Configuration" msgstr "客户程åºè®¾ç½®" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:313 -msgid "The Java clients listed below are started by the router and run in the same JVM." +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:314 +msgid "" +"The Java clients listed below are started by the router and run in the same " +"JVM." msgstr "下é¢åˆ—出的Java客户端éšè·¯ç”±å™¨å¯åŠ¨å¹¶è¿è¡ŒäºŽåŒä¸€JVMä¸ã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:317 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:318 msgid "To change other client options, edit the file" msgstr "修改其他客户端设置请编辑文件" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:324 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:344 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:325 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:401 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:415 msgid "All changes require restart to take effect." msgstr "所有更改å‡éœ€è¦ç¨‹åºé‡å¯æ‰èƒ½ç”Ÿæ•ˆã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:336 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:337 +msgid "Advanced Client Interface Configuration" +msgstr "客户端接å£è®¾ç½®(高级)" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:339 +msgid "External I2CP (I2P Client Protocol) Interface Configuration" +msgstr "外部I2CPæŽ¥å£ (I2P客户åè®®) 设置" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:345 +msgid "Enabled without SSL" +msgstr "å¯ç”¨æ— 需 SSL" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:351 +msgid "Enabled with SSL required" +msgstr "å¯ç”¨å¼ºåˆ¶ SSL" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:357 +msgid "Disabled - Clients outside this Java process may not connect" +msgstr "ç¦ç”¨ - 如果客户端与I2Pä¸è¿è¡Œä¸ŽåŒä¸€Java虚拟机ä¸åˆ™ç¦æ¢å…¶è¿žæŽ¥ã€‚" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:359 +msgid "I2CP Port" +msgstr "I2CP 端å£" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:363 +msgid "I2CP Interface" +msgstr "I2CP接å£" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:379 +msgid "Authorization" +msgstr "认è¯" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:385 +msgid "Require username and password" +msgstr "强制用户å密ç 登陆" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:387 +msgid "Username" +msgstr "用户å" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:391 +msgid "Password" +msgstr "密ç " + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:397 +msgid "Any changes made here must also be configured in the external client." +msgstr "对于æ¤å¤„çš„åšå‡ºçš„任何更改,外部客户端程åºä¸ä¹Ÿå¿…é¡»åšå‡ºç›¸åº”设置。" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:399 +msgid "Many clients do not support SSL or authorization." +msgstr "很多客户端程åºè¿˜ä¸æ”¯æŒSSL或认è¯ã€‚" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:407 msgid "WebApp Configuration" msgstr "WebApp 设置" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:338 -msgid "The Java web applications listed below are started by the webConsole client and run in the same JVM as the router. They are usually web applications accessible through the router console. They may be complete applications (e.g. i2psnark),front-ends to another client or application which must be separately enabled (e.g. susidns, i2ptunnel), or have no web interface at all (e.g. addressbook)." -msgstr "下é¢åˆ—出的Java Web 程åºéšå®¢æˆ·ç«¯â€œweb控制å°â€ä¸€åŒå¯åŠ¨ï¼Œå¹¶ä¸Žè·¯ç”±è¿è¡ŒäºŽåŒä¸€JVMä¸ã€‚这些Web程åºé€šå¸¸å¯ä»¥é€šè¿‡è·¯ç”±å™¨ç•Œé¢ç›´æŽ¥è®¿é—®ã€‚他们å¯èƒ½æ˜¯å®Œæ•´çš„ç¨‹åº (例如 i2psnark/BT客户端),其他客户端程åºçš„å‰ç«¯æˆ–å¿…é¡»å•ç‹¬å¯åŠ¨çš„程åº(例如. susidns, i2ptunnel),ç”šè‡³æ ¹æœ¬æ²¡æœ‰Webç•Œé¢(例如 addressbook)。" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:409 +msgid "" +"The Java web applications listed below are started by the webConsole client " +"and run in the same JVM as the router. They are usually web applications " +"accessible through the router console. They may be complete applications (e." +"g. i2psnark),front-ends to another client or application which must be " +"separately enabled (e.g. susidns, i2ptunnel), or have no web interface at " +"all (e.g. addressbook)." +msgstr "" +"下é¢åˆ—出的Java Web 程åºéšå®¢æˆ·ç«¯â€œweb控制å°â€ä¸€åŒå¯åŠ¨ï¼Œå¹¶ä¸Žè·¯ç”±è¿è¡ŒäºŽåŒä¸€JVMä¸ã€‚" +"这些Web程åºé€šå¸¸å¯ä»¥é€šè¿‡è·¯ç”±å™¨ç•Œé¢ç›´æŽ¥è®¿é—®ã€‚他们å¯èƒ½æ˜¯å®Œæ•´çš„ç¨‹åº (例如 " +"i2psnark/BT客户端),其他客户端程åºçš„å‰ç«¯æˆ–å¿…é¡»å•ç‹¬å¯åŠ¨çš„程åº(例如. susidns, " +"i2ptunnel),ç”šè‡³æ ¹æœ¬æ²¡æœ‰Webç•Œé¢(例如 addressbook)。" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:340 -msgid "A web app may also be disabled by removing the .war file from the webapps directory; however the .war file and web app will reappear when you update your router to a newer version, so disabling the web app here is the preferred method." -msgstr "从webapps目录ä¸åˆ 除相应的.war文件åŒæ ·å¯ä»¥ç¦ç”¨Web程åº;然而这些 .war 文件和Web程åºåœ¨æ›´æ–°I2PåŽè¿˜ä¼šå†æ¬¡å‡ºçŽ°,所以推è在这里通过设置的方法ç¦ç”¨ä¸ç”¨çš„Web程åºã€‚" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:411 +msgid "" +"A web app may also be disabled by removing the .war file from the webapps " +"directory; however the .war file and web app will reappear when you update " +"your router to a newer version, so disabling the web app here is the " +"preferred method." +msgstr "" +"从webapps目录ä¸åˆ 除相应的.war文件åŒæ ·å¯ä»¥ç¦ç”¨Web程åº;然而这些 .war 文件和Web" +"程åºåœ¨æ›´æ–°I2PåŽè¿˜ä¼šå†æ¬¡å‡ºçŽ°,所以推è在这里通过设置的方法ç¦ç”¨ä¸ç”¨çš„Web程åºã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:350 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:421 msgid "Plugin Configuration" msgstr "æ’件设置" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:352 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:423 msgid "The plugins listed below are started by the webConsole client." msgstr "下é¢åˆ—出的æ’件将由 webConsole 客户程åºè´Ÿè´£å¯åŠ¨ã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:358 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:429 msgid "Plugin Installation" msgstr "æ’件安装" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:360 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:431 msgid "To install a plugin, enter the download URL:" msgstr "安装æ’件å‰ï¼Œè¯·è¾“å…¥æ’件的下载链接:" @@ -4503,39 +4883,40 @@ msgstr "安装æ’件å‰ï¼Œè¯·è¾“å…¥æ’件的下载链接:" msgid "config keyring" msgstr "钥匙环设置" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:228 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:227 msgid "I2P Keyring Configuration" msgstr "I2P 钥匙环设置" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:294 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:295 msgid "The router keyring is used to decrypt encrypted leaseSets." msgstr "路由的钥匙环被用æ¥è§£å¯†å’ŒåŠ 密èµé›†." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:297 -msgid "The keyring may contain keys for local or remote encrypted destinations." +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:298 +msgid "" +"The keyring may contain keys for local or remote encrypted destinations." msgstr "钥匙环å¯ä»¥åŒ…å«æœ¬åœ°å’Œè¿œç¨‹çš„åŠ å¯†ç›®æ ‡(Destination)." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:307 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:308 msgid "Manual Keyring Addition" msgstr "æ‰‹åŠ¨æ·»åŠ é’¥åŒ™çŽ¯" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:309 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:310 msgid "Enter keys for encrypted remote destinations here." msgstr "在æ¤å¤„æ·»åŠ è¿œç¨‹åŠ å¯†ç›®æ ‡çš„å¯†é’¥ã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:312 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:313 msgid "Keys for local destinations must be entered on the" msgstr "è¾“å…¥æœ¬åœ°ç›®æ ‡çš„å¯†é’¥è¯·åˆ°" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:314 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:315 msgid "I2PTunnel page" msgstr "I2P 隧é“页é¢" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:316 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:317 msgid "Dest. name, hash, or full key" msgstr "ç›®æ ‡(Dest.)å称, HASH, 或完整公钥" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:318 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:319 msgid "Encryption Key" msgstr "åŠ å¯†å¯†é’¥" @@ -4543,92 +4924,109 @@ msgstr "åŠ å¯†å¯†é’¥" msgid "config logging" msgstr "日志设置" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:242 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:241 msgid "I2P Logging Configuration" msgstr "I2P 记录设置" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:299 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:301 msgid "Configure I2P Logging Options" msgstr "设置 I2P 记录选项" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:301 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:303 msgid "Logging filename" msgstr "日志文件å称" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:305 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:307 msgid "(the symbol '@' will be replaced during log rotation)" msgstr "(日志轮转时符å·'@'将被替æ¢)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:307 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:309 msgid "Log record format" msgstr "æ—¥å¿—è®°å½•æ ¼å¼" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:311 -msgid "(use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, 'm' = message)" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:313 +msgid "" +"(use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, 'm' = message)" msgstr "( 'd' = 日期, 'c' = ç±», 't' = 线程, 'p' = 优先级, 'm' = 消æ¯)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:313 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:315 msgid "Log date format" msgstr "æ—¥å¿—æ—¥æœŸæ ¼å¼" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:317 -msgid "('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' = millisecond)" -msgstr "('MM' = 月, 'dd' = 天, 'HH' = å°æ—¶, 'mm' = 分钟, 'ss' = 秒, 'SSS' = 毫秒)" - #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:319 +msgid "" +"('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' " +"= millisecond)" +msgstr "" +"('MM' = 月, 'dd' = 天, 'HH' = å°æ—¶, 'mm' = 分钟, 'ss' = 秒, 'SSS' = 毫秒)" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:321 msgid "Max log file size" msgstr "日志最大体积" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:323 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:325 msgid "Default log level" msgstr "默认日志ç‰çº§" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:327 -msgid "(DEBUG and INFO are not recommended defaults, as they will drastically slow down your router)" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:329 +msgid "" +"(DEBUG and INFO are not recommended defaults, as they will drastically slow " +"down your router)" msgstr "(建议ä¸è¦ä½¿ç”¨ DEBUG 或 INFO 作为默认ç‰çº§,他们会明显é™ä½Žç¨‹åºæ€§èƒ½)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:329 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:331 msgid "Log level overrides" msgstr "ç‰çº§å¤–<br>日志项目" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:335 +msgid "New override" +msgstr "新建å‚æ•°" + #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:106 msgid "config peers" msgstr "节点设置" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:228 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:227 msgid "I2P Peer Configuration" msgstr "I2P 节点设置" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:304 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:305 msgid "Manual Peer Controls" msgstr "手动节点控制" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:306 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:307 msgid "Router Hash" msgstr "路由器Key(è§NetDB)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:310 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:311 msgid "Manually Ban / Unban a Peer" msgstr "手动å°æ€/解å°æŸä¸ªèŠ‚点" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:312 -msgid "Banning will prevent the participation of this peer in tunnels you create." +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:313 +msgid "" +"Banning will prevent the participation of this peer in tunnels you create." msgstr "å°é”将阻æ¢èŠ‚点å‚与您的隧é“创建" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:324 -msgid "Bonuses may be positive or negative, and affect the peer's inclusion in Fast and High Capacity tiers. Fast peers are used for client tunnels, and High Capacity peers are used for some exploratory tunnels. Current bonuses are displayed on the" -msgstr "评分(Bonuse)å¯èƒ½ä¸ºæ£æˆ–为负并影å“节点是å¦è¯„为快速和高容é‡èŠ‚点。快速节点用于客户程åºé€šé“,高容é‡èŠ‚点用于探索隧é“。当å‰è¯„分显示于" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:323 +msgid "Adjust Profile Bonuses" +msgstr "调整节点评分" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:325 +msgid "" +"Bonuses may be positive or negative, and affect the peer's inclusion in Fast " +"and High Capacity tiers. Fast peers are used for client tunnels, and High " +"Capacity peers are used for some exploratory tunnels. Current bonuses are " +"displayed on the" +msgstr "" +"评分(Bonuse)å¯èƒ½ä¸ºæ£æˆ–为负并影å“节点是å¦è¯„为快速和高容é‡èŠ‚点。快速节点用于客" +"户程åºé€šé“,高容é‡èŠ‚点用于探索隧é“。当å‰è¯„分显示于" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:326 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:327 msgid "profiles page" msgstr "节点信æ¯é¡µé¢" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:342 -msgid "Adjust peer bonuses" -msgstr "调整节点评分" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:344 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:253 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:345 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:251 msgid "Banned Peers" msgstr "å·²å°é”节点" @@ -4636,140 +5034,258 @@ msgstr "å·²å°é”节点" msgid "Banned IPs" msgstr "å·²å°é”IP" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:106 +msgid "config reseeding" +msgstr "设置引导" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:240 +msgid "I2P Reseeding Configuration" +msgstr "I2P 网络引导设置" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:300 +msgid "Reseeding Configuration" +msgstr "网络引导设置" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:302 +msgid "" +"Reseeding is the bootstrapping process used to find other routers when you " +"first install I2P, or when your router has too few router references " +"remaining." +msgstr "" +"è¡¥ç§(Reseeding)是一个网络引导(Bootstrip)过程,新用户通过这个过程å‘现其他I2P用" +"户,很久未上线的è€ç”¨æˆ·åœ¨å·²çŸ¥çš„有效节点很少时也会进入引导/è¡¥ç§çŠ¶æ€ã€‚" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:304 +msgid "" +"If reseeding has failed, you should first check your network connection." +msgstr "如果网络引导失败请先检查您的网络设置,确定本机网络æ£å¸¸ã€‚" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:308 +msgid "" +"Change these only if HTTP is blocked by a restrictive firewall, reseed has " +"failed, and you have access to an HTTP proxy." +msgstr "您仅需在防ç«å¢™è¿‡æ»¤ä¸¥é‡ï¼Œé€ æˆç½‘络引导失败时需è¦ä½¿ç”¨HTTP代ç†ã€‚" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:310 +#, java-format +msgid "See {0} for instructions on reseeding manually." +msgstr "手动引导的方法请å‚è§ {0}" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:310 +msgid "the FAQ" +msgstr " 常è§é—®é¢˜è§£ç” " + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:312 +msgid "Reseed URL Selection" +msgstr "引导链接选择" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:318 +msgid "Try SSL first then non-SSL" +msgstr "å…ˆå°è¯•SSLå†å°è¯•HTTP" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:324 +msgid "Use SSL only" +msgstr "仅使用SSL" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:330 +msgid "Use non-SSL only" +msgstr "仅使用普通HTTP" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:332 +msgid "Reseed URLs" +msgstr "网络å¯åŠ¨" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:336 +msgid "Enable HTTP proxy (not used for SSL)" +msgstr "使用 HTTP 代ç†(ç›®å‰ä¸æ”¯æŒSSL)" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:340 +msgid "HTTP Proxy Host" +msgstr "HTTP 代ç†åœ°å€" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:344 +msgid "HTTP Proxy Port" +msgstr "HTTP 代ç†ç«¯å£" + #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:106 msgid "config service" msgstr "æœåŠ¡è®¾ç½®" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:228 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:227 msgid "I2P Service Configuration" msgstr "I2P æœåŠ¡è®¾ç½®" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:284 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:285 msgid "Shutdown the router" msgstr "å…³é—路由器" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:286 -msgid "Graceful shutdown lets the router satisfy the agreements it has already made before shutting down, but may take a few minutes." -msgstr "平滑关é—让路由器在关é—å‰å®Œæˆå·²è¾¾æˆçš„任务,但这å¯èƒ½éœ€è¦èŠ±è´¹å‡ 分钟的时间。" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:287 +msgid "" +"Graceful shutdown lets the router satisfy the agreements it has already made " +"before shutting down, but may take a few minutes." +msgstr "" +"平滑关é—让路由器在关é—å‰å®Œæˆå·²è¾¾æˆçš„任务,但这å¯èƒ½éœ€è¦èŠ±è´¹å‡ 分钟的时间。" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:288 -msgid "If you need to kill the router immediately, that option is available as well." +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:289 +msgid "" +"If you need to kill the router immediately, that option is available as well." msgstr "å½“ç„¶ä½ ä¹Ÿå¯ä»¥é€‰æ‹©ç«‹å³å…³é—路由。" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:298 -msgid "If you want the router to restart itself after shutting down, you can choose one of the following." +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:299 +msgid "" +"If you want the router to restart itself after shutting down, you can choose " +"one of the following." msgstr "å¦‚æžœä½ æƒ³è¦è·¯ç”±å™¨å…³é—åŽè‡ªåŠ¨é‡æ–°å¯åŠ¨ï¼Œå¯ä»¥é€‰æ‹©ä¸‹é¢çš„选项。" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:300 -msgid "This is useful in some situations - for example, if you changed some settings that client applications only read at startup, such as the routerconsole password or the interface it listens on." -msgstr "æ¤åŠŸèƒ½åœ¨å¦‚下情况下适用 - 例如当您修改了æŸäº›åªåœ¨å¯åŠ¨æ—¶è¯»å–的设置,例如路由器控制å°å¯†ç ,路由监å¬æŽ¥å£ç‰ã€‚" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:301 +msgid "" +"This is useful in some situations - for example, if you changed some " +"settings that client applications only read at startup, such as the " +"routerconsole password or the interface it listens on." +msgstr "" +"æ¤åŠŸèƒ½åœ¨å¦‚下情况下适用 - 例如当您修改了æŸäº›åªåœ¨å¯åŠ¨æ—¶è¯»å–的设置,例如路由器控" +"制å°å¯†ç ,路由监å¬æŽ¥å£ç‰ã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:302 -msgid "A graceful restart will take a few minutes (but your peers will appreciate your patience), while a hard restart does so immediately." -msgstr "平滑é‡å¯å¯èƒ½ä¼šç‰å¾…å‡ åˆ†é’Ÿçš„æ—¶é—´(ä½†ä½ çš„èŠ‚ç‚¹ä¸€å®šä¼šæ„Ÿæ¿€ä½ çš„è€å¿ƒ),硬é‡å¯å¯ä»¥ç«‹å³å®Œæˆã€‚" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:303 +msgid "" +"A graceful restart will take a few minutes (but your peers will appreciate " +"your patience), while a hard restart does so immediately." +msgstr "" +"平滑é‡å¯å¯èƒ½ä¼šç‰å¾…å‡ åˆ†é’Ÿçš„æ—¶é—´(ä½†ä½ çš„èŠ‚ç‚¹ä¸€å®šä¼šæ„Ÿæ¿€ä½ çš„è€å¿ƒ),硬é‡å¯å¯ä»¥ç«‹å³" +"完æˆã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:304 -msgid "After tearing down the router, it will wait 1 minute before starting back up again." +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:305 +msgid "" +"After tearing down the router, it will wait 1 minute before starting back up " +"again." msgstr "路由关é—åŽå°†ç‰å¾…1分钟å†é‡æ–°å¯åŠ¨ã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:314 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:315 msgid "Systray integration" msgstr "使用系统托盘" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:316 -msgid "On the windows platform, there is a small application to sit in the system tray, allowing you to view the router's status" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:317 +msgid "" +"On the windows platform, there is a small application to sit in the system " +"tray, allowing you to view the router's status" msgstr "Windows å¹³å°å…许å°ç¨‹åºè¿›é©»ç³»ç»Ÿæ‰˜ç›˜ï¼Œè®©ä½ å¯ä»¥æŸ¥çœ‹è·¯ç”±çŠ¶æ€" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:318 -msgid "(later on, I2P client applications will be able to integrate their own functionality into the system tray as well)." +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:319 +msgid "" +"(later on, I2P client applications will be able to integrate their own " +"functionality into the system tray as well)." msgstr "(以åŽçš„ I2P 客户端程åºä¹Ÿä¼šå°†å®ƒä»¬çš„功能集æˆåˆ°ç³»ç»Ÿæ‰˜ç›˜é‡Œ)。" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:320 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:321 msgid "If you are on windows, you can either enable or disable that icon here." msgstr "å¦‚æžœä½ ä½¿ç”¨Windows, å¯ä»¥åœ¨è¿™é‡Œå¼€å¯æˆ–å…³é—è¿™ä¸ªæ‰˜ç›˜å›¾æ ‡ã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:326 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:323 +msgid "Show systray icon" +msgstr "æ˜¾ç¤ºæ‰˜ç›˜å›¾æ ‡" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:325 +msgid "Hide systray icon" +msgstr "éšè—ç³»ç»Ÿå›¾æ ‡" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:327 msgid "Run on startup" msgstr "å¯åŠ¨æ—¶è¿è¡Œ" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:328 -msgid "You can control whether I2P is run on startup or not by selecting one of the following options - I2P will install (or remove) a service accordingly." -msgstr "è¿™é‡Œä½ å¯ä»¥é€šè¿‡ä¸‹é¢çš„选项æ¥è®¾ç½®å¼€æœºåŽ I2P 是å¦å¯åŠ¨ - I2P 将相应的安装或å¸è½½I2PæœåŠ¡ã€‚" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:329 +msgid "" +"You can control whether I2P is run on startup or not by selecting one of the " +"following options - I2P will install (or remove) a service accordingly." +msgstr "" +"è¿™é‡Œä½ å¯ä»¥é€šè¿‡ä¸‹é¢çš„选项æ¥è®¾ç½®å¼€æœºåŽ I2P 是å¦å¯åŠ¨ - I2P 将相应的安装或å¸è½½I2P" +"æœåŠ¡ã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:330 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:331 msgid "If you prefer the command line, you can also run the " msgstr "å¦‚æžœä½ å好使用命令行,å¯ä»¥è¿è¡Œ" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:340 -msgid "If you are running I2P as service right now, removing it will shut down your router immediately." +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:341 +msgid "" +"If you are running I2P as service right now, removing it will shut down your " +"router immediately." msgstr "如果您目å‰å·²ç»ä»¥æœåŠ¡å½¢å¼è¿è¡Œ I2P ï¼Œåˆ é™¤ I2P æœåŠ¡å°†ç«‹åˆ»å…³é—路由器。" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:342 -msgid "You may want to consider shutting down gracefully, as above, then running uninstall_i2p_service_winnt.bat." -msgstr "您å¯ä»¥è€ƒè™‘先平滑关é—路由,待退出åŽè¿è¡Œ uninstall_i2p_service_winnt.bat。" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:343 +msgid "" +"You may want to consider shutting down gracefully, as above, then running " +"uninstall_i2p_service_winnt.bat." +msgstr "" +"您å¯ä»¥è€ƒè™‘先平滑关é—路由,待退出åŽè¿è¡Œ uninstall_i2p_service_winnt.bat。" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:346 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:347 msgid "Debugging" msgstr "调试" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:348 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:349 msgid "View the job queue" msgstr "查看作业队列" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:352 -msgid "At times, it may be helpful to debug I2P by getting a thread dump. To do so, please select the following option and review the thread dumped to <a href=\"logs.jsp#servicelogs\">wrapper.log</a>." +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:353 +msgid "" +"At times, it may be helpful to debug I2P by getting a thread dump. To do so, " +"please select the following option and review the thread dumped to <a href=" +"\"logs.jsp#servicelogs\">wrapper.log</a>." msgstr "" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:358 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:359 msgid "Launch browser on router startup?" msgstr "路由器å¯åŠ¨æ—¶è¿è¡Œæµè§ˆå™¨?" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:360 -msgid "I2P's main configuration interface is this web console, so for your convenience I2P can launch a web browser on startup pointing at" -msgstr "æ¤Web控制å°æ˜¯I2P的主è¦è®¾ç½®ç•Œé¢ï¼Œæ‰€ä»¥å¦‚果您您觉得有必è¦I2På¯ä»¥åœ¨è·¯ç”±å¯åŠ¨æ—¶è°ƒç”¨æµè§ˆå™¨æ‰“å¼€" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:361 +msgid "" +"I2P's main configuration interface is this web console, so for your " +"convenience I2P can launch a web browser on startup pointing at" +msgstr "" +"æ¤Web控制å°æ˜¯I2P的主è¦è®¾ç½®ç•Œé¢ï¼Œæ‰€ä»¥å¦‚果您您觉得有必è¦I2På¯ä»¥åœ¨è·¯ç”±å¯åŠ¨æ—¶è°ƒç”¨" +"æµè§ˆå™¨æ‰“å¼€" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:107 msgid "config stats" msgstr "统计设置" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:229 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:228 msgid "I2P Stats Configuration" msgstr "I2P 统计设置" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:300 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:302 msgid "Configure I2P Stat Collection" msgstr "设置 I2P 统计项" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:302 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:304 msgid "Enable full stats?" msgstr "å¯ç”¨å®Œæ•´ç»Ÿè®¡?" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:309 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:311 msgid "change requires restart to take effect" msgstr "设置需è¦ç¨‹åºé‡å¯åŽæ‰èƒ½ç”Ÿæ•ˆã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:311 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:313 msgid "Stat file" msgstr "统计文件" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:315 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:317 msgid "Filter" msgstr "过滤器" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:317 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:326 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:319 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:328 msgid "toggle all" msgstr "全部切æ¢" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:328 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:330 msgid "Log" msgstr "日志" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:330 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:332 msgid "Graph" msgstr "图表" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:369 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:371 msgid "Advanced filter" msgstr "高级过滤器" @@ -4777,43 +5293,49 @@ msgstr "高级过滤器" msgid "config tunnels" msgstr "隧é“设置" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:241 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:240 msgid "I2P Tunnel Configuration" msgstr "I2P 隧é“设置" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:305 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:306 msgid "The default settings work for most people." msgstr "默认设置适于大多数人。" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:309 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:310 msgid "There is a fundamental tradeoff between anonymity and performance." msgstr "匿å性需è¦ä»¥æ€§èƒ½ä¸ºä»£ä»·ã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:312 -msgid "Tunnels longer than 3 hops (for example 2 hops + 0-2 hops, 3 hops + 0-1 hops, 3 hops + 0-2 hops), or a high quantity + backup quantity, may severely reduce performance or reliability." -msgstr "长于3个跳点的隧é“(例如 2跳点 + 0-2跳点,3跳点 + 0-1跳点, 3跳点 + 0-2跳点),或大é‡å¸¸è§„+大é‡å¤‡ç”¨,å¯èƒ½é™ä½Žæ€§èƒ½å’Œç¨³å®šæ€§ã€‚" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:313 +msgid "" +"Tunnels longer than 3 hops (for example 2 hops + 0-2 hops, 3 hops + 0-1 " +"hops, 3 hops + 0-2 hops), or a high quantity + backup quantity, may severely " +"reduce performance or reliability." +msgstr "" +"长于3个跳点的隧é“(例如 2跳点 + 0-2跳点,3跳点 + 0-1跳点, 3跳点 + 0-2跳点),或" +"大é‡å¸¸è§„+大é‡å¤‡ç”¨,å¯èƒ½é™ä½Žæ€§èƒ½å’Œç¨³å®šæ€§ã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:315 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:316 msgid "High CPU and/or high outbound bandwidth usage may result." msgstr "导致高CPUå 用和/或高上行æµé‡ã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:318 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:319 msgid "Change these settings with care, and adjust them if you have problems." msgstr "å°å¿ƒæ›´æ”¹è¿™äº›è®¾ç½®ã€‚如果é‡åˆ°é—®é¢˜å¯ä»¥åœ¨è¿™é‡Œè°ƒæ•´ã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:332 -msgid "Exploratory tunnel setting changes are stored in the router.config file." +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:333 +msgid "" +"Exploratory tunnel setting changes are stored in the router.config file." msgstr "对探测隧é“设置的更改将ä¿å˜å…¥router.config文件ä¸ã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:335 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:336 msgid "Client tunnel changes are temporary and are not saved." msgstr "对客户程åºéš§é“的修改是临时的,将ä¸äºˆä¿å˜ã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:337 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:338 msgid "To make permanent client tunnel changes see the" msgstr "è¦æ°¸ä¹…性更改客户通é“的设置å‚è§" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:339 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:340 msgid "i2ptunnel page" msgstr "I2P 隧é“页é¢" @@ -4821,31 +5343,39 @@ msgstr "I2P 隧é“页é¢" msgid "config UI" msgstr "ç•Œé¢è®¾ç½®" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:241 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:240 msgid "I2P UI Configuration" msgstr "I2P ç•Œé¢è®¾ç½®" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:291 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:292 msgid "Router Console Theme" msgstr "路由控制å°ä¸»é¢˜" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:309 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:310 msgid "Theme selection disabled for Internet Explorer, sorry." msgstr "抱æ‰ï¼Œä¸»é¢˜åŠŸèƒ½åœ¨InternetExplorerä¸å·²ç¦ç”¨ã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:311 -msgid "If you're not using IE, it's likely that your browser is pretending to be IE; please configure your browser (or proxy) to use a different User Agent string if you'd like to access the console themes." -msgstr "如果您没使用IE,您的æµè§ˆå™¨å¯èƒ½æ£åœ¨ä¼ªè£…IEçš„UserAgent;您需è¦è®¾ç½®æµè§ˆå™¨(或过滤å¼ä»£ç†)使用ä¸åŒçš„UserAgent,æ‰èƒ½è®¿é—®è·¯ç”±æŽ§åˆ¶å°çš„主题功能。" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:312 +msgid "" +"If you're not using IE, it's likely that your browser is pretending to be " +"IE; please configure your browser (or proxy) to use a different User Agent " +"string if you'd like to access the console themes." +msgstr "" +"如果您没使用IE,您的æµè§ˆå™¨å¯èƒ½æ£åœ¨ä¼ªè£…IEçš„UserAgent;您需è¦è®¾ç½®æµè§ˆå™¨(或过滤" +"å¼ä»£ç†)使用ä¸åŒçš„UserAgent,æ‰èƒ½è®¿é—®è·¯ç”±æŽ§åˆ¶å°çš„主题功能。" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:315 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:316 msgid "Router Console Language" msgstr "路由控制å°è¯è¨€" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:319 -msgid "Please contribute to the router console translation project! Contact the developers on IRC #i2p to help." -msgstr "æ¬¢è¿ŽåŠ å…¥è·¯ç”±æŽ§åˆ¶å°ç¿»è¯‘项目ï¼æ供帮助请通过IRC到#i2p房间与开å‘人员è”系。" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:320 +msgid "" +"Please contribute to the router console translation project! Contact the " +"developers on IRC #i2p to help." +msgstr "" +"æ¬¢è¿ŽåŠ å…¥è·¯ç”±æŽ§åˆ¶å°ç¿»è¯‘项目ï¼æ供帮助请通过IRC到#i2p房间与开å‘人员è”系。" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:323 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:324 msgid "Apply" msgstr "应用" @@ -4853,83 +5383,145 @@ msgstr "应用" msgid "config update" msgstr "更新设置" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:228 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:227 msgid "I2P Update Configuration" msgstr "I2P 更新设置" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:302 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:303 msgid "Check for I2P and news updates" msgstr "检查I2P软件åŠæ–°é—»æ›´æ–°" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:304 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:305 msgid "News & I2P Updates" msgstr "软件åŠæ–°é—»æ›´æ–°" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:308 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:309 msgid "Update In Progress" msgstr "æ›´æ–°ä¸" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:316 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:317 msgid "News URL" msgstr "新闻链接" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:320 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:321 msgid "Refresh frequency" msgstr "更新频率" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:326 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:327 msgid "Update policy" msgstr "å‡çº§ç–ç•¥" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:330 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:331 msgid "Update through the eepProxy?" msgstr "通过I2P代ç†æ›´æ–°?" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:334 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:335 msgid "eepProxy host" msgstr "I2P代ç†ä¸»æœº" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:338 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:339 msgid "eepProxy port" msgstr "I2P代ç†ç«¯å£" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:342 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:343 msgid "Update URLs" msgstr "更新链接" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:346 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:347 msgid "Trusted keys" msgstr "å¯ä¿¡å…¬é’¥" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:350 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:351 msgid "Update with unsigned development builds?" msgstr "更新包括未ç¾åçš„å¼€å‘版?" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:354 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:355 msgid "Unsigned Build URL" msgstr "未ç¾å软件链接" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:360 -msgid "I2P updates are disabled because you do not have write permission for the install directory." +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:361 +msgid "" +"I2P updates are disabled because you do not have write permission for the " +"install directory." msgstr "I2P更新功能已ç¦ç”¨ï¼Œå› 为您对I2P的安装目录没有写æƒé™ã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:366 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:367 msgid "Save" msgstr "ä¿å˜" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:115 +msgid "Internal Error" +msgstr "内部错误" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:117 +msgid "Router Console" +msgstr "路由控制å°" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:121 +msgid "Configuration" +msgstr "设置" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:129 +msgid "Sorry! There has been an internal error." +msgstr "抱æ‰ï¼ç¨‹åºå‘生内部错误。" + +#. note to translators - both parameters are URLs +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:133 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:232 +#, java-format +msgid "Please report bugs on {0} or {1}." +msgstr "Bug报告请到 {0} 或 {1}。" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:137 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:236 +msgid "" +"You may use the username \"guest\" and password \"guest\" if you do not wish " +"to register." +msgstr "如果您ä¸æƒ³æ³¨å†Œå¯ä»¥ç”¨â€œguestâ€ä½œä¸ºç”¨æˆ·å和密ç 登陆。" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:139 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:238 +msgid "Please include this information in bug reports" +msgstr "报告问题时请包括以下信æ¯" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:141 +msgid "Error Details" +msgstr "错误详情" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:143 +#, java-format +msgid "Error {0}" +msgstr "错误 {0}" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:163 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:228 +msgid "I2P Version and Running Environment" +msgstr "I2P 版本åŠè¿è¡ŒçŽ¯å¢ƒ" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:191 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:266 +msgid "" +"Note that system information, log timestamps, and log messages may provide " +"clues to your location; please review everything you include in a bug report." +msgstr "" +"注æ„,系统信æ¯ã€æ—¥å¿—时间戳和日志ä¸çš„部分信æ¯ä¸å¯èƒ½æ³„露您真实ä½ç½®ï¼›æ交å‰è¯·ä»”" +"细检查。" + #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:117 msgid "Page Not Found" msgstr "页é¢æœªæ‰¾åˆ°" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:243 -msgid "Sorry! You appear to be requesting a non-existent Router Console page or resource." +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:242 +msgid "" +"Sorry! You appear to be requesting a non-existent Router Console page or " +"resource." msgstr "抱æ‰!您请求的页é¢æˆ–资æºä¸å˜åœ¨ã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:245 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:244 msgid "Error 404" msgstr "错误 404" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:250 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:249 msgid "not found" msgstr "未找到" @@ -4937,7 +5529,7 @@ msgstr "未找到" msgid "graphs" msgstr "图表" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:228 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:227 msgid "I2P Performance Graphs" msgstr "I2P 性能图表" @@ -4949,7 +5541,7 @@ msgstr "主页" msgid "job queue" msgstr "作业队列" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:226 msgid "I2P Router Job Queue" msgstr "I2P 路由器作业队列" @@ -4957,31 +5549,19 @@ msgstr "I2P 路由器作业队列" msgid "logs" msgstr "日志" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:226 msgid "I2P Router Logs" msgstr "I2P 路由器日志" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:229 -msgid "I2P Version & Running Environment" -msgstr "I2P 版本åŠè¿è¡ŒçŽ¯å¢ƒ" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:231 -msgid "Please report bugs on <a href=\"http://trac.i2p2.i2p/newticket\">trac.i2p2.i2p</a>." -msgstr "如果您å‘现错误请报告至<a href=\"http://trac.i2p2.i2p/newticket\">trac.i2p2.i2p</a>。" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:233 -msgid "Please include this information in bug reports" -msgstr "报告问题时请包括以下信æ¯" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:274 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:281 msgid "Critical Logs" msgstr "关键日志" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:278 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:285 msgid "Router Logs" msgstr "路由器日志" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:284 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:291 msgid "Service (Wrapper) Logs" msgstr "æœåŠ¡(å°è£…)日志" @@ -4989,7 +5569,7 @@ msgstr "æœåŠ¡(å°è£…)日志" msgid "network database summary" msgstr "I2P 网络数æ®åº“概况" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:226 msgid "I2P Network Database Summary" msgstr "I2P 网络数æ®åº“概况" @@ -4997,23 +5577,26 @@ msgstr "I2P 网络数æ®åº“概况" msgid "WebApp Not Found" msgstr "Web程åº(war)未找到" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:231 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:230 msgid "Web Application Not Running" msgstr "Web程åº(.war)未è¿è¡Œ" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:233 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:232 msgid "The requested web application is not running." msgstr "您所访问的Web程åºæœªå¯åŠ¨ã€‚" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:235 -msgid "Please visit the <a href=\"/configclients.jsp#webapp\">config clients page</a> to start it." -msgstr "请先在<a href=\"/configclients.jsp#webapp\">é…置客户端页é¢</a>ä¸å¯åŠ¨å®ƒã€‚" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:234 +msgid "" +"Please visit the <a href=\"/configclients.jsp#webapp\">config clients page</" +"a> to start it." +msgstr "" +"请先在<a href=\"/configclients.jsp#webapp\">é…置客户端页é¢</a>ä¸å¯åŠ¨å®ƒã€‚" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:105 msgid "peer connections" msgstr "节点连接" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:226 msgid "I2P Network Peers" msgstr "I2P 网络节点" @@ -5021,7 +5604,7 @@ msgstr "I2P 网络节点" msgid "peer profiles" msgstr "节点信æ¯" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:226 msgid "I2P Network Peer Profiles" msgstr "I2P 网络节点信æ¯" @@ -5029,11 +5612,11 @@ msgstr "I2P 网络节点信æ¯" msgid "statistics" msgstr "统计" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:242 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:243 msgid "I2P Router Statistics" msgstr "I2P 路由器统计数æ®" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:244 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/summaryframe_jsp.java:247 #, java-format msgid "Disable {0} Refresh" msgstr "åœæ¢ {0} 刷新" @@ -5042,49 +5625,129 @@ msgstr "åœæ¢ {0} 刷新" msgid "tunnel summary" msgstr "隧é“概况" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:227 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:226 msgid "I2P Tunnel Summary" msgstr "I2P 隧é“概况" +#~ msgid "Client Interface Configuration (Advacned)" +#~ msgstr "客户端接å£è®¾ç½®(高级)" + +#~ msgid "" +#~ "Ensure that nothing blocks outbound HTTP, check <a target=\"_top\" href=" +#~ "\"logs.jsp\">logs</a> and if nothing helps, read the <a target=\"_top\" " +#~ "href=\"http://www.i2p2.de/faq.html\">FAQ</a> about reseeding manually." +#~ msgstr "" +#~ "请ä¿è¯HTTP通信没有å—阻,检查 <a target=\"_top\" href=\"logs.jsp\">日志</" +#~ "a> ,如果问题ä»æ— 法解决,请å‚ç…§ <a target=\"_top\" href=\"http://www.i2p2." +#~ "de/faq.html\">FAQ</a> 进行手动补ç§ã€‚" + +#~ msgid "Last reseed failed fully (failed reading seed URL)." +#~ msgstr "上次补ç§å°è¯•å¤±è´¥(读å–è¡¥ç§URL失败)。" + +#~ msgid "Last reseed failed fully (no routerInfo URLs at seed URL)." +#~ msgstr "上次补ç§å°è¯•å¤±è´¥(è¡¥ç§æœåŠ¡å™¨æœªè¿”回任何路由信æ¯URL)。" + +#~ msgid "Last reseed failed partly ({0}% of {1})." +#~ msgstr "上次补ç§éƒ¨åˆ†å¤±è´¥({0}%失败,共{1})" + +#~ msgid "Last reseed failed ({0}% of {1})." +#~ msgstr "上次补ç§å¤±è´¥({0}%失败,共{1})" + +#~ msgid "Last reseed failed fully (exception caught)." +#~ msgstr "上次补ç§å¤±è´¥(exception caught)." + +#~ msgid "System tray icon enabled." +#~ msgstr "ç³»ç»Ÿæ‰˜ç›˜å›¾æ ‡å·²å¯ç”¨" + +#~ msgid "System tray icon feature not supported on this platform. Sorry!" +#~ msgstr "您的平å°ä¸æ”¯æŒç³»ç»Ÿæ‰˜ç›˜å›¾æ ‡åŠŸèƒ½" + +#~ msgid "Warning: unable to contact the systray manager" +#~ msgstr "è¦å‘Šï¼šä¸Žæ‰˜ç›˜ç®¡ç†å™¨é€šè®¯å¤±è´¥" + +#~ msgid "System tray icon disabled." +#~ msgstr "系统托盘已ç¦ç”¨" + +#~ msgid "minute" +#~ msgstr "分钟" + +#~ msgid "minutes" +#~ msgstr "分钟" + +#~ msgid "avg value" +#~ msgstr "å‡å€¼" + +#~ msgid "events" +#~ msgstr "事件" + +#~ msgid "lifetime average" +#~ msgstr "总平å‡å€¼" + +#~ msgid "peak average" +#~ msgstr "峰值平å‡å€¼" + +#~ msgid "" +#~ "Please report bugs on <a href=\"http://trac.i2p2.i2p/newticket\">trac." +#~ "i2p2.i2p</a>." +#~ msgstr "" +#~ "如果您å‘现错误请报告至<a href=\"http://trac.i2p2.i2p/newticket\">trac." +#~ "i2p2.i2p</a>。" + #~ msgid "hops" #~ msgstr "跳点" + #~ msgid "tunnels" #~ msgstr "隧é“" + #~ msgid "Tunnels in/out" #~ msgstr "通é“(上/下行)" -#~ msgid "name" -#~ msgstr "å称" + #~ msgid "" #~ "WebApp configuration saved successfully - restart required to take effect." #~ msgstr "WebApp设置ä¿å˜æˆåŠŸ - 程åºé‡å¯åŽç”Ÿæ•ˆ" + #~ msgid "Start Now" #~ msgstr "ç«‹å³å¯åŠ¨" + #~ msgid "Show the router's workload, and how it's performing" #~ msgstr "显示I2P路由器的负载与工作状况" + #~ msgid "Jobs" #~ msgstr "作业" + #~ msgid "This is useful in some situations" #~ msgstr "é‡å¯åœ¨æŸäº›æƒ…况下有用" + #~ msgid "I2P will install (or remove) a service accordingly." #~ msgstr "I2P将相应的将自身安装为æœåŠ¡(或å¸è½½æœåŠ¡)。" + #~ msgid "Expl. + Client" #~ msgstr "探测+客户" + #~ msgid "Part. from + to" #~ msgstr "相邻共享节点" + #~ msgid "Depth" #~ msgstr "深度" + #~ msgid "Addresses" #~ msgstr "地å€" + #~ msgid "view without" #~ msgstr "查看ä¸å«" + #~ msgid "view with" #~ msgstr "查看å«" + #~ msgid "stats" #~ msgstr "统计" + #~ msgid "View" #~ msgstr "查看" + #~ msgid "Not Failing" #~ msgstr "æ ‡å‡†" + #~ msgid "" #~ "If you want the router to restart itself after shutting down, you can " #~ "choose one of the following. This is useful in some situations - for " @@ -5099,6 +5762,7 @@ msgstr "I2P 隧é“概况" #~ "- 例如当修改了客户程åºä»…在å¯åŠ¨æ—¶è¯»å–的设置比如路由器控制界é¢çš„密ç ,监å¬çš„" #~ "接å£ã€‚平滑é‡å¯å¯èƒ½ä¼šç‰å¾…å‡ åˆ†é’Ÿçš„æ—¶é—´ (ä½†å…¶ä»–èŠ‚ç‚¹ä¸€å®šä¼šæ„Ÿæ¿€ä½ çš„è€å¿ƒ),硬é‡" #~ "å¯å¯ä»¥ç«‹å³å®Œæˆã€‚ 路由关é—åŽå°†ç‰å¾…1分钟å†é‡æ–°å¯åŠ¨ã€‚" + #~ msgid "" #~ "On the windows platform, there is a small application to sit in the " #~ "system tray, allowing you to view the router's status (later on, I2P " @@ -5109,4 +5773,3 @@ msgstr "I2P 隧é“概况" #~ "windows å¹³å°å…许å°ç¨‹åºè¿›é©»ç³»ç»Ÿæ‰˜ç›˜ï¼Œè®©ä½ å¯ä»¥æŸ¥çœ‹è·¯ç”±çŠ¶æ€ï¼Œ(以åŽçš„ I2P 客户" #~ "端程åºä¹Ÿä¼šå°†å®ƒä»¬çš„功能集æˆåˆ°ç³»ç»Ÿæ‰˜ç›˜é‡Œ)ã€‚å¦‚æžœä½ ä½¿ç”¨Windows, å¯ä»¥åœ¨è¿™é‡Œå¼€å¯" #~ "或关é—è¿™ä¸ªæ‰˜ç›˜å›¾æ ‡ã€‚" - diff --git a/apps/sam/java/build.xml b/apps/sam/java/build.xml index 57aeff9947071c36fc7877cc0d89c236c0ee59f2..7e62fd27c2fee17fdbb77c6084c394dd6eacfdda 100644 --- a/apps/sam/java/build.xml +++ b/apps/sam/java/build.xml @@ -28,6 +28,7 @@ <javac srcdir="./src" debug="true" deprecation="on" source="1.5" target="1.5" + includeAntRuntime="false" destdir="./build/obj" classpath="../../../core/java/build/i2p.jar:../../ministreaming/java/build/mstreaming.jar:../../streaming/java/build/streaming.jar" > <compilerarg line="${javac.compilerargs}" /> @@ -37,19 +38,42 @@ <javac srcdir="./test" debug="true" deprecation="on" source="1.5" target="1.5" + includeAntRuntime="false" destdir="./build/obj" classpath="../../../core/java/build/i2p.jar:../../ministreaming/java/build/mstreaming.jar:../../streaming/java/build/streaming.jar" > <compilerarg line="${javac.compilerargs}" /> </javac> </target> - <target name="jar" depends="compile"> + + <target name="jar" depends="compile, jarUpToDate" unless="jar.uptodate" > + <exec executable="mtn" outputproperty="workspace.changes" errorproperty="mtn.error2" failifexecutionfails="false" > + <arg value="list" /> + <arg value="changed" /> + <arg value="." /> + </exec> + <!-- \n in an attribute value generates an invalid manifest --> + <exec executable="tr" inputstring="${workspace.changes}" outputproperty="workspace.changes.tr" errorproperty="mtn.error2" failifexecutionfails="false" > + <arg value="-s" /> + <arg value="[:space:]" /> + <arg value="," /> + </exec> <jar destfile="./build/sam.jar" basedir="./build/obj" includes="**/*.class"> <manifest> <attribute name="Main-Class" value="net.i2p.sam.SAMBridge" /> <attribute name="Class-Path" value="i2p.jar mstreaming.jar streaming.jar" /> + <attribute name="Build-Date" value="${build.timestamp}" /> + <attribute name="Base-Revision" value="${workspace.version}" /> + <attribute name="Workspace-Changes" value="${workspace.changes.tr}" /> </manifest> </jar> </target> + + <target name="jarUpToDate"> + <uptodate property="jar.uptodate" targetfile="build/sam.jar" > + <srcfiles dir= "build/obj" includes="**/*.class" /> + </uptodate> + </target> + <target name="jarTest" depends="jar, compileTest"> <jar destfile="./build/sam.jar" basedir="./build/obj" includes="**/*Test*.class" update="true" /> </target> diff --git a/apps/streaming/java/build.xml b/apps/streaming/java/build.xml index dff6fbf1d55989a5774d762d0cbfd72f3c328709..1351399b72c66ba1c692ab57a077de1e95558a66 100644 --- a/apps/streaming/java/build.xml +++ b/apps/streaming/java/build.xml @@ -27,6 +27,7 @@ <javac srcdir="./src" debug="true" deprecation="on" source="1.5" target="1.5" + includeAntRuntime="false" destdir="./build/obj" classpath="../../../core/java/build/i2p.jar:../../ministreaming/java/build/mstreaming.jar" > <compilerarg line="${javac.compilerargs}" /> @@ -36,14 +37,40 @@ <javac srcdir="./test" debug="true" deprecation="on" source="1.5" target="1.5" + includeAntRuntime="false" destdir="./build/obj" classpath="../../../core/java/build/i2p.jar:../../ministreaming/java/build/mstreaming.jar" > <compilerarg line="${javac.compilerargs}" /> </javac> </target> - <target name="jar" depends="builddep, compile"> - <jar destfile="./build/streaming.jar" basedir="./build/obj" includes="**/*.class" /> + + <target name="jar" depends="builddep, compile, jarUpToDate" unless="jar.uptodate" > + <exec executable="mtn" outputproperty="workspace.changes" errorproperty="mtn.error2" failifexecutionfails="false" > + <arg value="list" /> + <arg value="changed" /> + <arg value="." /> + </exec> + <!-- \n in an attribute value generates an invalid manifest --> + <exec executable="tr" inputstring="${workspace.changes}" outputproperty="workspace.changes.tr" errorproperty="mtn.error2" failifexecutionfails="false" > + <arg value="-s" /> + <arg value="[:space:]" /> + <arg value="," /> + </exec> + <jar destfile="./build/streaming.jar" basedir="./build/obj" includes="**/*.class" > + <manifest> + <attribute name="Build-Date" value="${build.timestamp}" /> + <attribute name="Base-Revision" value="${workspace.version}" /> + <attribute name="Workspace-Changes" value="${workspace.changes.tr}" /> + </manifest> + </jar> </target> + + <target name="jarUpToDate"> + <uptodate property="jar.uptodate" targetfile="build/streaming.jar" > + <srcfiles dir= "." includes="build/obj/**/*.class" /> + </uptodate> + </target> + <target name="jarTest" depends="jar, compileTest"> <jar destfile="./build/streaming.jar" basedir="./build/obj" includes="**/*Test*.class" update="true" /> </target> diff --git a/apps/streaming/java/src/net/i2p/client/streaming/ConnectionManager.java b/apps/streaming/java/src/net/i2p/client/streaming/ConnectionManager.java index 69ace81a2833f19ebd84fc25f6caa172e69ab223..10ff38856435ed20d8da256bcf6b3b67028b5c12 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/ConnectionManager.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/ConnectionManager.java @@ -40,7 +40,7 @@ class ConnectionManager { private int _maxConcurrentStreams; private ConnectionOptions _defaultOptions; private volatile int _numWaiting; - private long SoTimeout; + private long _soTimeout; private ConnThrottler _minuteThrottler; private ConnThrottler _hourThrottler; private ConnThrottler _dayThrottler; @@ -64,7 +64,7 @@ class ConnectionManager { _allowIncoming = false; _numWaiting = 0; /** Socket timeout for accept() */ - SoTimeout = -1; + _soTimeout = -1; _context.statManager().createRateStat("stream.con.lifetimeMessagesSent", "How many messages do we send on a stream?", "Stream", new long[] { 60*60*1000, 24*60*60*1000 }); _context.statManager().createRateStat("stream.con.lifetimeMessagesReceived", "How many messages do we receive on a stream?", "Stream", new long[] { 60*60*1000, 24*60*60*1000 }); @@ -97,16 +97,16 @@ class ConnectionManager { * Set the socket accept() timeout. * @param x */ - public void MsetSoTimeout(long x) { - SoTimeout = x; + public void setSoTimeout(long x) { + _soTimeout = x; } /** * Get the socket accept() timeout. * @return accept timeout in ms. */ - public long MgetSoTimeout() { - return SoTimeout; + public long getSoTimeout() { + return _soTimeout; } public void setAllowIncomingConnections(boolean allow) { diff --git a/apps/streaming/java/src/net/i2p/client/streaming/I2PServerSocketFull.java b/apps/streaming/java/src/net/i2p/client/streaming/I2PServerSocketFull.java index acb58fe15fc7025f25bdf6882de2981b16706244..71e1dd3ac7e172e2ad5238e206006105939459ed 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/I2PServerSocketFull.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/I2PServerSocketFull.java @@ -26,11 +26,11 @@ class I2PServerSocketFull implements I2PServerSocket { } public long getSoTimeout() { - return _socketManager.getConnectionManager().MgetSoTimeout(); + return _socketManager.getConnectionManager().getSoTimeout(); } public void setSoTimeout(long x) { - _socketManager.getConnectionManager().MsetSoTimeout(x); + _socketManager.getConnectionManager().setSoTimeout(x); } /** * Close the connection. diff --git a/apps/streaming/java/src/net/i2p/client/streaming/I2PSocketFull.java b/apps/streaming/java/src/net/i2p/client/streaming/I2PSocketFull.java index dfcfacfa1f55f6e188c70cf8f9f42d8d676a4926..f8dbe74ea691d79241461b2dac53569a94bffebd 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/I2PSocketFull.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/I2PSocketFull.java @@ -46,6 +46,10 @@ class I2PSocketFull implements I2PSocket { Connection getConnection() { return _connection; } + /** + * Warning, may return null instead of throwing IOE, + * which is not what the interface says. + */ public InputStream getInputStream() { Connection c = _connection; if (c != null) @@ -62,6 +66,10 @@ class I2PSocketFull implements I2PSocket { return null; } + /** + * Warning, may return null instead of throwing IOE, + * which is not what the interface says. + */ public OutputStream getOutputStream() throws IOException { Connection c = _connection; if (c != null) diff --git a/apps/streaming/java/src/net/i2p/client/streaming/I2PSocketManagerFull.java b/apps/streaming/java/src/net/i2p/client/streaming/I2PSocketManagerFull.java index 03abafdda1163d6b9462696f1179a8c4355426a6..573354e8981f88840f85bee0f5aeda8082a2361a 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/I2PSocketManagerFull.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/I2PSocketManagerFull.java @@ -1,6 +1,9 @@ package net.i2p.client.streaming; +import java.io.IOException; import java.net.NoRouteToHostException; +import java.net.ServerSocket; +import java.net.Socket; import java.net.SocketTimeoutException; import java.util.HashSet; import java.util.Iterator; @@ -30,6 +33,7 @@ public class I2PSocketManagerFull implements I2PSocketManager { private Log _log; private I2PSession _session; private I2PServerSocketFull _serverSocket; + private StandardServerSocket _realServerSocket; private ConnectionOptions _defaultOptions; private long _acceptTimeout; private String _name; @@ -44,8 +48,6 @@ public class I2PSocketManagerFull implements I2PSocketManager { private static final long ACCEPT_TIMEOUT_DEFAULT = 5*1000; public I2PSocketManagerFull() { - _context = null; - _session = null; } /** @@ -120,7 +122,7 @@ public class I2PSocketManagerFull implements I2PSocketManager { */ public I2PSocket receiveSocket() throws I2PException, SocketTimeoutException { verifySession(); - Connection con = _connectionManager.getConnectionHandler().accept(_connectionManager.MgetSoTimeout()); + Connection con = _connectionManager.getConnectionHandler().accept(_connectionManager.getSoTimeout()); if(_log.shouldLog(Log.DEBUG)) { _log.debug("receiveSocket() called: " + con); } @@ -129,7 +131,7 @@ public class I2PSocketManagerFull implements I2PSocketManager { con.setSocket(sock); return sock; } else { - if(_connectionManager.MgetSoTimeout() == -1) { + if(_connectionManager.getSoTimeout() == -1) { return null; } throw new SocketTimeoutException("I2PSocket timed out"); @@ -171,6 +173,17 @@ public class I2PSocketManagerFull implements I2PSocketManager { return _serverSocket; } + /** + * Like getServerSocket but returns a real ServerSocket for easier porting of apps. + * @since 0.8.4 + */ + public synchronized ServerSocket getStandardServerSocket() throws IOException { + if (_realServerSocket == null) + _realServerSocket = new StandardServerSocket(_serverSocket); + _connectionManager.setAllowIncomingConnections(true); + return _realServerSocket; + } + private void verifySession() throws I2PException { if (!_connectionManager.getSession().isClosed()) return; @@ -185,7 +198,7 @@ public class I2PSocketManagerFull implements I2PSocketManager { * this data will be bundled in the SYN packet. * * @param peer Destination to connect to - * @param options I2P socket options to be used for connecting + * @param options I2P socket options to be used for connecting, may be null * * @return I2PSocket if successful * @throws NoRouteToHostException if the peer is not found or not reachable @@ -235,6 +248,45 @@ public class I2PSocketManagerFull implements I2PSocketManager { return connect(peer, _defaultOptions); } + /** + * Like connect() but returns a real Socket, and throws only IOE, + * for easier porting of apps. + * @since 0.8.4 + */ + public Socket connectToSocket(Destination peer) throws IOException { + return connectToSocket(peer, _defaultOptions); + } + + /** + * Like connect() but returns a real Socket, and throws only IOE, + * for easier porting of apps. + * @param timeout ms if > 0, forces blocking (disables connectDelay) + * @since 0.8.4 + */ + public Socket connectToSocket(Destination peer, int timeout) throws IOException { + ConnectionOptions opts = new ConnectionOptions(_defaultOptions); + opts.setConnectTimeout(timeout); + if (timeout > 0) + opts.setConnectDelay(-1); + return connectToSocket(peer, opts); + } + + /** + * Like connect() but returns a real Socket, and throws only IOE, + * for easier porting of apps. + * @param options may be null + * @since 0.8.4 + */ + private Socket connectToSocket(Destination peer, I2PSocketOptions options) throws IOException { + try { + I2PSocket sock = connect(peer, options); + return new StandardSocket(sock); + } catch (I2PException i2pe) { + // fixme in 1.6 change to cause + throw new IOException(i2pe.toString()); + } + } + /** * Destroy the socket manager, freeing all the associated resources. This * method will block untill all the managed sockets are closed. @@ -259,11 +311,10 @@ public class I2PSocketManagerFull implements I2PSocketManager { * * @return set of currently connected I2PSockets */ - public Set listSockets() { - Set connections = _connectionManager.listConnections(); - Set rv = new HashSet(connections.size()); - for (Iterator iter = connections.iterator(); iter.hasNext(); ) { - Connection con = (Connection)iter.next(); + public Set<I2PSocket> listSockets() { + Set<Connection> connections = _connectionManager.listConnections(); + Set<I2PSocket> rv = new HashSet(connections.size()); + for (Connection con : connections) { if (con.getSocket() != null) rv.add(con.getSocket()); } diff --git a/apps/streaming/java/src/net/i2p/client/streaming/MessageHandler.java b/apps/streaming/java/src/net/i2p/client/streaming/MessageHandler.java index 4097c568f2c0ab6f918964e9dc121e8422f9ce93..632b904b74a598993a73ae31c6b94e8d31e9b961 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/MessageHandler.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/MessageHandler.java @@ -2,13 +2,13 @@ package net.i2p.client.streaming; import java.util.Iterator; import java.util.Set; +import java.util.concurrent.CopyOnWriteArraySet; import net.i2p.I2PAppContext; import net.i2p.client.I2PSession; import net.i2p.client.I2PSessionException; import net.i2p.client.I2PSessionListener; import net.i2p.util.Log; -import net.i2p.util.ConcurrentHashSet; /** * Receive raw information from the I2PSession and turn it into @@ -24,7 +24,7 @@ class MessageHandler implements I2PSessionListener { public MessageHandler(I2PAppContext ctx, ConnectionManager mgr) { _manager = mgr; _context = ctx; - _listeners = new ConcurrentHashSet(1); + _listeners = new CopyOnWriteArraySet(); _log = ctx.logManager().getLog(MessageHandler.class); _context.statManager().createRateStat("stream.packetReceiveFailure", "When do we fail to decrypt or otherwise receive a packet sent to us?", "Stream", new long[] { 60*60*1000, 24*60*60*1000 }); } @@ -81,8 +81,8 @@ class MessageHandler implements I2PSessionListener { for (Iterator<I2PSocketManager.DisconnectListener> iter = _listeners.iterator(); iter.hasNext(); ) { I2PSocketManager.DisconnectListener lsnr = iter.next(); lsnr.sessionDisconnected(); - iter.remove(); } + _listeners.clear(); } /** diff --git a/apps/streaming/java/src/net/i2p/client/streaming/StandardServerSocket.java b/apps/streaming/java/src/net/i2p/client/streaming/StandardServerSocket.java new file mode 100644 index 0000000000000000000000000000000000000000..324d12687704dda3f139fb0c1a4e8580e06b9580 --- /dev/null +++ b/apps/streaming/java/src/net/i2p/client/streaming/StandardServerSocket.java @@ -0,0 +1,170 @@ +package net.i2p.client.streaming; + +import java.io.IOException; +import java.net.InetAddress; +import java.net.ServerSocket; +import java.net.Socket; +import java.net.SocketAddress; +import java.net.SocketException; +import java.nio.channels.ServerSocketChannel; + +import net.i2p.I2PException; + +/** + * Bridge to I2PServerSocket. + * + * This extends ServerSocket to make porting apps easier. + * accept() returns a real Socket (a StandardSocket). + * accept() throws IOExceptions like ServerSockets do, rather than returning + * null or throwing I2PExceptions. + * + * StandardServerSockets are always bound. + * You may not create an unbound StandardServerSocket. + * Create this through the SocketManager. + * + * @author zzz + * @since 0.8.4 + */ +class StandardServerSocket extends ServerSocket { + private final I2PServerSocketFull _socket; + + /** + * Doesn't really throw IOE but super() does + */ + StandardServerSocket(I2PServerSocketFull socket) throws IOException { + _socket = socket; + } + + @Override + public Socket accept() throws IOException { + try { + I2PSocket sock = _socket.accept(); + if (sock == null) + throw new IOException("No socket"); + return new StandardSocket(sock); + } catch (I2PException i2pe) { + // fixme in 1.6 change to cause + throw new IOException(i2pe.toString()); + } + } + + /** + * @throws UnsupportedOperationException always + */ + @Override + public void bind(SocketAddress endpoint) { + throw new UnsupportedOperationException(); + } + + /** + * @throws UnsupportedOperationException always + */ + @Override + public void bind(SocketAddress endpoint, int backlog) { + throw new UnsupportedOperationException(); + } + + @Override + public void close() throws IOException { + if (isClosed()) + throw new IOException("Already closed"); + _socket.close(); + } + + /** + * @return null always + */ + @Override + public ServerSocketChannel getChannel() { + return null; + } + + /** + * @return null always + */ + @Override + public InetAddress getInetAddress() { + return null; + } + + /** + * @return -1 always + */ + @Override + public int getLocalPort() { + return -1; + } + + /** + * @return null always + */ + @Override + public SocketAddress getLocalSocketAddress() { + return null; + } + + @Override + public int getReceiveBufferSize() { + ConnectionOptions opts = (ConnectionOptions) ((I2PSocketManagerFull)_socket.getManager()).getDefaultOptions(); + if (opts == null) + return 64*1024; + return opts.getInboundBufferSize(); + } + + /** + * @return false always + */ + @Override + public boolean getReuseAddress() { + return false; + } + + @Override + public int getSoTimeout() { + return (int) _socket.getSoTimeout(); + } + + /** + * @return true always + */ + @Override + public boolean isBound() { + return true; + } + + @Override + public boolean isClosed() { + return ((I2PSocketManagerFull)_socket.getManager()).getConnectionManager().getAllowIncomingConnections(); + } + + /** + * Does nothing. + */ + @Override + public void setPerformancePreferences(int connectionTime, int latency, int bandwidth) { + } + + /** + * Does nothing. + */ + @Override + public void setReceiveBufferSize(int size) { + } + + /** + * Does nothing. + */ + @Override + public void setReuseAddress(boolean on) { + } + + @Override + public void setSoTimeout(int timeout) throws SocketException { + _socket.setSoTimeout(timeout); + } + + @Override + public String toString() { + return _socket.toString(); + } +} diff --git a/apps/streaming/java/src/net/i2p/client/streaming/StandardSocket.java b/apps/streaming/java/src/net/i2p/client/streaming/StandardSocket.java new file mode 100644 index 0000000000000000000000000000000000000000..6ba78bfd49eccb3341cd5ebf96da7c2d1fe32717 --- /dev/null +++ b/apps/streaming/java/src/net/i2p/client/streaming/StandardSocket.java @@ -0,0 +1,341 @@ +package net.i2p.client.streaming; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.InetAddress; +import java.net.Socket; +import java.net.SocketAddress; +import java.net.SocketException; +import java.nio.channels.SocketChannel; + +import net.i2p.I2PException; + +/** + * Bridge to I2PSocket. + * + * This extends Socket to make porting apps easier. + * Methods throw IOExceptions like Sockets do, rather than returning + * null for some methods. + * + * StandardSockets are always bound, and always start out connected + * (unless connectDelay is > 0). + * You may not create an unbound StandardSocket. + * Create this through the SocketManager. + * + * Todo: Make public and add getPeerDestination() ? + * + * @author zzz + * @since 0.8.4 + */ +class StandardSocket extends Socket { + private final I2PSocket _socket; + + StandardSocket(I2PSocket socket) { + _socket = socket; + } + + /** + * @throws UnsupportedOperationException always + */ + @Override + public void bind(SocketAddress bindpoint) { + throw new UnsupportedOperationException(); + } + + @Override + public void close() throws IOException { + if (_socket.isClosed()) + throw new IOException("Already closed"); + _socket.close(); + } + + /** + * @throws UnsupportedOperationException always + */ + @Override + public void connect(SocketAddress endpoint) { + throw new UnsupportedOperationException(); + } + + /** + * @throws UnsupportedOperationException always + */ + @Override + public void connect(SocketAddress endpoint, int timeout) { + throw new UnsupportedOperationException(); + } + + /** + * @return null always + */ + @Override + public SocketChannel getChannel() { + return null; + } + + /** + * @return null always + */ + @Override + public InetAddress getInetAddress() { + return null; + } + + @Override + public InputStream getInputStream() throws IOException { + InputStream rv = _socket.getInputStream(); + if (rv != null) + return rv; + throw new IOException("No stream"); + } + + @Override + public boolean getKeepAlive() { + ConnectionOptions opts = (ConnectionOptions) _socket.getOptions(); + if (opts == null) + return false; + return opts.getInactivityAction() == ConnectionOptions.INACTIVITY_ACTION_SEND; + } + + /** + * @return null always + */ + @Override + public InetAddress getLocalAddress() { + return null; + } + + /** + * @return -1 always + */ + @Override + public int getLocalPort() { + return -1; + } + + /** + * @return null always + */ + @Override + public SocketAddress getLocalSocketAddress() { + return null; + } + + /** + * @return false always + */ + @Override + public boolean getOOBInline() { + return false; + } + + @Override + public OutputStream getOutputStream() throws IOException { + OutputStream rv = _socket.getOutputStream(); + if (rv != null) + return rv; + throw new IOException("No stream"); + } + + /** + * @return 0 always + */ + @Override + public int getPort() { + return 0; + } + + @Override + public int getReceiveBufferSize() { + ConnectionOptions opts = (ConnectionOptions) _socket.getOptions(); + if (opts == null) + return 64*1024; + return opts.getInboundBufferSize(); + } + + /** + * @throws UnsupportedOperationException always + */ + @Override + public SocketAddress getRemoteSocketAddress() { + throw new UnsupportedOperationException(); + } + + /** + * @return false always + */ + @Override + public boolean getReuseAddress() { + return false; + } + + @Override + public int getSendBufferSize() { + ConnectionOptions opts = (ConnectionOptions) _socket.getOptions(); + if (opts == null) + return 64*1024; + return opts.getInboundBufferSize(); + } + + @Override + public int getSoLinger() { + I2PSocketOptions opts = _socket.getOptions(); + if (opts == null) + return -1; + return -1; // fixme really? + } + + @Override + public int getSoTimeout() { + I2PSocketOptions opts = _socket.getOptions(); + if (opts == null) + return 0; + return (int) opts.getReadTimeout(); + } + + /** + * @return false always + */ + @Override + public boolean getTcpNoDelay() { + // No option yet. See ConnectionDataReceiver + return false; + } + + /** + * @return 0 always + */ + @Override + public int getTrafficClass() { + return 0; + } + + /** + * @return true always + */ + @Override + public boolean isBound() { + return true; + } + + @Override + public boolean isClosed() { + return _socket.isClosed(); + } + + @Override + public boolean isConnected() { + return !_socket.isClosed(); + } + + @Override + public boolean isInputShutdown() { + return _socket.isClosed(); + } + + @Override + public boolean isOutputShutdown() { + return _socket.isClosed(); + } + + /** + * @throws UnsupportedOperationException always + */ + @Override + public void sendUrgentData(int data) { + throw new UnsupportedOperationException(); + } + + @Override + public void setKeepAlive(boolean on) { + ConnectionOptions opts = (ConnectionOptions) _socket.getOptions(); + if (opts == null) + return; + if (on) + opts.setInactivityAction(ConnectionOptions.INACTIVITY_ACTION_SEND); + else + opts.setInactivityAction(ConnectionOptions.INACTIVITY_ACTION_NOOP); // DISCONNECT? + } + + /** + * @throws UnsupportedOperationException if on is true + */ + @Override + public void setOOBInline(boolean on) { + if (on) + throw new UnsupportedOperationException(); + } + + /** + * Does nothing. + */ + @Override + public void setPerformancePreferences(int connectionTime, int latency, int bandwidth) { + } + + /** + * Does nothing. + */ + @Override + public void setReceiveBufferSize(int size) { + } + + /** + * Does nothing. + */ + @Override + public void setReuseAddress(boolean on) { + } + + /** + * Does nothing. + */ + @Override + public void setSendBufferSize(int size) { + } + + /** + * Does nothing. + */ + @Override + public void setSoLinger(boolean on, int linger) { + } + + @Override + public void setSoTimeout(int timeout) throws SocketException { + I2PSocketOptions opts = _socket.getOptions(); + if (opts == null) + throw new SocketException("No options"); + opts.setReadTimeout(timeout); + } + + /** + * Does nothing. + */ + @Override + public void setTcpNoDelay(boolean on) { + } + + /** + * Does nothing. + */ + @Override + public void setTrafficClass(int tc) { + } + + @Override + public void shutdownInput() throws IOException { + close(); + } + + @Override + public void shutdownOutput() throws IOException { + close(); + } + + @Override + public String toString() { + return _socket.toString(); + } +} diff --git a/apps/susidns/locale/messages_ar.po b/apps/susidns/locale/messages_ar.po new file mode 100644 index 0000000000000000000000000000000000000000..6523a43a4d78643bf0b5ef244dfc87c6fea59074 --- /dev/null +++ b/apps/susidns/locale/messages_ar.po @@ -0,0 +1,501 @@ +# 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: 2011-03-03 18:29+0000\n" +"PO-Revision-Date: 2011-02-25 18:40-0000\n" +"Last-Translator: hamada <hamada@mail.i2p>\n" +"Language-Team: duck <duck@mail.i2p>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:200 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:193 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:197 +msgid "Search" +msgstr "بØØ«" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:204 +msgid "Search within filtered list" +msgstr "بØØ« ضمن القائمة" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:206 +msgid "Filtered list" +msgstr "قائمة الترشيØ" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:210 +msgid "no matches" +msgstr "لا يوجد شبيه" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:213 +msgid "Addressbook" +msgstr "دÙتر العناوين" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:215 +msgid "contains no entries" +msgstr "لايØتوي على بيانات" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:217 +msgid "contains 1 entry" +msgstr "ÙŠØتوي على واØدة" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:219 +#, java-format +msgid "contains {0} entries" +msgstr "ÙŠØتوي على {0} " + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:229 +#, java-format +msgid "Showing {0} of {1}" +msgstr "اظهار {0} من {1}" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:260 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:368 +msgid "Add" +msgstr "أضÙ" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:260 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:265 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:366 +msgid "Replace" +msgstr "عوض" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:264 +#, java-format +msgid "Host name {0} is already in addressbook, unchanged." +msgstr "اسم مضي٠{0} موجود ÙÙŠ دÙتر العناوين." + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:266 +#, java-format +msgid "" +"Host name {0} is already in addressbook with a different destination. Click " +"\"Replace\" to overwrite." +msgstr "اسم المضي٠{0} موجود مسبقا ÙÙŠ دÙتر العناوين. أنقر \"عوض\" يتعويضه." + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:278 +#, java-format +msgid "Destination added for {0}." +msgstr "تم اضاÙØ© الوجهة الى {0}." + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:280 +#, java-format +msgid "Destination changed for {0}." +msgstr "تم تغيير الوجهة الى {0}." + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:285 +msgid "Invalid Base 64 destination." +msgstr "باطلة Base 64 وجهة." + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:289 +msgid "Please enter a host name and destination" +msgstr "قم بادخال اسم المضي٠والوجهة" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:293 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:314 +msgid "Delete Selected" +msgstr "ØØ°Ù" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:303 +#, java-format +msgid "Destination {0} deleted." +msgstr "وجهة {0} Ù…ØذوÙØ©." + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:305 +#, java-format +msgid "{0} destinations deleted." +msgstr "{0} وجهة Ù…ØذوÙØ©." + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:311 +msgid "Addressbook saved." +msgstr "تم ØÙظ دÙتر العناوين" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:314 +msgid "ERROR: Could not write addressbook file." +msgstr "خطأ: لم يتم ØÙظ دÙتر العناوين" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:319 +#: ../src/java/src/i2p/susi/dns/ConfigBean.java:148 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:151 +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:130 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:130 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:130 +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:145 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:128 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:128 +msgid "Reload" +msgstr "أعد تشغيل" + +#: ../src/java/src/i2p/susi/dns/ConfigBean.java:144 +msgid "Configuration reloaded." +msgstr "اعادة تØميل الاعدادات" + +#. Yes this is a hack. +#. No it doesn't work on a text-mode browser. +#. Fetching from the addressbook servlet +#. with the correct parameters will kick off a +#. config reload and fetch. +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:139 +msgid "" +"Subscriptions saved, updating addressbook from subscription sources now." +msgstr "تم ØÙظ الاشتراكات وتØديث دÙتر العناوين من مصادر اشتراك الآن." + +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:143 +msgid "Subscriptions saved." +msgstr "تم ØÙظ الاشتراك." + +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:147 +msgid "Subscriptions reloaded." +msgstr "تم اعادة تØميل الاشتراك." + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:125 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:145 +msgid "addressbook" +msgstr "دÙتر العناوين" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:127 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:104 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:93 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:104 +msgid "addressbooks" +msgstr "دÙتر العناوين" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:129 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:106 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:95 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:106 +msgid "private" +msgstr "خاص" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:131 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:108 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:97 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:108 +msgid "master" +msgstr "رئيسي" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:133 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:110 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:99 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:110 +msgid "router" +msgstr "موجه" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:135 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:112 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:101 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:112 +msgid "published" +msgstr "منشور" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:137 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:114 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:103 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:102 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:114 +msgid "subscriptions" +msgstr "اشتراك" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:139 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:102 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:116 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:105 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:116 +msgid "configuration" +msgstr "خيارات" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:141 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:118 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:107 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:118 +msgid "overview" +msgstr "نظرة عامة" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:163 +msgid "Filter" +msgstr "ترشيØ" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:166 +msgid "all" +msgstr "جمبع" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:177 +msgid "Current filter" +msgstr "Ø§Ù„ØªØ±Ø´ÙŠØ Ø§Ù„Øالي" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:182 +msgid "clear filter" +msgstr "الغاء الترشيØ" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:224 +msgid "Name" +msgstr "الإسم" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:226 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:362 +msgid "Destination" +msgstr "الوجهة" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:257 +msgid "Mark for deletion" +msgstr "اختر للØØ°Ù" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:279 +msgid "address helper link" +msgstr "وصلة مساعدة" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:312 +msgid "Cancel" +msgstr "الغاء" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:345 +msgid "This addressbook is empty." +msgstr "هذا دÙتر العناوين Ùارغ" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:356 +msgid "Add new destination" +msgstr "أض٠وجهة جديدة" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:358 +msgid "Hostname" +msgstr "اسم مضيÙ" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:132 +msgid "Hints" +msgstr "إشارة" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:134 +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) or %APPDATA%\\I2P\\addressbook\\ (Windows)." + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:136 +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:138 +msgid "" +"The router addressbook and the published addressbook are updated by the " +"addressbook application." +msgstr "" +"يتم تØديث دÙتر العناوين الخاص Ùˆ دÙتر العناوين العمومي من طر٠تطبيق دÙتر " +"العناوين." + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:140 +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:142 +msgid "" +"Use the private addressbook for private destinations, these are not " +"published." +msgstr "استعمل دÙتر العناوين الخاص من أجل العناوين الخاصة التي لن يتم نشرها." + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:144 +msgid "Options" +msgstr "خيارات" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:146 +msgid "File containing the list of subscriptions URLs (no need to change)" +msgstr "مل٠يØتوي على قائمة الاشتراكات" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:148 +msgid "Update interval in hours" +msgstr "تØديث الÙاصل الزمني ÙÙŠ ساعات" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:150 +msgid "" +"Your public hosts.txt file (choose a path within your webserver document " +"root)" +msgstr "hosts.txt ملÙ" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:152 +msgid "Your hosts.txt (don't change)" +msgstr "hosts.txt (ﻻتغير)" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:154 +msgid "Your personal addressbook, these hosts will be published" +msgstr "سيتم نشر هذه العناوين" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:156 +msgid "Your private addressbook, it is never published" +msgstr "دÙتر عناوينك الخاص، لن يتم نشره" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:158 +msgid "Port for your eepProxy (no need to change)" +msgstr "رقم منÙØ° eepProxy (ï»» Øاجة للتغيير)" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:160 +msgid "Hostname for your eepProxy (no need to change)" +msgstr "عنوان لـ eepProxy" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:162 +msgid "Whether to update the published addressbook" +msgstr "تعديل دÙتر العناوين المنشور" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:164 +msgid "" +"File containing the etags header from the fetched subscription URLs (no need " +"to change)" +msgstr "مل٠يØتوي على قائمة عناوين الاشتراك" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:166 +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:168 +msgid "File to log activity to (change to /dev/null if you like)" +msgstr "مل٠لØÙظ الأخطاء" + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:91 +msgid "Introduction" +msgstr "تقديم" + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:109 +msgid "What is the addressbook?" +msgstr "ماهو دÙتر العناوين؟" + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:111 +msgid "The addressbook application is part of your i2p installation." +msgstr "تطبيق دÙتر العناوين هو ضمن مجموعة برامج i2p" + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:113 +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:115 +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:117 +msgid "" +"Subscribing to additional sites is easy, just add them to your <a href=" +"\"subscriptions.jsp\">subscriptions</a> file." +msgstr "" +"من السهل الانخراط ÙÙŠ باقي المواقع Ùقط أضÙÙ‡ الى <a href=\"subscriptions.jsp" +"\">الانخراط</a>" + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:119 +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 "" +"للمزيد من المعلومات Øول التسمية<a href=\"http://www.i2p2.i2p/naming.html" +"\">لمØØ© عامة www.i2p2.i2p</a>." + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:121 +msgid "How does the addressbook work?" +msgstr "كي٠يشتغل دÙتر العناوين؟" + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:123 +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:125 +msgid "" +"Then it merges your \"master\" addressbook (userhosts.txt) into the router " +"addressbook as well." +msgstr "ثم اضاÙØ© العناوين الى دÙتر العناوين أيضا." + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:127 +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 "اذا قمت بالاختيار لن تتم نشر دÙتر العناوين " + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:129 +msgid "" +"The router also uses a private addressbook (privatehosts.txt, not shown in " +"the picture), which is not merged or published." +msgstr "الموجه يستعمل ايضا دÙتر عناوين خاص الذ لا يتم نشره" + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:131 +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:133 +msgid "" +"The private addressbook can also be used for aliases of hosts in your other " +"addressbooks." +msgstr "" +"ويمكن أيضا أن تستعمل دÙتر العناوين الخاص لأجل الأسماء المستعارة لأخرى " +"الخاصة بك." + +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:132 +msgid "The subscription file contains a list of i2p URLs." +msgstr "مل٠الاشتراك ÙŠØتوي على قائمة مواقع i2p." + +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:134 +msgid "" +"The addressbook application regularly checks this list for new eepsites." +msgstr "دÙتر العناوين تقوم يستمرار بالتØقق من قائمة eepsites." + +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:136 +msgid "Those URLs refer to published hosts.txt files." +msgstr "هذه العناوين لمل٠hosts.txt." + +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:138 +msgid "" +"The default subscription is the hosts.txt from www.i2p2.i2p, which is " +"updated infrequently." +msgstr "" +"الاشتراك العادي هو لمل٠hosts.txt from www.i2p2.i2p الذي يتم ترقيته باستمرار." + +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:140 +msgid "" +"So it is a good idea to add additional subscriptions to sites that have the " +"latest addresses." +msgstr "" +"انها Ùكرة جيدة لإضاÙØ© اشتراكات إضاÙية إلى المواقع التي تØتوي على Ø£Øدث " +"العناوين." + +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:142 +msgid "See the FAQ for a list of subscription URLs." +msgstr "أنظر الأسئلة الشائعة للخصول على قائمة بالعناوين" diff --git a/apps/susidns/locale/messages_de.po b/apps/susidns/locale/messages_de.po index 3e983ffec963278385959a18271fa17950460913..d8f2b2e57e64757768ebbcff32460f1a41f20309 100644 --- a/apps/susidns/locale/messages_de.po +++ b/apps/susidns/locale/messages_de.po @@ -8,10 +8,11 @@ msgid "" msgstr "" "Project-Id-Version: I2P susidns\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-11-08 18:21+0000\n" +"POT-Creation-Date: 2011-03-03 18:29+0000\n" "PO-Revision-Date: 2010-12-19 04:36+0100\n" "Last-Translator: mixxy <m1xxy@mail.i2p>\n" "Language-Team: foo <foo@bar>\n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -75,8 +76,12 @@ msgstr "Hostname {0} ist bereits im Adressbuch, nicht geändert." #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:266 #, java-format -msgid "Host name {0} is already in addressbook with a different destination. Click \"Replace\" to overwrite." -msgstr "Hostname {0} ist mit einem anderen Ziel bereits im Adressbuch. Klicken Sie auf \"Ersetzen\", um den alten Eintrag zu ersetzen!" +msgid "" +"Host name {0} is already in addressbook with a different destination. Click " +"\"Replace\" to overwrite." +msgstr "" +"Hostname {0} ist mit einem anderen Ziel bereits im Adressbuch. Klicken Sie " +"auf \"Ersetzen\", um den alten Eintrag zu ersetzen!" #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:278 #, java-format @@ -122,8 +127,12 @@ msgstr "FEHLER: Konnte Adressbuchdatei nicht schreiben." #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:319 #: ../src/java/src/i2p/susi/dns/ConfigBean.java:148 #: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:151 -msgid "Invalid form submission, probably because you used the \"back\" or \"reload\" button on your browser. Please resubmit." -msgstr "Ungültige Datenübertragung, vielleicht haben Sie die \"Zurück\"- oder \"Neu laden\"-Schalter in Ihrem Browser genutzt. Bitte neu senden!" +msgid "" +"Invalid form submission, probably because you used the \"back\" or \"reload" +"\" button on your browser. Please resubmit." +msgstr "" +"Ungültige Datenübertragung, vielleicht haben Sie die \"Zurück\"- oder \"Neu " +"laden\"-Schalter in Ihrem Browser genutzt. Bitte neu senden!" #: ../src/java/src/i2p/susi/dns/ConfigBean.java:139 #: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:130 @@ -153,8 +162,11 @@ msgstr "Einstellungen neu geladen" #. with the correct parameters will kick off a #. config reload and fetch. #: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:139 -msgid "Subscriptions saved, updating addressbook from subscription sources now." -msgstr "Abonnement gespeichert, aktualisiere jetzt das Adressbuch von untenstehenden Aboquellen." +msgid "" +"Subscriptions saved, updating addressbook from subscription sources now." +msgstr "" +"Abonnement gespeichert, aktualisiere jetzt das Adressbuch von untenstehenden " +"Aboquellen." #: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:143 msgid "Subscriptions saved." @@ -281,24 +293,46 @@ msgid "Hints" msgstr "Hinweise" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:134 -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 "Dateien und Verzeichnispfade sind relativ zum Arbeitsverzeichnis des Adressbuchs - normalerweise ~/.i2p/addressbook/ (Linux) oder %APPDATA%\\I2P\\addressbook\\ (Windows)." +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 "" +"Dateien und Verzeichnispfade sind relativ zum Arbeitsverzeichnis des " +"Adressbuchs - normalerweise ~/.i2p/addressbook/ (Linux) oder %APPDATA%\\I2P" +"\\addressbook\\ (Windows)." #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:136 -msgid "If you want to manually add lines to an addressbook, add them to the private or master addressbooks." -msgstr "Falls Sie manuell Einträge zum Adressbuch hinzufügen möchten, fügen Sie diese zum privaten oder zum Master-Adressbuch hinzu!" +msgid "" +"If you want to manually add lines to an addressbook, add them to the private " +"or master addressbooks." +msgstr "" +"Falls Sie manuell Einträge zum Adressbuch hinzufügen möchten, fügen Sie " +"diese zum privaten oder zum Master-Adressbuch hinzu!" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:138 -msgid "The router addressbook and the published addressbook are updated by the addressbook application." -msgstr "Das Router-Adressbuch und das veröffentlichte Adressbuch werden von der Adressbuch-Anwendung aktualisiert." +msgid "" +"The router addressbook and the published addressbook are updated by the " +"addressbook application." +msgstr "" +"Das Router-Adressbuch und das veröffentlichte Adressbuch werden von der " +"Adressbuch-Anwendung aktualisiert." #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:140 -msgid "When you publish your addressbook, ALL destinations from the master and router addressbooks appear there." -msgstr "Falls Sie das Adressbuch veröffentlichen, erscheinen dort ALLE Ziele aus dem Master- und dem Router-Adressbuch." +msgid "" +"When you publish your addressbook, ALL destinations from the master and " +"router addressbooks appear there." +msgstr "" +"Falls Sie das Adressbuch veröffentlichen, erscheinen dort ALLE Ziele aus dem " +"Master- und dem Router-Adressbuch." #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:142 -msgid "Use the private addressbook for private destinations, these are not published." -msgstr "Benutzen Sie das private Adressbuch für private Ziele. Diese werden nicht veröffentlicht." +msgid "" +"Use the private addressbook for private destinations, these are not " +"published." +msgstr "" +"Benutzen Sie das private Adressbuch für private Ziele. Diese werden nicht " +"veröffentlicht." #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:144 msgid "Options" @@ -306,15 +340,20 @@ msgstr "Optionen" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:146 msgid "File containing the list of subscriptions URLs (no need to change)" -msgstr "Datei mit der Liste von Abonnement-URLs (braucht nicht geändert zu werden)" +msgstr "" +"Datei mit der Liste von Abonnement-URLs (braucht nicht geändert zu werden)" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:148 msgid "Update interval in hours" msgstr "Aktualisierungsintervall in Stunden" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:150 -msgid "Your public hosts.txt file (choose a path within your webserver document root)" -msgstr "Ihre öffentliche hosts.txt-Datei (Wählen Sie einen Pfad in Ihrem Webserver Wurzelverzeichnis!)" +msgid "" +"Your public hosts.txt file (choose a path within your webserver document " +"root)" +msgstr "" +"Ihre öffentliche hosts.txt-Datei (Wählen Sie einen Pfad in Ihrem Webserver " +"Wurzelverzeichnis!)" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:152 msgid "Your hosts.txt (don't change)" @@ -341,16 +380,26 @@ msgid "Whether to update the published addressbook" msgstr "Soll Ihr veröffentlichtes Adressbuch aktualisiert werden?" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:164 -msgid "File containing the etags header from the fetched subscription URLs (no need to change)" -msgstr "Datei, die die etags-Kopfzeilen der bereits aktualisierten Abonnement-URLs enthält (braucht nicht geändert zu werden)" +msgid "" +"File containing the etags header from the fetched subscription URLs (no need " +"to change)" +msgstr "" +"Datei, die die etags-Kopfzeilen der bereits aktualisierten Abonnement-URLs " +"enthält (braucht nicht geändert zu werden)" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:166 -msgid "File containing the modification timestamp for each fetched subscription URL (no need to change)" -msgstr "Datei, welche die Zeitstempel der letzten Modifikation für jede bereits aktualisierte Abonnement-URL enthält (braucht nicht geändert zu werden)" +msgid "" +"File containing the modification timestamp for each fetched subscription URL " +"(no need to change)" +msgstr "" +"Datei, welche die Zeitstempel der letzten Modifikation für jede bereits " +"aktualisierte Abonnement-URL enthält (braucht nicht geändert zu werden)" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:168 msgid "File to log activity to (change to /dev/null if you like)" -msgstr "Berichte zu Aktivitäten werden in dieser Datei gespeichert. (Ändern Sie es zu /dev/null, wenn Sie möchten!)" +msgstr "" +"Berichte zu Aktivitäten werden in dieser Datei gespeichert. (Ändern Sie es " +"zu /dev/null, wenn Sie möchten!)" #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:91 msgid "Introduction" @@ -365,70 +414,122 @@ msgid "The addressbook application is part of your i2p installation." msgstr "Das Adressbuch ist ein Teil Ihrer I2P-Installation." #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:113 -msgid "It regularly updates your hosts.txt file from distributed sources or \"subscriptions\"." -msgstr "Es aktualisiert regelmäßig Ihre hosts.txt-Datei aus verteilten Quellen oder den \"Abonnementquellen\"." +msgid "" +"It regularly updates your hosts.txt file from distributed sources or " +"\"subscriptions\"." +msgstr "" +"Es aktualisiert regelmäßig Ihre hosts.txt-Datei aus verteilten Quellen oder " +"den \"Abonnementquellen\"." #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:115 -msgid "In the default configuration, the addressbook is only subscribed to www.i2p2.i2p." -msgstr "In der Standardeinstellung bezieht das Adressbuch sein Abonnement nur von www.i2p2.i2p." +msgid "" +"In the default configuration, the addressbook is only subscribed to www.i2p2." +"i2p." +msgstr "" +"In der Standardeinstellung bezieht das Adressbuch sein Abonnement nur von " +"www.i2p2.i2p." #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:117 -msgid "Subscribing to additional sites is easy, just add them to your <a href=\"subscriptions.jsp\">subscriptions</a> file." -msgstr "Zusätzliche Abonnementquellen hinzuzufügen ist einfach: Geben Sie dazu deren URL in Ihrer <a href=\"subscriptions.jsp\">Abonnement</a>-Datei an." +msgid "" +"Subscribing to additional sites is easy, just add them to your <a href=" +"\"subscriptions.jsp\">subscriptions</a> file." +msgstr "" +"Zusätzliche Abonnementquellen hinzuzufügen ist einfach: Geben Sie dazu deren " +"URL in Ihrer <a href=\"subscriptions.jsp\">Abonnement</a>-Datei an." #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:119 -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 "Für mehr Informationen über das Namenssystem in I2P konsultieren Sie bitte die <a href=\"http://www.i2p2.i2p/naming.html\">Übersichtsseite auf www.i2p2.i2p</a>." +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 "" +"Für mehr Informationen über das Namenssystem in I2P konsultieren Sie bitte " +"die <a href=\"http://www.i2p2.i2p/naming.html\">Übersichtsseite auf www." +"i2p2.i2p</a>." #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:121 msgid "How does the addressbook work?" msgstr "Wie funktioniert das Adressbuch?" #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:123 -msgid "The addressbook application regularly polls your subscriptions and merges their content into your \"router\" addressbook, stored in the hosts.txt file." -msgstr "Die Adressbuch-Anwendung bezieht regelmäßig ihre Abonnements und führt deren Inhalt mit dem Ihres \"Router\"-Adressbuchs zusammen, welches in der hosts.txt-Datei gespeichert ist." +msgid "" +"The addressbook application regularly polls your subscriptions and merges " +"their content into your \"router\" addressbook, stored in the hosts.txt file." +msgstr "" +"Die Adressbuch-Anwendung bezieht regelmäßig ihre Abonnements und führt deren " +"Inhalt mit dem Ihres \"Router\"-Adressbuchs zusammen, welches in der hosts." +"txt-Datei gespeichert ist." #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:125 -msgid "Then it merges your \"master\" addressbook (userhosts.txt) into the router addressbook as well." -msgstr "Dann fügt sie auch Ihr \"Master\"-Adressbuch (userhosts.txt) dem Router-Adressbuch hinzu." +msgid "" +"Then it merges your \"master\" addressbook (userhosts.txt) into the router " +"addressbook as well." +msgstr "" +"Dann fügt sie auch Ihr \"Master\"-Adressbuch (userhosts.txt) dem Router-" +"Adressbuch hinzu." #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:127 -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 "Falls eingestellt, wird das Router-Adressbuch jetzt in das \"veröffentlichte\" Adressbuch kopiert. Dieses ist öffentlich erreichbar, solange Sie eine Eepseite betreiben." +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 "" +"Falls eingestellt, wird das Router-Adressbuch jetzt in das \"veröffentlichte" +"\" Adressbuch kopiert. Dieses ist öffentlich erreichbar, solange Sie eine " +"Eepseite betreiben." #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:129 -msgid "The router also uses a private addressbook (privatehosts.txt, not shown in the picture), which is not merged or published." -msgstr "Der Router besitzt auch ein privates Adressbuch (privatehosts.txt, nicht im Bild gezeigt), welches nicht mit anderen vereinigt oder veröffentlicht wird." +msgid "" +"The router also uses a private addressbook (privatehosts.txt, not shown in " +"the picture), which is not merged or published." +msgstr "" +"Der Router besitzt auch ein privates Adressbuch (privatehosts.txt, nicht im " +"Bild gezeigt), welches nicht mit anderen vereinigt oder veröffentlicht wird." #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:131 -msgid "Hosts in the private addressbook can be accessed by you but their addresses are never distributed to others." -msgstr "Hosts in Ihrem privatem Adressbuch können von Ihnen aufgerufen werden, aber ihre Adressen werden nicht an andere verteilt." +msgid "" +"Hosts in the private addressbook can be accessed by you but their addresses " +"are never distributed to others." +msgstr "" +"Hosts in Ihrem privatem Adressbuch können von Ihnen aufgerufen werden, aber " +"ihre Adressen werden nicht an andere verteilt." #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:133 -msgid "The private addressbook can also be used for aliases of hosts in your other addressbooks." -msgstr "Das private Adressbuch kann auch für Verweise auf Hosts in Ihren anderen Adressbüchern genutzt werden." +msgid "" +"The private addressbook can also be used for aliases of hosts in your other " +"addressbooks." +msgstr "" +"Das private Adressbuch kann auch für Verweise auf Hosts in Ihren anderen " +"Adressbüchern genutzt werden." #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:132 msgid "The subscription file contains a list of i2p URLs." msgstr "Die Abonnementdatei enthält eine Liste von I2P-URLs." #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:134 -msgid "The addressbook application regularly checks this list for new eepsites." -msgstr "Die Adressbuchanwendung prüft diese Liste regelmäßig auf neue Eepsites." +msgid "" +"The addressbook application regularly checks this list for new eepsites." +msgstr "" +"Die Adressbuchanwendung prüft diese Liste regelmäßig auf neue Eepsites." #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:136 msgid "Those URLs refer to published hosts.txt files." msgstr "Diese URLs verweisen auf veröffentlichte hosts.txt-Dateien." #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:138 -msgid "The default subscription is the hosts.txt from www.i2p2.i2p, which is updated infrequently." -msgstr "Das Standardabonnement ist die hosts.txt-Datei von www.i2p2.i2p, welche nicht regelmäßig aktualisiert wird." +msgid "" +"The default subscription is the hosts.txt from www.i2p2.i2p, which is " +"updated infrequently." +msgstr "" +"Das Standardabonnement ist die hosts.txt-Datei von www.i2p2.i2p, welche " +"nicht regelmäßig aktualisiert wird." #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:140 -msgid "So it is a good idea to add additional subscriptions to sites that have the latest addresses." -msgstr "Somit ist es eine gute Idee, weitere Abonnements von Seiten mit den neuesten Adressen hinzuzufügen." +msgid "" +"So it is a good idea to add additional subscriptions to sites that have the " +"latest addresses." +msgstr "" +"Somit ist es eine gute Idee, weitere Abonnements von Seiten mit den neuesten " +"Adressen hinzuzufügen." #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:142 msgid "See the FAQ for a list of subscription URLs." msgstr "Schauen Sie in den FAQ nach einer Liste von Abonnement-URLs!" - diff --git a/apps/susidns/locale/messages_en.po b/apps/susidns/locale/messages_en.po new file mode 100644 index 0000000000000000000000000000000000000000..f907ba15474147dcbcaffeff180414c432e3abca --- /dev/null +++ b/apps/susidns/locale/messages_en.po @@ -0,0 +1,481 @@ +# 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: 2011-03-03 18:29+0000\n" +"PO-Revision-Date: 2010-06-15 14:09+0100\n" +"Last-Translator: duck <duck@mail.i2p>\n" +"Language-Team: duck <duck@mail.i2p>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:200 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:193 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:197 +msgid "Search" +msgstr "" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:204 +msgid "Search within filtered list" +msgstr "" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:206 +msgid "Filtered list" +msgstr "" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:210 +msgid "no matches" +msgstr "" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:213 +msgid "Addressbook" +msgstr "" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:215 +msgid "contains no entries" +msgstr "" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:217 +msgid "contains 1 entry" +msgstr "" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:219 +#, java-format +msgid "contains {0} entries" +msgstr "" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:229 +#, java-format +msgid "Showing {0} of {1}" +msgstr "" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:260 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:368 +msgid "Add" +msgstr "" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:260 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:265 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:366 +msgid "Replace" +msgstr "" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:264 +#, java-format +msgid "Host name {0} is already in addressbook, unchanged." +msgstr "" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:266 +#, java-format +msgid "" +"Host name {0} is already in addressbook with a different destination. Click " +"\"Replace\" to overwrite." +msgstr "" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:278 +#, java-format +msgid "Destination added for {0}." +msgstr "" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:280 +#, java-format +msgid "Destination changed for {0}." +msgstr "" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:285 +msgid "Invalid Base 64 destination." +msgstr "" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:289 +msgid "Please enter a host name and destination" +msgstr "" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:293 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:314 +msgid "Delete Selected" +msgstr "" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:303 +#, java-format +msgid "Destination {0} deleted." +msgstr "" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:305 +#, java-format +msgid "{0} destinations deleted." +msgstr "" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:311 +msgid "Addressbook saved." +msgstr "" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:314 +msgid "ERROR: Could not write addressbook file." +msgstr "" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:319 +#: ../src/java/src/i2p/susi/dns/ConfigBean.java:148 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:151 +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:130 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:130 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:130 +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:145 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:128 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:128 +msgid "Reload" +msgstr "" + +#: ../src/java/src/i2p/susi/dns/ConfigBean.java:144 +msgid "Configuration reloaded." +msgstr "" + +#. Yes this is a hack. +#. No it doesn't work on a text-mode browser. +#. Fetching from the addressbook servlet +#. with the correct parameters will kick off a +#. config reload and fetch. +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:139 +msgid "" +"Subscriptions saved, updating addressbook from subscription sources now." +msgstr "" + +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:143 +msgid "Subscriptions saved." +msgstr "" + +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:147 +msgid "Subscriptions reloaded." +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:125 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:145 +msgid "addressbook" +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:127 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:104 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:93 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:104 +msgid "addressbooks" +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:129 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:106 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:95 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:106 +msgid "private" +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:131 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:108 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:97 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:108 +msgid "master" +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:133 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:110 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:99 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:110 +msgid "router" +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:135 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:112 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:101 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:112 +msgid "published" +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:137 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:114 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:103 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:102 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:114 +msgid "subscriptions" +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:139 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:102 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:116 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:105 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:116 +msgid "configuration" +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:141 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:118 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:107 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:118 +msgid "overview" +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:163 +msgid "Filter" +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:166 +msgid "all" +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:177 +msgid "Current filter" +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:182 +msgid "clear filter" +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:224 +msgid "Name" +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:226 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:362 +msgid "Destination" +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:257 +msgid "Mark for deletion" +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:279 +msgid "address helper link" +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:312 +msgid "Cancel" +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:345 +msgid "This addressbook is empty." +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:356 +msgid "Add new destination" +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:358 +msgid "Hostname" +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:132 +msgid "Hints" +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:134 +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 "" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:136 +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:138 +msgid "" +"The router addressbook and the published addressbook are updated by the " +"addressbook application." +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:140 +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:142 +msgid "" +"Use the private addressbook for private destinations, these are not " +"published." +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:144 +msgid "Options" +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:146 +msgid "File containing the list of subscriptions URLs (no need to change)" +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:148 +msgid "Update interval in hours" +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:150 +msgid "" +"Your public hosts.txt file (choose a path within your webserver document " +"root)" +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:152 +msgid "Your hosts.txt (don't change)" +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:154 +msgid "Your personal addressbook, these hosts will be published" +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:156 +msgid "Your private addressbook, it is never published" +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:158 +msgid "Port for your eepProxy (no need to change)" +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:160 +msgid "Hostname for your eepProxy (no need to change)" +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:162 +msgid "Whether to update the published addressbook" +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:164 +msgid "" +"File containing the etags header from the fetched subscription URLs (no need " +"to change)" +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:166 +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:168 +msgid "File to log activity to (change to /dev/null if you like)" +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:91 +msgid "Introduction" +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:109 +msgid "What is the addressbook?" +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:111 +msgid "The addressbook application is part of your i2p installation." +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:113 +msgid "" +"It regularly updates your hosts.txt file from distributed sources or " +"\"subscriptions\"." +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:115 +msgid "" +"In the default configuration, the addressbook is only subscribed to www.i2p2." +"i2p." +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:117 +msgid "" +"Subscribing to additional sites is easy, just add them to your <a href=" +"\"subscriptions.jsp\">subscriptions</a> file." +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:119 +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 "" + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:121 +msgid "How does the addressbook work?" +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:123 +msgid "" +"The addressbook application regularly polls your subscriptions and merges " +"their content into your \"router\" addressbook, stored in the hosts.txt file." +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:125 +msgid "" +"Then it merges your \"master\" addressbook (userhosts.txt) into the router " +"addressbook as well." +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:127 +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 "" + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:129 +msgid "" +"The router also uses a private addressbook (privatehosts.txt, not shown in " +"the picture), which is not merged or published." +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:131 +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:133 +msgid "" +"The private addressbook can also be used for aliases of hosts in your other " +"addressbooks." +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:132 +msgid "The subscription file contains a list of i2p URLs." +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:134 +msgid "" +"The addressbook application regularly checks this list for new eepsites." +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:136 +msgid "Those URLs refer to published hosts.txt files." +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:138 +msgid "" +"The default subscription is the hosts.txt from www.i2p2.i2p, which is " +"updated infrequently." +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:140 +msgid "" +"So it is a good idea to add additional subscriptions to sites that have the " +"latest addresses." +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:142 +msgid "See the FAQ for a list of subscription URLs." +msgstr "" diff --git a/apps/susidns/locale/messages_es.po b/apps/susidns/locale/messages_es.po new file mode 100644 index 0000000000000000000000000000000000000000..8e1ee29c1b23901ce271d39c38daa16317485200 --- /dev/null +++ b/apps/susidns/locale/messages_es.po @@ -0,0 +1,544 @@ +# 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\n" +"Report-Msgid-Bugs-To: https://trac.i2p2.de/\n" +"POT-Creation-Date: 2011-03-03 18:29+0000\n" +"PO-Revision-Date: 2011-03-22 15:48+0000\n" +"Last-Translator: punkibastardo <punkibastardo@gmail.com>\n" +"Language-Team: Spanish (Castilian) <None>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:200 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:193 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:197 +msgid "Search" +msgstr "Buscar" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:204 +msgid "Search within filtered list" +msgstr "Buscar con la lista filtrada" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:206 +msgid "Filtered list" +msgstr "Lista filtrada" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:210 +msgid "no matches" +msgstr "No hay coincidencias" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:213 +msgid "Addressbook" +msgstr "Libreta de direcciones" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:215 +msgid "contains no entries" +msgstr "no contiene entradas" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:217 +msgid "contains 1 entry" +msgstr "contiene 1 entrada" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:219 +#, java-format +msgid "contains {0} entries" +msgstr "contiene {0} entradas" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:229 +#, java-format +msgid "Showing {0} of {1}" +msgstr "Mostrando {0} de {1}" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:260 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:368 +msgid "Add" +msgstr "Agregar" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:260 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:265 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:366 +msgid "Replace" +msgstr "Reemplazar" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:264 +#, java-format +msgid "Host name {0} is already in addressbook, unchanged." +msgstr "" +"El nombre del host {0} ya está en la libreta de direcciones, sin cambios." + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:266 +#, java-format +msgid "" +"Host name {0} is already in addressbook with a different destination. Click " +"\"Replace\" to overwrite." +msgstr "" +"El nombre del host {0} ya está en la libreta de direcciones con un destino " +"diferente. Haga clic en \"reemplazar\" para sobrescribir." + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:278 +#, java-format +msgid "Destination added for {0}." +msgstr "Destino añadido para {0}." + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:280 +#, java-format +msgid "Destination changed for {0}." +msgstr "Destino cambiado para {0}." + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:285 +msgid "Invalid Base 64 destination." +msgstr "Destino en Base 64 no válido" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:289 +msgid "Please enter a host name and destination" +msgstr "Por favor, introduzca un nombre de host y destino" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:293 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:314 +msgid "Delete Selected" +msgstr "Eliminar seleccionados" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:303 +#, java-format +msgid "Destination {0} deleted." +msgstr "Destino {0} eliminado." + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:305 +#, java-format +msgid "{0} destinations deleted." +msgstr "{0} destinos eliminados." + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:311 +msgid "Addressbook saved." +msgstr "Libreta de direcciones guardada." + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:314 +msgid "ERROR: Could not write addressbook file." +msgstr "ERROR: No se pudo escribir el archivo de la libreta direcciones." + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:319 +#: ../src/java/src/i2p/susi/dns/ConfigBean.java:148 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:151 +msgid "" +"Invalid form submission, probably because you used the \"back\" or " +"\"reload\" button on your browser. Please resubmit." +msgstr "" +"presentación de formulario no válido, probablemente debido a que ha " +"utilizado el botón \"atrás\" o \"recargar\" de su navegador. Por favor, " +"vuelva a enviarlo." + +#: ../src/java/src/i2p/susi/dns/ConfigBean.java:139 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:130 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:130 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:130 +msgid "Save" +msgstr "Guardar" + +#: ../src/java/src/i2p/susi/dns/ConfigBean.java:141 +msgid "Configuration saved." +msgstr "Configuración guardada." + +#: ../src/java/src/i2p/susi/dns/ConfigBean.java:142 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:145 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:128 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:128 +msgid "Reload" +msgstr "Recargar" + +#: ../src/java/src/i2p/susi/dns/ConfigBean.java:144 +msgid "Configuration reloaded." +msgstr "Configuración recargada." + +#. Yes this is a hack. +#. No it doesn't work on a text-mode browser. +#. Fetching from the addressbook servlet +#. with the correct parameters will kick off a +#. config reload and fetch. +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:139 +msgid "" +"Subscriptions saved, updating addressbook from subscription sources now." +msgstr "" +"Suscripciones guardadas, actualizando la libreta de direcciones a partir de " +"las fuentes de suscripción ahora." + +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:143 +msgid "Subscriptions saved." +msgstr "Suscripciones guardadas." + +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:147 +msgid "Subscriptions reloaded." +msgstr "Suscripciones recargadas." + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:125 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:145 +msgid "addressbook" +msgstr "libreta de direcciones" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:127 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:104 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:93 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:104 +msgid "addressbooks" +msgstr "libretas de direcciones" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:129 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:106 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:95 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:106 +msgid "private" +msgstr "privado" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:131 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:108 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:97 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:108 +msgid "master" +msgstr "maestro" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:133 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:110 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:99 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:110 +msgid "router" +msgstr "router" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:135 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:112 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:101 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:112 +msgid "published" +msgstr "publicado" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:137 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:114 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:103 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:102 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:114 +msgid "subscriptions" +msgstr "suscripciones" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:139 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:102 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:116 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:105 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:116 +msgid "configuration" +msgstr "configuración" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:141 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:118 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:107 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:118 +msgid "overview" +msgstr "resumen" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:163 +msgid "Filter" +msgstr "Filtro" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:166 +msgid "all" +msgstr "todos" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:177 +msgid "Current filter" +msgstr "Filtro actual" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:182 +msgid "clear filter" +msgstr "filtro actual" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:224 +msgid "Name" +msgstr "Nombre" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:226 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:362 +msgid "Destination" +msgstr "Destino" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:257 +msgid "Mark for deletion" +msgstr "Marcar para eliminar" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:279 +msgid "address helper link" +msgstr "ayudante de dirección del enlace" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:312 +msgid "Cancel" +msgstr "Cancelar" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:345 +msgid "This addressbook is empty." +msgstr "Esta libreta de direcciones está vacÃa." + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:356 +msgid "Add new destination" +msgstr "Añadir nuevo destino" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:358 +msgid "Hostname" +msgstr "Nombre de Host" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:132 +msgid "Hints" +msgstr "Consejos" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:134 +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 "" +"Las rutas de archivos y de directorios mostradas aquà son relativas al " +"directorio de trabajo de la libreta de direcciones, que es normalmente " +"~/.i2p/addressbook/ (Linux) o %APPDATA%\\I2P\\addressbook\\ (Windows)." + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:136 +msgid "" +"If you want to manually add lines to an addressbook, add them to the private" +" or master addressbooks." +msgstr "" +"Si desea agregar manualmente lÃneas a una libreta de direcciones, añadalos a" +" la libreta de direcciones privada o maestra." + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:138 +msgid "" +"The router addressbook and the published addressbook are updated by the " +"addressbook application." +msgstr "" +"La libreta de direcciones del router y la libreta de direcciones publicada " +"son actualizadas por la aplicación libreta de direcciones." + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:140 +msgid "" +"When you publish your addressbook, ALL destinations from the master and " +"router addressbooks appear there." +msgstr "" +"Al publicar su libro de direcciones, TODOS los destinos de la libreta " +"maestra y la libreta de direcciones del router aparecen ahÃ." + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:142 +msgid "" +"Use the private addressbook for private destinations, these are not " +"published." +msgstr "" +"Utilice la libreta de direcciones privada para destinos privados, éstos no " +"serán publicados." + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:144 +msgid "Options" +msgstr "Opciones" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:146 +msgid "File containing the list of subscriptions URLs (no need to change)" +msgstr "" +"El archivo que contiene la lista de suscripciones URL (no es necesario " +"cambiarlo)" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:148 +msgid "Update interval in hours" +msgstr "Intervalo de actualización en horas" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:150 +msgid "" +"Your public hosts.txt file (choose a path within your webserver document " +"root)" +msgstr "" +"Su archivo hosts.txt público (elija una ruta dentro de la raÃz de la " +"documentación de su servidor web)" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:152 +msgid "Your hosts.txt (don't change)" +msgstr "Su hosts.txt (no cambiar)" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:154 +msgid "Your personal addressbook, these hosts will be published" +msgstr "Su libreta de direcciones personal, estos hosts serán publicados" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:156 +msgid "Your private addressbook, it is never published" +msgstr "Su libreta de direcciones privada, nunca se publica" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:158 +msgid "Port for your eepProxy (no need to change)" +msgstr "Puerto para su eepProxy (no es necesario cambiarlo)" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:160 +msgid "Hostname for your eepProxy (no need to change)" +msgstr "Nombre de la host para su eepProxy (no es necesario cambiarlo)" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:162 +msgid "Whether to update the published addressbook" +msgstr "Sea para actualizar la libreta de direcciones publicadas" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:164 +msgid "" +"File containing the etags header from the fetched subscription URLs (no need" +" to change)" +msgstr "" +"Archivo que contiene la cabecera de los etags desde la URL de subscripciones" +" capturada (no es necesario cambiarlo)" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:166 +msgid "" +"File containing the modification timestamp for each fetched subscription URL" +" (no need to change)" +msgstr "" +"Archivo que contiene la fecha y hora de modificación para cada URL de " +"suscripción capturada (no es necesario cambiarlo)" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:168 +msgid "File to log activity to (change to /dev/null if you like)" +msgstr "" +"El archivo en el que se guarda el registro de actividad (cambielo a " +"/dev/null si quiere)" + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:91 +msgid "Introduction" +msgstr "Introducción" + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:109 +msgid "What is the addressbook?" +msgstr "¿Qué es la libreta de direcciones?" + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:111 +msgid "The addressbook application is part of your i2p installation." +msgstr "" +"La aplicación de libreta de direcciones es parte de la instalación I2P." + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:113 +msgid "" +"It regularly updates your hosts.txt file from distributed sources or " +"\"subscriptions\"." +msgstr "" +"Actualiza constantemente su archivo hosts.txt desde fuentes distribuidas o " +"\"suscripciones\"." + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:115 +msgid "" +"In the default configuration, the addressbook is only subscribed to " +"www.i2p2.i2p." +msgstr "" +"Con la configuración predeterminada, la libreta de direcciones sólo está " +"suscrita a www.i2p2.i2p." + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:117 +msgid "" +"Subscribing to additional sites is easy, just add them to your <a " +"href=\"subscriptions.jsp\">subscriptions</a> file." +msgstr "" +"Suscribirse a otros sitios es fácil, sólo tiene que añadirlos a su archivo " +"de <a href=\"subscriptions.jsp\">suscripciones</a>." + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:119 +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 "" +"Para obtener más información sobre los nombres en I2P, consulte <a " +"href=\"http://www.i2p2.i2p/naming.html\">la información general en " +"www.i2p2.i2p</a> ." + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:121 +msgid "How does the addressbook work?" +msgstr "¿Cómo funciona la libreta de direcciones?" + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:123 +msgid "" +"The addressbook application regularly polls your subscriptions and merges " +"their content into your \"router\" addressbook, stored in the hosts.txt " +"file." +msgstr "" +"La aplicación de libreta de direcciones comprueba periódicamente sus " +"suscripciones y funde su contenido con la libreta de direcciones de su " +"\"router\" almacenada en el archivo hosts.txt." + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:125 +msgid "" +"Then it merges your \"master\" addressbook (userhosts.txt) into the router " +"addressbook as well." +msgstr "" +"Luego también une su libreta de direcciones \"maestra\" (userhosts.txt) con " +"la libreta de direcciones del router." + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:127 +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 "" +"Si está configurada, la libreta de direcciones del router ahora se escribirá" +" a la libreta \"publicada\", que estará disponible al público si está " +"ejecutando un eepsite." + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:129 +msgid "" +"The router also uses a private addressbook (privatehosts.txt, not shown in " +"the picture), which is not merged or published." +msgstr "" +"El router también utiliza una libreta de direcciones privadas " +"(privatehosts.txt, no se muestra en la imagen), que ni se fusiona ni es " +"publicada." + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:131 +msgid "" +"Hosts in the private addressbook can be accessed by you but their addresses " +"are never distributed to others." +msgstr "" +"Puede visitar a los hosts que aparecen en su libreta de direcciones privada," +" pero su dirección no se distribuye a terceros." + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:133 +msgid "" +"The private addressbook can also be used for aliases of hosts in your other " +"addressbooks." +msgstr "" +"La libreta de direcciones privada también se pueden utilizar para alias de " +"los hosts en sus otras libretas de direcciones." + +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:132 +msgid "The subscription file contains a list of i2p URLs." +msgstr "El archivo de suscripción contiene una lista de URLs I2P." + +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:134 +msgid "" +"The addressbook application regularly checks this list for new eepsites." +msgstr "" +"La aplicación de libreta de direcciones comprueba regularmente esta lista en" +" busca de nuevos eepsites." + +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:136 +msgid "Those URLs refer to published hosts.txt files." +msgstr "Esas URLs referencian a los archivos hosts.txt publicados." + +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:138 +msgid "" +"The default subscription is the hosts.txt from www.i2p2.i2p, which is " +"updated infrequently." +msgstr "" +"La suscripción por defecto es el hosts.txt de www.i2p2.i2p, que se actualiza" +" con poca frecuencia." + +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:140 +msgid "" +"So it is a good idea to add additional subscriptions to sites that have the " +"latest addresses." +msgstr "" +"Por lo tanto, es una buena idea agregar suscripciones adicionales a sitios " +"que ttengan las direcciones más recientes" + +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:142 +msgid "See the FAQ for a list of subscription URLs." +msgstr "" +"Ver las preguntas frecuentes para obtener una lista de direcciones URL de " +"suscripciónes." diff --git a/apps/susidns/locale/messages_fr.po b/apps/susidns/locale/messages_fr.po new file mode 100644 index 0000000000000000000000000000000000000000..8d2c13c2984ca012fdfd7571e5a3c88c827f9e70 --- /dev/null +++ b/apps/susidns/locale/messages_fr.po @@ -0,0 +1,435 @@ +# 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: 2011-03-24 16:49+0000\n" +"PO-Revision-Date: 2011-04-09 02:53+0100\n" +"Last-Translator: magma <magma@mail.i2p>\n" +"Language-Team: duck <duck@mail.i2p>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n >= 2)\n" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:200 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:193 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:197 +msgid "Search" +msgstr "Chercher" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:204 +msgid "Search within filtered list" +msgstr "Chercher dans la liste filtrée" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:206 +msgid "Filtered list" +msgstr "Liste filtrée" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:210 +msgid "no matches" +msgstr "aucune correspondance" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:213 +msgid "Addressbook" +msgstr "Le carnet d'adresses" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:215 +msgid "contains no entries" +msgstr "est vide" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:217 +msgid "contains 1 entry" +msgstr "contient 1 entrée" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:219 +#, java-format +msgid "contains {0} entries" +msgstr "contient {0} entrée(s)" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:229 +#, java-format +msgid "Showing {0} of {1}" +msgstr "Affichage {0} sur {1}" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:260 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:368 +msgid "Add" +msgstr "Ajouter" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:260 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:265 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:366 +msgid "Replace" +msgstr "Remplacer" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:264 +#, java-format +msgid "Host name {0} is already in addressbook, unchanged." +msgstr "L''hôte {0} est déjà présent: inchangé." + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:266 +#, java-format +msgid "Host name {0} is already in addressbook with a different destination. Click \"Replace\" to overwrite." +msgstr "L''hôte {0} est déjà présent avec une destination différente. Cliquez sur \"Remplacer\"...pour le remplacer." + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:278 +#, java-format +msgid "Destination added for {0}." +msgstr "Destination ajoutée pour {0}." + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:280 +#, java-format +msgid "Destination changed for {0}." +msgstr "Destination modifiée pour {0}." + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:285 +msgid "Invalid Base 64 destination." +msgstr "Destination Base64 incorrecte." + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:289 +msgid "Please enter a host name and destination" +msgstr "Entrez un nom d'hôte et sa destination" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:293 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:314 +msgid "Delete Selected" +msgstr "Supprimer les éléments sélectionnés" + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:303 +#, java-format +msgid "Destination {0} deleted." +msgstr "Destination {0} supprimée." + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:305 +#, java-format +msgid "{0} destinations deleted." +msgstr "{0} destination(s) supprimée(s)." + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:311 +msgid "Addressbook saved." +msgstr "Carnet d'adresses enregistré." + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:314 +msgid "ERROR: Could not write addressbook file." +msgstr "ERREUR: impossible d'enregistrer le fichier carnet d'adresses." + +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:319 +#: ../src/java/src/i2p/susi/dns/ConfigBean.java:148 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:151 +msgid "Invalid form submission, probably because you used the \"back\" or \"reload\" button on your browser. Please resubmit." +msgstr "Soumission du formulaire incorrecte: vous avez peut-être utilisé le bouton \"Page précédente\" ou \"Recharger\". Merci de soumettre à nouveau." + +#: ../src/java/src/i2p/susi/dns/ConfigBean.java:139 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:130 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:130 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:130 +msgid "Save" +msgstr "Enregistrer" + +#: ../src/java/src/i2p/susi/dns/ConfigBean.java:141 +msgid "Configuration saved." +msgstr "Configuration enregistrée." + +#: ../src/java/src/i2p/susi/dns/ConfigBean.java:142 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:145 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:128 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:128 +msgid "Reload" +msgstr "Recharger" + +#: ../src/java/src/i2p/susi/dns/ConfigBean.java:144 +msgid "Configuration reloaded." +msgstr "Configuration rechargée." + +#. Yes this is a hack. +#. No it doesn't work on a text-mode browser. +#. Fetching from the addressbook servlet +#. with the correct parameters will kick off a +#. config reload and fetch. +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:139 +msgid "Subscriptions saved, updating addressbook from subscription sources now." +msgstr "Souscriptions enregistrées, mise à jour en cours du carnet d'adresses à partir de celles-ci." + +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:143 +msgid "Subscriptions saved." +msgstr "Souscription enregistrée." + +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:147 +msgid "Subscriptions reloaded." +msgstr "Souscription rechargée." + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:125 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:145 +msgid "addressbook" +msgstr "carnet d'adresses" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:127 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:104 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:93 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:104 +msgid "addressbooks" +msgstr "carnets d'adresses" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:129 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:106 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:95 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:106 +msgid "private" +msgstr "privé" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:131 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:108 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:97 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:108 +msgid "master" +msgstr "principal" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:133 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:110 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:99 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:110 +msgid "router" +msgstr "routeur" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:135 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:112 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:101 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:112 +msgid "published" +msgstr "publié" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:137 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:114 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:103 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:102 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:114 +msgid "subscriptions" +msgstr "souscriptions" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:139 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:102 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:116 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:105 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:116 +msgid "configuration" +msgstr "configuration" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:141 +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:118 +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:107 +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:118 +msgid "overview" +msgstr "aperçu" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:163 +msgid "Filter" +msgstr "Filtrer" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:166 +msgid "all" +msgstr "tout" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:177 +msgid "Current filter" +msgstr "Filtre courant" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:182 +msgid "clear filter" +msgstr "effacer le filtre" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:224 +msgid "Name" +msgstr "Nom" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:226 +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:362 +msgid "Destination" +msgstr "Destination" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:257 +msgid "Mark for deletion" +msgstr "Marquer pour suppression" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:279 +msgid "address helper link" +msgstr "lien d'aide d'adresse" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:312 +msgid "Cancel" +msgstr "Annuler" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:345 +msgid "This addressbook is empty." +msgstr "Ce carnet d'adresses est vide" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:356 +msgid "Add new destination" +msgstr "Ajoutez une nouvelle destination" + +#: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:358 +msgid "Hostname" +msgstr "Nom d'hôte" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:132 +msgid "Hints" +msgstr "Aides" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:134 +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 "Les chemins des fichiers et dossiers listés sont relatifs au répertoire de travail du carnet d'adresses, normalement ~/.i2p/addressbook/ (Linux) ou %APPDATA%\\I2P\\addressbook\\ (Windows)." + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:136 +msgid "If you want to manually add lines to an addressbook, add them to the private or master addressbooks." +msgstr "si vous voulez ajouter manuellement des lignes dans un carnet d'adresses, faites-le dans le carnet privé ou principal." + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:138 +msgid "The router addressbook and the published addressbook are updated by the addressbook application." +msgstr "Le carnet d'adresses du routeur et le carnet d'adresses publié sont mis à jour par l'application carnet d'adresses." + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:140 +msgid "When you publish your addressbook, ALL destinations from the master and router addressbooks appear there." +msgstr "Quand vous publiez votre carnet d'adresses, TOUTES les destinations des carnets principal et routeur le sont." + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:142 +msgid "Use the private addressbook for private destinations, these are not published." +msgstr "Utilisez le carnet d'adresses privé pour les destinations privées: elles ne seront pas publiées." + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:144 +msgid "Options" +msgstr "Options" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:146 +msgid "File containing the list of subscriptions URLs (no need to change)" +msgstr "fichier contenant la liste des URLs de souscriptions (inutile de modifier)" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:148 +msgid "Update interval in hours" +msgstr "Intervalle de mise à jour (en heures)" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:150 +msgid "Your public hosts.txt file (choose a path within your webserver document root)" +msgstr "Votre fichier hosts.txt (choisissez un emplacement dans la racine de votre serveur web)" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:152 +msgid "Your hosts.txt (don't change)" +msgstr "Votre hosts.txt (ne pas modifier)" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:154 +msgid "Your personal addressbook, these hosts will be published" +msgstr "Votre carnet d'adresses personnel: ces hôtes peuvent être publiés" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:156 +msgid "Your private addressbook, it is never published" +msgstr "Votre carnet d'adresses privé n'est jamais publié" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:158 +msgid "Port for your eepProxy (no need to change)" +msgstr "Port de votre proxy eep (inutile de modifier)" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:160 +msgid "Hostname for your eepProxy (no need to change)" +msgstr "nom d'hôte de votre proxy eep (inutile de modifier)" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:162 +msgid "Whether to update the published addressbook" +msgstr "S'il faut actualiser le carnet d'adresses publié" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:164 +msgid "File containing the etags header from the fetched subscription URLs (no need to change)" +msgstr "Fichier contenant les en-têtes etag des URLs de souscription (inutile de changer)" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:166 +msgid "File containing the modification timestamp for each fetched subscription URL (no need to change)" +msgstr "Fichier contenant les tampons horaires de modification de chaque URL de souscription importée (inutile de modifier)" + +#: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:168 +msgid "File to log activity to (change to /dev/null if you like)" +msgstr "Fichier d'historiques (modifiez en /dev/null si ça vous chante) " + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:91 +msgid "Introduction" +msgstr "Introduction" + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:109 +msgid "What is the addressbook?" +msgstr "Qu'est-ce que le carnet d'adresses?" + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:111 +msgid "The addressbook application is part of your i2p installation." +msgstr "L'application carnet d'adresses fait partie intégrante de votre installation I2P." + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:113 +msgid "It regularly updates your hosts.txt file from distributed sources or \"subscriptions\"." +msgstr "Elle actualise votre fichier hosts.txt à intervalle régulier à partir de sources décentralisées (\"souscriptions\" ou \"abonnements\")" + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:115 +msgid "In the default configuration, the addressbook is only subscribed to www.i2p2.i2p." +msgstr "Dans sa configuration par défaut, le carnet d'adresses est seulement abonné à www.i2p2.i2p." + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:117 +msgid "Subscribing to additional sites is easy, just add them to your <a href=\"subscriptions.jsp\">subscriptions</a> file." +msgstr "La souscription à des sites supplémentaires est aisée: ajoutez-les simplement à votre fichier de <a href=\"subscriptions.jsp\">souscriptions</a> ." + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:119 +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 "Plus d'infos sur <a href=\"http://www.i2p2.i2p/techintro_fr.html#app.naming\">le nommage dans I2P</a>." + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:121 +msgid "How does the addressbook work?" +msgstr "Fonctionnement du carnet d'adresses." + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:123 +msgid "The addressbook application regularly polls your subscriptions and merges their content into your \"router\" addressbook, stored in the hosts.txt file." +msgstr "L'application carnet d'adresses interroge vos souscriptions à intervalle régulier et fusionne leurs contenus dans le carnet d'adresses du \"routeur\", stocké dans le fichier hosts.txt." + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:125 +msgid "Then it merges your \"master\" addressbook (userhosts.txt) into the router addressbook as well." +msgstr "Puis elle fusionne votre carnet d'adresses \"principal\" (userhosts.txt) dans celui du routeur. " + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:127 +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 "Si c'est activé, le carnet du routeur est alors écrit dans le carnet d'adresses \"publié\" qui devient publiquement disponible si vous avez votre propre site eep." + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:129 +msgid "The router also uses a private addressbook (privatehosts.txt, not shown in the picture), which is not merged or published." +msgstr "Le routeur utilise également un carnet privé (privatehosts.txt, non illustré), qui n'est ni fusionné ni publié." + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:131 +msgid "Hosts in the private addressbook can be accessed by you but their addresses are never distributed to others." +msgstr "Les hôtes du carnet privé ne sont accessibles qu'à vous, et leurs adresses ne sont jamais distribuées à personne." + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:133 +msgid "The private addressbook can also be used for aliases of hosts in your other addressbooks." +msgstr "Le carnet privé peut aussi servir à stocker des alias/pseudos pour des hôtes des autres carnets." + +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:132 +msgid "The subscription file contains a list of i2p URLs." +msgstr "Le fichier de souscriptions contient une liste d'URLs I2P." + +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:134 +msgid "The addressbook application regularly checks this list for new eepsites." +msgstr "L'application vérifie régulièrement cette liste pour trouver de nouveaux sites eep." + +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:136 +msgid "Those URLs refer to published hosts.txt files." +msgstr "Ces URLs font référence aux fichiers hosts.txt des autres utilisateurs." + +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:138 +msgid "The default subscription is the hosts.txt from www.i2p2.i2p, which is updated infrequently." +msgstr "L'abonnement par défaut est le fichier hosts.txt de www.i2p2.i2p, mais il est très peu actualisé." + +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:140 +msgid "So it is a good idea to add additional subscriptions to sites that have the latest addresses." +msgstr "C'est donc une bonne idée d'ajouter des souscriptions supplémentaires à des sites qui disposent des dernières adresses." + +#: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:142 +msgid "See the FAQ for a list of subscription URLs." +msgstr "Voir la <a href=\"http://www.i2p2.i2p/faq_fr.html#subscriptions\">FAQ</a> pour une liste d'URLs de souscriptions." + diff --git a/apps/susidns/locale/messages_nl.po b/apps/susidns/locale/messages_nl.po index 8f1c5b3c0ad6bf2f6578a6660c123a7d7af7e711..7664c92c895840a7ff1b95bb9ae686460e3648ba 100644 --- a/apps/susidns/locale/messages_nl.po +++ b/apps/susidns/locale/messages_nl.po @@ -6,16 +6,17 @@ # msgid "" msgstr "" -"Project-Id-Version: I2P susidns\n" +"Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-12-17 15:05+0000\n" -"PO-Revision-Date: 2010-06-15 11:22+0100\n" -"Last-Translator: duck <duck@mail.i2p>\n" -"Language-Team: duck <duck@mail.i2p>, monkeybrains <monkeybrains@mail.i2p>\n" +"POT-Creation-Date: 2011-03-03 18:29+0000\n" +"PO-Revision-Date: 2011-02-20 12:15+0000\n" +"Last-Translator: ducki2p <ducki2p@gmail.com>\n" +"Language-Team: Dutch <>\n" +"Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Poedit-Language: Dutch\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" #: ../src/java/src/i2p/susi/dns/AddressbookBean.java:200 #: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:193 diff --git a/apps/susidns/locale/messages_ru.po b/apps/susidns/locale/messages_ru.po index 7e689c89ad8548e8be0f6adf8dce4b7f6911dcc8..22752452af5a79711fedc8756425d64b9470d4ab 100644 --- a/apps/susidns/locale/messages_ru.po +++ b/apps/susidns/locale/messages_ru.po @@ -8,125 +8,135 @@ msgid "" msgstr "" "Project-Id-Version: I2P susidns\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-05-25 21:15+0000\n" +"POT-Creation-Date: 2011-03-03 18:29+0000\n" "PO-Revision-Date: 2010-05-25 21:43+0000\n" "Last-Translator: 4get <forget@mail.i2p>\n" "Language-Team: foo <foo@bar>\n" +"Language: \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:199 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:200 #: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:193 #: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:197 msgid "Search" msgstr "ПоиÑк" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:203 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:204 msgid "Search within filtered list" msgstr "ПоиÑк в отфильтрованном ÑпиÑке" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:205 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:206 msgid "Filtered list" msgstr "Отфильтрованный ÑпиÑок" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:209 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:210 msgid "no matches" msgstr "ничего не найдено" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:212 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:213 msgid "Addressbook" msgstr "ÐдреÑÐ½Ð°Ñ ÐºÐ½Ð¸Ð³Ð°" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:214 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:215 msgid "contains no entries" msgstr "не Ñодержит запиÑей" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:216 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:217 msgid "contains 1 entry" msgstr "Ñодержит одну запиÑÑŒ" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:218 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:219 #, java-format msgid "contains {0} entries" msgstr "Ñодержит {0} запиÑей" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:228 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:229 #, java-format msgid "Showing {0} of {1}" msgstr "Показаны {0} из {1}" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:259 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:260 #: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:368 msgid "Add" msgstr "Добавить" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:259 -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:264 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:260 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:265 #: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:366 msgid "Replace" msgstr "Заменить" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:263 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:264 #, java-format msgid "Host name {0} is already in addressbook, unchanged." msgstr "Ð”Ð»Ñ ÑƒÐ·Ð»Ð° {0} уже ÑущеÑтвует запиÑÑŒ Ñ Ñовпадающим адреÑом назначениÑ." -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:265 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:266 #, java-format -msgid "Host name {0} is already in addressbook with a different destination. Click \"Replace\" to overwrite." -msgstr "Ð”Ð»Ñ ÑƒÐ·Ð»Ð° {0} уже ÑущеÑтвует запиÑÑŒ Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼ адреÑом назначениÑ. Ðажмите \"Заменить\" Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿Ð¸Ñи." +msgid "" +"Host name {0} is already in addressbook with a different destination. Click " +"\"Replace\" to overwrite." +msgstr "" +"Ð”Ð»Ñ ÑƒÐ·Ð»Ð° {0} уже ÑущеÑтвует запиÑÑŒ Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼ адреÑом назначениÑ. Ðажмите " +"\"Заменить\" Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿Ð¸Ñи." -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:277 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:278 #, java-format msgid "Destination added for {0}." msgstr "Добавлен Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ {0}." -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:279 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:280 #, java-format msgid "Destination changed for {0}." msgstr "Заменён Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ {0}." -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:284 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:285 msgid "Invalid Base 64 destination." msgstr "Ðекорректный Base-64 адреÑ." -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:288 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:289 msgid "Please enter a host name and destination" msgstr "ПожалуйÑта, введите Ð¸Ð¼Ñ ÑƒÐ·Ð»Ð° и Ð°Ð´Ñ€ÐµÑ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:292 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:293 #: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:314 msgid "Delete Selected" msgstr "Удалить выделенное" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:302 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:303 #, java-format msgid "Destination {0} deleted." msgstr "ÐÐ´Ñ€ÐµÑ {0} удален." -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:304 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:305 #, java-format msgid "{0} destinations deleted." msgstr "{0} адреÑов удалено." -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:310 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:311 msgid "Addressbook saved." msgstr "ÐдреÑÐ½Ð°Ñ ÐºÐ½Ð¸Ð³Ð° Ñохранена." -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:313 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:314 msgid "ERROR: Could not write addressbook file." msgstr "ОШИБКÐ: Ðе удалоÑÑŒ Ñохранить файл адреÑной книги." -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:318 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:319 #: ../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/SubscriptionsBean.java:151 +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/java/src/i2p/susi/dns/SubscriptionsBean.java:130 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:130 #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:130 msgid "Save" @@ -137,7 +147,7 @@ msgid "Configuration saved." msgstr "ÐаÑтройки Ñохранены." #: ../src/java/src/i2p/susi/dns/ConfigBean.java:142 -#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:144 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:145 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:128 #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:128 msgid "Reload" @@ -147,15 +157,22 @@ msgstr "Перезагрузить" msgid "Configuration reloaded." msgstr "ÐаÑтройки перезагружены." -#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:138 -msgid "Subscriptions saved, updating addressbook from subscription sources now." -msgstr "ПодпиÑки Ñохранены, запущена загрузка подпиÑок и обновление адреÑной книги." +#. Yes this is a hack. +#. No it doesn't work on a text-mode browser. +#. Fetching from the addressbook servlet +#. with the correct parameters will kick off a +#. config reload and fetch. +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:139 +msgid "" +"Subscriptions saved, updating addressbook from subscription sources now." +msgstr "" +"ПодпиÑки Ñохранены, запущена загрузка подпиÑок и обновление адреÑной книги." -#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:142 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:143 msgid "Subscriptions saved." msgstr "ПодпиÑки Ñохранены." -#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:146 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:147 msgid "Subscriptions reloaded." msgstr "ПодпиÑки перезагружены." @@ -276,24 +293,46 @@ msgid "Hints" msgstr "ПримечаниÑ" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:134 -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)." +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:136 -msgid "If you want to manually add lines to an addressbook, add them to the private or master addressbooks." -msgstr "ЕÑли Ð’Ñ‹ хотите вручную добавлÑÑ‚ÑŒ запиÑи в адреÑную книгу, то добавлÑйте их в «приватную» или «оÑновную»." +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:138 -msgid "The router addressbook and the published addressbook are updated by the addressbook application." -msgstr "ÐдреÑные книги «маршрутизатор» и «публикуемаÑ» ÑоздаютÑÑ/перезапиÑываютÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки." +msgid "" +"The router addressbook and the published addressbook are updated by the " +"addressbook application." +msgstr "" +"ÐдреÑные книги «маршрутизатор» и «публикуемаÑ» ÑоздаютÑÑ/перезапиÑываютÑÑ " +"автоматичеÑки." #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:140 -msgid "When you publish your addressbook, ALL destinations from the master and router addressbooks appear there." -msgstr "Когда Ð’Ñ‹ публикуете Ñвою адреÑную книгу, то публикуютÑÑ Ð’Ð¡Ð• запиÑи из адреÑных книг «оÑновнаÑ» и «маршрутизатор»." +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:142 -msgid "Use the private addressbook for private destinations, these are not published." -msgstr "ПользуйтеÑÑŒ «приватной» адреÑной книгой Ð´Ð»Ñ Ð°Ð´Ñ€ÐµÑов, которые Ð’Ñ‹ не хотите публиковать." +msgid "" +"Use the private addressbook for private destinations, these are not " +"published." +msgstr "" +"ПользуйтеÑÑŒ «приватной» адреÑной книгой Ð´Ð»Ñ Ð°Ð´Ñ€ÐµÑов, которые Ð’Ñ‹ не хотите " +"публиковать." #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:144 msgid "Options" @@ -301,15 +340,20 @@ msgstr "Параметры" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:146 msgid "File containing the list of subscriptions URLs (no need to change)" -msgstr "Файл Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ ÑпиÑка URL подпиÑок (перенаÑтраивать нет необходимоÑти)" +msgstr "" +"Файл Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ ÑпиÑка URL подпиÑок (перенаÑтраивать нет необходимоÑти)" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:148 msgid "Update interval in hours" msgstr "Интервал Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ (чаÑÑ‹)" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:150 -msgid "Your public hosts.txt file (choose a path within your webserver document root)" -msgstr "hosts.txt Ð´Ð»Ñ Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸ (по умолчанию ÑохранÑетÑÑ Ð² корневой директории вÑтроенного в I2P маршутизатор вебÑервера)" +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:152 msgid "Your hosts.txt (don't change)" @@ -336,12 +380,20 @@ msgid "Whether to update the published addressbook" msgstr "ОбновлÑÑ‚ÑŒ ли публикуемую адреÑную книгу (true/false)" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:164 -msgid "File containing the etags header from the fetched subscription URLs (no need to change)" -msgstr "Файл Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ etags-заголовков от загруженных адреÑов подпиÑок (перенаÑтраивать нет необходимоÑти)" +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:166 -msgid "File containing the modification timestamp for each fetched subscription URL (no need to change)" -msgstr "Файл Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ñ‚Ñ‹/времени модификации каждого загруженного адреÑа подпиÑки (перенаÑтраивать нет необходимоÑти)" +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:168 msgid "File to log activity to (change to /dev/null if you like)" @@ -360,68 +412,120 @@ msgid "The addressbook application is part of your i2p installation." msgstr "ÐдреÑÐ½Ð°Ñ ÐºÐ½Ð¸Ð³Ð° — Ñто приложение в ÑоÑтаве Вашего I2P маршрутизатора." #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:113 -msgid "It regularly updates your hosts.txt file from distributed sources or \"subscriptions\"." -msgstr "Его задача регулÑрно пополнÑÑ‚ÑŒ Ваш hosts.txt адреÑами из наÑтраиваемых иÑточников («подпиÑок»)." +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:115 -msgid "In the default configuration, the addressbook is only subscribed to www.i2p2.i2p." -msgstr "По умолчанию в адреÑной книге наÑтроена лишь одна подпиÑка — на www.i2p2.i2p." +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:117 -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>." +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:119 -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>." +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:121 msgid "How does the addressbook work?" msgstr "Как работает адреÑÐ½Ð°Ñ ÐºÐ½Ð¸Ð³Ð°?" #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:123 -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." +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:125 -msgid "Then it merges your \"master\" addressbook (userhosts.txt) into the router addressbook as well." -msgstr "ПоÑле Ñтого туда добавлÑетÑÑ Ñодержимое Вашей «оÑновной» адреÑной книги (userhosts.txt)." +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:127 -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-Ñайт." +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:129 -msgid "The router also uses a private addressbook (privatehosts.txt, not shown in the picture), which is not merged or published." -msgstr "Маршрутизатор также иÑпользует приватную адреÑную книгу (privatehosts.txt, на иллюÑтрации не показано), ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð½Ð¸ÐºÑƒÐ´Ð° не копируетÑÑ Ð¸ не публикуетÑÑ." +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:131 -msgid "Hosts in the private addressbook can be accessed by you but their addresses are never distributed to others." -msgstr "Таким образом Ð’Ñ‹ можете пользоватьÑÑ Ð°Ð´Ñ€ÐµÑами из Ñтой адреÑной книги, не раÑÐºÑ€Ñ‹Ð²Ð°Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼ её Ñодержимое." +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:133 -msgid "The private addressbook can also be used for aliases of hosts in your other addressbooks." -msgstr "Приватную адреÑную книгу также удобно иcпользовать Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð°Ð»ÑŒÑ‚ÐµÑ€Ð½Ð°Ñ‚Ð¸Ð²Ð½Ñ‹Ñ…/коротких адреÑов." +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:132 msgid "The subscription file contains a list of i2p URLs." msgstr "Файл подпиÑок Ñодержит ÑпиÑок i2p URL." #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:134 -msgid "The addressbook application regularly checks this list for new eepsites." -msgstr "ÐдреÑÐ½Ð°Ñ ÐºÐ½Ð¸Ð³Ð° периодичеÑки проверÑет Ñтот ÑпиÑок на наличие новых адреÑов I2P-Ñайтов." +msgid "" +"The addressbook application regularly checks this list for new eepsites." +msgstr "" +"ÐдреÑÐ½Ð°Ñ ÐºÐ½Ð¸Ð³Ð° периодичеÑки проверÑет Ñтот ÑпиÑок на наличие новых адреÑов " +"I2P-Ñайтов." #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:136 msgid "Those URLs refer to published hosts.txt files." msgstr "Каждый URL указывает на опубликованный hosts.txt файл." #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:138 -msgid "The default subscription is the hosts.txt from www.i2p2.i2p, which is updated infrequently." -msgstr "По умолчанию в ÑпиÑке задана только ÑÑылка на hosts.txt Ñ www.i2p2.i2p, который обновлÑетÑÑ Ð¾Ñ‡ÐµÐ½ÑŒ редко." +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:140 -msgid "So it is a good idea to add additional subscriptions to sites that have the latest addresses." -msgstr "ПоÑтому не помешает дополнительно подпиÑатьÑÑ Ð½Ð° hosts.txt Ñ Ð±Ð¾Ð»ÐµÐµ чаÑто обновлÑемых Ñайтов." +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:142 msgid "See the FAQ for a list of subscription URLs." @@ -429,4 +533,3 @@ msgstr "Ð’ ÑоответÑтвующем разделе FAQ можно найт #~ msgid "Delete" #~ msgstr "Удалить" - diff --git a/apps/susidns/locale/messages_zh.po b/apps/susidns/locale/messages_zh.po index ace16bf4b86971b824e8e90d8addeb32b9d11adf..52f1c37272b85595a6ebe9d65956f51450fc4e8c 100644 --- a/apps/susidns/locale/messages_zh.po +++ b/apps/susidns/locale/messages_zh.po @@ -1,132 +1,139 @@ -# 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. -# +# 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: 2010-05-29 02:35+0000\n" +"POT-Creation-Date: 2011-03-03 18:29+0000\n" "PO-Revision-Date: 2010-05-29 12:51+0800\n" "Last-Translator: walking <walking@mail.i2p>\n" "Language-Team: foo <foo@bar>\n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Chinese\n" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:199 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:200 #: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:193 #: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:197 msgid "Search" msgstr "æœç´¢" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:203 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:204 msgid "Search within filtered list" msgstr "在过滤结果ä¸æœç´¢" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:205 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:206 msgid "Filtered list" msgstr "过滤结果列表" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:209 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:210 msgid "no matches" msgstr "æ— åŒ¹é…项目" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:212 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:213 msgid "Addressbook" msgstr "地å€ç°¿" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:214 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:215 msgid "contains no entries" msgstr "åŒ…å« 0 个项目" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:216 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:217 msgid "contains 1 entry" msgstr "åŒ…å« 1 个项目" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:218 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:219 #, java-format msgid "contains {0} entries" msgstr "åŒ…å« {0} 个项目" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:228 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:229 #, java-format msgid "Showing {0} of {1}" msgstr "显示 {0} 个项目共 {1}" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:259 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:260 #: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:368 msgid "Add" msgstr "æ·»åŠ " -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:259 -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:264 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:260 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:265 #: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:366 msgid "Replace" msgstr "替æ¢" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:263 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:264 #, java-format msgid "Host name {0} is already in addressbook, unchanged." msgstr "主机å称{0}å·²å˜åœ¨äºŽåœ°å€ç°¿ä¸ï¼Œæœ¬æ¬¡æ“作未更新。" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:265 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:266 #, java-format -msgid "Host name {0} is already in addressbook with a different destination. Click \"Replace\" to overwrite." +msgid "" +"Host name {0} is already in addressbook with a different destination. Click " +"\"Replace\" to overwrite." msgstr "域å{0}已以ä¸åŒç›®æ ‡å¯†é’¥çš„å˜åœ¨äºŽåœ°å€ç°¿ä¸ï¼Œç‚¹å‡»â€œæ›¿æ¢â€è¿›è¡Œè¦†ç›–" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:277 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:278 #, java-format msgid "Destination added for {0}." msgstr "ç›®æ ‡å¯†é’¥å·²æ·»åŠ ä¸º{0}。" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:279 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:280 #, java-format msgid "Destination changed for {0}." msgstr "ç›®æ ‡å·²æ›´æ–°ä¸º{0}。" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:284 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:285 msgid "Invalid Base 64 destination." msgstr "æ— æ•ˆçš„Base64ç›®æ ‡å¯†é’¥" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:288 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:289 msgid "Please enter a host name and destination" msgstr "请输入主机åç§°ä¸Žç›®æ ‡" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:292 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:293 #: ../src/tmp/i2p/susi/dns/jsp/addressbook_jsp.java:314 msgid "Delete Selected" msgstr "åˆ é™¤é€‰ä¸é¡¹" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:302 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:303 #, java-format msgid "Destination {0} deleted." msgstr "ç›®æ ‡ {0} å·²åˆ é™¤" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:304 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:305 #, java-format msgid "{0} destinations deleted." msgstr "{0} ä¸ªç›®æ ‡å·²åˆ é™¤" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:310 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:311 msgid "Addressbook saved." msgstr "地å€ç°¿å·²ä¿å˜" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:313 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:314 msgid "ERROR: Could not write addressbook file." msgstr "错误:æ— æ³•å†™å…¥åœ°å€ç°¿æ–‡ä»¶" -#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:318 +#: ../src/java/src/i2p/susi/dns/AddressbookBean.java:319 #: ../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/SubscriptionsBean.java:151 +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/java/src/i2p/susi/dns/SubscriptionsBean.java:130 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:130 #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:130 msgid "Save" @@ -137,7 +144,7 @@ msgid "Configuration saved." msgstr "é…置已ä¿å˜" #: ../src/java/src/i2p/susi/dns/ConfigBean.java:142 -#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:144 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:145 #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:128 #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:128 msgid "Reload" @@ -147,15 +154,21 @@ msgstr "刷新" msgid "Configuration reloaded." msgstr "é…置已é‡æ–°è½½å…¥" -#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:138 -msgid "Subscriptions saved, updating addressbook from subscription sources now." +#. Yes this is a hack. +#. No it doesn't work on a text-mode browser. +#. Fetching from the addressbook servlet +#. with the correct parameters will kick off a +#. config reload and fetch. +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:139 +msgid "" +"Subscriptions saved, updating addressbook from subscription sources now." msgstr "订阅已ä¿å˜ï¼Œæ£åœ¨é€šè¿‡è®¢é˜…地å€æ›´æ–°åœ°å€ç°¿ã€‚" -#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:142 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:143 msgid "Subscriptions saved." msgstr "订阅已ä¿å˜ã€‚" -#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:146 +#: ../src/java/src/i2p/susi/dns/SubscriptionsBean.java:147 msgid "Subscriptions reloaded." msgstr "订阅设置已é‡æ–°è½½å…¥ã€‚" @@ -276,23 +289,38 @@ msgid "Hints" msgstr "æ示" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:134 -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)." +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:136 -msgid "If you want to manually add lines to an addressbook, add them to the private or master addressbooks." +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:138 -msgid "The router addressbook and the published addressbook are updated by the addressbook application." +msgid "" +"The router addressbook and the published addressbook are updated by the " +"addressbook application." msgstr "路由地å€ç°¿ä¸Žå·²å‘布地å€ç°¿ä¼šç”±åœ°å€ç°¿ç¨‹åºè´Ÿè´£æ›´æ–°ã€‚" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:140 -msgid "When you publish your addressbook, ALL destinations from the master and router addressbooks appear there." -msgstr "当您å‘布地å€ç°¿æ—¶ï¼Œä¸»åœ°å€ç°¿ä¸Žè·¯ç”±åœ°å€ç°¿ä¸çš„所有地å€æ¡ç›®éƒ½ä¼šæ˜¾ç¤ºäºŽå·²å‘布地å€ç°¿ä¸ã€‚" +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:142 -msgid "Use the private addressbook for private destinations, these are not published." +msgid "" +"Use the private addressbook for private destinations, these are not " +"published." msgstr "ç§æœ‰åœ°å€ç°¿ç”¨æ¥è®°å½•éœ€è¦ä¿å¯†çš„ç§äººç›®æ ‡ï¼Œå…¶ä¸çš„æ¡ç›®ä¸ä¼šè¢«å‘布。" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:144 @@ -308,8 +336,11 @@ msgid "Update interval in hours" msgstr "更新周期(å°æ—¶)" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:150 -msgid "Your public hosts.txt file (choose a path within your webserver document root)" -msgstr "您å‘布的公开地å€ç°¿ hosts.txt (请指定为您WebæœåŠ¡å™¨ç›®å½•ä¸çš„æŸä¸ªè·¯å¾„以便å‘布。)" +msgid "" +"Your public hosts.txt file (choose a path within your webserver document " +"root)" +msgstr "" +"您å‘布的公开地å€ç°¿ hosts.txt (请指定为您WebæœåŠ¡å™¨ç›®å½•ä¸çš„æŸä¸ªè·¯å¾„以便å‘布。)" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:152 msgid "Your hosts.txt (don't change)" @@ -336,11 +367,15 @@ msgid "Whether to update the published addressbook" msgstr "是å¦æ›´æ–°å‘布地å€ç°¿" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:164 -msgid "File containing the etags header from the fetched subscription URLs (no need to change)" +msgid "" +"File containing the etags header from the fetched subscription URLs (no need " +"to change)" msgstr "æ¤æ–‡ä»¶å«æœ‰è®¢é˜…URL返回的etag头(æ— éœ€ä¿®æ”¹)" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:166 -msgid "File containing the modification timestamp for each fetched subscription URL (no need to change)" +msgid "" +"File containing the modification timestamp for each fetched subscription URL " +"(no need to change)" msgstr "æ¤æ–‡ä»¶å«æœ‰æ¯ä¸ªåœ°å€ç°¿è®¢é˜…URL上次获å–时的修改时间(æ— éœ€ä¿®æ”¹)" #: ../src/tmp/i2p/susi/dns/jsp/config_jsp.java:168 @@ -360,47 +395,80 @@ msgid "The addressbook application is part of your i2p installation." msgstr "地å€ç°¿ç¨‹åºæ˜¯I2P安装程åºçš„一部分。" #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:113 -msgid "It regularly updates your hosts.txt file from distributed sources or \"subscriptions\"." -msgstr "他通过分散的æ¥æºæˆ–称地å€ç°¿â€œè®¢é˜…â€(概念类似RSS)更新您的地å€ç°¿æ–‡ä»¶ host.txt。" +msgid "" +"It regularly updates your hosts.txt file from distributed sources or " +"\"subscriptions\"." +msgstr "" +"他通过分散的æ¥æºæˆ–称地å€ç°¿â€œè®¢é˜…â€(概念类似RSS)更新您的地å€ç°¿æ–‡ä»¶ host.txt。" #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:115 -msgid "In the default configuration, the addressbook is only subscribed to www.i2p2.i2p." +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:117 -msgid "Subscribing to additional sites is easy, just add them to your <a href=\"subscriptions.jsp\">subscriptions</a> file." -msgstr "订阅其他网站的地å€ç°¿ä¹Ÿå¾ˆç®€å•ï¼Œåªéœ€å°†å®ƒä»¬åŠ å…¥ <a href=\"subscriptions.jsp\">订阅</a> 文件å³å¯ã€‚" +msgid "" +"Subscribing to additional sites is easy, just add them to your <a href=" +"\"subscriptions.jsp\">subscriptions</a> file." +msgstr "" +"订阅其他网站的地å€ç°¿ä¹Ÿå¾ˆç®€å•ï¼Œåªéœ€å°†å®ƒä»¬åŠ å…¥ <a href=\"subscriptions.jsp\">订" +"阅</a> 文件å³å¯ã€‚" #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:119 -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\"> www.i2p2.i2p 网站上的“概述†</a>." +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" +"\"> www.i2p2.i2p 网站上的“概述†</a>." #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:121 msgid "How does the addressbook work?" msgstr "那么地å€ç°¿æ˜¯å¦‚何工作的呢?" #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:123 -msgid "The addressbook application regularly polls your subscriptions and merges their content into your \"router\" addressbook, stored in the hosts.txt file." -msgstr "地å€ç°¿ç¨‹åºå®šæœŸé€šè¿‡è®¢é˜…çš„URL获å–新的地å€ç°¿æ¡ç›®å¹¶å°†å®ƒä»¬åˆå¹¶å…¥æ‚¨çš„“路由â€åœ°å€ç°¿ä¸ï¼Œä¿å˜ä¸Ž hosts.txt 文件内。" +msgid "" +"The addressbook application regularly polls your subscriptions and merges " +"their content into your \"router\" addressbook, stored in the hosts.txt file." +msgstr "" +"地å€ç°¿ç¨‹åºå®šæœŸé€šè¿‡è®¢é˜…çš„URL获å–新的地å€ç°¿æ¡ç›®å¹¶å°†å®ƒä»¬åˆå¹¶å…¥æ‚¨çš„“路由â€åœ°å€ç°¿" +"ä¸ï¼Œä¿å˜ä¸Ž hosts.txt 文件内。" #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:125 -msgid "Then it merges your \"master\" addressbook (userhosts.txt) into the router addressbook as well." +msgid "" +"Then it merges your \"master\" addressbook (userhosts.txt) into the router " +"addressbook as well." msgstr "éšåŽä»–还会将您的“主è¦â€åœ°å€ç°¿(userhost.txt)åˆå¹¶å…¥è·¯ç”±å™¨åœ°å€ç°¿ã€‚" #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:127 -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 "如果å¯ç”¨äº†ç›¸å…³é…置,路由器地å€ç°¿ä¼šå†™å…¥æ‚¨çš„“å‘布â€åœ°å€ç°¿ä¸ï¼Œå¦‚果您有自己的eepsite匿å站点,那么它å¯ä»¥é€šè¿‡æ‚¨çš„站点公开å‘布。" +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 "" +"如果å¯ç”¨äº†ç›¸å…³é…置,路由器地å€ç°¿ä¼šå†™å…¥æ‚¨çš„“å‘布â€åœ°å€ç°¿ä¸ï¼Œå¦‚果您有自己的" +"eepsite匿å站点,那么它å¯ä»¥é€šè¿‡æ‚¨çš„站点公开å‘布。" #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:129 -msgid "The router also uses a private addressbook (privatehosts.txt, not shown in the picture), which is not merged or published." -msgstr "路由器åŒæ—¶æ供了ç§æœ‰åœ°å€ç°¿(privatehost.txt,图片ä¸ä¸ºå‡ºçŽ°),å…¶ä¸çš„项目ä¸ä¼šè¢«åˆå¹¶æˆ–å‘布。" +msgid "" +"The router also uses a private addressbook (privatehosts.txt, not shown in " +"the picture), which is not merged or published." +msgstr "" +"路由器åŒæ—¶æ供了ç§æœ‰åœ°å€ç°¿(privatehost.txt,图片ä¸ä¸ºå‡ºçŽ°),å…¶ä¸çš„项目ä¸ä¼šè¢«åˆå¹¶" +"或å‘布。" #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:131 -msgid "Hosts in the private addressbook can be accessed by you but their addresses are never distributed to others." -msgstr "您å¯ä»¥è®¿é—®ç§æœ‰åœ°å€ç°¿ä¸çš„网站,但它们的地å€ç»ä¸ä¼šé€šè¿‡æ‚¨çš„公开地å€ç°¿å‘布给别人。" +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:133 -msgid "The private addressbook can also be used for aliases of hosts in your other addressbooks." +msgid "" +"The private addressbook can also be used for aliases of hosts in your other " +"addressbooks." msgstr "ç§æœ‰åœ°å€ç°¿è¿˜å¯ä»¥è¢«ç”¨æ¥è®¾ç½®ç½‘站别å。" #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:132 @@ -408,7 +476,8 @@ msgid "The subscription file contains a list of i2p URLs." msgstr "订阅文件是一个I2P链接列表。" #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:134 -msgid "The addressbook application regularly checks this list for new eepsites." +msgid "" +"The addressbook application regularly checks this list for new eepsites." msgstr "地å€ç°¿ç¨‹åºå®šæœŸé€šè¿‡è¿™äº›é“¾æŽ¥æ£€æŸ¥æ˜¯å¦æœ‰æ–°çš„I2P匿å网站。" #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:136 @@ -416,17 +485,22 @@ msgid "Those URLs refer to published hosts.txt files." msgstr "这些URL指å‘公开å‘布的hosts.txt文件。" #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:138 -msgid "The default subscription is the hosts.txt from www.i2p2.i2p, which is updated infrequently." +msgid "" +"The default subscription is the hosts.txt from www.i2p2.i2p, which is " +"updated infrequently." msgstr "默认订阅是 www.i2p2.i2p æ供的 hosts.txt,æ¤æ–‡ä»¶å¾ˆå°‘更新。" #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:140 -msgid "So it is a good idea to add additional subscriptions to sites that have the latest addresses." +msgid "" +"So it is a good idea to add additional subscriptions to sites that have the " +"latest addresses." msgstr "所以订阅一些网站的最新地å€ç°¿æ˜¯ä¸ªä¸é”™çš„主æ„。" #: ../src/tmp/i2p/susi/dns/jsp/subscriptions_jsp.java:142 msgid "See the FAQ for a list of subscription URLs." -msgstr "其他æ¥æºçš„订阅链接å‚è§I2P站点的 <a href=\"http://www.i2p2.i2p/faq_zh.html\">FAQ</a>" +msgstr "" +"其他æ¥æºçš„订阅链接å‚è§I2P站点的 <a href=\"http://www.i2p2.i2p/faq_zh.html" +"\">FAQ</a>" #~ msgid "Delete" #~ msgstr "åˆ é™¤" - diff --git a/apps/susidns/src/bmsg.sh b/apps/susidns/src/bmsg.sh deleted file mode 100644 index b9d294b32336537241eb2f9953fb65673c93b524..0000000000000000000000000000000000000000 --- a/apps/susidns/src/bmsg.sh +++ /dev/null @@ -1,17 +0,0 @@ -# -# Update messages_xx.po and messages_xx.class files, -# from both java and jsp sources. -# Requires installed programs xgettext, msgfmt, msgmerge, and find. -# zzz - public domain -# - -## launching sh.exe with -login parameter will open a shell with the current path always pointing to \bin\ -## need to cd into our orignal path - where we call sh.exe from. - -cd $CALLFROM -## echo $PWD - -## except this everything is the same with bundle-message.sh -## walking - public domain :-D - -source bundle-messages.sh $PARAS \ No newline at end of file diff --git a/apps/susidns/src/build.xml b/apps/susidns/src/build.xml index 8244d37cfb7dc2d1ebad4a1e3390ec64cb7e6bf1..d2dc2f121b7383f03a905a30fba065563b03526d 100644 --- a/apps/susidns/src/build.xml +++ b/apps/susidns/src/build.xml @@ -23,13 +23,16 @@ <pathelement location="../../../core/java/build/i2p.jar" /> </path> <property name="javac.compilerargs" value="" /> + <target name="compile"> <mkdir dir="${bin}" /> <javac debug="true" deprecation="on" source="1.5" target="1.5" + includeAntRuntime="false" classpathref="cp" destdir="${bin}" srcdir="${src}" includes="**/*.java" > <compilerarg line="${javac.compilerargs}" /> </javac> </target> + <target name="precompilejsp" unless="precompilejsp.uptodate"> <delete file="WEB-INF/web-fragment.xml" /> <delete file="WEB-INF/web-out.xml" /> @@ -47,6 +50,7 @@ <arg value="./jsp" /> </java> <javac debug="true" deprecation="on" source="1.5" target="1.5" + includeAntRuntime="false" destdir="${bin}" srcdir="${tmp}" includes="**/*.java" classpathref="cp"> <compilerarg line="${javac.compilerargs}" /> </javac> @@ -61,8 +65,20 @@ <srcfiles dir= "." includes="jsp/*.jsp, WEB-INF/web-template.xml"/> </uptodate> - <target name="all" depends="compile,precompilejsp,bundle,war"/> - <target name="war"> + <target name="all" depends="war"/> + + <target name="war" depends="compile, precompilejsp, bundle, warUpToDate" unless="war.uptodate" > + <exec executable="mtn" outputproperty="workspace.changes" errorproperty="mtn.error2" failifexecutionfails="false" > + <arg value="list" /> + <arg value="changed" /> + <arg value="." /> + </exec> + <!-- \n in an attribute value generates an invalid manifest --> + <exec executable="tr" inputstring="${workspace.changes}" outputproperty="workspace.changes.tr" errorproperty="mtn.error2" failifexecutionfails="false" > + <arg value="-s" /> + <arg value="[:space:]" /> + <arg value="," /> + </exec> <war destfile="${project}.war" webxml="WEB-INF/web-out.xml"> <fileset dir="."> <include name="WEB-INF/**/*.class"/> @@ -74,21 +90,32 @@ <include name="index.html"/> <include name="WEB-INF/classes/${project}.properties"/> </fileset> + <manifest> + <attribute name="Build-Date" value="${build.timestamp}" /> + <attribute name="Base-Revision" value="${workspace.version}" /> + <attribute name="Workspace-Changes" value="${workspace.changes.tr}" /> + </manifest> </war> </target> + <target name="warUpToDate"> + <uptodate property="war.uptodate" targetfile="${project}.war"> + <srcfiles dir= "." includes="WEB-INF/web-out.xml WEB-INF/**/*.class images/*.png css.css index.html WEB-INF/classes/${project}.properties" /> + </uptodate> + </target> + <target name="bundle" depends="compile, precompilejsp"> <!-- Update the messages_*.po files. We need to supply the bat file for windows, and then change the fail property to true --> - <exec executable="sh" osfamily="unix" failifexecutionfails="false" > + <exec executable="sh" osfamily="unix" failifexecutionfails="true" > <arg value="./bundle-messages.sh" /> </exec> - <exec executable="sh" osfamily="mac" failifexecutionfails="false" > + <exec executable="sh" osfamily="mac" failifexecutionfails="true" > <arg value="./bundle-messages.sh" /> </exec> - <exec executable="cmd" osfamily="windows" failifexecutionfails="false" > - <arg value="/c" /> - <arg value="bundle-messages.bat" /> + <!-- multi-lang is optional --> + <exec executable="sh" osfamily="windows" failifexecutionfails="false" > + <arg value="./bundle-messages.sh" /> </exec> </target> @@ -102,9 +129,8 @@ <arg value="./bundle-messages.sh" /> <arg value="-p" /> </exec> - <exec executable="cmd" osfamily="windows" failifexecutionfails="true" > - <arg value="/c" /> - <arg value="bundle-messages.bat" /> + <exec executable="sh" osfamily="windows" failifexecutionfails="true" > + <arg value="./bundle-messages.sh" /> <arg value="-p" /> </exec> </target> diff --git a/apps/susidns/src/bundle-messages.bat b/apps/susidns/src/bundle-messages.bat deleted file mode 100644 index 90feca972a6457eebf97f9bdbea6028ac88d7789..0000000000000000000000000000000000000000 --- a/apps/susidns/src/bundle-messages.bat +++ /dev/null @@ -1,26 +0,0 @@ -@echo off -set Callfrom=%cd% -set Paras=%1 - -rem before calling make sure you have msys and mingw 's "bin" path -rem in your current searching path -rem type "set path" to check -if not exist ..\locale\*.only goto updateALL - -rem put a messages_xx.only(eg messages_zh.only) into locale folder -rem this script will only touch the po file(eg zh) you specified, leaving other po files untact. - -for %%i in (..\locale\*.only) do set PO=%%~ni -echo [Notice] Yu choose to Ony update the choosen file: %PO%.po -for %%i in (..\locale\*.po) do if not %%~ni==%PO% ren %%i %%~ni.po- - -call sh --login %cd%\bmsg.sh - -for %%i in (..\locale\*.po-) do if not %%~ni==%PO% ren %%i %%~ni.po -goto end - -:updateALL -call sh --login %cd%\bmsg.sh - -:end -echo End of Message Bundling \ No newline at end of file diff --git a/apps/susidns/src/bundle-messages.sh b/apps/susidns/src/bundle-messages.sh index b1cd377b3ff9511229b49b14cd43370047f48973..349eb3f1db83ffe33ca0e267cdf9ef57417f0f30 100755 --- a/apps/susidns/src/bundle-messages.sh +++ b/apps/susidns/src/bundle-messages.sh @@ -18,6 +18,14 @@ then POUPDATE=1 fi +# on windows, one must specify the path of commnad find +# since windows has its own retarded version of find. +if which find|grep -q -i windows ; then + export PATH=.:/bin:/usr/local/bin:$PATH +fi +# Fast mode - update ondemond +# set LG2 to the language you need in envrionment varibales to enable this + # add ../src/ so the refs will work in the po file JPATHS="../src/java/ ../src/tmp/" for i in ../locale/messages_*.po @@ -26,6 +34,11 @@ do LG=${i#../locale/messages_} LG=${LG%.po} + # skip, if specified + if [ $LG2 ]; then + [ $LG != $LG2 ] && continue || echo INFO: Language update is set to [$LG2] only. + fi + if [ "$POUPDATE" = "1" ] then # make list of java files newer than the .po file @@ -72,15 +85,19 @@ do touch $i fi - echo "Generating ${CLASS}_$LG ResourceBundle..." + if [ "$LG" != "en" ] + then + # only generate for non-source language + echo "Generating ${CLASS}_$LG ResourceBundle..." - # convert to class files in build/obj - msgfmt --java --statistics -r $CLASS -l $LG -d WEB-INF/classes $i - if [ $? -ne 0 ] - then - echo 'Warning - msgfmt failed, not updating translations' - break - fi + # convert to class files in build/obj + msgfmt --java --statistics -r $CLASS -l $LG -d WEB-INF/classes $i + if [ $? -ne 0 ] + then + echo 'Warning - msgfmt failed, not updating translations' + break + fi + fi done rm -f $TMPFILE # todo: return failure diff --git a/apps/susidns/src/images/how_fr.png b/apps/susidns/src/images/how_fr.png new file mode 100644 index 0000000000000000000000000000000000000000..43da5d091e98e8a034b523799d89976080c4a981 Binary files /dev/null and b/apps/susidns/src/images/how_fr.png differ diff --git a/apps/susimail/build.xml b/apps/susimail/build.xml index 9ab38ce42e60e352ced5472c0fe28b2c60c9362e..b38edf9b9ad9ffa1a8be29e232e337bdf4c66d31 100644 --- a/apps/susimail/build.xml +++ b/apps/susimail/build.xml @@ -10,6 +10,7 @@ <javac srcdir="./src/src" debug="true" deprecation="off" source="1.5" target="1.5" + includeAntRuntime="false" destdir="./src/WEB-INF/classes"> <compilerarg line="${javac.compilerargs}" /> <classpath> @@ -20,11 +21,66 @@ </javac> </target> <target name="jar" depends="compile, war" /> - <target name="war" depends="compile"> + + <target name="war" depends="compile, bundle, warUpToDate" unless="war.uptodate" > + <exec executable="mtn" outputproperty="workspace.changes" errorproperty="mtn.error2" failifexecutionfails="false" > + <arg value="list" /> + <arg value="changed" /> + <arg value="." /> + </exec> + <!-- \n in an attribute value generates an invalid manifest --> + <exec executable="tr" inputstring="${workspace.changes}" outputproperty="workspace.changes.tr" errorproperty="mtn.error2" failifexecutionfails="false" > + <arg value="-s" /> + <arg value="[:space:]" /> + <arg value="," /> + </exec> <war destfile="susimail.war" webxml="src/WEB-INF/web.xml" basedir="src/" excludes="WEB-INF/web.xml LICENSE src/**/*"> + <manifest> + <attribute name="Build-Date" value="${build.timestamp}" /> + <attribute name="Base-Revision" value="${workspace.version}" /> + <attribute name="Workspace-Changes" value="${workspace.changes.tr}" /> + </manifest> </war> </target> + + <target name="warUpToDate"> + <uptodate property="war.uptodate" targetfile="susimail.war"> + <srcfiles dir= "src" excludes="LICENSE src/**/*" /> + </uptodate> + </target> + + <target name="bundle" depends="compile"> + <!-- Update the messages_*.po files. + We need to supply the bat file for windows, and then change the fail property to true --> + <exec executable="sh" osfamily="unix" failifexecutionfails="true" > + <arg value="./bundle-messages.sh" /> + </exec> + <exec executable="sh" osfamily="mac" failifexecutionfails="true" > + <arg value="./bundle-messages.sh" /> + </exec> + <!-- multi-lang is optional --> + <exec executable="sh" osfamily="windows" failifexecutionfails="false" > + <arg value="./bundle-messages.sh" /> + </exec> + </target> + + <target name="poupdate" depends="builddep, compile"> + <!-- Update the messages_*.po files. --> + <exec executable="sh" osfamily="unix" failifexecutionfails="true" > + <arg value="./bundle-messages.sh" /> + <arg value="-p" /> + </exec> + <exec executable="sh" osfamily="mac" failifexecutionfails="true" > + <arg value="./bundle-messages.sh" /> + <arg value="-p" /> + </exec> + <exec executable="sh" osfamily="windows" failifexecutionfails="true" > + <arg value="./bundle-messages.sh" /> + <arg value="-p" /> + </exec> + </target> + <target name="javadoc"> <mkdir dir="./build" /> <mkdir dir="./build/javadoc" /> diff --git a/apps/susimail/bundle-messages.sh b/apps/susimail/bundle-messages.sh new file mode 100644 index 0000000000000000000000000000000000000000..10b6f150abc9b2517f448f55a6c4f689dd553151 --- /dev/null +++ b/apps/susimail/bundle-messages.sh @@ -0,0 +1,102 @@ +# +# Update messages_xx.po and messages_xx.class files, +# from both java and jsp sources. +# Requires installed programs xgettext, msgfmt, msgmerge, and find. +# +# usage: +# bundle-messages.sh (generates the resource bundle from the .po file) +# bundle-messages.sh -p (updates the .po file from the source tags, then generates the resource bundle) +# +# zzz - public domain +# +CLASS=i2p.susi.webmail.messages +TMPFILE=javafiles.txt +export TZ=UTC + +if [ "$1" = "-p" ] +then + POUPDATE=1 +fi + +# on windows, one must specify the path of commnad find +# since windows has its own retarded version of find. +if which find|grep -q -i windows ; then + export PATH=.:/bin:/usr/local/bin:$PATH +fi +# Fast mode - update ondemond +# set LG2 to the language you need in envrionment varibales to enable this + +# add ../java/ so the refs will work in the po file +JPATHS="src" +for i in locale/messages_*.po +do + # get language + LG=${i#locale/messages_} + LG=${LG%.po} + + # skip, if specified + if [ $LG2 ]; then + [ $LG != $LG2 ] && continue || echo INFO: Language update is set to [$LG2] only. + fi + + if [ "$POUPDATE" = "1" ] + then + # make list of java files newer than the .po file + find $JPATHS -name *.java -newer $i > $TMPFILE + fi + + if [ -s src/WEB-INF/classes/i2p/susi/webmail/messages_$LG.class -a \ + src/WEB-INF/classes/i2p/susi/webmail/messages_$LG.class -nt $i -a \ + ! -s $TMPFILE ] + then + continue + fi + + if [ "$POUPDATE" = "1" ] + then + echo "Updating the $i file from the tags..." + # extract strings from java and jsp files, and update messages.po files + # translate calls must be one of the forms: + # _("foo") + # _x("foo") + # To start a new translation, copy the header from an old translation to the new .po file, + # then ant distclean poupdate. + find $JPATHS -name *.java > $TMPFILE + xgettext -f $TMPFILE -F -L java --from-code=UTF-8 --add-comments\ + --keyword=_ --keyword=_x \ + -o ${i}t + if [ $? -ne 0 ] + then + echo 'Warning - xgettext failed, not updating translations' + rm -f ${i}t + break + fi + msgmerge -U --backup=none $i ${i}t + if [ $? -ne 0 ] + then + echo 'Warning - msgmerge failed, not updating translations' + rm -f ${i}t + break + fi + rm -f ${i}t + # so we don't do this again + touch $i + fi + + if [ "$LG" != "en" ] + then + # only generate for non-source language + echo "Generating ${CLASS}_$LG ResourceBundle..." + + # convert to class files in build/obj + msgfmt --java --statistics -r $CLASS -l $LG -d src/WEB-INF/classes $i + if [ $? -ne 0 ] + then + echo 'Warning - msgfmt failed, not updating translations' + break + fi + fi +done +rm -f $TMPFILE +# todo: return failure +exit 0 diff --git a/apps/susimail/locale/messages_de.po b/apps/susimail/locale/messages_de.po new file mode 100644 index 0000000000000000000000000000000000000000..f00349039f89807ccdccbae0dfe84901941d030a --- /dev/null +++ b/apps/susimail/locale/messages_de.po @@ -0,0 +1,441 @@ +# I2P +# Copyright (C) 2009 The I2P Project +# This file is distributed under the same license as the susimail package. +# To contribute translations, see http://www.i2p2.de/newdevelopers +# foo <foo@bar>, 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: I2P susimail\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-03-12 22:04+0000\n" +"PO-Revision-Date: 2011-03-13 12:31+0100\n" +"Last-Translator: mixxy <m1xxy@mail.i2p>\n" +"Language-Team: mixxy <m1xxy@mail.i2p>\n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: src/src/i2p/susi/webmail/WebMail.java:454 +msgid "unknown" +msgstr "unbekannt" + +#: src/src/i2p/susi/webmail/WebMail.java:473 +msgid "Warning: no transfer encoding found, fallback to 7bit." +msgstr "Warnung: keine Ãœbertragungskodierung gefunden, Rückgriff auf 7-bit" + +#: src/src/i2p/susi/webmail/WebMail.java:478 +#, java-format +msgid "No encoder found for encoding \\''{0}\\''." +msgstr "kein Kodierer für Kodierung \\''{0}\\'' gefunden" + +#: src/src/i2p/susi/webmail/WebMail.java:484 +msgid "Warning: no charset found, fallback to US-ASCII." +msgstr "Warnung: kein Zeichensatz gefunden; Rückgriff auf US-ASCII" + +#: src/src/i2p/susi/webmail/WebMail.java:498 +#, java-format +msgid "Charset \\''{0}\\'' not supported." +msgstr "Zeichensatz \\''{0}\\'' nicht unterstützt" + +#: src/src/i2p/susi/webmail/WebMail.java:502 +#, java-format +msgid "Part ({0}) not shown, because of {1}" +msgstr "Teil ({0}) aufgrund von {1} nicht angezeigt" + +#: src/src/i2p/susi/webmail/WebMail.java:525 +msgid "Download" +msgstr "Herunterladen" + +#: src/src/i2p/susi/webmail/WebMail.java:525 +msgid "File is packed into a zipfile for security reasons." +msgstr "Die Datei wurde aus Sicherheitsgründen in ein Zip-Archiv gepackt." + +#: src/src/i2p/susi/webmail/WebMail.java:525 +#, java-format +msgid "attachment ({0})." +msgstr "Anhang ({0})." + +#: src/src/i2p/susi/webmail/WebMail.java:529 +#, java-format +msgid "Attachment ({0})." +msgstr "Anhang ({0})." + +#: src/src/i2p/susi/webmail/WebMail.java:579 +msgid "Need username for authentication." +msgstr "Benutzername zur Authentifizierung benötigt" + +#: src/src/i2p/susi/webmail/WebMail.java:583 +msgid "Need password for authentication." +msgstr "Passwort zur Authentifizierung benötigt" + +#: src/src/i2p/susi/webmail/WebMail.java:587 +msgid "Need hostname for connect." +msgstr "Host-Name für die Verbindung benötigt" + +#: src/src/i2p/susi/webmail/WebMail.java:592 +msgid "Need port number for pop3 connect." +msgstr "POP3-Port für die Verbindung benötigt" + +#: src/src/i2p/susi/webmail/WebMail.java:599 +msgid "POP3 port number is not in range 0..65535." +msgstr "Der POP3-Port liegt nicht im Bereich 0-65535." + +#: src/src/i2p/susi/webmail/WebMail.java:605 +msgid "POP3 port number is invalid." +msgstr "ungültiger POP3-Port" + +#: src/src/i2p/susi/webmail/WebMail.java:611 +msgid "Need port number for smtp connect." +msgstr "SMTP-Port für die SMTP-Verbindung benötigt" + +#: src/src/i2p/susi/webmail/WebMail.java:618 +msgid "SMTP port number is not in range 0..65535." +msgstr "Der SMTP-Port liegt nicht im Bereich 0-65535." + +#: src/src/i2p/susi/webmail/WebMail.java:624 +msgid "SMTP port number is invalid." +msgstr "ungültiger SMTP-Port" + +#: src/src/i2p/susi/webmail/WebMail.java:671 +msgid "User logged out." +msgstr "Benutzer wurde abgemeldet" + +#: src/src/i2p/susi/webmail/WebMail.java:675 +msgid "Internal error, lost connection." +msgstr "interner Fehler; Verbindung unterbrochen" + +#: src/src/i2p/susi/webmail/WebMail.java:771 +#, java-format +msgid "On {0} {1} wrote:" +msgstr "Am {0} schrieb {1}:" + +#: src/src/i2p/susi/webmail/WebMail.java:818 +msgid "begin forwarded mail" +msgstr "Anfang weitergeleiteter Nachricht" + +#: src/src/i2p/susi/webmail/WebMail.java:840 +msgid "end forwarded mail" +msgstr "Ende weitergeleiteter Nachricht" + +#: src/src/i2p/susi/webmail/WebMail.java:847 +#: src/src/i2p/susi/webmail/WebMail.java:1701 +msgid "Could not fetch mail body." +msgstr "konnte den Körper der Nachricht nicht holen" + +#: src/src/i2p/susi/webmail/WebMail.java:875 +msgid "Message id not valid." +msgstr "ungültige Nachrichten-ID" + +#: src/src/i2p/susi/webmail/WebMail.java:958 +#, java-format +msgid "No Encoding found for {0}" +msgstr "keine Kodierung für {0} gefunden" + +#: src/src/i2p/susi/webmail/WebMail.java:962 +#, java-format +msgid "Could not encode data: {0}" +msgstr "Konte Daten nicht kodieren: {0}" + +#: src/src/i2p/susi/webmail/WebMail.java:967 +#, java-format +msgid "Error reading uploaded file: {0}" +msgstr "Fehler beim Lesen der hochzuladenen Datei: {0}" + +#: src/src/i2p/susi/webmail/WebMail.java:1045 +msgid "Error parsing download parameter." +msgstr "Fehler beim Parsen des Download-Parameters" + +#: src/src/i2p/susi/webmail/WebMail.java:1089 +msgid "Invalid pagesize number, resetting to default value." +msgstr "ungültige Seitengröße, wird auf Standardwert zurückgesetzt" + +#: src/src/i2p/susi/webmail/WebMail.java:1113 +msgid "No messages marked for deletion." +msgstr "Keine Nachrichten zum Löschen markiert" + +#: src/src/i2p/susi/webmail/WebMail.java:1133 +#, java-format +msgid "Error deleting message: {0}" +msgstr "Fehler beim Löschen der Nachricht: {0}" + +#: src/src/i2p/susi/webmail/WebMail.java:1144 +#, java-format +msgid "1 message deleted." +msgid_plural "{0} messages deleted." +msgstr[0] "Eine Nachricht gelöscht" +msgstr[1] "{0} Nachrichten gelöscht" + +#: src/src/i2p/susi/webmail/WebMail.java:1264 +#: src/src/i2p/susi/webmail/WebMail.java:1587 +msgid "Login" +msgstr "Anmelden" + +#: src/src/i2p/susi/webmail/WebMail.java:1266 +#, java-format +msgid "1 Message" +msgid_plural "{0} Messages" +msgstr[0] "Eine Nachricht" +msgstr[1] "{0} Nachrichten" + +#: src/src/i2p/susi/webmail/WebMail.java:1268 +msgid "Show Message" +msgstr "Nachricht anzeigen" + +#: src/src/i2p/susi/webmail/WebMail.java:1325 +#, java-format +msgid "Error decoding content: {0}" +msgstr "Fehler beim Dekodieren des Inhalts: {0}" + +#: src/src/i2p/susi/webmail/WebMail.java:1330 +msgid "Error decoding content: No encoder found." +msgstr "Fehler bei der Dekodierung: kein Kodierer gefunden" + +#: src/src/i2p/susi/webmail/WebMail.java:1377 +msgid "no subject" +msgstr "kein Betreff" + +#: src/src/i2p/susi/webmail/WebMail.java:1394 +msgid "Found no valid sender address." +msgstr "Keine gültige Absenderadresse vorgefunden" + +#: src/src/i2p/susi/webmail/WebMail.java:1400 +#, java-format +msgid "Found no valid address in \\''{0}\\''." +msgstr "keine gültige Adresse in \\''{0}\\''" + +#: src/src/i2p/susi/webmail/WebMail.java:1419 +msgid "No recipients found." +msgstr "Keine Empfänger gefunden" + +#: src/src/i2p/susi/webmail/WebMail.java:1426 +msgid "Quoted printable encoder not available." +msgstr "Der angegebene druckbare Kodierer ist nicht verfügbar." + +#: src/src/i2p/susi/webmail/WebMail.java:1431 +msgid "Header line encoder not available." +msgstr "Kodierer für die Kopfzeilen nicht verfügbar" + +#: src/src/i2p/susi/webmail/WebMail.java:1482 +msgid "Mail sent." +msgstr "Mail versandt." + +#: src/src/i2p/susi/webmail/WebMail.java:1519 +msgid "Send" +msgstr "Senden" + +#: src/src/i2p/susi/webmail/WebMail.java:1520 +msgid "Cancel" +msgstr "Abbruch" + +#: src/src/i2p/susi/webmail/WebMail.java:1521 +msgid "Delete Attachment" +msgstr "Anhang löschen" + +#: src/src/i2p/susi/webmail/WebMail.java:1522 +#: src/src/i2p/susi/webmail/WebMail.java:1607 +#: src/src/i2p/susi/webmail/WebMail.java:1688 +msgid "Reload Config" +msgstr "Einstellungen neu laden" + +#: src/src/i2p/susi/webmail/WebMail.java:1523 +#: src/src/i2p/susi/webmail/WebMail.java:1608 +#: src/src/i2p/susi/webmail/WebMail.java:1689 +msgid "Logout" +msgstr "Abmelden" + +#: src/src/i2p/susi/webmail/WebMail.java:1546 +#: src/src/i2p/susi/webmail/WebMail.java:1693 +msgid "From:" +msgstr "Von:" + +#: src/src/i2p/susi/webmail/WebMail.java:1547 +msgid "To:" +msgstr "An:" + +#: src/src/i2p/susi/webmail/WebMail.java:1548 +msgid "Cc:" +msgstr "Kopie an:" + +#: src/src/i2p/susi/webmail/WebMail.java:1549 +msgid "Bcc:" +msgstr "Blindkopie an:" + +#: src/src/i2p/susi/webmail/WebMail.java:1550 +#: src/src/i2p/susi/webmail/WebMail.java:1695 +msgid "Subject:" +msgstr "Betreff:" + +#: src/src/i2p/susi/webmail/WebMail.java:1551 +msgid "Bcc to self" +msgstr "Blindkopie zurück?" + +#: src/src/i2p/susi/webmail/WebMail.java:1554 +msgid "New Attachment:" +msgstr "Neuer Anhang:" + +#: src/src/i2p/susi/webmail/WebMail.java:1554 +msgid "Upload File" +msgstr "Datei hochladen" + +#: src/src/i2p/susi/webmail/WebMail.java:1560 +msgid "Attachments:" +msgstr "Anhänge:" + +#: src/src/i2p/susi/webmail/WebMail.java:1582 +msgid "User" +msgstr "Benutzer" + +#: src/src/i2p/susi/webmail/WebMail.java:1583 +msgid "Pass" +msgstr "Passwort" + +#: src/src/i2p/susi/webmail/WebMail.java:1584 +msgid "Host" +msgstr "Host" + +#: src/src/i2p/susi/webmail/WebMail.java:1585 +msgid "POP3-Port" +msgstr "POP3-Port" + +#: src/src/i2p/susi/webmail/WebMail.java:1586 +msgid "SMTP-Port" +msgstr "SMTP-Port" + +#: src/src/i2p/susi/webmail/WebMail.java:1587 +msgid "Create Account" +msgstr "Konto anlegen" + +#: src/src/i2p/susi/webmail/WebMail.java:1587 +msgid "Reset" +msgstr "Zurücksetzen" + +#: src/src/i2p/susi/webmail/WebMail.java:1599 +msgid "Really delete the marked messages?" +msgstr "Sollen die markierten Nachrichten wirklich gelöscht werden?" + +#: src/src/i2p/susi/webmail/WebMail.java:1599 +msgid "Yes, really delete them!" +msgstr "Ja, löschen" + +#: src/src/i2p/susi/webmail/WebMail.java:1601 +#: src/src/i2p/susi/webmail/WebMail.java:1680 +msgid "New" +msgstr "Verfassen" + +#: src/src/i2p/susi/webmail/WebMail.java:1602 +#: src/src/i2p/susi/webmail/WebMail.java:1681 +msgid "Reply" +msgstr "Antworten" + +#: src/src/i2p/susi/webmail/WebMail.java:1603 +#: src/src/i2p/susi/webmail/WebMail.java:1682 +msgid "Reply All" +msgstr "Allen antworten" + +#: src/src/i2p/susi/webmail/WebMail.java:1604 +#: src/src/i2p/susi/webmail/WebMail.java:1683 +msgid "Forward" +msgstr "Weiterleiten" + +#: src/src/i2p/susi/webmail/WebMail.java:1605 +#: src/src/i2p/susi/webmail/WebMail.java:1684 +msgid "Delete" +msgstr "Löschen" + +#: src/src/i2p/susi/webmail/WebMail.java:1606 +msgid "Check Mail" +msgstr "Nachrichten abrufen" + +#: src/src/i2p/susi/webmail/WebMail.java:1610 +msgid "Sender" +msgstr "Absender" + +#: src/src/i2p/susi/webmail/WebMail.java:1611 +msgid "Subject" +msgstr "Betreff" + +#: src/src/i2p/susi/webmail/WebMail.java:1612 +msgid "Date" +msgstr "Datum" + +#: src/src/i2p/susi/webmail/WebMail.java:1613 +msgid "Size" +msgstr "Größe" + +#: src/src/i2p/susi/webmail/WebMail.java:1639 +#, java-format +msgid "1 Byte" +msgid_plural "{0} Bytes" +msgstr[0] "1 Byte" +msgstr[1] "{0} Bytes" + +#: src/src/i2p/susi/webmail/WebMail.java:1644 +msgid "Mark All" +msgstr "Alles markieren" + +#: src/src/i2p/susi/webmail/WebMail.java:1645 +msgid "Invert Selection" +msgstr "Markierung umkehren" + +#: src/src/i2p/susi/webmail/WebMail.java:1646 +msgid "Clear" +msgstr "Verwerfen" + +#: src/src/i2p/susi/webmail/WebMail.java:1649 +#: src/src/i2p/susi/webmail/WebMail.java:1650 +msgid "First" +msgstr "erste" + +#: src/src/i2p/susi/webmail/WebMail.java:1649 +#: src/src/i2p/susi/webmail/WebMail.java:1650 +#: src/src/i2p/susi/webmail/WebMail.java:1685 +msgid "Previous" +msgstr "vorherige" + +#: src/src/i2p/susi/webmail/WebMail.java:1651 +#, java-format +msgid "Page {0} of {1}" +msgstr "Seite {0} von {1}" + +#: src/src/i2p/susi/webmail/WebMail.java:1653 +#: src/src/i2p/susi/webmail/WebMail.java:1654 +msgid "Last" +msgstr "letzte" + +#: src/src/i2p/susi/webmail/WebMail.java:1653 +#: src/src/i2p/susi/webmail/WebMail.java:1654 +#: src/src/i2p/susi/webmail/WebMail.java:1686 +msgid "Next" +msgstr "nächste" + +#: src/src/i2p/susi/webmail/WebMail.java:1657 +msgid "Pagesize:" +msgstr "Seitengröße" + +#: src/src/i2p/susi/webmail/WebMail.java:1658 +msgid "Set" +msgstr "festlegen" + +#: src/src/i2p/susi/webmail/WebMail.java:1668 +msgid "Really delete this message?" +msgstr "Diese Nachricht wirklich löschen?" + +#: src/src/i2p/susi/webmail/WebMail.java:1668 +msgid "Yes, really delete it!" +msgstr "Ja, wirklich löschen" + +#: src/src/i2p/susi/webmail/WebMail.java:1687 +msgid "Back to Folder" +msgstr "Zurück zur Ãœbersicht" + +#: src/src/i2p/susi/webmail/WebMail.java:1694 +msgid "Date:" +msgstr "Datum:" + +#: src/src/i2p/susi/webmail/WebMail.java:1705 +msgid "Could not fetch mail." +msgstr "Konnte Nachrichten nicht abrufen." + diff --git a/apps/susimail/locale/messages_en.po b/apps/susimail/locale/messages_en.po new file mode 100644 index 0000000000000000000000000000000000000000..aac4c983fcf565146cb7d8e927ec3e0d5a1c657e --- /dev/null +++ b/apps/susimail/locale/messages_en.po @@ -0,0 +1,440 @@ +# I2P +# Copyright (C) 2009 The I2P Project +# This file is distributed under the same license as the susimail package. +# To contribute translations, see http://www.i2p2.de/newdevelopers +# foo <foo@bar>, 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: I2P susimail\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-03-12 20:49+0000\n" +"PO-Revision-Date: 2010-06-15 14:09+0100\n" +"Last-Translator: duck <duck@mail.i2p>\n" +"Language-Team: duck <duck@mail.i2p>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: src/src/i2p/susi/webmail/WebMail.java:454 +msgid "unknown" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:473 +msgid "Warning: no transfer encoding found, fallback to 7bit." +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:478 +#, java-format +msgid "No encoder found for encoding \\''{0}\\''." +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:484 +msgid "Warning: no charset found, fallback to US-ASCII." +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:498 +#, java-format +msgid "Charset \\''{0}\\'' not supported." +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:502 +#, java-format +msgid "Part ({0}) not shown, because of {1}" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:525 +msgid "Download" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:525 +msgid "File is packed into a zipfile for security reasons." +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:525 +#, java-format +msgid "attachment ({0})." +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:529 +#, java-format +msgid "Attachment ({0})." +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:579 +msgid "Need username for authentication." +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:583 +msgid "Need password for authentication." +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:587 +msgid "Need hostname for connect." +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:592 +msgid "Need port number for pop3 connect." +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:599 +msgid "POP3 port number is not in range 0..65535." +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:605 +msgid "POP3 port number is invalid." +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:611 +msgid "Need port number for smtp connect." +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:618 +msgid "SMTP port number is not in range 0..65535." +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:624 +msgid "SMTP port number is invalid." +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:671 +msgid "User logged out." +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:675 +msgid "Internal error, lost connection." +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:771 +#, java-format +msgid "On {0} {1} wrote:" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:818 +msgid "begin forwarded mail" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:840 +msgid "end forwarded mail" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:847 +#: src/src/i2p/susi/webmail/WebMail.java:1701 +msgid "Could not fetch mail body." +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:875 +msgid "Message id not valid." +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:958 +#, java-format +msgid "No Encoding found for {0}" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:962 +#, java-format +msgid "Could not encode data: {0}" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:967 +#, java-format +msgid "Error reading uploaded file: {0}" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1045 +msgid "Error parsing download parameter." +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1089 +msgid "Invalid pagesize number, resetting to default value." +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1113 +msgid "No messages marked for deletion." +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1133 +#, java-format +msgid "Error deleting message: {0}" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1144 +#, java-format +msgid "1 message deleted." +msgid_plural "{0} messages deleted." +msgstr[0] "" +msgstr[1] "" + +#: src/src/i2p/susi/webmail/WebMail.java:1264 +#: src/src/i2p/susi/webmail/WebMail.java:1587 +msgid "Login" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1266 +#, java-format +msgid "1 Message" +msgid_plural "{0} Messages" +msgstr[0] "" +msgstr[1] "" + +#: src/src/i2p/susi/webmail/WebMail.java:1268 +msgid "Show Message" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1325 +#, java-format +msgid "Error decoding content: {0}" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1330 +msgid "Error decoding content: No encoder found." +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1377 +msgid "no subject" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1394 +msgid "Found no valid sender address." +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1400 +#, java-format +msgid "Found no valid address in \\''{0}\\''." +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1419 +msgid "No recipients found." +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1426 +msgid "Quoted printable encoder not available." +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1431 +msgid "Header line encoder not available." +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1482 +msgid "Mail sent." +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1519 +msgid "Send" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1520 +msgid "Cancel" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1521 +msgid "Delete Attachment" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1522 +#: src/src/i2p/susi/webmail/WebMail.java:1607 +#: src/src/i2p/susi/webmail/WebMail.java:1688 +msgid "Reload Config" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1523 +#: src/src/i2p/susi/webmail/WebMail.java:1608 +#: src/src/i2p/susi/webmail/WebMail.java:1689 +msgid "Logout" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1546 +#: src/src/i2p/susi/webmail/WebMail.java:1693 +msgid "From:" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1547 +msgid "To:" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1548 +msgid "Cc:" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1549 +msgid "Bcc:" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1550 +#: src/src/i2p/susi/webmail/WebMail.java:1695 +msgid "Subject:" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1551 +msgid "Bcc to self" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1554 +msgid "New Attachment:" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1554 +msgid "Upload File" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1560 +msgid "Attachments:" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1582 +msgid "User" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1583 +msgid "Pass" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1584 +msgid "Host" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1585 +msgid "POP3-Port" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1586 +msgid "SMTP-Port" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1587 +msgid "Create Account" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1587 +msgid "Reset" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1599 +msgid "Really delete the marked messages?" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1599 +msgid "Yes, really delete them!" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1601 +#: src/src/i2p/susi/webmail/WebMail.java:1680 +msgid "New" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1602 +#: src/src/i2p/susi/webmail/WebMail.java:1681 +msgid "Reply" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1603 +#: src/src/i2p/susi/webmail/WebMail.java:1682 +msgid "Reply All" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1604 +#: src/src/i2p/susi/webmail/WebMail.java:1683 +msgid "Forward" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1605 +#: src/src/i2p/susi/webmail/WebMail.java:1684 +msgid "Delete" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1606 +msgid "Check Mail" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1610 +msgid "Sender" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1611 +msgid "Subject" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1612 +msgid "Date" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1613 +msgid "Size" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1639 +#, java-format +msgid "1 Byte" +msgid_plural "{0} Bytes" +msgstr[0] "" +msgstr[1] "" + +#: src/src/i2p/susi/webmail/WebMail.java:1644 +msgid "Mark All" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1645 +msgid "Invert Selection" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1646 +msgid "Clear" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1649 +#: src/src/i2p/susi/webmail/WebMail.java:1650 +msgid "First" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1649 +#: src/src/i2p/susi/webmail/WebMail.java:1650 +#: src/src/i2p/susi/webmail/WebMail.java:1685 +msgid "Previous" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1651 +#, java-format +msgid "Page {0} of {1}" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1653 +#: src/src/i2p/susi/webmail/WebMail.java:1654 +msgid "Last" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1653 +#: src/src/i2p/susi/webmail/WebMail.java:1654 +#: src/src/i2p/susi/webmail/WebMail.java:1686 +msgid "Next" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1657 +msgid "Pagesize:" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1658 +msgid "Set" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1668 +msgid "Really delete this message?" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1668 +msgid "Yes, really delete it!" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1687 +msgid "Back to Folder" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1694 +msgid "Date:" +msgstr "" + +#: src/src/i2p/susi/webmail/WebMail.java:1705 +msgid "Could not fetch mail." +msgstr "" diff --git a/apps/susimail/locale/messages_es.po b/apps/susimail/locale/messages_es.po new file mode 100644 index 0000000000000000000000000000000000000000..8d930c4e70eec1ed3fc9639db47bddcf01893019 --- /dev/null +++ b/apps/susimail/locale/messages_es.po @@ -0,0 +1,441 @@ +# I2P +# Copyright (C) 2009 The I2P Project +# This file is distributed under the same license as the susimail package. +# To contribute translations, see http://www.i2p2.de/newdevelopers +# foo <foo@bar>, 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: I2P\n" +"Report-Msgid-Bugs-To: https://trac.i2p2.de/\n" +"POT-Creation-Date: 2011-03-12 20:49+0000\n" +"PO-Revision-Date: 2011-04-18 21:35+0100\n" +"Last-Translator: mixxy <m1xxy@mail.i2p>\n" +"Language-Team: Spanish (Castilian) <None>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: src/src/i2p/susi/webmail/WebMail.java:454 +msgid "unknown" +msgstr "desconocido" + +#: src/src/i2p/susi/webmail/WebMail.java:473 +msgid "Warning: no transfer encoding found, fallback to 7bit." +msgstr "Aviso: no se encuentra codificación de transferencia, volviendo a 7 bits." + +#: src/src/i2p/susi/webmail/WebMail.java:478 +#, java-format +msgid "No encoder found for encoding \\''{0}\\''." +msgstr "No se ha encontrado codificador para la codificación \\''{0}''\\." + +#: src/src/i2p/susi/webmail/WebMail.java:484 +msgid "Warning: no charset found, fallback to US-ASCII." +msgstr "Aviso: no se ha encontrado el juego de caracteres, volviendo a US-ASCII." + +#: src/src/i2p/susi/webmail/WebMail.java:498 +#, java-format +msgid "Charset \\''{0}\\'' not supported." +msgstr "juego de caracteres \\''{0}\\''no soportado." + +#: src/src/i2p/susi/webmail/WebMail.java:502 +#, java-format +msgid "Part ({0}) not shown, because of {1}" +msgstr "La parte ({0}) no se muestra, debido a {1}" + +#: src/src/i2p/susi/webmail/WebMail.java:525 +msgid "Download" +msgstr "Descarga" + +#: src/src/i2p/susi/webmail/WebMail.java:525 +msgid "File is packed into a zipfile for security reasons." +msgstr "El archivo está empaquetado en un archivo zip por razones de seguridad." + +#: src/src/i2p/susi/webmail/WebMail.java:525 +#, java-format +msgid "attachment ({0})." +msgstr "adjunto ({0})." + +#: src/src/i2p/susi/webmail/WebMail.java:529 +#, java-format +msgid "Attachment ({0})." +msgstr "Adjunto ({0})." + +#: src/src/i2p/susi/webmail/WebMail.java:579 +msgid "Need username for authentication." +msgstr "Es necesario un nombre de usuario para la autenticación." + +#: src/src/i2p/susi/webmail/WebMail.java:583 +msgid "Need password for authentication." +msgstr "Es necesaria una contraseña para la autenticación." + +#: src/src/i2p/susi/webmail/WebMail.java:587 +msgid "Need hostname for connect." +msgstr "Es necesario un nombre de host para la conexión." + +#: src/src/i2p/susi/webmail/WebMail.java:592 +msgid "Need port number for pop3 connect." +msgstr "Es necesario el número de puerto para conectar pop3." + +#: src/src/i2p/susi/webmail/WebMail.java:599 +msgid "POP3 port number is not in range 0..65535." +msgstr "El puerto POP3 no está en el rango 0..65535." + +#: src/src/i2p/susi/webmail/WebMail.java:605 +msgid "POP3 port number is invalid." +msgstr "El puerto POP3 no es válido." + +#: src/src/i2p/susi/webmail/WebMail.java:611 +msgid "Need port number for smtp connect." +msgstr "Es necesario el número de puerto para conectar smtp." + +#: src/src/i2p/susi/webmail/WebMail.java:618 +msgid "SMTP port number is not in range 0..65535." +msgstr "El puerto SMTP no está en el rango 0..65535." + +#: src/src/i2p/susi/webmail/WebMail.java:624 +msgid "SMTP port number is invalid." +msgstr "El puerto SMTP no es válido." + +#: src/src/i2p/susi/webmail/WebMail.java:671 +msgid "User logged out." +msgstr "Usuario desconectado." + +#: src/src/i2p/susi/webmail/WebMail.java:675 +msgid "Internal error, lost connection." +msgstr "Error interno, pérdida de conexión." + +#: src/src/i2p/susi/webmail/WebMail.java:771 +#, java-format +msgid "On {0} {1} wrote:" +msgstr "En {0} {1} escribió:" + +#: src/src/i2p/susi/webmail/WebMail.java:818 +msgid "begin forwarded mail" +msgstr "comenzar correo reenviado" + +#: src/src/i2p/susi/webmail/WebMail.java:840 +msgid "end forwarded mail" +msgstr "terminar correo reenviado" + +#: src/src/i2p/susi/webmail/WebMail.java:847 +#: src/src/i2p/susi/webmail/WebMail.java:1701 +msgid "Could not fetch mail body." +msgstr "No se pudo obtener el cuerpo del correo." + +#: src/src/i2p/susi/webmail/WebMail.java:875 +msgid "Message id not valid." +msgstr "ID del mensaje no válida." + +#: src/src/i2p/susi/webmail/WebMail.java:958 +#, java-format +msgid "No Encoding found for {0}" +msgstr "No se ha encontrado codificación para {0}" + +#: src/src/i2p/susi/webmail/WebMail.java:962 +#, java-format +msgid "Could not encode data: {0}" +msgstr "No se pudo codificar los datos: {0}" + +#: src/src/i2p/susi/webmail/WebMail.java:967 +#, java-format +msgid "Error reading uploaded file: {0}" +msgstr "Error al leer el archivo subido: {0}" + +#: src/src/i2p/susi/webmail/WebMail.java:1045 +msgid "Error parsing download parameter." +msgstr "Error al analizar parámetros de descarga." + +#: src/src/i2p/susi/webmail/WebMail.java:1089 +msgid "Invalid pagesize number, resetting to default value." +msgstr "Tamaño de página no válida, restableciendo a los valores predeterminados." + +#: src/src/i2p/susi/webmail/WebMail.java:1113 +msgid "No messages marked for deletion." +msgstr "No hay mensajes marcados para su eliminación." + +#: src/src/i2p/susi/webmail/WebMail.java:1133 +#, java-format +msgid "Error deleting message: {0}" +msgstr "Error al eliminar el mensaje: {0}" + +#: src/src/i2p/susi/webmail/WebMail.java:1144 +#, java-format +msgid "1 message deleted." +msgid_plural "{0} messages deleted." +msgstr[0] "1 mensaje eliminado." +msgstr[1] "{0} mensajes eliminados." + +#: src/src/i2p/susi/webmail/WebMail.java:1264 +#: src/src/i2p/susi/webmail/WebMail.java:1587 +msgid "Login" +msgstr "Iniciar sesión" + +#: src/src/i2p/susi/webmail/WebMail.java:1266 +#, java-format +msgid "1 Message" +msgid_plural "{0} Messages" +msgstr[0] "1 Mensaje" +msgstr[1] "{0} Mensajes" + +#: src/src/i2p/susi/webmail/WebMail.java:1268 +msgid "Show Message" +msgstr "Mostrar mensaje" + +#: src/src/i2p/susi/webmail/WebMail.java:1325 +#, java-format +msgid "Error decoding content: {0}" +msgstr "Error al descifrar el contenido: {0}" + +#: src/src/i2p/susi/webmail/WebMail.java:1330 +msgid "Error decoding content: No encoder found." +msgstr "Error al descifrar el contenido: No se ha encontrado codificador." + +#: src/src/i2p/susi/webmail/WebMail.java:1377 +msgid "no subject" +msgstr "sin asunto" + +#: src/src/i2p/susi/webmail/WebMail.java:1394 +msgid "Found no valid sender address." +msgstr "No se ha encontrado una dirección de remitente válida." + +#: src/src/i2p/susi/webmail/WebMail.java:1400 +#, java-format +msgid "Found no valid address in \\''{0}\\''." +msgstr "No se ha encontrado ninguna dirección válida en \\''{0}\\''." + +#: src/src/i2p/susi/webmail/WebMail.java:1419 +msgid "No recipients found." +msgstr "No se han encontrado destinatarios." + +#: src/src/i2p/susi/webmail/WebMail.java:1426 +msgid "Quoted printable encoder not available." +msgstr "El codificador imprimible citado no se encuentra disponible." + +#: src/src/i2p/susi/webmail/WebMail.java:1431 +msgid "Header line encoder not available." +msgstr "El codificador de lÃnea de encabezado no está disponible." + +#: src/src/i2p/susi/webmail/WebMail.java:1482 +msgid "Mail sent." +msgstr "Correo enviado." + +#: src/src/i2p/susi/webmail/WebMail.java:1519 +msgid "Send" +msgstr "Enviar" + +#: src/src/i2p/susi/webmail/WebMail.java:1520 +msgid "Cancel" +msgstr "Cancelar" + +#: src/src/i2p/susi/webmail/WebMail.java:1521 +msgid "Delete Attachment" +msgstr "Eliminar datos adjuntos" + +#: src/src/i2p/susi/webmail/WebMail.java:1522 +#: src/src/i2p/susi/webmail/WebMail.java:1607 +#: src/src/i2p/susi/webmail/WebMail.java:1688 +msgid "Reload Config" +msgstr "Actualizar configuración" + +#: src/src/i2p/susi/webmail/WebMail.java:1523 +#: src/src/i2p/susi/webmail/WebMail.java:1608 +#: src/src/i2p/susi/webmail/WebMail.java:1689 +msgid "Logout" +msgstr "Desconectarse" + +#: src/src/i2p/susi/webmail/WebMail.java:1546 +#: src/src/i2p/susi/webmail/WebMail.java:1693 +msgid "From:" +msgstr "De:" + +#: src/src/i2p/susi/webmail/WebMail.java:1547 +msgid "To:" +msgstr "Para:" + +#: src/src/i2p/susi/webmail/WebMail.java:1548 +msgid "Cc:" +msgstr "Cc:" + +#: src/src/i2p/susi/webmail/WebMail.java:1549 +msgid "Bcc:" +msgstr "CCO:" + +#: src/src/i2p/susi/webmail/WebMail.java:1550 +#: src/src/i2p/susi/webmail/WebMail.java:1695 +msgid "Subject:" +msgstr "Asunto:" + +#: src/src/i2p/susi/webmail/WebMail.java:1551 +msgid "Bcc to self" +msgstr "CCO a mà mismo" + +#: src/src/i2p/susi/webmail/WebMail.java:1554 +msgid "New Attachment:" +msgstr "Nuevo Archivo adjunto:" + +#: src/src/i2p/susi/webmail/WebMail.java:1554 +msgid "Upload File" +msgstr "Subir Archivo" + +#: src/src/i2p/susi/webmail/WebMail.java:1560 +msgid "Attachments:" +msgstr "Archivos adjuntos:" + +#: src/src/i2p/susi/webmail/WebMail.java:1582 +msgid "User" +msgstr "Usuario" + +#: src/src/i2p/susi/webmail/WebMail.java:1583 +msgid "Pass" +msgstr "Contraseña" + +#: src/src/i2p/susi/webmail/WebMail.java:1584 +msgid "Host" +msgstr "Host" + +#: src/src/i2p/susi/webmail/WebMail.java:1585 +msgid "POP3-Port" +msgstr "Puerto-POP3" + +#: src/src/i2p/susi/webmail/WebMail.java:1586 +msgid "SMTP-Port" +msgstr "Puerto-SMTP" + +#: src/src/i2p/susi/webmail/WebMail.java:1587 +msgid "Create Account" +msgstr "Crear una cuenta" + +#: src/src/i2p/susi/webmail/WebMail.java:1587 +msgid "Reset" +msgstr "Cancelar" + +#: src/src/i2p/susi/webmail/WebMail.java:1599 +msgid "Really delete the marked messages?" +msgstr "¿Realmente deseas borrar los mensajes marcados?" + +#: src/src/i2p/susi/webmail/WebMail.java:1599 +msgid "Yes, really delete them!" +msgstr "SÃ, realmente eliminarlos!" + +#: src/src/i2p/susi/webmail/WebMail.java:1601 +#: src/src/i2p/susi/webmail/WebMail.java:1680 +msgid "New" +msgstr "Nuevo" + +#: src/src/i2p/susi/webmail/WebMail.java:1602 +#: src/src/i2p/susi/webmail/WebMail.java:1681 +msgid "Reply" +msgstr "Responder" + +#: src/src/i2p/susi/webmail/WebMail.java:1603 +#: src/src/i2p/susi/webmail/WebMail.java:1682 +msgid "Reply All" +msgstr "Responder a todos" + +#: src/src/i2p/susi/webmail/WebMail.java:1604 +#: src/src/i2p/susi/webmail/WebMail.java:1683 +msgid "Forward" +msgstr "Reenviar" + +#: src/src/i2p/susi/webmail/WebMail.java:1605 +#: src/src/i2p/susi/webmail/WebMail.java:1684 +msgid "Delete" +msgstr "Eliminar" + +#: src/src/i2p/susi/webmail/WebMail.java:1606 +msgid "Check Mail" +msgstr "Comprobar correo" + +#: src/src/i2p/susi/webmail/WebMail.java:1610 +msgid "Sender" +msgstr "Remitente" + +#: src/src/i2p/susi/webmail/WebMail.java:1611 +msgid "Subject" +msgstr "Asunto" + +#: src/src/i2p/susi/webmail/WebMail.java:1612 +msgid "Date" +msgstr "Fecha" + +#: src/src/i2p/susi/webmail/WebMail.java:1613 +msgid "Size" +msgstr "Tamaño" + +#: src/src/i2p/susi/webmail/WebMail.java:1639 +#, java-format +msgid "1 Byte" +msgid_plural "{0} Bytes" +msgstr[0] "1 Byte" +msgstr[1] "{0} Bytes" + +#: src/src/i2p/susi/webmail/WebMail.java:1644 +msgid "Mark All" +msgstr "Marcar todos" + +#: src/src/i2p/susi/webmail/WebMail.java:1645 +msgid "Invert Selection" +msgstr "Invertir selección" + +#: src/src/i2p/susi/webmail/WebMail.java:1646 +msgid "Clear" +msgstr "Despejar" + +#: src/src/i2p/susi/webmail/WebMail.java:1649 +#: src/src/i2p/susi/webmail/WebMail.java:1650 +msgid "First" +msgstr "Primero" + +#: src/src/i2p/susi/webmail/WebMail.java:1649 +#: src/src/i2p/susi/webmail/WebMail.java:1650 +#: src/src/i2p/susi/webmail/WebMail.java:1685 +msgid "Previous" +msgstr "Anterior" + +#: src/src/i2p/susi/webmail/WebMail.java:1651 +#, java-format +msgid "Page {0} of {1}" +msgstr "Página {0} de {1}" + +#: src/src/i2p/susi/webmail/WebMail.java:1653 +#: src/src/i2p/susi/webmail/WebMail.java:1654 +msgid "Last" +msgstr "Última" + +#: src/src/i2p/susi/webmail/WebMail.java:1653 +#: src/src/i2p/susi/webmail/WebMail.java:1654 +#: src/src/i2p/susi/webmail/WebMail.java:1686 +msgid "Next" +msgstr "Siguiente" + +#: src/src/i2p/susi/webmail/WebMail.java:1657 +msgid "Pagesize:" +msgstr "Tamaño de página:" + +#: src/src/i2p/susi/webmail/WebMail.java:1658 +msgid "Set" +msgstr "Set" + +#: src/src/i2p/susi/webmail/WebMail.java:1668 +msgid "Really delete this message?" +msgstr "¿Realmente deseas borrar este mensaje?" + +#: src/src/i2p/susi/webmail/WebMail.java:1668 +msgid "Yes, really delete it!" +msgstr "SÃ, realmente eliminarlo!" + +#: src/src/i2p/susi/webmail/WebMail.java:1687 +msgid "Back to Folder" +msgstr "Volver a carpeta" + +#: src/src/i2p/susi/webmail/WebMail.java:1694 +msgid "Date:" +msgstr "Fecha:" + +#: src/src/i2p/susi/webmail/WebMail.java:1705 +msgid "Could not fetch mail." +msgstr "No se pudo descargar el correo." + diff --git a/apps/susimail/locale/messages_fr.po b/apps/susimail/locale/messages_fr.po new file mode 100644 index 0000000000000000000000000000000000000000..238ebd4e716d8d7587497e06d0879e3ed793a2f5 --- /dev/null +++ b/apps/susimail/locale/messages_fr.po @@ -0,0 +1,441 @@ +# I2P +# Copyright (C) 2009 The I2P Project +# This file is distributed under the same license as the susimail package. +# To contribute translations, see http://www.i2p2.de/newdevelopers +# foo <foo@bar>, 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: I2P susimail\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-03-24 16:49+0000\n" +"PO-Revision-Date: 2011-04-09 03:06+0100\n" +"Last-Translator: magma <magma@mail.i2p>\n" +"Language-Team: duck <duck@mail.i2p>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n >= 2)\n" + +#: src/src/i2p/susi/webmail/WebMail.java:454 +msgid "unknown" +msgstr "inconnu" + +#: src/src/i2p/susi/webmail/WebMail.java:473 +msgid "Warning: no transfer encoding found, fallback to 7bit." +msgstr "Avertissement: pas d'encodage de transfert trouvé: retour en 7bits." + +#: src/src/i2p/susi/webmail/WebMail.java:478 +#, java-format +msgid "No encoder found for encoding \\''{0}\\''." +msgstr "Pas d''encodeur trouvé pour encoder \"{0}\"." + +#: src/src/i2p/susi/webmail/WebMail.java:484 +msgid "Warning: no charset found, fallback to US-ASCII." +msgstr "Avertissement: aucun jeu de caractères trouvé, retour en ASCII-US" + +#: src/src/i2p/susi/webmail/WebMail.java:498 +#, java-format +msgid "Charset \\''{0}\\'' not supported." +msgstr "Jeu de caractères \\''{0}\\'' non pris en charge." + +#: src/src/i2p/susi/webmail/WebMail.java:502 +#, java-format +msgid "Part ({0}) not shown, because of {1}" +msgstr "Partie ({0}) non affichée car {1}" + +#: src/src/i2p/susi/webmail/WebMail.java:525 +msgid "Download" +msgstr "Télécharger" + +#: src/src/i2p/susi/webmail/WebMail.java:525 +msgid "File is packed into a zipfile for security reasons." +msgstr "Fichier compressé en zip par sécurité." + +#: src/src/i2p/susi/webmail/WebMail.java:525 +#, java-format +msgid "attachment ({0})." +msgstr "pièce jointe ({0})." + +#: src/src/i2p/susi/webmail/WebMail.java:529 +#, java-format +msgid "Attachment ({0})." +msgstr "Pièce jointe ({0})." + +#: src/src/i2p/susi/webmail/WebMail.java:579 +msgid "Need username for authentication." +msgstr "Identifiant requis pour l'authentification." + +#: src/src/i2p/susi/webmail/WebMail.java:583 +msgid "Need password for authentication." +msgstr "Mot de passe requis pour l'authentification." + +#: src/src/i2p/susi/webmail/WebMail.java:587 +msgid "Need hostname for connect." +msgstr "Nom d'hôte requis pour la connexion." + +#: src/src/i2p/susi/webmail/WebMail.java:592 +msgid "Need port number for pop3 connect." +msgstr "Port requis pour la connexion POP3." + +#: src/src/i2p/susi/webmail/WebMail.java:599 +msgid "POP3 port number is not in range 0..65535." +msgstr "Le port POP3 n'est pas compris entre 0 et 65535." + +#: src/src/i2p/susi/webmail/WebMail.java:605 +msgid "POP3 port number is invalid." +msgstr "Port POP3 incorrect." + +#: src/src/i2p/susi/webmail/WebMail.java:611 +msgid "Need port number for smtp connect." +msgstr "Port requis pour la connexion SMTP." + +#: src/src/i2p/susi/webmail/WebMail.java:618 +msgid "SMTP port number is not in range 0..65535." +msgstr "Le port SMTP n'est pas compris entre 0 et 65535." + +#: src/src/i2p/susi/webmail/WebMail.java:624 +msgid "SMTP port number is invalid." +msgstr "Port SMTP incorrect." + +#: src/src/i2p/susi/webmail/WebMail.java:671 +msgid "User logged out." +msgstr "Utilisateur déconnecté." + +#: src/src/i2p/susi/webmail/WebMail.java:675 +msgid "Internal error, lost connection." +msgstr "Erreur interne, connexion perdue." + +#: src/src/i2p/susi/webmail/WebMail.java:771 +#, java-format +msgid "On {0} {1} wrote:" +msgstr "Sur {0} {1} écrit:" + +#: src/src/i2p/susi/webmail/WebMail.java:818 +msgid "begin forwarded mail" +msgstr "tranfert du message commencé" + +#: src/src/i2p/susi/webmail/WebMail.java:840 +msgid "end forwarded mail" +msgstr "tranfert du message terminé" + +#: src/src/i2p/susi/webmail/WebMail.java:847 +#: src/src/i2p/susi/webmail/WebMail.java:1701 +msgid "Could not fetch mail body." +msgstr "Impossible de ramener le corps du message." + +#: src/src/i2p/susi/webmail/WebMail.java:875 +msgid "Message id not valid." +msgstr "ID de message incorrecte." + +#: src/src/i2p/susi/webmail/WebMail.java:958 +#, java-format +msgid "No Encoding found for {0}" +msgstr "Pas d''encodage trouvé pour {0}" + +#: src/src/i2p/susi/webmail/WebMail.java:962 +#, java-format +msgid "Could not encode data: {0}" +msgstr "Impossible d''encoder les données: {0}" + +#: src/src/i2p/susi/webmail/WebMail.java:967 +#, java-format +msgid "Error reading uploaded file: {0}" +msgstr "Erreur de lecture du fichier envoyé: {0}" + +#: src/src/i2p/susi/webmail/WebMail.java:1045 +msgid "Error parsing download parameter." +msgstr "Erreur d'analyse des paramètres de téléchargement." + +#: src/src/i2p/susi/webmail/WebMail.java:1089 +msgid "Invalid pagesize number, resetting to default value." +msgstr "Taille de page incorrecte: réinitialisation à la valeur par défaut." + +#: src/src/i2p/susi/webmail/WebMail.java:1113 +msgid "No messages marked for deletion." +msgstr "Aucun message marqué pour suppression" + +#: src/src/i2p/susi/webmail/WebMail.java:1133 +#, java-format +msgid "Error deleting message: {0}" +msgstr "Erreur de suppression du message: {0}" + +#: src/src/i2p/susi/webmail/WebMail.java:1144 +#, java-format +msgid "1 message deleted." +msgid_plural "{0} messages deleted." +msgstr[0] "{0} message supprimé" +msgstr[1] "{0} messages supprimés" + +#: src/src/i2p/susi/webmail/WebMail.java:1264 +#: src/src/i2p/susi/webmail/WebMail.java:1587 +msgid "Login" +msgstr "Identification" + +#: src/src/i2p/susi/webmail/WebMail.java:1266 +#, java-format +msgid "1 Message" +msgid_plural "{0} Messages" +msgstr[0] "{0} Message" +msgstr[1] "{0} Messages" + +#: src/src/i2p/susi/webmail/WebMail.java:1268 +msgid "Show Message" +msgstr "Afficher le message" + +#: src/src/i2p/susi/webmail/WebMail.java:1325 +#, java-format +msgid "Error decoding content: {0}" +msgstr "Erreur de décodage de contenu: {0}" + +#: src/src/i2p/susi/webmail/WebMail.java:1330 +msgid "Error decoding content: No encoder found." +msgstr "Erreur de décodage de contenu: pas d'encodeur trouvé." + +#: src/src/i2p/susi/webmail/WebMail.java:1377 +msgid "no subject" +msgstr "pas d'objet" + +#: src/src/i2p/susi/webmail/WebMail.java:1394 +msgid "Found no valid sender address." +msgstr "Adresse d'expéditeur correcte non trouvée" + +#: src/src/i2p/susi/webmail/WebMail.java:1400 +#, java-format +msgid "Found no valid address in \\''{0}\\''." +msgstr "Pas d''adresse correcte dans \\''{0}\\''." + +#: src/src/i2p/susi/webmail/WebMail.java:1419 +msgid "No recipients found." +msgstr "Pas de destinataire trouvé." + +#: src/src/i2p/susi/webmail/WebMail.java:1426 +msgid "Quoted printable encoder not available." +msgstr "Encodeur \"Quoted printable\" non disponible." + +#: src/src/i2p/susi/webmail/WebMail.java:1431 +msgid "Header line encoder not available." +msgstr "Ligne d'en-tête \"Encodeur\" non disponible." + +#: src/src/i2p/susi/webmail/WebMail.java:1482 +msgid "Mail sent." +msgstr "Message envoyé." + +#: src/src/i2p/susi/webmail/WebMail.java:1519 +msgid "Send" +msgstr "Envoyer" + +#: src/src/i2p/susi/webmail/WebMail.java:1520 +msgid "Cancel" +msgstr "Annuler" + +#: src/src/i2p/susi/webmail/WebMail.java:1521 +msgid "Delete Attachment" +msgstr "Supprimer la pièce jointe" + +#: src/src/i2p/susi/webmail/WebMail.java:1522 +#: src/src/i2p/susi/webmail/WebMail.java:1607 +#: src/src/i2p/susi/webmail/WebMail.java:1688 +msgid "Reload Config" +msgstr "Recharger la configuration" + +#: src/src/i2p/susi/webmail/WebMail.java:1523 +#: src/src/i2p/susi/webmail/WebMail.java:1608 +#: src/src/i2p/susi/webmail/WebMail.java:1689 +msgid "Logout" +msgstr "Déconnexion" + +#: src/src/i2p/susi/webmail/WebMail.java:1546 +#: src/src/i2p/susi/webmail/WebMail.java:1693 +msgid "From:" +msgstr "De:" + +#: src/src/i2p/susi/webmail/WebMail.java:1547 +msgid "To:" +msgstr "À:" + +#: src/src/i2p/susi/webmail/WebMail.java:1548 +msgid "Cc:" +msgstr "Cc:" + +#: src/src/i2p/susi/webmail/WebMail.java:1549 +msgid "Bcc:" +msgstr "Cci:" + +#: src/src/i2p/susi/webmail/WebMail.java:1550 +#: src/src/i2p/susi/webmail/WebMail.java:1695 +msgid "Subject:" +msgstr "Objet:" + +#: src/src/i2p/susi/webmail/WebMail.java:1551 +msgid "Bcc to self" +msgstr "Cci à moi-même" + +#: src/src/i2p/susi/webmail/WebMail.java:1554 +msgid "New Attachment:" +msgstr "Nouvelle pièce jointe:" + +#: src/src/i2p/susi/webmail/WebMail.java:1554 +msgid "Upload File" +msgstr "Envoyer le fichier" + +#: src/src/i2p/susi/webmail/WebMail.java:1560 +msgid "Attachments:" +msgstr "Pièces jointes:" + +#: src/src/i2p/susi/webmail/WebMail.java:1582 +msgid "User" +msgstr "Utilisateur" + +#: src/src/i2p/susi/webmail/WebMail.java:1583 +msgid "Pass" +msgstr "Mot de passe" + +#: src/src/i2p/susi/webmail/WebMail.java:1584 +msgid "Host" +msgstr "Hôte" + +#: src/src/i2p/susi/webmail/WebMail.java:1585 +msgid "POP3-Port" +msgstr "Port POP3" + +#: src/src/i2p/susi/webmail/WebMail.java:1586 +msgid "SMTP-Port" +msgstr "Port SMTP" + +#: src/src/i2p/susi/webmail/WebMail.java:1587 +msgid "Create Account" +msgstr "Créer un compte" + +#: src/src/i2p/susi/webmail/WebMail.java:1587 +msgid "Reset" +msgstr "Remise à zéro" + +#: src/src/i2p/susi/webmail/WebMail.java:1599 +msgid "Really delete the marked messages?" +msgstr "voulez-vous vraiment supprimer les messages marqués?" + +#: src/src/i2p/susi/webmail/WebMail.java:1599 +msgid "Yes, really delete them!" +msgstr "Oui, suppression!" + +#: src/src/i2p/susi/webmail/WebMail.java:1601 +#: src/src/i2p/susi/webmail/WebMail.java:1680 +msgid "New" +msgstr "Nouveau message" + +#: src/src/i2p/susi/webmail/WebMail.java:1602 +#: src/src/i2p/susi/webmail/WebMail.java:1681 +msgid "Reply" +msgstr "Répondre" + +#: src/src/i2p/susi/webmail/WebMail.java:1603 +#: src/src/i2p/susi/webmail/WebMail.java:1682 +msgid "Reply All" +msgstr "Répondre à tous" + +#: src/src/i2p/susi/webmail/WebMail.java:1604 +#: src/src/i2p/susi/webmail/WebMail.java:1683 +msgid "Forward" +msgstr "Transférer" + +#: src/src/i2p/susi/webmail/WebMail.java:1605 +#: src/src/i2p/susi/webmail/WebMail.java:1684 +msgid "Delete" +msgstr "Supprimer" + +#: src/src/i2p/susi/webmail/WebMail.java:1606 +msgid "Check Mail" +msgstr "Relever le courrier" + +#: src/src/i2p/susi/webmail/WebMail.java:1610 +msgid "Sender" +msgstr "De" + +#: src/src/i2p/susi/webmail/WebMail.java:1611 +msgid "Subject" +msgstr "Objet" + +#: src/src/i2p/susi/webmail/WebMail.java:1612 +msgid "Date" +msgstr "Date" + +#: src/src/i2p/susi/webmail/WebMail.java:1613 +msgid "Size" +msgstr "Taille" + +#: src/src/i2p/susi/webmail/WebMail.java:1639 +#, java-format +msgid "1 Byte" +msgid_plural "{0} Bytes" +msgstr[0] "{0} octet" +msgstr[1] "{0} octets" + +#: src/src/i2p/susi/webmail/WebMail.java:1644 +msgid "Mark All" +msgstr "Tout cocher" + +#: src/src/i2p/susi/webmail/WebMail.java:1645 +msgid "Invert Selection" +msgstr "Inverser la sélection" + +#: src/src/i2p/susi/webmail/WebMail.java:1646 +msgid "Clear" +msgstr "Effacer" + +#: src/src/i2p/susi/webmail/WebMail.java:1649 +#: src/src/i2p/susi/webmail/WebMail.java:1650 +msgid "First" +msgstr "Premier" + +#: src/src/i2p/susi/webmail/WebMail.java:1649 +#: src/src/i2p/susi/webmail/WebMail.java:1650 +#: src/src/i2p/susi/webmail/WebMail.java:1685 +msgid "Previous" +msgstr "Précédent" + +#: src/src/i2p/susi/webmail/WebMail.java:1651 +#, java-format +msgid "Page {0} of {1}" +msgstr "Page {0} sur {1}" + +#: src/src/i2p/susi/webmail/WebMail.java:1653 +#: src/src/i2p/susi/webmail/WebMail.java:1654 +msgid "Last" +msgstr "Dernier" + +#: src/src/i2p/susi/webmail/WebMail.java:1653 +#: src/src/i2p/susi/webmail/WebMail.java:1654 +#: src/src/i2p/susi/webmail/WebMail.java:1686 +msgid "Next" +msgstr "Suivant" + +#: src/src/i2p/susi/webmail/WebMail.java:1657 +msgid "Pagesize:" +msgstr "Taille de page:" + +#: src/src/i2p/susi/webmail/WebMail.java:1658 +msgid "Set" +msgstr "Définir" + +#: src/src/i2p/susi/webmail/WebMail.java:1668 +msgid "Really delete this message?" +msgstr "Voulez-vous vraiment supprimer ce message?" + +#: src/src/i2p/susi/webmail/WebMail.java:1668 +msgid "Yes, really delete it!" +msgstr "Oui, supprimer!" + +#: src/src/i2p/susi/webmail/WebMail.java:1687 +msgid "Back to Folder" +msgstr "Retour au dossier" + +#: src/src/i2p/susi/webmail/WebMail.java:1694 +msgid "Date:" +msgstr "Date:" + +#: src/src/i2p/susi/webmail/WebMail.java:1705 +msgid "Could not fetch mail." +msgstr "Impossible de ramener le courrier." + diff --git a/apps/susimail/locale/messages_nl.po b/apps/susimail/locale/messages_nl.po new file mode 100644 index 0000000000000000000000000000000000000000..411a02eb64961e636a4d62732b17054de9d0b0db --- /dev/null +++ b/apps/susimail/locale/messages_nl.po @@ -0,0 +1,440 @@ +# I2P +# Copyright (C) 2009 The I2P Project +# This file is distributed under the same license as the susimail package. +# To contribute translations, see http://www.i2p2.de/newdevelopers +# foo <foo@bar>, 2009. +# +msgid "" +msgstr "" +"Project-Id-Version: I2P susimail\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-03-12 20:49+0000\n" +"PO-Revision-Date: 2010-06-15 14:09+0100\n" +"Last-Translator: duck <duck@mail.i2p>\n" +"Language-Team: duck <duck@mail.i2p>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nl\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: src/src/i2p/susi/webmail/WebMail.java:454 +msgid "unknown" +msgstr "onbekend" + +#: src/src/i2p/susi/webmail/WebMail.java:473 +msgid "Warning: no transfer encoding found, fallback to 7bit." +msgstr "Waarschuwing: geen transfer encoding gevonden, terugval naar 7bit." + +#: src/src/i2p/susi/webmail/WebMail.java:478 +#, java-format +msgid "No encoder found for encoding \\''{0}\\''." +msgstr "Geen encoder gevonden voor de encoding \\''{0}\\''." + +#: src/src/i2p/susi/webmail/WebMail.java:484 +msgid "Warning: no charset found, fallback to US-ASCII." +msgstr "Waarschuwing: geen charset gevonden, terugval naar US-ASCII." + +#: src/src/i2p/susi/webmail/WebMail.java:498 +#, java-format +msgid "Charset \\''{0}\\'' not supported." +msgstr "Charset \\''{0}\\'' niet ondersteund." + +#: src/src/i2p/susi/webmail/WebMail.java:502 +#, java-format +msgid "Part ({0}) not shown, because of {1}" +msgstr "Deel ({0}) niet getoond, vanwege {1}" + +#: src/src/i2p/susi/webmail/WebMail.java:525 +msgid "Download" +msgstr "Download" + +#: src/src/i2p/susi/webmail/WebMail.java:525 +msgid "File is packed into a zipfile for security reasons." +msgstr "Bestand is verpakt in een zipbestand wegens veiligheid." + +#: src/src/i2p/susi/webmail/WebMail.java:525 +#, java-format +msgid "attachment ({0})." +msgstr "bijlage ({0})." + +#: src/src/i2p/susi/webmail/WebMail.java:529 +#, java-format +msgid "Attachment ({0})." +msgstr "Bijlage ({0})." + +#: src/src/i2p/susi/webmail/WebMail.java:579 +msgid "Need username for authentication." +msgstr "Gebruikersnaam nodig voor authenticatie." + +#: src/src/i2p/susi/webmail/WebMail.java:583 +msgid "Need password for authentication." +msgstr "Wachtwoord nodig voor authenticatie." + +#: src/src/i2p/susi/webmail/WebMail.java:587 +msgid "Need hostname for connect." +msgstr "Hostnaam nodig voor verbinding." + +#: src/src/i2p/susi/webmail/WebMail.java:592 +msgid "Need port number for pop3 connect." +msgstr "Poortnummer nodig voor pop3 verbinding." + +#: src/src/i2p/susi/webmail/WebMail.java:599 +msgid "POP3 port number is not in range 0..65535." +msgstr "POP3 poortnummer valt niet in het bereik 0..65535." + +#: src/src/i2p/susi/webmail/WebMail.java:605 +msgid "POP3 port number is invalid." +msgstr "POP3 poortnummer is ongeldig." + +#: src/src/i2p/susi/webmail/WebMail.java:611 +msgid "Need port number for smtp connect." +msgstr "Poortnummer nodig voor smtp verbinding." + +#: src/src/i2p/susi/webmail/WebMail.java:618 +msgid "SMTP port number is not in range 0..65535." +msgstr "SMTP poortnummer valt niet in het bereik 0..65535." + +#: src/src/i2p/susi/webmail/WebMail.java:624 +msgid "SMTP port number is invalid." +msgstr "SMTP poortnummer is ongeldig." + +#: src/src/i2p/susi/webmail/WebMail.java:671 +msgid "User logged out." +msgstr "Gebruiker is uitgelogged." + +#: src/src/i2p/susi/webmail/WebMail.java:675 +msgid "Internal error, lost connection." +msgstr "Interne fout, verbinding verbroken." + +#: src/src/i2p/susi/webmail/WebMail.java:771 +#, java-format +msgid "On {0} {1} wrote:" +msgstr "Op {0} schreef {1}:" + +#: src/src/i2p/susi/webmail/WebMail.java:818 +msgid "begin forwarded mail" +msgstr "begin doorgestuurde mail" + +#: src/src/i2p/susi/webmail/WebMail.java:840 +msgid "end forwarded mail" +msgstr "einde doorgestuurde mail" + +#: src/src/i2p/susi/webmail/WebMail.java:847 +#: src/src/i2p/susi/webmail/WebMail.java:1701 +msgid "Could not fetch mail body." +msgstr "Kon de body van het bericht niet ophalen." + +#: src/src/i2p/susi/webmail/WebMail.java:875 +msgid "Message id not valid." +msgstr "Message id is ongeldig." + +#: src/src/i2p/susi/webmail/WebMail.java:958 +#, java-format +msgid "No Encoding found for {0}" +msgstr "Geen Encoding gevonden voor {0}" + +#: src/src/i2p/susi/webmail/WebMail.java:962 +#, java-format +msgid "Could not encode data: {0}" +msgstr "Kon de data niet encoden: {0}" + +#: src/src/i2p/susi/webmail/WebMail.java:967 +#, java-format +msgid "Error reading uploaded file: {0}" +msgstr "Fout bij lezen van geupload bestand: {0}" + +#: src/src/i2p/susi/webmail/WebMail.java:1045 +msgid "Error parsing download parameter." +msgstr "Fout bij verwerken download parameter." + +#: src/src/i2p/susi/webmail/WebMail.java:1089 +msgid "Invalid pagesize number, resetting to default value." +msgstr "Ongeldig nummer voor paginagrootte, herstel naar standaardwaarde." + +#: src/src/i2p/susi/webmail/WebMail.java:1113 +msgid "No messages marked for deletion." +msgstr "Geen berichten gemarkeerd voor verwijdering." + +#: src/src/i2p/susi/webmail/WebMail.java:1133 +#, java-format +msgid "Error deleting message: {0}" +msgstr "Fout bij verwijderen van bericht: {0}" + +#: src/src/i2p/susi/webmail/WebMail.java:1144 +#, java-format +msgid "1 message deleted." +msgid_plural "{0} messages deleted." +msgstr[0] "1 bericht verwijderd." +msgstr[1] "{0} berichten verwijderd." + +#: src/src/i2p/susi/webmail/WebMail.java:1264 +#: src/src/i2p/susi/webmail/WebMail.java:1587 +msgid "Login" +msgstr "Login" + +#: src/src/i2p/susi/webmail/WebMail.java:1266 +#, java-format +msgid "1 Message" +msgid_plural "{0} Messages" +msgstr[0] "1 Bericht" +msgstr[1] "{0} Berichten" + +#: src/src/i2p/susi/webmail/WebMail.java:1268 +msgid "Show Message" +msgstr "Toon Bericht" + +#: src/src/i2p/susi/webmail/WebMail.java:1325 +#, java-format +msgid "Error decoding content: {0}" +msgstr "Fout bij decoden van inhoud: {0}" + +#: src/src/i2p/susi/webmail/WebMail.java:1330 +msgid "Error decoding content: No encoder found." +msgstr "Fout bij decoden van inhoud: Geen encoder gevonden." + +#: src/src/i2p/susi/webmail/WebMail.java:1377 +msgid "no subject" +msgstr "geen onderwerp" + +#: src/src/i2p/susi/webmail/WebMail.java:1394 +msgid "Found no valid sender address." +msgstr "Geen geldig afzender adres gevonden." + +#: src/src/i2p/susi/webmail/WebMail.java:1400 +#, java-format +msgid "Found no valid address in \\''{0}\\''." +msgstr "Geen geldig adres gevonden in \\''{0}\\''." + +#: src/src/i2p/susi/webmail/WebMail.java:1419 +msgid "No recipients found." +msgstr "Geen ontvangers gevonden." + +#: src/src/i2p/susi/webmail/WebMail.java:1426 +msgid "Quoted printable encoder not available." +msgstr "Gequote print encoder niet beschikbaar." + +#: src/src/i2p/susi/webmail/WebMail.java:1431 +msgid "Header line encoder not available." +msgstr "Kopregel encoder niet beschikbaar." + +#: src/src/i2p/susi/webmail/WebMail.java:1482 +msgid "Mail sent." +msgstr "Mail verzonden." + +#: src/src/i2p/susi/webmail/WebMail.java:1519 +msgid "Send" +msgstr "Verstuur" + +#: src/src/i2p/susi/webmail/WebMail.java:1520 +msgid "Cancel" +msgstr "Annuleer" + +#: src/src/i2p/susi/webmail/WebMail.java:1521 +msgid "Delete Attachment" +msgstr "Verwijder Bijlage" + +#: src/src/i2p/susi/webmail/WebMail.java:1522 +#: src/src/i2p/susi/webmail/WebMail.java:1607 +#: src/src/i2p/susi/webmail/WebMail.java:1688 +msgid "Reload Config" +msgstr "Herlaad Configuratie" + +#: src/src/i2p/susi/webmail/WebMail.java:1523 +#: src/src/i2p/susi/webmail/WebMail.java:1608 +#: src/src/i2p/susi/webmail/WebMail.java:1689 +msgid "Logout" +msgstr "Uitloggen" + +#: src/src/i2p/susi/webmail/WebMail.java:1546 +#: src/src/i2p/susi/webmail/WebMail.java:1693 +msgid "From:" +msgstr "Van:" + +#: src/src/i2p/susi/webmail/WebMail.java:1547 +msgid "To:" +msgstr "Aan:" + +#: src/src/i2p/susi/webmail/WebMail.java:1548 +msgid "Cc:" +msgstr "Cc:" + +#: src/src/i2p/susi/webmail/WebMail.java:1549 +msgid "Bcc:" +msgstr "Bcc:" + +#: src/src/i2p/susi/webmail/WebMail.java:1550 +#: src/src/i2p/susi/webmail/WebMail.java:1695 +msgid "Subject:" +msgstr "Onderwerp:" + +#: src/src/i2p/susi/webmail/WebMail.java:1551 +msgid "Bcc to self" +msgstr "Bcc zelf" + +#: src/src/i2p/susi/webmail/WebMail.java:1554 +msgid "New Attachment:" +msgstr "Nieuwe Bijlage:" + +#: src/src/i2p/susi/webmail/WebMail.java:1554 +msgid "Upload File" +msgstr "Upload Bestand" + +#: src/src/i2p/susi/webmail/WebMail.java:1560 +msgid "Attachments:" +msgstr "Bijlagen" + +#: src/src/i2p/susi/webmail/WebMail.java:1582 +msgid "User" +msgstr "Gebruiker" + +#: src/src/i2p/susi/webmail/WebMail.java:1583 +msgid "Pass" +msgstr "Wachtwoord" + +#: src/src/i2p/susi/webmail/WebMail.java:1584 +msgid "Host" +msgstr "Host" + +#: src/src/i2p/susi/webmail/WebMail.java:1585 +msgid "POP3-Port" +msgstr "POP3-Poort" + +#: src/src/i2p/susi/webmail/WebMail.java:1586 +msgid "SMTP-Port" +msgstr "SMTP-Poort" + +#: src/src/i2p/susi/webmail/WebMail.java:1587 +msgid "Create Account" +msgstr "Account Aanmaken" + +#: src/src/i2p/susi/webmail/WebMail.java:1587 +msgid "Reset" +msgstr "Herstel" + +#: src/src/i2p/susi/webmail/WebMail.java:1599 +msgid "Really delete the marked messages?" +msgstr "Wil je de gemarkeerde berichten daadwerkelijk verwijderen?" + +#: src/src/i2p/susi/webmail/WebMail.java:1599 +msgid "Yes, really delete them!" +msgstr "Ja, verwijder ze!" + +#: src/src/i2p/susi/webmail/WebMail.java:1601 +#: src/src/i2p/susi/webmail/WebMail.java:1680 +msgid "New" +msgstr "Nieuw" + +#: src/src/i2p/susi/webmail/WebMail.java:1602 +#: src/src/i2p/susi/webmail/WebMail.java:1681 +msgid "Reply" +msgstr "Beantwoorden" + +#: src/src/i2p/susi/webmail/WebMail.java:1603 +#: src/src/i2p/susi/webmail/WebMail.java:1682 +msgid "Reply All" +msgstr "Allen Beantwoorden" + +#: src/src/i2p/susi/webmail/WebMail.java:1604 +#: src/src/i2p/susi/webmail/WebMail.java:1683 +msgid "Forward" +msgstr "Doorsturen" + +#: src/src/i2p/susi/webmail/WebMail.java:1605 +#: src/src/i2p/susi/webmail/WebMail.java:1684 +msgid "Delete" +msgstr "Verwijder" + +#: src/src/i2p/susi/webmail/WebMail.java:1606 +msgid "Check Mail" +msgstr "Controlleer Mail" + +#: src/src/i2p/susi/webmail/WebMail.java:1610 +msgid "Sender" +msgstr "Verzender" + +#: src/src/i2p/susi/webmail/WebMail.java:1611 +msgid "Subject" +msgstr "Onderwerp" + +#: src/src/i2p/susi/webmail/WebMail.java:1612 +msgid "Date" +msgstr "Datum" + +#: src/src/i2p/susi/webmail/WebMail.java:1613 +msgid "Size" +msgstr "Grootte" + +#: src/src/i2p/susi/webmail/WebMail.java:1639 +#, java-format +msgid "1 Byte" +msgid_plural "{0} Bytes" +msgstr[0] "1 Byte" +msgstr[1] "{0} Bytes" + +#: src/src/i2p/susi/webmail/WebMail.java:1644 +msgid "Mark All" +msgstr "Allen Markeren" + +#: src/src/i2p/susi/webmail/WebMail.java:1645 +msgid "Invert Selection" +msgstr "Selectie Omkeren" + +#: src/src/i2p/susi/webmail/WebMail.java:1646 +msgid "Clear" +msgstr "Selectie Wissen" + +#: src/src/i2p/susi/webmail/WebMail.java:1649 +#: src/src/i2p/susi/webmail/WebMail.java:1650 +msgid "First" +msgstr "Eerste" + +#: src/src/i2p/susi/webmail/WebMail.java:1649 +#: src/src/i2p/susi/webmail/WebMail.java:1650 +#: src/src/i2p/susi/webmail/WebMail.java:1685 +msgid "Previous" +msgstr "Vorige" + +#: src/src/i2p/susi/webmail/WebMail.java:1651 +#, java-format +msgid "Page {0} of {1}" +msgstr "Pagina {0} van {1}" + +#: src/src/i2p/susi/webmail/WebMail.java:1653 +#: src/src/i2p/susi/webmail/WebMail.java:1654 +msgid "Last" +msgstr "Laatste" + +#: src/src/i2p/susi/webmail/WebMail.java:1653 +#: src/src/i2p/susi/webmail/WebMail.java:1654 +#: src/src/i2p/susi/webmail/WebMail.java:1686 +msgid "Next" +msgstr "Volgende" + +#: src/src/i2p/susi/webmail/WebMail.java:1657 +msgid "Pagesize:" +msgstr "Paginagrootte:" + +#: src/src/i2p/susi/webmail/WebMail.java:1658 +msgid "Set" +msgstr "Instellen" + +#: src/src/i2p/susi/webmail/WebMail.java:1668 +msgid "Really delete this message?" +msgstr "Werkelijk dit bericht verwijderen?" + +#: src/src/i2p/susi/webmail/WebMail.java:1668 +msgid "Yes, really delete it!" +msgstr "Ja, verwijder ze!" + +#: src/src/i2p/susi/webmail/WebMail.java:1687 +msgid "Back to Folder" +msgstr "Terug naar de Map" + +#: src/src/i2p/susi/webmail/WebMail.java:1694 +msgid "Date:" +msgstr "Datum:" + +#: src/src/i2p/susi/webmail/WebMail.java:1705 +msgid "Could not fetch mail." +msgstr "Kon de mail niet ophalen." diff --git a/apps/susimail/src/src/i2p/susi/webmail/Messages.java b/apps/susimail/src/src/i2p/susi/webmail/Messages.java new file mode 100644 index 0000000000000000000000000000000000000000..84b97450e2e7ee1a807f67f584d9f91dd4339516 --- /dev/null +++ b/apps/susimail/src/src/i2p/susi/webmail/Messages.java @@ -0,0 +1,38 @@ +package i2p.susi.webmail; + +import net.i2p.I2PAppContext; +import net.i2p.util.Translate; + +/** + * Translate strings for this package. + * @since 0.8.5 + */ +public class Messages { + private static final String BUNDLE_NAME = "i2p.susi.webmail.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); + } + + public static String getString(int n, String s, String p) { + return Translate.getString(n, s, p, I2PAppContext.getGlobalContext(), BUNDLE_NAME); + } +} diff --git a/apps/susimail/src/src/i2p/susi/webmail/WebMail.java b/apps/susimail/src/src/i2p/susi/webmail/WebMail.java index b356c73d17a1d41c090d2a746498535e7bc61264..c07947c289e3b4689dd3b2a86e805f208befc65f 100644 --- a/apps/susimail/src/src/i2p/susi/webmail/WebMail.java +++ b/apps/susimail/src/src/i2p/susi/webmail/WebMail.java @@ -27,6 +27,7 @@ import i2p.susi.debug.Debug; import i2p.susi.util.Config; import i2p.susi.util.Folder; import i2p.susi.util.ReadBuffer; +import i2p.susi.webmail.Messages; import i2p.susi.webmail.encoding.DecodingException; import i2p.susi.webmail.encoding.Encoding; import i2p.susi.webmail.encoding.EncodingException; @@ -450,7 +451,7 @@ public class WebMail extends HttpServlet ( mailPart.description != null ? mailPart.description + ", " : "" ) + ( mailPart.filename != null ? mailPart.filename + ", " : "" ) + ( mailPart.name != null ? mailPart.name + ", " : "" ) + - ( mailPart.type != null ? mailPart.type : "unknown" ) ); + ( mailPart.type != null ? mailPart.type : _("unknown") ) ); if( level == 0 && mailPart.version == null ) { /* @@ -469,18 +470,18 @@ public class WebMail extends HttpServlet String encoding = mailPart.encoding; if( encoding == null ) { encoding = "7bit"; - reason += "Warning: no transfer encoding found, fallback to 7bit." + br; + reason += _("Warning: no transfer encoding found, fallback to 7bit.") + br; } Encoding e = EncodingFactory.getEncoding( encoding ); if( e == null ) { showBody = false; - reason += "No encoder found for encoding '" + quoteHTML( encoding ) + "'."; + reason += _("No encoder found for encoding \\''{0}\\''.", quoteHTML( encoding )); } else { String charset = mailPart.charset; if( charset == null ) { charset = "US-ASCII"; - reason += "Warning: no charset found, fallback to US-ASCII." + br; + reason += _("Warning: no charset found, fallback to US-ASCII.") + br; } try { ReadBuffer decoded = e.decode( mailPart.buffer.content, mailPart.beginBody, mailPart.end - mailPart.beginBody ); @@ -494,11 +495,11 @@ public class WebMail extends HttpServlet } catch( UnsupportedEncodingException uee ) { showBody = false; - reason = "Charset '" + quoteHTML( mailPart.charset ) + "' not supported." + br; + reason = _("Charset \\''{0}\\'' not supported.", quoteHTML( mailPart.charset )) + br; } catch (Exception e1) { showBody = false; - reason += "Part (" + ident + ") not shown, because of " + e1.getClass().getName() + br; + reason += _("Part ({0}) not shown, because of {1}", ident, e1.getClass().getName()) + br; } } } @@ -521,11 +522,11 @@ public class WebMail extends HttpServlet if( prepareAttachment ) { if( html ) { out.println( "<p class=\"mailbody\">" ); - out.println( "<a target=\"_blank\" href=\"" + myself + "?" + DOWNLOAD + "=" + mailPart.hashCode() + "\">Download</a> attachment (" + ident + "). File is packed into a zipfile for security reasons." ); + out.println( "<a target=\"_blank\" href=\"" + myself + "?" + DOWNLOAD + "=" + mailPart.hashCode() + "\">" + _("Download") + "</a> " + _("attachment ({0}).", ident) + " " + _("File is packed into a zipfile for security reasons.") ); out.println( "</p>" ); } else { - out.println( "Attachment (" + ident + ")." ); + out.println( _("Attachment ({0}).", ident) ); } } if( html ) @@ -575,52 +576,52 @@ public class WebMail extends HttpServlet if( buttonPressed( request, LOGIN ) ) { if( user == null || user.length() == 0 ) { - sessionObject.error += "Need username for authentication.<br>"; + sessionObject.error += _("Need username for authentication.") + "<br>"; doContinue = false; } if( pass == null || pass.length() == 0 ) { - sessionObject.error += "Need password for authentication.<br>"; + sessionObject.error += _("Need password for authentication.") + "<br>"; doContinue = false; } if( host == null || host.length() == 0 ) { - sessionObject.error += "Need hostname for connect.<br>"; + sessionObject.error += _("Need hostname for connect.") + "<br>"; doContinue = false; } int pop3PortNo = 0; if( pop3Port == null || pop3Port.length() == 0 ) { - sessionObject.error += "Need port number for pop3 connect.<br>"; + sessionObject.error += _("Need port number for pop3 connect.") + "<br>"; doContinue = false; } else { try { pop3PortNo = Integer.parseInt( pop3Port ); if( pop3PortNo < 0 || pop3PortNo > 65535 ) { - sessionObject.error += "POP3 port number is not in range 0..65535.<br>"; + sessionObject.error += _("POP3 port number is not in range 0..65535.") + "<br>"; doContinue = false; } } catch( NumberFormatException nfe ) { - sessionObject.error += "POP3 port number is invalid.<br>"; + sessionObject.error += _("POP3 port number is invalid.") + "<br>"; doContinue = false; } } int smtpPortNo = 0; if( smtpPort == null || smtpPort.length() == 0 ) { - sessionObject.error += "Need port number for smtp connect.<br>"; + sessionObject.error += _("Need port number for smtp connect.") + "<br>"; doContinue = false; } else { try { smtpPortNo = Integer.parseInt( smtpPort ); if( smtpPortNo < 0 || smtpPortNo > 65535 ) { - sessionObject.error += "SMTP port number is not in range 0..65535.<br>"; + sessionObject.error += _("SMTP port number is not in range 0..65535.") + "<br>"; doContinue = false; } } catch( NumberFormatException nfe ) { - sessionObject.error += "SMTP port number is invalid.<br>"; + sessionObject.error += _("SMTP port number is invalid.") + "<br>"; doContinue = false; } } @@ -667,11 +668,11 @@ public class WebMail extends HttpServlet sessionObject.mailbox.close(); sessionObject.mailbox = null; } - sessionObject.info += "User logged out.<br>"; + sessionObject.info += _("User logged out.") + "<br>"; sessionObject.state = STATE_AUTH; } else if( sessionObject.mailbox == null ) { - sessionObject.error += "Internal error, lost connection.<br>"; + sessionObject.error += _("Internal error, lost connection.") + "<br>"; sessionObject.state = STATE_AUTH; } } @@ -767,7 +768,7 @@ public class WebMail extends HttpServlet sessionObject.subject = "Re: " + mail.formattedSubject; StringWriter text = new StringWriter(); PrintWriter pw = new PrintWriter( text ); - pw.println( "On " + mail.formattedDate + " " + sessionObject.replyTo + " wrote:" ); + pw.println( _("On {0} {1} wrote:", mail.formattedDate, sessionObject.replyTo) ); StringWriter text2 = new StringWriter(); PrintWriter pw2 = new PrintWriter( text2 ); showPart( pw2, mail.part, 0, TEXT_ONLY ); @@ -814,7 +815,7 @@ public class WebMail extends HttpServlet pw.println(); pw.println(); pw.println(); - pw.println( "---- begin forwarded mail ----" ); + pw.println( "---- " + _("begin forwarded mail") + " ----" ); pw.println( "From: " + sender ); if( mail.to != null ) { String pad = "To: "; @@ -836,14 +837,14 @@ public class WebMail extends HttpServlet pw.print( "Date: " + mail.dateString ); pw.println(); showPart( pw, mail.part, 0, TEXT_ONLY ); - pw.println( "---- end forwarded mail ----" ); + pw.println( "---- " + _("end forwarded mail") + " ----" ); pw.flush(); sessionObject.body = text.toString(); } sessionObject.state = STATE_NEW; } else { - sessionObject.error += "Could not fetch mail body.<br>"; + sessionObject.error += _("Could not fetch mail body.") + "<br>"; } } } @@ -871,7 +872,7 @@ public class WebMail extends HttpServlet } catch( NumberFormatException nfe ) { - sessionObject.error += "Message id not valid.<br>"; + sessionObject.error += _("Message id not valid.") + "<br>"; } } } @@ -954,16 +955,16 @@ public class WebMail extends HttpServlet sessionObject.attachments.add( attachment ); } else { - sessionObject.error += "No Encoding found for " + encodeTo + "<br>"; + sessionObject.error += _("No Encoding found for {0}", encodeTo) + "<br>"; } } catch (EncodingException e1) { - sessionObject.error += "Could not encode data: " + e1.getMessage(); + sessionObject.error += _("Could not encode data: {0}", e1.getMessage()); } } } catch (IOException e) { - sessionObject.error += "Error reading uploaded file: " + e.getMessage() + "<br>"; + sessionObject.error += _("Error reading uploaded file: {0}", e.getMessage()) + "<br>"; } } } @@ -1041,7 +1042,7 @@ public class WebMail extends HttpServlet sessionObject.showAttachment = part; } catch( NumberFormatException nfe ) { - sessionObject.error += "Error parsing download parameter."; + sessionObject.error += _("Error parsing download parameter."); } } } @@ -1085,7 +1086,7 @@ public class WebMail extends HttpServlet sessionObject.folder.setPageSize( pageSize ); } catch( NumberFormatException nfe ) { - sessionObject.error += "Invalid pagesize number, resetting to default value.<br>"; + sessionObject.error += _("Invalid pagesize number, resetting to default value.") + "<br>"; } } if( buttonPressed( request, PREVPAGE ) ) { @@ -1109,7 +1110,7 @@ public class WebMail extends HttpServlet if( m != -1 ) sessionObject.reallyDelete = true; else - sessionObject.error += "No messages marked for deletion.<br>"; + sessionObject.error += _("No messages marked for deletion.") + "<br>"; } else { int numberDeleted = 0; @@ -1129,7 +1130,7 @@ public class WebMail extends HttpServlet numberDeleted++; } else - sessionObject.error += "Error deleting message: " + sessionObject.mailbox.lastError() + "<br>"; + sessionObject.error += _("Error deleting message: {0}", sessionObject.mailbox.lastError()) + "<br>"; } } } @@ -1140,7 +1141,7 @@ public class WebMail extends HttpServlet sessionObject.mailbox.performDelete(); sessionObject.folder.setElements( sessionObject.mailbox.getUIDLs() ); sessionObject.pageChanged = true; - sessionObject.info += numberDeleted + " messages deleted."; + sessionObject.info += ngettext("1 message deleted.", "{0} messages deleted.", numberDeleted); } sessionObject.reallyDelete = false; } @@ -1260,11 +1261,11 @@ public class WebMail extends HttpServlet * build subtitle */ if( sessionObject.state == STATE_AUTH ) - subtitle = "Login"; + subtitle = _("Login"); else if( sessionObject.state == STATE_LIST ) - subtitle = "" + sessionObject.mailbox.getNumMails() + " Messages"; + subtitle = ngettext("1 Message", "{0} Messages", sessionObject.mailbox.getNumMails()); else if( sessionObject.state == STATE_SHOW ) - subtitle = "Show Message"; + subtitle = _("Show Message"); response.setContentType( "text/html" ); out.println( "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html>" ); @@ -1321,12 +1322,12 @@ public class WebMail extends HttpServlet content = encoding.decode( part.buffer.content, part.beginBody + 2, part.end - part.beginBody - 2 ); } catch (DecodingException e) { - sessionObject.error += "Error decoding content: " + e.getMessage() + "<br>"; + sessionObject.error += _("Error decoding content: {0}", e.getMessage()) + "<br>"; content = null; } } else { - sessionObject.error += "Error decoding content: No encoder found."; + sessionObject.error += _("Error decoding content: No encoder found."); content = null; } } @@ -1373,7 +1374,7 @@ public class WebMail extends HttpServlet String to = request.getParameter( NEW_TO ); String cc = request.getParameter( NEW_CC ); String bcc = request.getParameter( NEW_BCC ); - String subject = request.getParameter( NEW_SUBJECT, "no subject" ); + String subject = request.getParameter( NEW_SUBJECT, _("no subject") ); String text = request.getParameter( NEW_TEXT, "" ); String prop = Config.getProperty( CONFIG_SENDER_FIXED, "true" ); @@ -1390,13 +1391,13 @@ public class WebMail extends HttpServlet if( from == null || !Mail.validateAddress( from ) ) { ok = false; - sessionObject.error += "Found no valid sender address.<br>"; + sessionObject.error += _("Found no valid sender address.") + "<br>"; } else { sender = Mail.getAddress( from ); if( sender == null || sender.length() == 0 ) { ok = false; - sessionObject.error += "Found no valid address in '" + quoteHTML( from ) + "'.<br>"; + sessionObject.error += _("Found no valid address in \\''{0}\\''.", quoteHTML( from )) + "<br>"; } } @@ -1415,19 +1416,19 @@ public class WebMail extends HttpServlet if( recipients.isEmpty() ) { ok = false; - sessionObject.error += "No recipients found.<br>"; + sessionObject.error += _("No recipients found.") + "<br>"; } Encoding qp = EncodingFactory.getEncoding( "quoted-printable" ); Encoding hl = EncodingFactory.getEncoding( "HEADERLINE" ); if( qp == null ) { ok = false; - sessionObject.error += "Quoted printable encoder not available."; + sessionObject.error += _("Quoted printable encoder not available."); } if( hl == null ) { ok = false; - sessionObject.error += "Header line encoder not available."; + sessionObject.error += _("Header line encoder not available."); } if( ok ) { @@ -1478,7 +1479,7 @@ public class WebMail extends HttpServlet sessionObject.user, sessionObject.pass, sender, recipients.toArray(), body.toString() ) ) { - sessionObject.info += "Mail sent."; + sessionObject.info += _("Mail sent."); if( sessionObject.attachments != null ) sessionObject.attachments.clear(); @@ -1515,11 +1516,11 @@ public class WebMail extends HttpServlet */ private void showCompose( PrintWriter out, SessionObject sessionObject, RequestWrapper request ) { - out.println( button( SEND, "Send" ) + - button( CANCEL, "Cancel" ) + spacer + - (sessionObject.attachments != null && (!sessionObject.attachments.isEmpty()) ? button( DELETE_ATTACHMENT, "Delete Attachment" ) : button2( DELETE_ATTACHMENT, "Delete Attachment" ) ) + spacer + - button( RELOAD, "Reload Config" ) + spacer + - button( LOGOUT, "Logout" ) ); + out.println( button( SEND, _("Send") ) + + button( CANCEL, _("Cancel") ) + spacer + + (sessionObject.attachments != null && (!sessionObject.attachments.isEmpty()) ? button( DELETE_ATTACHMENT, _("Delete Attachment") ) : button2( DELETE_ATTACHMENT, _("Delete Attachment") ) ) + spacer + + button( RELOAD, _("Reload Config") ) + spacer + + button( LOGOUT, _("Logout") ) ); String from = (String)request.getParameter( NEW_FROM ); String fixed = Config.getProperty( CONFIG_SENDER_FIXED, "true" ); @@ -1542,21 +1543,21 @@ public class WebMail extends HttpServlet out.println( "<table cellspacing=\"0\" cellpadding=\"5\">\n" + "<tr><td colspan=\"2\" align=\"center\"><hr></td></tr>\n" + - "<tr><td align=\"right\">From:</td><td align=\"left\"><input type=\"text\" size=\"80\" name=\"" + NEW_FROM + "\" value=\"" + from + "\" " + ( fixed.compareToIgnoreCase( "false" ) != 0 ? "disabled" : "" ) +"></td></tr>\n" + - "<tr><td align=\"right\">To:</td><td align=\"left\"><input type=\"text\" size=\"80\" name=\"" + NEW_TO + "\" value=\"" + to + "\"></td></tr>\n" + - "<tr><td align=\"right\">Cc:</td><td align=\"left\"><input type=\"text\" size=\"80\" name=\"" + NEW_CC + "\" value=\"" + cc + "\"></td></tr>\n" + - "<tr><td align=\"right\">Bcc:</td><td align=\"left\"><input type=\"text\" size=\"80\" name=\"" + NEW_BCC + "\" value=\"" + bcc + "\"></td></tr>\n" + - "<tr><td align=\"right\">Subject:</td><td align=\"left\"><input type=\"text\" size=\"80\" name=\"" + NEW_SUBJECT + "\" value=\"" + subject + "\"></td></tr>\n" + - "<tr><td> </td><td align=\"left\"><input type=\"checkbox\" class=\"optbox\" name=\"" + NEW_BCC_TO_SELF + "\" value=\"1\"" + ( bccToSelf.compareToIgnoreCase( "false" ) != 0 ? "checked" : "" )+ ">Bcc to self</td></tr>\n" + + "<tr><td align=\"right\">" + _("From:") + "</td><td align=\"left\"><input type=\"text\" size=\"80\" name=\"" + NEW_FROM + "\" value=\"" + from + "\" " + ( fixed.compareToIgnoreCase( "false" ) != 0 ? "disabled" : "" ) +"></td></tr>\n" + + "<tr><td align=\"right\">" + _("To:") + "</td><td align=\"left\"><input type=\"text\" size=\"80\" name=\"" + NEW_TO + "\" value=\"" + to + "\"></td></tr>\n" + + "<tr><td align=\"right\">" + _("Cc:") + "</td><td align=\"left\"><input type=\"text\" size=\"80\" name=\"" + NEW_CC + "\" value=\"" + cc + "\"></td></tr>\n" + + "<tr><td align=\"right\">" + _("Bcc:") + "</td><td align=\"left\"><input type=\"text\" size=\"80\" name=\"" + NEW_BCC + "\" value=\"" + bcc + "\"></td></tr>\n" + + "<tr><td align=\"right\">" + _("Subject:") + "</td><td align=\"left\"><input type=\"text\" size=\"80\" name=\"" + NEW_SUBJECT + "\" value=\"" + subject + "\"></td></tr>\n" + + "<tr><td> </td><td align=\"left\"><input type=\"checkbox\" class=\"optbox\" name=\"" + NEW_BCC_TO_SELF + "\" value=\"1\"" + ( bccToSelf.compareToIgnoreCase( "false" ) != 0 ? "checked" : "" )+ ">" + _("Bcc to self") + "</td></tr>\n" + "<tr><td colspan=\"2\" align=\"center\"><textarea cols=\"" + Config.getProperty( CONFIG_COMPOSER_COLS, 80 )+ "\" rows=\"" + Config.getProperty( CONFIG_COMPOSER_ROWS, 10 )+ "\" name=\"" + NEW_TEXT + "\">" + text + "</textarea>" + "<tr><td colspan=\"2\" align=\"center\"><hr></td></tr>\n" + - "<tr><td align=\"right\">New Attachment:</td><td align=\"left\"><input type=\"file\" size=\"50%\" name=\"" + NEW_FILENAME + "\" value=\"\"><input type=\"submit\" name=\"" + NEW_UPLOAD + "\" value=\"Upload File\"></td></tr>" ); + "<tr><td align=\"right\">" + _("New Attachment:") + "</td><td align=\"left\"><input type=\"file\" size=\"50%\" name=\"" + NEW_FILENAME + "\" value=\"\"><input type=\"submit\" name=\"" + NEW_UPLOAD + "\" value=\"" + _("Upload File") + "\"></td></tr>" ); if( sessionObject.attachments != null && !sessionObject.attachments.isEmpty() ) { boolean wroteHeader = false; for( Iterator it = sessionObject.attachments.iterator(); it.hasNext(); ) { if( !wroteHeader ) { - out.println( "<tr><td colspan=\"2\" align=\"center\">Attachments:</td></tr>" ); + out.println( "<tr><td colspan=\"2\" align=\"center\">" + _("Attachments:") + "</td></tr>" ); wroteHeader = true; } Attachment attachment = (Attachment)it.next(); @@ -1578,12 +1579,12 @@ public class WebMail extends HttpServlet String smtp = Config.getProperty( CONFIG_PORTS_SMTP, "" + DEFAULT_SMTPPORT ); out.println( "<table cellspacing=\"0\" cellpadding=\"5\">\n" + - "<tr><td align=\"right\" width=\"30%\">User</td><td width=\"40%\" align=\"left\"><input type=\"text\" size=\"32\" name=\"" + USER + "\" value=\"" + ( RELEASE ? "" : "test") + "\"></td></tr>\n" + - "<tr><td align=\"right\" width=\"30%\">Pass</td><td width=\"40%\" align=\"left\"><input type=\"password\" size=\"32\" name=\"pass\" value=\"" + ( RELEASE ? "" : "test") + "\"></td></tr>\n" + - "<tr><td align=\"right\" width=\"30%\">Host</td><td width=\"40%\" align=\"left\"><input type=\"text\" size=\"32\" name=\"" + HOST +"\" value=\"" + host + "\"" + ( fixed ? " disabled" : "" ) + "></td></tr>\n" + - "<tr><td align=\"right\" width=\"30%\">POP3-Port</td><td width=\"40%\" align=\"left\"><input type=\"text\" size=\"32\" name=\"" + POP3 +"\" value=\"" + pop3 + "\"" + ( fixed ? " disabled" : "" ) + "></td></tr>\n" + - "<tr><td align=\"right\" width=\"30%\">SMTP-Port</td><td width=\"40%\" align=\"left\"><input type=\"text\" size=\"32\" name=\"" + SMTP +"\" value=\"" + smtp + "\"" + ( fixed ? " disabled" : "" ) + "></td></tr>\n" + - "<tr><td align=\"center\" colspan=\"2\"><a href=\"http://hq.postman.i2p/?page_id=16\">Create Account</a> " + button( LOGIN, "Login" ) + " <input type=\"reset\" value=\"Reset\"></td></tr>\n" + + "<tr><td align=\"right\" width=\"30%\">" + _("User") + "</td><td width=\"40%\" align=\"left\"><input type=\"text\" size=\"32\" name=\"" + USER + "\" value=\"" + ( RELEASE ? "" : "test") + "\"></td></tr>\n" + + "<tr><td align=\"right\" width=\"30%\">" + _("Pass") + "</td><td width=\"40%\" align=\"left\"><input type=\"password\" size=\"32\" name=\"pass\" value=\"" + ( RELEASE ? "" : "test") + "\"></td></tr>\n" + + "<tr><td align=\"right\" width=\"30%\">" + _("Host") + "</td><td width=\"40%\" align=\"left\"><input type=\"text\" size=\"32\" name=\"" + HOST +"\" value=\"" + host + "\"" + ( fixed ? " disabled" : "" ) + "></td></tr>\n" + + "<tr><td align=\"right\" width=\"30%\">" + _("POP3-Port") + "</td><td width=\"40%\" align=\"left\"><input type=\"text\" size=\"32\" name=\"" + POP3 +"\" value=\"" + pop3 + "\"" + ( fixed ? " disabled" : "" ) + "></td></tr>\n" + + "<tr><td align=\"right\" width=\"30%\">" + _("SMTP-Port") + "</td><td width=\"40%\" align=\"left\"><input type=\"text\" size=\"32\" name=\"" + SMTP +"\" value=\"" + smtp + "\"" + ( fixed ? " disabled" : "" ) + "></td></tr>\n" + + "<tr><td align=\"center\" colspan=\"2\"><a href=\"http://hq.postman.i2p/?page_id=16\">" + _("Create Account") + "</a> " + button( LOGIN, _("Login") ) + " <input type=\"reset\" value=\"" + _("Reset") + "\"></td></tr>\n" + "</table>"); } /** @@ -1595,21 +1596,21 @@ public class WebMail extends HttpServlet private void showFolder( PrintWriter out, SessionObject sessionObject, RequestWrapper request ) { if( sessionObject.reallyDelete ) { - out.println( "<p class=\"error\">Really delete the marked messages? " + button( REALLYDELETE, "Yes, really delete them!" ) + "</p>" ); + out.println( "<p class=\"error\">" + _("Really delete the marked messages?") + " " + button( REALLYDELETE, _("Yes, really delete them!") ) + "</p>" ); } - out.println( button( NEW, "New" ) + spacer + - button( REPLY, "Reply" ) + - button( REPLYALL, "Reply All" ) + - button( FORWARD, "Forward" ) + spacer + - button( DELETE, "Delete" ) + spacer + - button( REFRESH, "Check Mail" ) + spacer + - button( RELOAD, "Reload Config" ) + spacer + - button( LOGOUT, "Logout" ) + "<table cellspacing=\"0\" cellpadding=\"5\">\n" + + out.println( button( NEW, _("New") ) + spacer + + button( REPLY, _("Reply") ) + + button( REPLYALL, _("Reply All") ) + + button( FORWARD, _("Forward") ) + spacer + + button( DELETE, _("Delete") ) + spacer + + button( REFRESH, _("Check Mail") ) + spacer + + button( RELOAD, _("Reload Config") ) + spacer + + button( LOGOUT, _("Logout") ) + "<table cellspacing=\"0\" cellpadding=\"5\">\n" + "<tr><td colspan=\"8\"><hr></td></tr>\n<tr>" + - thSpacer + "<th>" + sortHeader( SORT_SENDER, "Sender" ) + "</th>" + - thSpacer + "<th>" + sortHeader( SORT_SUBJECT, "Subject" ) + "</th>" + - thSpacer + "<th>" + sortHeader( SORT_DATE, "Date" ) + sortHeader( SORT_ID, "" ) + "</th>" + - thSpacer + "<th>" + sortHeader( SORT_SIZE, "Size" ) + "</th></tr>" ); + thSpacer + "<th>" + sortHeader( SORT_SENDER, _("Sender") ) + "</th>" + + thSpacer + "<th>" + sortHeader( SORT_SUBJECT, _("Subject") ) + "</th>" + + thSpacer + "<th>" + sortHeader( SORT_DATE, _("Date") ) + sortHeader( SORT_ID, "" ) + "</th>" + + thSpacer + "<th>" + sortHeader( SORT_SIZE, _("Size") ) + "</th></tr>" ); int bg = 0; int i = 0; for( Iterator it = sessionObject.folder.currentPageIterator(); it != null && it.hasNext(); ) { @@ -1635,26 +1636,26 @@ public class WebMail extends HttpServlet ", invert=" + sessionObject.invert + ", clear=" + sessionObject.clear ); out.println( "<tr class=\"list" + bg + "\"><td><input type=\"checkbox\" class=\"optbox\" name=\"check" + i + "\" value=\"1\"" + - ( idChecked ? "checked" : "" ) + ">" + ( RELEASE ? "" : "" + i ) + "</td><td>" + link + mail.shortSender + "</a></td><td> </td><td>" + link + mail.shortSubject + "</a></td><td> </td><td>" + mail.formattedDate + "</a></td><td> </td><td>" + mail.size + " Bytes</a></td></tr>" ); + ( idChecked ? "checked" : "" ) + ">" + ( RELEASE ? "" : "" + i ) + "</td><td>" + link + mail.shortSender + "</a></td><td> </td><td>" + link + mail.shortSubject + "</a></td><td> </td><td>" + mail.formattedDate + "</a></td><td> </td><td>" + ngettext("1 Byte", "{0} Bytes", mail.size) + "</a></td></tr>" ); bg = 1 - bg; i++; } out.println( "<tr><td colspan=\"8\"><hr></td></tr>\n</table>" + - button( MARKALL, "Mark All" ) + - button( INVERT, "Invert Selection" ) + - button( CLEAR, "Clear" ) + + button( MARKALL, _("Mark All") ) + + button( INVERT, _("Invert Selection") ) + + button( CLEAR, _("Clear") ) + "<br>" + ( sessionObject.folder.isFirstPage() ? - button2( FIRSTPAGE, "First" ) + button2( PREVPAGE, "Previous" ) : - button( FIRSTPAGE, "First" ) + button( PREVPAGE, "Previous" ) ) + - " Page " + sessionObject.folder.getCurrentPage() + " of " + sessionObject.folder.getPages() + " " + + button2( FIRSTPAGE, _("First") ) + button2( PREVPAGE, _("Previous") ) : + button( FIRSTPAGE, _("First") ) + button( PREVPAGE, _("Previous") ) ) + + " " + _("Page {0} of {1}", sessionObject.folder.getCurrentPage(), sessionObject.folder.getPages()) + " " + ( sessionObject.folder.isLastPage() ? - button2( NEXTPAGE, "Next" ) + button2( LASTPAGE, "Last" ) : - button( NEXTPAGE, "Next" ) + button( LASTPAGE, "Last" ) ) + + button2( NEXTPAGE, _("Next") ) + button2( LASTPAGE, _("Last") ) : + button( NEXTPAGE, _("Next") ) + button( LASTPAGE, _("Last") ) ) + "<br>" + - "Pagesize: <input type=\"text\" name=\"" + PAGESIZE + "\" size=\"4\" value=\"" + sessionObject.folder.getPageSize() + "\">" + - button( SETPAGESIZE, "Set" ) ); + _("Pagesize:") + " <input type=\"text\" name=\"" + PAGESIZE + "\" size=\"4\" value=\"" + sessionObject.folder.getPageSize() + "\">" + + button( SETPAGESIZE, _("Set") ) ); } /** * @@ -1664,7 +1665,7 @@ public class WebMail extends HttpServlet private void showMessage( PrintWriter out, SessionObject sessionObject ) { if( sessionObject.reallyDelete ) { - out.println( "<p class=\"error\">Really delete this messages? " + button( REALLYDELETE, "Yes, really delete it!" ) + "</p>" ); + out.println( "<p class=\"error\">" + _("Really delete this message?") + " " + button( REALLYDELETE, _("Yes, really delete it!") ) + "</p>" ); } Mail mail = sessionObject.mailCache.getMail( sessionObject.showUIDL, MailCache.FETCH_ALL ); if( mail != null && mail.body != null && mail.part == null ) { @@ -1676,33 +1677,53 @@ public class WebMail extends HttpServlet out.println( quoteHTML( new String( mail.body.content, mail.body.offset, mail.body.length ) ) ); out.println( "-->" ); } - out.println( button( NEW, "New" ) + spacer + - button( REPLY, "Reply" ) + - button( REPLYALL, "Reply All" ) + - button( FORWARD, "Forward" ) + spacer + - button( DELETE, "Delete" ) + spacer + - ( sessionObject.folder.isFirstElement( sessionObject.showUIDL ) ? button2( PREV, "Previous" ) : button( PREV, "Previous" ) ) + - ( sessionObject.folder.isLastElement( sessionObject.showUIDL ) ? button2( NEXT, "Next" ) : button( NEXT, "Next" ) ) + spacer + - button( LIST, "Back to Folder" ) + spacer + - button( RELOAD, "Reload Config" ) + spacer + - button( LOGOUT, "Logout" ) ); + out.println( button( NEW, _("New") ) + spacer + + button( REPLY, _("Reply") ) + + button( REPLYALL, _("Reply All") ) + + button( FORWARD, _("Forward") ) + spacer + + button( DELETE, _("Delete") ) + spacer + + ( sessionObject.folder.isFirstElement( sessionObject.showUIDL ) ? button2( PREV, _("Previous") ) : button( PREV, _("Previous") ) ) + + ( sessionObject.folder.isLastElement( sessionObject.showUIDL ) ? button2( NEXT, _("Next") ) : button( NEXT, _("Next") ) ) + spacer + + button( LIST, _("Back to Folder") ) + spacer + + button( RELOAD, _("Reload Config") ) + spacer + + button( LOGOUT, _("Logout") ) ); if( mail != null ) { out.println( "<table cellspacing=\"0\" cellpadding=\"5\">\n" + "<tr><td colspan=\"2\" align=\"center\"><hr></td></tr>\n" + - "<tr class=\"mailhead\"><td align=\"right\">From:</td><td align=\"left\">" + quoteHTML( mail.formattedSender ) + "</td></tr>\n" + - "<tr class=\"mailhead\"><td align=\"right\">Date:</td><td align=\"left\">" + mail.quotedDate + "</td></tr>\n" + - "<tr class=\"mailhead\"><td align=\"right\">Subject:</td><td align=\"left\">" + quoteHTML( mail.formattedSubject ) + "</td></tr>\n" + + "<tr class=\"mailhead\"><td align=\"right\">" + _("From:") + "</td><td align=\"left\">" + quoteHTML( mail.formattedSender ) + "</td></tr>\n" + + "<tr class=\"mailhead\"><td align=\"right\">" + _("Date:") + "</td><td align=\"left\">" + mail.quotedDate + "</td></tr>\n" + + "<tr class=\"mailhead\"><td align=\"right\">" + _("Subject:") + "</td><td align=\"left\">" + quoteHTML( mail.formattedSubject ) + "</td></tr>\n" + "<tr><td colspan=\"2\" align=\"center\"><hr></td></tr>" ); if( mail.body != null ) { showPart( out, mail.part, 0, SHOW_HTML ); } else { - out.println( "<tr class=\"mailbody\"><td colspan=\"2\" align=\"center\"><p class=\"error\">Could not fetch mail body.</p></td></tr>" ); + out.println( "<tr class=\"mailbody\"><td colspan=\"2\" align=\"center\"><p class=\"error\">" + _("Could not fetch mail body.") + "</p></td></tr>" ); } } else { - out.println( "<tr class=\"mailbody\"><td colspan=\"2\" align=\"center\"><p class=\"error\">Could not fetch mail.</p></td></tr>" ); + out.println( "<tr class=\"mailbody\"><td colspan=\"2\" align=\"center\"><p class=\"error\">" + _("Could not fetch mail.") + "</p></td></tr>" ); } out.println( "<tr><td colspan=\"2\" align=\"center\"><hr></td></tr>\n</table>" ); } + + /** 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); + } + + /** translate */ + private String ngettext(String s, String p, int n) { + return Messages.getString(n, s, p); + } } diff --git a/apps/systray/java/build.xml b/apps/systray/java/build.xml index 9d48f902cbbf0bcafe163927deb50d91b93d8fbd..dc8f08afb81d6bf6a57d6cee18bbbaf01ccca8f2 100644 --- a/apps/systray/java/build.xml +++ b/apps/systray/java/build.xml @@ -16,28 +16,41 @@ source="1.5" target="1.5" destdir="./build/obj" + includeAntRuntime="false" includes="**/*.java" classpath="./lib/systray4j.jar:../../../core/java/build/i2p.jar" > <compilerarg line="${javac.compilerargs}" /> </javac> </target> - <target name="jar" depends="compile" unless="jar.uptodate"> - <mkdir dir="./build/jar_temp" /> - <copy todir="./build/jar_temp"> - <fileset dir="./build/obj" includes="**/*.class" /> - </copy> - <jar destfile="./build/systray.jar" basedir="./build/jar_temp" includes="**/*"> + + <target name="jar" depends="compile, jarUpToDate" unless="jar.uptodate"> + <exec executable="mtn" outputproperty="workspace.changes" errorproperty="mtn.error2" failifexecutionfails="false" > + <arg value="list" /> + <arg value="changed" /> + <arg value="." /> + </exec> + <!-- \n in an attribute value generates an invalid manifest --> + <exec executable="tr" inputstring="${workspace.changes}" outputproperty="workspace.changes.tr" errorproperty="mtn.error2" failifexecutionfails="false" > + <arg value="-s" /> + <arg value="[:space:]" /> + <arg value="," /> + </exec> + <jar destfile="./build/systray.jar" basedir="./build/obj" includes="**/*.class"> <manifest> <attribute name="Main-Class" value="net.i2p.apps.systray.SysTray" /> <attribute name="Class-Path" value="systray4j.jar" /> + <attribute name="Build-Date" value="${build.timestamp}" /> + <attribute name="Base-Revision" value="${workspace.version}" /> + <attribute name="Workspace-Changes" value="${workspace.changes.tr}" /> </manifest> </jar> - <delete dir="./build/jar_temp" /> </target> - <uptodate property="jar.uptodate" targetfile="./build/systray.jar"> - <srcfiles dir= "src" includes="**/*.java" /> - </uptodate> + <target name="jarUpToDate"> + <uptodate property="jar.uptodate" targetfile="./build/systray.jar"> + <srcfiles dir= "build/obj" includes="**/*.class" /> + </uptodate> + </target> <target name="javadoc"> <mkdir dir="./build" /> diff --git a/build.xml b/build.xml index 6a96b143c656619c52e5269e7225afdbd720aa77..51fd85ff555774aa4df30241a7e982d4845b847e 100644 --- a/build.xml +++ b/build.xml @@ -32,6 +32,7 @@ <echo message=" updaterRouter: updater with the i2p.jar and router.jar only" /> <echo message=" distclean: clean up all derived files" /> <echo message=" syndie: generate a standalone syndie install" /> + <echo message=" desktopgui: generate a standalone desktopgui 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" /> @@ -40,12 +41,9 @@ <echo message=" debian: generate Debian packages in ./debian/packages" /> <echo message=" (libc6-i686 and libc6-amd64 required, ant>=1.8 required)" /> <echo message=" debianrepo: build a Debian repository (reprepro required)" /> - <echo message=" updaterWithDesktopgui: tar the built files and desktopgui in an i2pupdate.zip" /> - <echo message=" pkgWithDesktopgui: distclean then package everything up with the desktopgui" /> - <echo message=" distWithDesktopgui: pkgWithDesktopgui and javadoc" /> - <echo message=" distcleanWithDesktopgui: clean up all derived files (including desktopgui files)" /> <echo message=" poupdate: update the .po files for translators" /> - </target> + <echo message=" pkg-portable-win32: build a minimum portable version for win32" /> + </target> <target name="debianhowto"> <echo message="To build debian packages, you must run dpkg-buildpackage as root in the source directory. It will then run ant for you. dpkg-buildpackage is found in the 'dpkg-dev' package. Also it should work fine to use the 'fakeroot' package with dpkg-buildpackage, if you don't want to run as root. Please read 'man dpkg-buildpackage' before building any packages yourself." /> </target> @@ -64,15 +62,14 @@ <target name="builddep" depends="builddepSmall, buildBOB, buildSAM, buildSusiMail, buildSusiDNS, buildI2PSnark" /> - <target name="builddepSmall" depends="buildrouter, buildSystray, buildRouterConsole, buildStreaming, buildI2PTunnel, buildAddressbook" /> + <target name="builddepSmall" depends="buildrouter, buildSystray, buildDesktopGui, buildRouterConsole, buildStreaming, buildI2PTunnel, buildAddressbook" /> <!-- start of buildX, one for each sub-build.xml. Do not put ant tasks in the sub-build.xmls anymore, so the build will go faster. --> - <!-- TODO remove I2PTunnel dependency in BOB --> - <target name="buildBOB" depends="buildStreaming, buildI2PTunnel" > + <target name="buildBOB" depends="buildStreaming" > <ant dir="apps/BOB/" target="jar" /> </target> @@ -100,11 +97,18 @@ <ant dir="apps/i2ptunnel/java/" target="build" /> </target> - <target name="buildRouterConsole" depends="buildrouter, buildSystray, buildJetty" > + <target name="buildDesktopGui" depends="buildCore, buildrouter" > +<!-- + <ant dir="apps/desktopgui" target="clean" /> +--> + <ant dir="apps/desktopgui" target="jar" /> + </target> + + <target name="buildRouterConsole" depends="buildrouter, buildSystray, buildDesktopGui, buildJetty" > <ant dir="apps/routerconsole/java/" target="jar" /> </target> - <target name="buildJetty" > + <target name="buildJetty" depends="buildProperties" > <ant dir="apps/jetty" target="build" /> </target> @@ -126,11 +130,21 @@ <copy file="router/java/build/router.jar" todir="build/" /> </target> - <target name="buildCore" > + <target name="buildCore" depends="buildProperties" > <ant dir="core/java/" target="jar" /> <copy file="core/java/build/i2p.jar" todir="build/" /> </target> + <target name="buildProperties" > + <exec executable="mtn" outputproperty="workspace.version" errorproperty="mtn.error1" failifexecutionfails="false" > + <arg value="automate" /> + <arg value="get_base_revision_id" /> + </exec> + <tstamp> + <format property="build.timestamp" pattern="yyyy-MM-dd HH:mm:ss z" timezone="UTC" locale="en" /> + </tstamp> + </target> + <!-- end of sub-build.xml targets --> <target name="buildWEB" depends="buildRouterConsole" > @@ -164,11 +178,13 @@ </condition> <ant target="doBuildEXE" /> </target> - <target name="doBuildEXE" unless="noExe"> + <target name="doBuildEXE" depends="buildProperties" unless="noExe"> <jar destfile="./build/launchi2p.jar"> <manifest> <attribute name="Main-Class" value="net.i2p.router.RouterLaunch" /> - <attribute name="Class-Path" value="lib/i2p.jar lib/router.jar lib/jbigi.jar lib/BOB.jar lib/sam.jar lib/mstreaming.jar lib/streaming.jar lib/routerconsole.jar lib/i2ptunnel.jar lib/org.mortbay.jetty.jar lib/javax.servlet.jar lib/jasper-compiler.jar lib/jasper-runtime.jar lib/commons-logging.jar lib/commons-el.jar lib/wrapper.jar lib/systray.jar lib/systray4j.jar" /> + <attribute name="Class-Path" value="lib/i2p.jar lib/router.jar lib/jbigi.jar lib/BOB.jar lib/sam.jar lib/mstreaming.jar lib/streaming.jar lib/routerconsole.jar lib/i2ptunnel.jar lib/org.mortbay.jetty.jar lib/javax.servlet.jar lib/jasper-compiler.jar lib/jasper-runtime.jar lib/commons-logging.jar lib/commons-el.jar lib/wrapper.jar lib/systray.jar lib/systray4j.jar lib/desktopgui.jar" /> + <attribute name="Build-Date" value="${build.timestamp}" /> + <attribute name="Base-Revision" value="${workspace.version}" /> </manifest> </jar> <!-- now the standalone launcher exe --> @@ -196,6 +212,8 @@ <copy file="apps/i2ptunnel/java/build/i2ptunnel.jar" todir="build/" /> <copy file="apps/i2ptunnel/java/build/i2ptunnel.war" todir="build/" /> <copy file="apps/systray/java/build/systray.jar" todir="build/" /> + <copy file="apps/desktopgui/dist/desktopgui.jar" todir="build/" /> + <copy file="installer/lib/jbigi/jbigi.jar" todir="build" /> <copy file="apps/addressbook/dist/addressbook.war" todir="build/" /> </target> @@ -218,11 +236,15 @@ </target> <!-- the apps need to compile the jsps to poupdate --> - <target name="poupdate" depends="buildRouter, buildStreaming, buildSystray, buildJetty" > + <target name="poupdate" depends="buildRouter, buildStreaming, buildSystray, buildJetty, buildDesktopGui" > + <echo message="Setting environment variable LG2 to a lang code (eg: de,zh,nl etc)" /> + <echo message=" will restrict language update to the language you specified, leaving other language untact." /> <ant dir="apps/routerconsole/java/" target="poupdate" /> <ant dir="apps/i2psnark/java/" target="poupdate" /> <ant dir="apps/i2ptunnel/java/" target="poupdate" /> <ant dir="apps/susidns/src/" target="poupdate" /> + <ant dir="apps/susimail/" target="poupdate" /> + <ant dir="apps/desktopgui" target="poupdate" /> </target> <target name="javadoc"> <ant dir="apps/jetty" target="ensureJettylib" /> @@ -268,6 +290,7 @@ <group title="SusiDNS Application" packages="i2p.susi.dns" /> <group title="SusiMail Application" packages="i2p.susi.webmail:i2p.susi.webmail.*:i2p.susi.debug:i2p.susi.util" /> <group title="Systray Application" packages="net.i2p.apps.systray" /> + <group title="Desktopgui Application" packages="net.i2p.desktopgui.*" /> <sourcepath> <pathelement location="core/java/src" /> <!--<pathelement location="core/java/test" />--> @@ -277,6 +300,7 @@ <pathelement location="apps/streaming/java/src" /> <pathelement location="apps/i2ptunnel/java/src" /> <pathelement location="apps/systray/java/src" /> + <pathelement location="apps/desktopgui/src" /> <pathelement location="apps/routerconsole/java/src" /> <pathelement location="apps/addressbook/java/src" /> <pathelement location="apps/i2psnark/java/src" /> @@ -323,6 +347,7 @@ <ant dir="apps/i2ptunnel/java/" target="distclean" /> <ant dir="apps/sam/java/" target="distclean" /> <ant dir="apps/BOB" target="clean" /> + <ant dir="apps/desktopgui" target="clean" /> <ant dir="apps/routerconsole/java/" target="distclean" /> <ant dir="apps/addressbook/" target="distclean" /> <ant dir="apps/susimail/" target="distclean" /> @@ -403,6 +428,7 @@ <copy file="installer/resources/fixperms.bat" todir="pkg-temp/" /> <copy file="installer/resources/install_i2p_service_winnt.bat" todir="pkg-temp/" /> <copy file="installer/resources/postinstall.bat" todir="pkg-temp/" /> + <copy file="installer/resources/set_config_dir_for_nt_service.bat" todir="pkg-temp/" /> <copy file="installer/resources/uninstall_i2p_service_winnt.bat" todir="pkg-temp/" /> <copy todir="pkg-temp/lib/wrapper/win32/"> <fileset dir="installer/lib/wrapper/win32/" /> @@ -448,6 +474,7 @@ <copy file="build/streaming.jar" todir="pkg-temp/lib/" /> <copy file="build/org.mortbay.jetty.jar" todir="pkg-temp/lib/" /> <copy file="build/router.jar" todir="pkg-temp/lib/" /> + <copy file="build/desktopgui.jar" todir="pkg-temp/lib/" /> <copy file="build/routerconsole.jar" todir="pkg-temp/lib/" /> <!-- pulled out of routerconsole.jar in 0.7.12; name without version so we can overwrite if we upgrade --> <copy file="apps/jrobin/jrobin-1.4.0.jar" tofile="pkg-temp/lib/jrobin.jar" /> @@ -490,7 +517,10 @@ <mkdir dir="pkg-temp/eepsite/docroot/help" /> <mkdir dir="pkg-temp/eepsite/docroot/help/lib" /> <copy todir="pkg-temp/eepsite/docroot/" > - <fileset dir="installer/resources/eepsite.help/" includes="robots.txt index.html help/pagetemplate.html help/index*.html **/*.png **/*.css" /> + <fileset dir="installer/resources/eepsite.help/" /> + </copy> + <copy todir="pkg-temp/eepsite/docroot/help/lib/" > + <fileset dir="installer/resources/icons/flags/" includes="cn.png de.png es.png fr.png ir.png it.png jp.png nl.png ru.png se.png us.png" /> </copy> <copy file="installer/resources/themes/console/images/favicon.ico" tofile="pkg-temp/eepsite/docroot/favicon.ico" /> <copy file="installer/resources/jetty.xml" tofile="pkg-temp/eepsite/jetty.xml" /> @@ -550,6 +580,8 @@ <copy todir="pkg-temp/docs/" > <fileset dir="installer/resources/readme/" includes="readme*.html" /> <fileset dir="installer/resources/proxy/" includes="*.ht" /> + <!-- lang_ar.png added in 0.8.4 --> + <fileset dir="installer/resources/" includes="icons/flags/lang_ar.png" /> </copy> </target> @@ -618,6 +650,7 @@ <copy file="build/i2psnark.jar" todir="pkg-temp/lib" /> <!-- include systray changes in 0.7.5 --> <copy file="build/systray.jar" todir="pkg-temp/lib/" /> + <copy file="build/desktopgui.jar" todir="pkg-temp/lib/" /> <copy file="build/susimail.war" todir="pkg-temp/webapps/" /> <copy file="build/susidns.war" todir="pkg-temp/webapps/" /> <!-- as of 0.7.12; someday, we can remove these from the updater --> @@ -680,17 +713,43 @@ <target name="prepjupdatefixes" depends="prepupdate, buildWEB"> <copy file="build/org.mortbay.jetty.jar" todir="pkg-temp/lib/" /> </target> - <target name="installer" depends="preppkg"> + <target name="installer" depends="preppkg, buildProperties"> <taskdef name="izpack" classpath="${basedir}/installer/lib/izpack/standalone-compiler.jar" classname="com.izforge.izpack.ant.IzPackTask" /> <mkdir dir="pkg-temp/installer" /> + <exec executable="mtn" outputproperty="workspace.changes.util" errorproperty="mtn.error.util" failifexecutionfails="false" > + <arg value="list" /> + <arg value="changed" /> + <arg value="core/java/src/net/i2p/util" /> + </exec> + <!-- \n in an attribute value generates an invalid manifest --> + <exec executable="tr" inputstring="${workspace.changes.util}" outputproperty="workspace.changes.util.tr" errorproperty="mtn.error2" failifexecutionfails="false" > + <arg value="-s" /> + <arg value="[:space:]" /> + <arg value="," /> + </exec> <jar destfile="./pkg-temp/installer/copy.jar" basedir="./core/java/build/obj" includes="net/i2p/util/Copy.class net/i2p/util/FileUtil.class"> - <manifest><attribute name="Main-Class" value="net.i2p.util.Copy" /></manifest> + <manifest> + <attribute name="Main-Class" value="net.i2p.util.Copy" /> + <attribute name="Build-Date" value="${build.timestamp}" /> + <attribute name="Base-Revision" value="${workspace.version}" /> + <attribute name="Workspace-Changes" value="${workspace.changes.util.tr}" /> + </manifest> </jar> <jar destfile="./pkg-temp/installer/delete.jar" basedir="./core/java/build/obj" includes="net/i2p/util/Delete.class net/i2p/util/FileUtil.class"> - <manifest><attribute name="Main-Class" value="net.i2p.util.Delete" /></manifest> + <manifest> + <attribute name="Main-Class" value="net.i2p.util.Delete" /> + <attribute name="Build-Date" value="${build.timestamp}" /> + <attribute name="Base-Revision" value="${workspace.version}" /> + <attribute name="Workspace-Changes" value="${workspace.changes.util.tr}" /> + </manifest> </jar> <jar destfile="./pkg-temp/installer/exec.jar" basedir="./core/java/build/obj" includes="net/i2p/util/Exec.class"> - <manifest><attribute name="Main-Class" value="net.i2p.util.Exec" /></manifest> + <manifest> + <attribute name="Main-Class" value="net.i2p.util.Exec" /> + <attribute name="Build-Date" value="${build.timestamp}" /> + <attribute name="Base-Revision" value="${workspace.version}" /> + <attribute name="Workspace-Changes" value="${workspace.changes.util.tr}" /> + </manifest> </jar> <!-- Force 1.5 pack200 output @@ -731,29 +790,31 @@ <launch4j configFile="./installer/i2pstandalone.xml" /> <!-- thazzit --> </target> - <target name="test"> + + <target name="test" depends="buildProperties" > <ant dir="core/java/" target="test" /> </target> - <target name="junit.report"> + <target name="junit.report" depends="buildProperties" > <ant dir="core/java/" target="junit.report" /> </target> - <target name="clover.report"> + <target name="clover.report" depends="buildProperties" > <ant dir="core/java/" target="clover.report" /> </target> <target name="test.report" depends="junit.report, clover.report"/> - <target name="fulltest"> + <target name="fulltest" depends="buildProperties" > <ant dir="core/java/" target="fulltest" /> <ant dir="router/java/" target="fulltest" /> </target> - <target name="fullclovertest"> + <target name="fullclovertest" depends="buildProperties" > <ant dir="core/java/" target="fullclovertest" /> <ant dir="router/java/" target="fullclovertest" /> </target> + <target name="syndie" > <ant dir="apps/syndie/java/" target="standalone" /> <copy file="apps/syndie/java/syndie-standalone.zip" todir="." /> </target> - <target name="i2psnark"> + <target name="i2psnark" depends="buildProperties" > <ant dir="apps/i2psnark/java" target="standalone" /> <copy file="apps/i2psnark/java/i2psnark-standalone.zip" todir="." /> </target> @@ -791,6 +852,7 @@ <arg value="build/i2ptunnel.war"/> <arg value="build/mstreaming.jar"/> <arg value="build/router.jar/"/> + <arg value="build/desktopgui.jar"/> <arg value="build/routerconsole.jar"/> <arg value="build/routerconsole.war"/> <arg value="build/sam.jar"/> @@ -802,34 +864,6 @@ <echo message="Findbugs output stored in i2p.fba" /> <echo message="Now run: findbugs i2p.fba" /> </target> - <target name="buildWithDesktopgui" depends="buildrouter,builddepSmall"> - <ant dir="apps/desktopgui" target="build_jar" /> - </target> - <target name="preppkgWithDesktopgui" depends="buildWithDesktopgui,preppkg"> - <copy file="apps/desktopgui/dist/desktopgui.jar" todir="pkg-temp/lib/" /> - <copy file="apps/desktopgui/lib/swing-worker.jar" todir="pkg-temp/lib/" /> - <copy file="apps/desktopgui/lib/appframework.jar" todir="pkg-temp/lib/" /> - <mkdir dir="pkg-temp/desktopgui/resources/" /> - <copy todir="pkg-temp/desktopgui/resources/"> - <fileset dir="apps/desktopgui/desktopgui/resources/" /> - </copy> - </target> - <target name="installerWithDesktopgui" depends="preppkgWithDesktopgui,installer" /> - <target name="prepupdateWithDesktopgui" depends="buildWithDesktopgui,prepupdate"> - <copy file="apps/desktopgui/dist/desktopgui.jar" todir="pkg-temp/lib/" /> - <copy file="apps/desktopgui/lib/swing-worker.jar" todir="pkg-temp/lib/" /> - <copy file="apps/desktopgui/lib/appframework.jar" todir="pkg-temp/lib/" /> - <mkdir dir="pkg-temp/desktopgui/resources/" /> - <copy todir="pkg-temp/desktopgui/resources/"> - <fileset dir="apps/desktopgui/desktopgui/resources/" /> - </copy> - </target> - <target name="updaterWithDesktopgui" depends="prepupdateWithDesktopgui,updater" /> - <target name="pkgWithDesktopgui" depends="distclean, updaterWithDesktopgui, installerWithDesktopgui, preppkg" /> - <target name="distWithDesktopgui" depends="pkgWithDesktopgui, javadoc" /> - <target name="distcleanWithDesktopgui" depends="distclean"> - <ant dir="apps/desktopgui" target="build_clean" /> - </target> <!-- this is the same dependency as pkg, but with updater200 in the middle, since preppkg puts too much stuff in pkg-temp --> @@ -984,7 +1018,7 @@ <target name="debian" depends="distclean, debian-source, debian-binary" /> - <target name="debian-binary"> + <target name="debian-binary" depends="buildProperties" > <echo message="Did you update the version in these files?" /> <exec executable="ls" failonerror="true"> <arg value="-l" /> @@ -1001,7 +1035,7 @@ <arg value="amd64" /> </exec> </target> - <target name="debian-source"> + <target name="debian-source" depends="buildProperties" > <!-- bundle the 20MB jetty 5 lib since there probably isn't a deb for it --> <ant dir="apps/jetty" target="ensureJettylib" /> <echo message="Did you update the version in these files?" /> diff --git a/core/java/build.xml b/core/java/build.xml index 2ae9d655fadb00e1c1866326ebca1afe0206753b..60f1a4dcc3175a91b26b1c085a91bf8edf86fcb1 100644 --- a/core/java/build.xml +++ b/core/java/build.xml @@ -21,20 +21,51 @@ <target name="compile" depends="depend"> <mkdir dir="./build" /> <mkdir dir="./build/obj" /> - <javac srcdir="./src" debug="true" source="1.5" target="1.5" deprecation="on" destdir="./build/obj" classpath="${javac.classpath}" > + <javac srcdir="./src" debug="true" source="1.5" target="1.5" deprecation="on" + includeAntRuntime="false" + destdir="./build/obj" classpath="${javac.classpath}" > <compilerarg line="${javac.compilerargs}" /> </javac> </target> + <target name="compileTest"> <mkdir dir="./build" /> <mkdir dir="./build/obj" /> - <javac srcdir="./src:./test" debug="true" source="1.5" target="1.5" deprecation="on" destdir="./build/obj" > + <!-- junit classes are in ant runtime --> + <javac srcdir="./src:./test" debug="true" source="1.5" target="1.5" deprecation="on" + includeAntRuntime="true" + destdir="./build/obj" > <compilerarg line="${javac.compilerargs}" /> </javac> </target> - <target name="jar" depends="compile"> - <jar destfile="./build/i2p.jar" basedir="./build/obj" includes="**/*.class" /> + + <target name="jar" depends="compile, jarUpToDate" unless="jar.uptodate" > + <exec executable="mtn" outputproperty="workspace.changes" errorproperty="mtn.error2" failifexecutionfails="false" > + <arg value="list" /> + <arg value="changed" /> + <arg value="." /> + </exec> + <!-- \n in an attribute value generates an invalid manifest --> + <exec executable="tr" inputstring="${workspace.changes}" outputproperty="workspace.changes.tr" errorproperty="mtn.error2" failifexecutionfails="false" > + <arg value="-s" /> + <arg value="[:space:]" /> + <arg value="," /> + </exec> + <jar destfile="./build/i2p.jar" basedir="./build/obj" includes="**/*.class" > + <manifest> + <attribute name="Build-Date" value="${build.timestamp}" /> + <attribute name="Base-Revision" value="${workspace.version}" /> + <attribute name="Workspace-Changes" value="${workspace.changes.tr}" /> + </manifest> + </jar> </target> + + <target name="jarUpToDate" > + <uptodate property="jar.uptodate" targetfile="build/i2p.jar" > + <srcfiles dir= "build/obj" includes="**/*.class" /> + </uptodate> + </target> + <target name="jarTest" depends="compileTest"> <jar destfile="./build/i2ptest.jar" basedir="./build/obj" includes="**/*.class" /> </target> @@ -43,15 +74,35 @@ <mkdir dir="./build/javadoc" /> <javadoc sourcepath="./src:./test" destdir="./build/javadoc" packagenames="*" use="true" splitindex="true" windowtitle="I2P SDK" /> </target> - <target name="test" depends="clean, compileTest"> - <junit printsummary="on" fork="yes"> + <target name="prepareTest" depends="compileTest" if="with.cobertura"> + <taskdef classpath="${with.cobertura}" resource="tasks.properties" onerror="report" /> + <mkdir dir="./build/obj_test" /> + <cobertura-instrument todir="./build/obj_test"> + <fileset dir="./build/obj"> + <include name="**/*.class"/> + <exclude name="**/*Test.class" /> + </fileset> + </cobertura-instrument> + </target> + <target name="test" depends="clean, compileTest, prepareTest"> + <delete> + <fileset dir="../../reports/core/junit"> + <include name="TEST-*.xml"/> + </fileset> + </delete> + <mkdir dir="../../reports/" /> + <mkdir dir="../../reports/core/" /> + <mkdir dir="../../reports/core/junit/" /> + <junit printsummary="on" fork="yes" maxmemory="384m"> + <sysproperty key="net.sourceforge.cobertura.datafile" file="./cobertura.ser" /> <classpath> <pathelement path="${classpath}" /> + <pathelement location="./build/obj_test" /> <pathelement location="./build/obj" /> <pathelement location="../../installer/lib/jbigi/jbigi.jar" /> - <pathelement path="${ant.home}/lib/clover.jar"/> + <pathelement location="${with.cobertura}" /> </classpath> - <batchtest> + <batchtest todir="../../reports/core/junit/"> <fileset dir="./test/"> <include name="**/*Test.java" /> <exclude name="**/ElGamalAESEngineTest.java" /> @@ -60,24 +111,11 @@ </batchtest> <formatter type="xml"/> </junit> - <mkdir dir="../../reports/" /> - <mkdir dir="../../reports/core/" /> - <mkdir dir="../../reports/core/junit/" /> - <delete> - <fileset dir="../../reports/core/junit"> - <include name="TEST-*.xml"/> - </fileset> - </delete> - <copy todir="../../reports/core/junit"> - <fileset dir="."> - <include name="TEST-*.xml"/> - </fileset> - </copy> - <delete> - <fileset dir="."> - <include name="TEST-*.xml"/> - </fileset> - </delete> + </target> + <target name="cobertura" depends="test" if="with.cobertura"> + <mkdir dir="../../reports/core/cobertura" /> + <cobertura-report format="xml" srcdir="./src" destdir="../../reports/core/cobertura" /> + <delete file="./cobertura.ser" /> </target> <target name="junit.report"> <junitreport todir="../../reports/core/junit"> @@ -87,28 +125,8 @@ <report format="frames" todir="../../reports/core/html/junit"/> </junitreport> </target> - <target name="clover.report"> - <taskdef resource="clovertasks"/> - <mkdir dir="../../reports/" /> - <mkdir dir="../../reports/core" /> - <mkdir dir="../../reports/core/clover" /> - <clover-setup initString="../../reports/core/clover/coverage.db"/> - <clover-report> - <current outfile="../../reports/core/html/clover"> - <format type="html"/> - </current> - </clover-report> - </target> - <target name="test.report" depends="junit.report, clover.report"/> - <target name="useclover"> - <taskdef resource="clovertasks"/> - <mkdir dir="../../reports/" /> - <mkdir dir="../../reports/core/" /> - <mkdir dir="../../reports/core/clover" /> - <clover-setup initString="../../reports/core/clover/coverage.db"/> - </target> + <target name="test.report" depends="junit.report"/> <target name="fulltest" depends="test, junit.report" /> - <target name="fullclovertest" depends="useclover, test, test.report" /> <target name="clean"> <delete dir="./build" /> </target> diff --git a/core/java/src/freenet/support/CPUInformation/CPUID.java b/core/java/src/freenet/support/CPUInformation/CPUID.java index e3712e4ad8ce9888fe658aa9a328ca2592079fa6..921f497ddedb924f5f776e44c865c59fb8bfa79a 100644 --- a/core/java/src/freenet/support/CPUInformation/CPUID.java +++ b/core/java/src/freenet/support/CPUInformation/CPUID.java @@ -324,18 +324,26 @@ public class CPUID { return getCPUFamily() > 6 || (getCPUFamily() == 6 && getCPUModel() >=3); } public boolean IsPentium3Compatible() - { - return getCPUFamily() > 6 || (getCPUFamily() == 6 && getCPUModel() >=7); + { + // Atom + if (getCPUExtendedModel() == 1 && (getCPUFamily() == 6 && (getCPUModel() == 12))){ + return true; + // ?? + } else if (getCPUExtendedModel() == 0 && (getCPUFamily() > 6 || (getCPUFamily() == 6 && getCPUModel() >=7))){ + return true; + } else { + return false; + } } public boolean IsPentium4Compatible() { - // P4 + // P4 if (getCPUFamily() >= 15){ return true; - // Xeon MP (45nm) or Core i7 + // Xeon MP (45nm) or Core i7 } else if (getCPUExtendedModel() == 1 && (getCPUFamily() == 6 && (getCPUModel() == 10 || getCPUModel() == 13))){ return true; - // Core 2 Duo + // Core 2 Duo } else if (getCPUExtendedModel() == 0 && getCPUFamily() == 6 && getCPUModel() == 15){ return true; } else { @@ -417,17 +425,18 @@ public class CPUID { case 15: return "Core 2 (Conroe)"; } - } - if (getCPUExtendedModel() == 1){ - switch(getCPUModel()){ - case 10: - return "Core i7"; - case 12: - return "Atom"; - case 13: - return "Xeon MP"; - } - } + } else { + if (getCPUExtendedModel() == 1){ + switch(getCPUModel()){ + case 10: + return "Core i7"; + case 12: + return "Atom"; + case 13: + return "Xeon MP"; + } + } + } } if(getCPUFamily() == 7){ switch(getCPUModel()){ diff --git a/core/java/src/net/i2p/CoreVersion.java b/core/java/src/net/i2p/CoreVersion.java index 860747c760e4d973fa9c9b7206339a12ce35bcc1..6005a73485cad24834c57ce14f7e5d05ac497dee 100644 --- a/core/java/src/net/i2p/CoreVersion.java +++ b/core/java/src/net/i2p/CoreVersion.java @@ -16,7 +16,7 @@ package net.i2p; public class CoreVersion { /** deprecated */ public final static String ID = "Monotone"; - public final static String VERSION = "0.8.2"; + public final static String VERSION = "0.8.6"; public static void main(String args[]) { System.out.println("I2P Core version: " + VERSION); diff --git a/core/java/src/net/i2p/I2PAppContext.java b/core/java/src/net/i2p/I2PAppContext.java index e6df37e6f467ffb683daa48138fa4c3b866ec44e..5cfc37ac5d4370ebf054fda6bef635e220f49c6e 100644 --- a/core/java/src/net/i2p/I2PAppContext.java +++ b/core/java/src/net/i2p/I2PAppContext.java @@ -30,11 +30,13 @@ import net.i2p.util.Clock; import net.i2p.util.ConcurrentHashSet; import net.i2p.util.FileUtil; import net.i2p.util.FortunaRandomSource; +import net.i2p.util.I2PProperties; import net.i2p.util.KeyRing; import net.i2p.util.LogManager; //import net.i2p.util.PooledRandomSource; import net.i2p.util.RandomSource; import net.i2p.util.SecureDirectory; +import net.i2p.util.I2PProperties.I2PPropertyCallback; /** * <p>Provide a base scope for accessing singletons that I2P exposes. Rather than @@ -63,9 +65,9 @@ import net.i2p.util.SecureDirectory; */ public class I2PAppContext { /** the context that components without explicit root are bound */ - protected static I2PAppContext _globalAppContext; + protected static volatile I2PAppContext _globalAppContext; - private Properties _overrideProps; + protected I2PProperties _overrideProps; private StatManager _statManager; private SessionKeyManager _sessionKeyManager; @@ -117,7 +119,8 @@ public class I2PAppContext { * */ public static I2PAppContext getGlobalContext() { - // skip the global lock + // skip the global lock - _gAC must be volatile + // http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html I2PAppContext rv = _globalAppContext; if (rv != null) return rv; @@ -168,7 +171,9 @@ public class I2PAppContext { _globalAppContext = this; } } - _overrideProps = envProps; + _overrideProps = new I2PProperties(); + if (envProps != null) + _overrideProps.putAll(envProps); _statManager = null; _sessionKeyManager = null; _namingService = null; @@ -474,6 +479,9 @@ public class I2PAppContext { * provided during the context construction, as well as the ones included in * System.getProperties. * + * WARNING - not overridden in RouterContext, doesn't contain router config settings, + * use getProperties() instead. + * * @return set of Strings containing the names of defined system properties */ public Set getPropertyNames() { @@ -483,6 +491,29 @@ public class I2PAppContext { return names; } + /** + * Access the configuration attributes of this context, listing the properties + * provided during the context construction, as well as the ones included in + * System.getProperties. + * + * @return new Properties with system and context properties + * @since 0.8.4 + */ + public Properties getProperties() { + Properties rv = new Properties(); + rv.putAll(System.getProperties()); + rv.putAll(_overrideProps); + return rv; + } + + /** + * Add a callback, which will fire upon changes in the property + * given in the specific callback. + * Unimplemented in I2PAppContext: this only makes sense in a router context. + * @param callback The implementation of the callback. + */ + public void addPropertyCallback(I2PPropertyCallback callback) {} + /** * The statistics component with which we can track various events * over time. @@ -757,7 +788,7 @@ public class I2PAppContext { * enable simulators to play with clock skew among different instances. * */ - public Clock clock() { // overridden in RouterContext + public Clock clock() { if (!_clockInitialized) initializeClock(); return _clock; diff --git a/core/java/src/net/i2p/client/DestReplyMessageHandler.java b/core/java/src/net/i2p/client/DestReplyMessageHandler.java index 8d5527d59b4e7d4c4d65f6687e702b920615f515..2207a56c514af61b858968272432efdd410ca903 100644 --- a/core/java/src/net/i2p/client/DestReplyMessageHandler.java +++ b/core/java/src/net/i2p/client/DestReplyMessageHandler.java @@ -26,11 +26,13 @@ class DestReplyMessageHandler extends HandlerImpl { _log.debug("Handle message " + message); DestReplyMessage msg = (DestReplyMessage) message; Destination d = msg.getDestination(); - if (d != null) + if (d != null) { session.destReceived(d); - Hash h = msg.getHash(); - if (h != null) - session.destLookupFailed(h); + } else { + Hash h = msg.getHash(); + if (h != null) + session.destLookupFailed(h); + } // else let it time out } } diff --git a/core/java/src/net/i2p/client/I2CPMessageProducer.java b/core/java/src/net/i2p/client/I2CPMessageProducer.java index 0fa35d8cff10dc2904e2afe81fbc094d98be2d33..336c858cace3664d80ac0348d4024cd82a4df3d7 100644 --- a/core/java/src/net/i2p/client/I2CPMessageProducer.java +++ b/core/java/src/net/i2p/client/I2CPMessageProducer.java @@ -12,6 +12,8 @@ package net.i2p.client; import java.util.Date; import java.util.Properties; import java.util.Set; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.ReentrantLock; import net.i2p.I2PAppContext; import net.i2p.data.DataFormatException; @@ -41,22 +43,51 @@ import net.i2p.util.Log; * @author jrandom */ class I2CPMessageProducer { - private final static Log _log = new Log(I2CPMessageProducer.class); + private final Log _log; private final I2PAppContext _context; - private int _sendBps; - private long _sendPeriodBytes; - private long _sendPeriodBeginTime; + private int _maxBytesPerSecond; + private volatile int _sendPeriodBytes; + private volatile long _sendPeriodBeginTime; + private final ReentrantLock _lock; + private static final String PROP_MAX_BW = "i2cp.outboundBytesPerSecond"; + /** see ConnectionOptions in streaming - MTU + streaming overhead + gzip overhead */ + private static final int TYP_SIZE = 1730 + 28 + 23; + private static final int MIN_RATE = 2 * TYP_SIZE; public I2CPMessageProducer(I2PAppContext context) { _context = context; - context.statManager().createRateStat("client.sendBpsRaw", "How fast we pump out I2CP data messages", "ClientMessages", new long[] { 60*1000, 5*60*1000, 10*60*1000, 60*60*1000 }); + _log = context.logManager().getLog(I2CPMessageProducer.class); + _lock = new ReentrantLock(true); + context.statManager().createRateStat("client.sendThrottled", "Times waited for bandwidth", "ClientMessages", new long[] { 60*1000 }); + context.statManager().createRateStat("client.sendDropped", "Length of msg dropped waiting for bandwidth", "ClientMessages", new long[] { 60*1000 }); } + /** + * Update the bandwidth setting + * @since 0.8.4 + */ + public void updateBandwidth(I2PSessionImpl session) { + String max = session.getOptions().getProperty(PROP_MAX_BW); + if (max != null) { + try { + int iMax = Integer.parseInt(max); + if (iMax > 0) + // round up to next higher TYP_SIZE for efficiency, then add some fudge for small messages + _maxBytesPerSecond = 256 + Math.max(MIN_RATE, TYP_SIZE * ((iMax + TYP_SIZE - 1) / TYP_SIZE)); + else + _maxBytesPerSecond = 0; + } catch (NumberFormatException nfe) {} + } + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Setting " + _maxBytesPerSecond + " BPS max"); + } + /** * Send all the messages that a client needs to send to a router to establish * a new session. */ public void connect(I2PSessionImpl session) throws I2PSessionException { + updateBandwidth(session); CreateSessionMessage msg = new CreateSessionMessage(); SessionConfig cfg = new SessionConfig(session.getMyDestination()); cfg.setOptions(session.getOptions()); @@ -99,32 +130,135 @@ class I2CPMessageProducer { */ public void sendMessage(I2PSessionImpl session, Destination dest, long nonce, byte[] payload, SessionTag tag, SessionKey key, Set tags, SessionKey newKey, long expires) throws I2PSessionException { + sendMessage(session, dest, nonce, payload, expires, 0); + } + + /** + * Package up and send the payload to the router for delivery + * @since 0.8.4 + */ + public void sendMessage(I2PSessionImpl session, Destination dest, long nonce, byte[] payload, + long expires, int flags) throws I2PSessionException { + + if (!updateBps(payload.length, expires)) + // drop the message... send fail notification? + return; SendMessageMessage msg; - if (expires > 0) { - msg = new SendMessageExpiresMessage(); - ((SendMessageExpiresMessage)msg).setExpiration(new Date(expires)); + if (expires > 0 || flags > 0) { + SendMessageExpiresMessage smsg = new SendMessageExpiresMessage(); + smsg.setExpiration(expires); + smsg.setFlags(flags); + msg = smsg; } else msg = new SendMessageMessage(); msg.setDestination(dest); msg.setSessionId(session.getSessionId()); msg.setNonce(nonce); - Payload data = createPayload(dest, payload, tag, key, tags, newKey); + Payload data = createPayload(dest, payload, null, null, null, null); msg.setPayload(data); session.sendMessage(msg); - updateBps(payload.length); } - private void updateBps(int len) { - long now = _context.clock().now(); - float period = ((float)now-_sendPeriodBeginTime)/1000f; - if (period >= 1f) { - // first term decays on slow transmission - _sendBps = (int)(((float)0.9f * (float)_sendBps) + ((float)0.1f*((float)_sendPeriodBytes)/period)); - _sendPeriodBytes = len; - _sendPeriodBeginTime = now; - _context.statManager().addRateData("client.sendBpsRaw", _sendBps, 0); - } else { - _sendPeriodBytes += len; + /** + * Super-simple bandwidth throttler. + * We only calculate on a one-second basis, so large messages + * (compared to the one-second limit) may exceed the limits. + * Tuned for streaming, may not work well for large datagrams. + * + * This does poorly with low rate limits since it doesn't credit + * bandwidth across two periods. So the limit is rounded up, + * and the min limit is set to 2x the typ size, above. + * + * Blocking so this could be very bad for retransmissions, + * as it could clog StreamingTimer. + * Waits are somewhat "fair" using ReentrantLock. + * While out-of-order transmission is acceptable, fairness + * reduces the chance of starvation. ReentrantLock does not + * guarantee in-order execution due to thread priority issues, + * so out-of-order may still occur. But shouldn't happen within + * the same thread anyway... Also note that small messages may + * go ahead of large ones that are waiting for the next window. + * Also, threads waiting a second time go to the back of the line. + * + * Since this is at the I2CP layer, it includes streaming overhead, + * streaming acks and retransmissions, + * gzip overhead (or "underhead" for compression), + * repliable datagram overhead, etc. + * However, it does not, of course, include the substantial overhead + * imposed by the router for the leaseset, tags, encryption, + * and fixed-size tunnel messages. + * + * @param expires if > 0, an expiration date + * @return true if we should send the message, false to drop it + */ + private boolean updateBps(int len, long expires) { + if (_maxBytesPerSecond <= 0) + return true; + //synchronized(this) { + _lock.lock(); + try { + int waitCount = 0; + while (true) { + long now = _context.clock().now(); + if (waitCount > 0 && expires > 0 && expires < now) { + // just say no to bufferbloat... drop the message right here + _context.statManager().addRateData("client.sendDropped", len, 0); + if (_log.shouldLog(Log.WARN)) + _log.warn("Dropping " + len + " byte msg expired in queue"); + return false; + } + + long period = now - _sendPeriodBeginTime; + if (period >= 2000) { + // start new period, always let it through no matter how big + _sendPeriodBytes = len; + _sendPeriodBeginTime = now; + if (_log.shouldLog(Log.DEBUG)) + _log.debug("New period after idle, " + len + " bytes"); + return true; + } + + if (period >= 1000) { + // start new period + // Allow burst within 2 sec, only advance window by 1 sec, and + // every other second give credit for unused bytes in previous period + if (_sendPeriodBytes > 0 && ((_sendPeriodBeginTime / 1000) & 0x01) == 0) + _sendPeriodBytes += len - _maxBytesPerSecond; + else + _sendPeriodBytes = len; + _sendPeriodBeginTime += 1000; + if (_log.shouldLog(Log.DEBUG)) + _log.debug("New period, " + len + " bytes"); + return true; + } + + if (_sendPeriodBytes + len <= _maxBytesPerSecond) { + // still bytes available in this period + _sendPeriodBytes += len; + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Sending " + len + ", Elapsed " + period + "ms, total " + _sendPeriodBytes + " bytes"); + return true; + } + + if (waitCount >= 2) { + // just say no to bufferbloat... drop the message right here + _context.statManager().addRateData("client.sendDropped", len, 0); + if (_log.shouldLog(Log.WARN)) + _log.warn("Dropping " + len + " byte msg after waiting " + waitCount + " times"); + return false; + } + + // wait until next period + _context.statManager().addRateData("client.sendThrottled", ++waitCount, 0); + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Throttled " + len + " bytes, wait #" + waitCount + ' ' + (1000 - period) + "ms" /*, new Exception()*/); + try { + //this.wait(1000 - period); + _lock.newCondition().await(1000 - period, TimeUnit.MILLISECONDS); + } catch (InterruptedException ie) {} + } + } finally { + _lock.unlock(); } } diff --git a/core/java/src/net/i2p/client/I2PSession.java b/core/java/src/net/i2p/client/I2PSession.java index cd20cfc2d655ef86580e18c1faaf248421d5e33d..567c9e521dbfc5981c2e67407a38d35452ed40b6 100644 --- a/core/java/src/net/i2p/client/I2PSession.java +++ b/core/java/src/net/i2p/client/I2PSession.java @@ -9,6 +9,7 @@ package net.i2p.client; * */ +import java.util.Properties; import java.util.Set; import net.i2p.data.Destination; @@ -20,17 +21,20 @@ import net.i2p.data.SigningPrivateKey; /** * <p>Define the standard means of sending and receiving messages on the * I2P network by using the I2CP (the client protocol). This is done over a - * bidirectional TCP socket and never sends any private keys - all end to end - * encryption is done transparently within the client's I2PSession - * itself. Periodically the router will ask the client to authorize a new set of + * bidirectional TCP socket and never sends any private keys. + * + * End to end encryption in I2PSession was disabled in release 0.6. + * + * Periodically the router will ask the client to authorize a new set of * tunnels to be allocated to the client, which the client can accept by sending a * {@link net.i2p.data.LeaseSet} signed by the {@link net.i2p.data.Destination}. - * In addition, the router may on occation provide the client with an updated + * In addition, the router may on occasion provide the client with an updated * clock offset so that the client can stay in sync with the network (even if * the host computer's clock is off).</p> * */ public interface I2PSession { + /** Send a new message to the given destination, containing the specified * payload, returning true if the router feels confident that the message * was delivered. @@ -39,11 +43,18 @@ public interface I2PSession { * @return whether it was accepted by the router for delivery or not */ public boolean sendMessage(Destination dest, byte[] payload) throws I2PSessionException; + public boolean sendMessage(Destination dest, byte[] payload, int offset, int size) throws I2PSessionException; - /** See I2PSessionMuxedImpl for details */ + + /** + * See I2PSessionMuxedImpl for proto/port details. + * @since 0.7.1 + */ public boolean sendMessage(Destination dest, byte[] payload, int proto, int fromport, int toport) throws I2PSessionException; /** + * End-to-End Crypto is disabled, tags and keys are ignored! + * * Like sendMessage above, except the key used and the tags sent are exposed to the * application. <p /> * @@ -61,25 +72,62 @@ public interface I2PSession { * * @param dest location to send the message * @param payload body of the message to be sent (unencrypted) - * @param keyUsed session key delivered to the destination for association with the tags sent. This is essentially + * @param keyUsed UNUSED, IGNORED. Session key delivered to the destination for association with the tags sent. This is essentially * an output parameter - keyUsed.getData() is ignored during this call, but after the call completes, * it will be filled with the bytes of the session key delivered. Typically the key delivered is the * same one as the key encrypted with, but not always. If this is null then the key data will not be * exposed. - * @param tagsSent set of tags delivered to the peer and associated with the keyUsed. This is also an output parameter - + * @param tagsSent UNUSED, IGNORED. Set of tags delivered to the peer and associated with the keyUsed. This is also an output parameter - * the contents of the set is ignored during the call, but afterwards it contains a set of SessionTag * objects that were sent along side the given keyUsed. */ public boolean sendMessage(Destination dest, byte[] payload, SessionKey keyUsed, Set tagsSent) throws I2PSessionException; + + /** + * End-to-End Crypto is disabled, tags and keys are ignored. + * @param keyUsed UNUSED, IGNORED. + * @param tagsSent UNUSED, IGNORED. + */ public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent) throws I2PSessionException; + + /** + * End-to-End Crypto is disabled, tags and keys are ignored. + * @param keyUsed UNUSED, IGNORED. + * @param tagsSent UNUSED, IGNORED. + * @since 0.7.1 + */ public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, long expire) throws I2PSessionException; - /** See I2PSessionMuxedImpl for details */ + + /** + * See I2PSessionMuxedImpl for proto/port details. + * End-to-End Crypto is disabled, tags and keys are ignored. + * @param keyUsed UNUSED, IGNORED. + * @param tagsSent UNUSED, IGNORED. + * @since 0.7.1 + */ public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, int proto, int fromport, int toport) throws I2PSessionException; - /** See I2PSessionMuxedImpl for details */ + + /** + * See I2PSessionMuxedImpl for proto/port details. + * End-to-End Crypto is disabled, tags and keys are ignored. + * @param keyUsed UNUSED, IGNORED. + * @param tagsSent UNUSED, IGNORED. + * @since 0.7.1 + */ public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, long expire, int proto, int fromport, int toport) throws I2PSessionException; + /** + * See I2PSessionMuxedImpl for proto/port details. + * End-to-End Crypto is disabled, tags and keys are ignored. + * @param keyUsed UNUSED, IGNORED. + * @param tagsSent UNUSED, IGNORED. + * @since 0.8.4 + */ + public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, long expire, + int proto, int fromport, int toport, int flags) throws I2PSessionException; + /** Receive a message that the router has notified the client about, returning * the payload. * @param msgId message to fetch @@ -151,8 +199,16 @@ public interface I2PSession { */ public Destination lookupDest(Hash h, long maxWait) throws I2PSessionException; + /** + * Does not remove properties previously present but missing from this options parameter. + * @param options non-null + * @since 0.8.4 + */ + public void updateOptions(Properties options); + /** * Get the current bandwidth limits. Blocking. + * @since 0.8.3 */ public int[] bandwidthLimits() throws I2PSessionException; diff --git a/core/java/src/net/i2p/client/I2PSessionImpl.java b/core/java/src/net/i2p/client/I2PSessionImpl.java index 8b4389e47da3a78db1799e995047e4516cc7bcc9..dc7e875d9cf4f6dd0798fbbb0bfb955b5244f4f5 100644 --- a/core/java/src/net/i2p/client/I2PSessionImpl.java +++ b/core/java/src/net/i2p/client/I2PSessionImpl.java @@ -221,20 +221,32 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa } } + /** save some memory, don't pass along the pointless properties */ private Properties filter(Properties options) { Properties rv = new Properties(); for (Iterator iter = options.keySet().iterator(); iter.hasNext();) { String key = (String) iter.next(); - String val = options.getProperty(key); - if (key.startsWith("java") || - key.startsWith("user") || - key.startsWith("os") || - key.startsWith("sun") || - key.startsWith("file") || - key.startsWith("line") || - key.startsWith("wrapper")) { + if (key.startsWith("java.") || + key.startsWith("user.") || + key.startsWith("os.") || + key.startsWith("sun.") || + key.startsWith("file.") || + key.equals("line.separator") || + key.equals("path.separator") || + key.equals("prng.buffers") || + key.equals("router.trustedUpdateKeys") || + key.startsWith("router.update") || + key.startsWith("routerconsole.") || + key.startsWith("time.") || + key.startsWith("stat.") || + key.startsWith("gnu.") || // gnu JVM + key.startsWith("net.i2p.router.web.") || // console nonces + key.startsWith("wrapper.")) { if (_log.shouldLog(Log.DEBUG)) _log.debug("Skipping property: " + key); - } else if ((key.length() > 255) || (val.length() > 255)) { + continue; + } + String val = options.getProperty(key); + if ((key.length() > 255) || (val.length() > 255)) { if (_log.shouldLog(Log.WARN)) _log.warn(getPrefix() + "Not passing on property [" + key @@ -247,6 +259,18 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa return rv; } + /** + * Update the tunnel and bandwidth settings + * @since 0.8.4 + */ + public void updateOptions(Properties options) { + _options.putAll(filter(options)); + _producer.updateBandwidth(this); + try { + _producer.updateTunnels(this, 0); + } catch (I2PSessionException ise) {} + } + void setLeaseSet(LeaseSet ls) { _leaseSet = ls; if (ls != null) { @@ -397,7 +421,7 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa * */ public byte[] receiveMessage(int msgId) throws I2PSessionException { - MessagePayloadMessage msg = _availableMessages.remove(new Long(msgId)); + MessagePayloadMessage msg = _availableMessages.remove(Long.valueOf(msgId)); if (msg == null) { _log.error("Receive message " + msgId + " had no matches"); return null; @@ -414,21 +438,6 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa _producer.reportAbuse(this, msgId, severity); } - /** - * Send the data to the destination. - * TODO: this currently always returns true, regardless of whether the message was - * delivered successfully. make this wait for at least ACCEPTED - * - */ - public abstract boolean sendMessage(Destination dest, byte[] payload) throws I2PSessionException; - - /** - * @param keyUsed unused - no end-to-end crypto - * @param tagsSent unused - no end-to-end crypto - */ - public abstract boolean sendMessage(Destination dest, byte[] payload, SessionKey keyUsed, - Set tagsSent) throws I2PSessionException; - public abstract void receiveStatus(int msgId, long nonce, int status); /****** no end-to-end crypto @@ -444,7 +453,7 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa * Recieve a payload message and let the app know its available */ public void addNewMessage(MessagePayloadMessage msg) { - Long mid = new Long(msg.getMessageId()); + Long mid = Long.valueOf(msg.getMessageId()); _availableMessages.put(mid, msg); long id = msg.getMessageId(); byte data[] = msg.getPayload().getUnencryptedData(); @@ -494,7 +503,7 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa public void available(long msgId, int size) { synchronized (AvailabilityNotifier.this) { - _pendingIds.add(new Long(msgId)); + _pendingIds.add(Long.valueOf(msgId)); _pendingSizes.add(Integer.valueOf(size)); AvailabilityNotifier.this.notifyAll(); } diff --git a/core/java/src/net/i2p/client/I2PSessionImpl2.java b/core/java/src/net/i2p/client/I2PSessionImpl2.java index f0000b68cb4302cdf079b01007ef7463f70b0743..3af551eaaf9c6fa96a7152f3f13c23e8f2696216 100644 --- a/core/java/src/net/i2p/client/I2PSessionImpl2.java +++ b/core/java/src/net/i2p/client/I2PSessionImpl2.java @@ -130,6 +130,10 @@ class I2PSessionImpl2 extends I2PSessionImpl { int proto, int fromport, int toport) throws I2PSessionException { throw new IllegalArgumentException("Use MuxedImpl"); } + public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, long expire, + int proto, int fromport, int toport, int flags) throws I2PSessionException { + throw new IllegalArgumentException("Use MuxedImpl"); + } @Override public boolean sendMessage(Destination dest, byte[] payload) throws I2PSessionException { @@ -222,14 +226,23 @@ class I2PSessionImpl2 extends I2PSessionImpl { private static final int NUM_TAGS = 50; /** - * TODO - Don't need to save MessageState since actuallyWait is false... - * But for now just use sendNoEffort() instead. - * * @param keyUsed unused - no end-to-end crypto * @param tagsSent unused - no end-to-end crypto */ protected boolean sendBestEffort(Destination dest, byte payload[], SessionKey keyUsed, Set tagsSent, long expires) throws I2PSessionException { + return sendBestEffort(dest, payload, expires, 0); + } + + /** + * TODO - Don't need to save MessageState since actuallyWait is false... + * But for now just use sendNoEffort() instead. + * + * @param flags to be passed to the router + * @since 0.8.4 + */ + protected boolean sendBestEffort(Destination dest, byte payload[], long expires, int flags) + throws I2PSessionException { //SessionKey key = null; //SessionKey newKey = null; //SessionTag tag = null; @@ -324,7 +337,7 @@ class I2PSessionImpl2 extends I2PSessionImpl { + " sync took " + (inSendingSync-beforeSendingSync) + " add took " + (afterSendingSync-inSendingSync)); //_producer.sendMessage(this, dest, nonce, payload, tag, key, sentTags, newKey, expires); - _producer.sendMessage(this, dest, nonce, payload, null, null, null, null, expires); + _producer.sendMessage(this, dest, nonce, payload, expires, flags); // since this is 'best effort', all we're waiting for is a status update // saying that the router received it - in theory, that should come back diff --git a/core/java/src/net/i2p/client/I2PSessionMuxedImpl.java b/core/java/src/net/i2p/client/I2PSessionMuxedImpl.java index 342b05d260e584e5e61e52685ea330210fe36ab8..fcf11d0dafab3e8fcb2d7d87a90c9dcdcc576b3d 100644 --- a/core/java/src/net/i2p/client/I2PSessionMuxedImpl.java +++ b/core/java/src/net/i2p/client/I2PSessionMuxedImpl.java @@ -162,12 +162,34 @@ class I2PSessionMuxedImpl extends I2PSessionImpl2 implements I2PSession { * 255 disallowed * @param fromPort 1-65535 or 0 for unset * @param toPort 1-65535 or 0 for unset + * @since 0.7.1 */ @Override public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, long expires, int proto, int fromPort, int toPort) throws I2PSessionException { + return sendMessage(dest, payload, offset, size, keyUsed, tagsSent, 0, proto, fromPort, toPort, 0); + } + + /** + * @param keyUsed unused - no end-to-end crypto + * @param tagsSent unused - no end-to-end crypto + * @param proto 1-254 or 0 for unset; recommended: + * I2PSession.PROTO_UNSPECIFIED + * I2PSession.PROTO_STREAMING + * I2PSession.PROTO_DATAGRAM + * 255 disallowed + * @param fromPort 1-65535 or 0 for unset + * @param toPort 1-65535 or 0 for unset + * @param flags to be passed to the router + * @since 0.8.4 + */ + @Override + public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, + SessionKey keyUsed, Set tagsSent, long expires, + int proto, int fromPort, int toPort, int flags) + throws I2PSessionException { if (isClosed()) throw new I2PSessionException("Already closed"); updateActivity(); @@ -183,7 +205,7 @@ class I2PSessionMuxedImpl extends I2PSessionImpl2 implements I2PSession { _context.statManager().addRateData("i2cp.tx.msgCompressed", payload.length, 0); _context.statManager().addRateData("i2cp.tx.msgExpanded", size, 0); - return sendBestEffort(dest, payload, keyUsed, tagsSent, expires); + return sendBestEffort(dest, payload, expires, flags); } /** @@ -191,7 +213,7 @@ class I2PSessionMuxedImpl extends I2PSessionImpl2 implements I2PSession { */ @Override public void addNewMessage(MessagePayloadMessage msg) { - Long mid = new Long(msg.getMessageId()); + Long mid = Long.valueOf(msg.getMessageId()); _availableMessages.put(mid, msg); long id = msg.getMessageId(); byte data[] = msg.getPayload().getUnencryptedData(); diff --git a/core/java/src/net/i2p/client/I2PSimpleSession.java b/core/java/src/net/i2p/client/I2PSimpleSession.java index e984b6d30712e00b93afd0d3542aac41f28634ef..e108fc008ba0e577d142f40fd0ca127adec1360d 100644 --- a/core/java/src/net/i2p/client/I2PSimpleSession.java +++ b/core/java/src/net/i2p/client/I2PSimpleSession.java @@ -98,10 +98,17 @@ class I2PSimpleSession extends I2PSessionImpl2 { } } + /** + * Ignore, does nothing + * @since 0.8.4 + */ + @Override + public void updateOptions(Properties options) {} + /** * Only map message handlers that we will use */ - class SimpleMessageHandlerMap extends I2PClientMessageHandlerMap { + private static class SimpleMessageHandlerMap extends I2PClientMessageHandlerMap { public SimpleMessageHandlerMap(I2PAppContext context) { int highest = Math.max(DestReplyMessage.MESSAGE_TYPE, BandwidthLimitsMessage.MESSAGE_TYPE); _handlers = new I2CPMessageHandler[highest+1]; diff --git a/core/java/src/net/i2p/client/datagram/I2PDatagramDissector.java b/core/java/src/net/i2p/client/datagram/I2PDatagramDissector.java index 4748e749502e4d3c4958d3878ff38a1e1c92ced6..be88bdb53f248cdd696ffa18148121fd62b0edc7 100644 --- a/core/java/src/net/i2p/client/datagram/I2PDatagramDissector.java +++ b/core/java/src/net/i2p/client/datagram/I2PDatagramDissector.java @@ -30,10 +30,10 @@ public final class I2PDatagramDissector { private static Log _log = new Log(I2PDatagramDissector.class); - private static int DGRAM_BUFSIZE = 32768; + private static final int DGRAM_BUFSIZE = 32768; - private DSAEngine dsaEng = DSAEngine.getInstance(); - private SHA256Generator hashGen = SHA256Generator.getInstance(); + private final DSAEngine dsaEng = DSAEngine.getInstance(); + private final SHA256Generator hashGen = SHA256Generator.getInstance(); private Hash rxHash = null; @@ -41,7 +41,7 @@ public final class I2PDatagramDissector { private Destination rxDest; - private byte[] rxPayload = new byte[DGRAM_BUFSIZE]; + private final byte[] rxPayload = new byte[DGRAM_BUFSIZE]; private int rxPayloadLen = 0; @@ -63,36 +63,36 @@ public final class I2PDatagramDissector { public void loadI2PDatagram(byte[] dgram) throws DataFormatException { ByteArrayInputStream dgStream = new ByteArrayInputStream(dgram); byte[] rxTrimmedPayload; - - // set invalid(very important!) - this.valid = false; - + + // set invalid(very important!) + this.valid = false; + try { rxDest = new Destination(); rxSign = new Signature(); - - // read destination + + // read destination rxDest.readBytes(dgStream); - - // read signature + + // read signature rxSign.readBytes(dgStream); - - // read payload + + // read payload rxPayloadLen = dgStream.read(rxPayload); - - // calculate the hash of the payload + + // calculate the hash of the payload this.rxHash = hashGen.calculateHash(rxPayload, 0, rxPayloadLen); - assert this.hashGen.calculateHash(this.extractPayload()).equals(this.rxHash); + assert this.hashGen.calculateHash(this.extractPayload()).equals(this.rxHash); } catch (IOException e) { _log.error("Caught IOException - INCONSISTENT STATE!", e); } catch(AssertionError e) { - _log.error("Assertion failed!", e); - } - + _log.error("Assertion failed!", e); + } + //_log.debug("Datagram payload size: " + rxPayloadLen + "; content:\n" // + HexDump.dump(rxPayload, 0, rxPayloadLen)); } - + /** * Get the payload carried by an I2P repliable datagram (previously loaded * with the loadI2PDatagram() method), verifying the datagram signature. @@ -106,7 +106,7 @@ public final class I2PDatagramDissector { return this.extractPayload(); } - + /** * Get the sender of an I2P repliable datagram (previously loaded with the * loadI2PDatagram() method), verifying the datagram signature. @@ -118,23 +118,23 @@ public final class I2PDatagramDissector { public Destination getSender() throws I2PInvalidDatagramException { this.verifySignature(); - return this.extractSender(); + return this.extractSender(); } - - /** - * Extract the hash of the payload of an I2P repliable datagram (previously - * loaded with the loadI2PDatagram() method), verifying the datagram - * signature. - * @return The hash of the payload of the I2P repliable datagram - * @throws I2PInvalidDatagramException if the signature verification fails - */ - public Hash getHash() throws I2PInvalidDatagramException { - // make sure it has a valid signature - this.verifySignature(); - - return this.extractHash(); - } - + + /** + * Extract the hash of the payload of an I2P repliable datagram (previously + * loaded with the loadI2PDatagram() method), verifying the datagram + * signature. + * @return The hash of the payload of the I2P repliable datagram + * @throws I2PInvalidDatagramException if the signature verification fails + */ + public Hash getHash() throws I2PInvalidDatagramException { + // make sure it has a valid signature + this.verifySignature(); + + return this.extractHash(); + } + /** * Extract the payload carried by an I2P repliable datagram (previously * loaded with the loadI2PDatagram() method), without verifying the @@ -145,10 +145,10 @@ public final class I2PDatagramDissector { public byte[] extractPayload() { byte[] retPayload = new byte[this.rxPayloadLen]; System.arraycopy(this.rxPayload, 0, retPayload, 0, this.rxPayloadLen); - + return retPayload; } - + /** * Extract the sender of an I2P repliable datagram (previously loaded with * the loadI2PDatagram() method), without verifying the datagram signature. @@ -168,31 +168,30 @@ public final class I2PDatagramDissector { return retDest; } - - /** - * Extract the hash of the payload of an I2P repliable datagram (previously - * loaded with the loadI2PDatagram() method), without verifying the datagram - * signature. - * @return The hash of the payload of the I2P repliable datagram - */ - public Hash extractHash() { - return this.rxHash; - } + + /** + * Extract the hash of the payload of an I2P repliable datagram (previously + * loaded with the loadI2PDatagram() method), without verifying the datagram + * signature. + * @return The hash of the payload of the I2P repliable datagram + */ + public Hash extractHash() { + return this.rxHash; + } /** * Verify the signature of this datagram (previously loaded with the * loadI2PDatagram() method) - * @throws I2PInvalidDatagramException if the signature is invalid + * @throws I2PInvalidDatagramException if the signature is invalid */ public void verifySignature() throws I2PInvalidDatagramException { // first check if it already got validated if(this.valid) return; - if (rxSign == null || rxSign.getData() == null || - rxDest == null || rxDest.getSigningPublicKey() == null) + if (rxSign == null || rxSign.getData() == null || rxDest == null || rxDest.getSigningPublicKey() == null) throw new I2PInvalidDatagramException("Datagram not yet read"); - + // now validate if (!this.dsaEng.verifySignature(rxSign, rxHash.getData(), rxDest.getSigningPublicKey())) throw new I2PInvalidDatagramException("Incorrect I2P repliable datagram signature"); diff --git a/core/java/src/net/i2p/client/datagram/I2PDatagramMaker.java b/core/java/src/net/i2p/client/datagram/I2PDatagramMaker.java index 0b3baf5b4def9a492cb8e844cc76b77523d3609b..7d711492bb60ec5223038461dba494a7c5f21d83 100644 --- a/core/java/src/net/i2p/client/datagram/I2PDatagramMaker.java +++ b/core/java/src/net/i2p/client/datagram/I2PDatagramMaker.java @@ -28,15 +28,15 @@ public final class I2PDatagramMaker { private static Log _log = new Log(I2PDatagramMaker.class); - private static int DGRAM_BUFSIZE = 32768; + private static final int DGRAM_BUFSIZE = 32768; - private SHA256Generator hashGen = SHA256Generator.getInstance(); - private DSAEngine dsaEng = DSAEngine.getInstance(); + private final SHA256Generator hashGen = SHA256Generator.getInstance(); + private final DSAEngine dsaEng = DSAEngine.getInstance(); private SigningPrivateKey sxPrivKey = null; private byte[] sxDestBytes = null; - private ByteArrayOutputStream sxDGram = new ByteArrayOutputStream(DGRAM_BUFSIZE); + private final ByteArrayOutputStream sxDGram = new ByteArrayOutputStream(DGRAM_BUFSIZE); /** * Construct a new I2PDatagramMaker that will be able to create I2P @@ -45,8 +45,8 @@ public final class I2PDatagramMaker { * @param session I2PSession used to send I2PDatagrams through */ public I2PDatagramMaker(I2PSession session) { - sxPrivKey = session.getPrivateKey(); - sxDestBytes = session.getMyDestination().toByteArray(); + this(); + this.setI2PDatagramMaker(session); } /** * Construct a new I2PDatagramMaker that is null. @@ -70,12 +70,12 @@ public final class I2PDatagramMaker { try { sxDGram.write(sxDestBytes); - + dsaEng.sign(hashGen.calculateHash(payload).toByteArray(), sxPrivKey).writeBytes(sxDGram); - + sxDGram.write(payload); - + return sxDGram.toByteArray(); } catch (IOException e) { _log.error("Caught IOException", e); diff --git a/core/java/src/net/i2p/client/datagram/I2PInvalidDatagramException.java b/core/java/src/net/i2p/client/datagram/I2PInvalidDatagramException.java index 97756a7768c57f3490544abc7859106540358f8a..e64bfb38eb4176fb658ac941cb3cc8be76e3211b 100644 --- a/core/java/src/net/i2p/client/datagram/I2PInvalidDatagramException.java +++ b/core/java/src/net/i2p/client/datagram/I2PInvalidDatagramException.java @@ -16,10 +16,10 @@ package net.i2p.client.datagram; public class I2PInvalidDatagramException extends Exception { public I2PInvalidDatagramException() { - super(); + super(); } public I2PInvalidDatagramException(String s) { - super(s); + super(s); } } diff --git a/core/java/src/net/i2p/crypto/CryptixAESEngine.java b/core/java/src/net/i2p/crypto/CryptixAESEngine.java index ea2338003ce4c9f80209a7f642f54405e440466c..350821e35558fe6324db6cbc538ce02ad53f6174 100644 --- a/core/java/src/net/i2p/crypto/CryptixAESEngine.java +++ b/core/java/src/net/i2p/crypto/CryptixAESEngine.java @@ -149,7 +149,7 @@ public class CryptixAESEngine extends AESEngine { @Override public final void decryptBlock(byte payload[], int inIndex, SessionKey sessionKey, byte rv[], int outIndex) { if ( (payload == null) || (rv == null) ) - throw new IllegalArgumentException("null block args [payload=" + payload + " rv="+rv); + throw new IllegalArgumentException("null block args"); if (payload.length - inIndex > rv.length - outIndex) throw new IllegalArgumentException("bad block args [payload.len=" + payload.length + " inIndex=" + inIndex + " rv.len=" + rv.length diff --git a/core/java/src/net/i2p/crypto/DHSessionKeyBuilder.java b/core/java/src/net/i2p/crypto/DHSessionKeyBuilder.java index 192bde062920e187cb639320e498a6756f5934de..160cc1354bb54a5d5e2c3948f65574b7eae05aaa 100644 --- a/core/java/src/net/i2p/crypto/DHSessionKeyBuilder.java +++ b/core/java/src/net/i2p/crypto/DHSessionKeyBuilder.java @@ -82,7 +82,9 @@ public class DHSessionKeyBuilder { // add to the defaults for every 128MB of RAM, up to 512MB long maxMemory = Runtime.getRuntime().maxMemory(); - int factor = Math.min(4, (int) (1 + (maxMemory / (128*1024*1024l)))); + if (maxMemory == Long.MAX_VALUE) + maxMemory = 127*1024*1024l; + int factor = (int) Math.max(1l, Math.min(4l, 1 + (maxMemory / (128*1024*1024l)))); int defaultMin = DEFAULT_DH_PRECALC_MIN * factor; int defaultMax = DEFAULT_DH_PRECALC_MAX * factor; MIN_NUM_BUILDERS = ctx.getProperty(PROP_DH_PRECALC_MIN, defaultMin); diff --git a/core/java/src/net/i2p/crypto/ElGamalAESEngine.java b/core/java/src/net/i2p/crypto/ElGamalAESEngine.java index 6160caf5b7a9243401ac5b6a166340649fcccb67..df4867574d7f52911025297a414592f2eec845bf 100644 --- a/core/java/src/net/i2p/crypto/ElGamalAESEngine.java +++ b/core/java/src/net/i2p/crypto/ElGamalAESEngine.java @@ -10,6 +10,7 @@ package net.i2p.crypto; */ import java.util.ArrayList; +import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.List; @@ -527,8 +528,6 @@ public class ElGamalAESEngine { return aesEncr; } - private final static Set EMPTY_SET = new HashSet(); - /** * For both scenarios, this method encrypts the AES area using the given key, iv * and making sure the resulting data is at least as long as the paddedSize and @@ -552,7 +551,7 @@ public class ElGamalAESEngine { long paddedSize, int prefixBytes) { //_log.debug("iv for encryption: " + DataHelper.toString(iv, 16)); //_log.debug("Encrypting AES"); - if (tagsForDelivery == null) tagsForDelivery = EMPTY_SET; + if (tagsForDelivery == null) tagsForDelivery = Collections.EMPTY_SET; int size = 2 // sizeof(tags) + tagsForDelivery.size() + SessionTag.BYTE_LENGTH*tagsForDelivery.size() diff --git a/core/java/src/net/i2p/crypto/SHA256Generator.java b/core/java/src/net/i2p/crypto/SHA256Generator.java index 8d5b6957b5e2743e83e29429c732236aa475bb23..87955646beff602b64caf979a24229882ee9062d 100644 --- a/core/java/src/net/i2p/crypto/SHA256Generator.java +++ b/core/java/src/net/i2p/crypto/SHA256Generator.java @@ -23,13 +23,18 @@ public final class SHA256Generator { return I2PAppContext.getGlobalContext().sha(); } - /** Calculate the SHA-256 has of the source + /** + * Calculate the SHA-256 hash of the source and cache the result. * @param source what to hash * @return hash of the source */ public final Hash calculateHash(byte[] source) { return calculateHash(source, 0, source.length); } + + /** + * Calculate the hash and cache the result. + */ public final Hash calculateHash(byte[] source, int start, int len) { Sha256Standalone digest = acquireGnu(); digest.update(source, start, len); @@ -39,6 +44,10 @@ public final class SHA256Generator { return Hash.create(rv); } + /** + * Use this if you only need the data, not a Hash object. + * Does not cache. + */ public final void calculateHash(byte[] source, int start, int len, byte out[], int outOffset) { Sha256Standalone digest = acquireGnu(); digest.update(source, start, len); diff --git a/core/java/src/net/i2p/crypto/YKGenerator.java b/core/java/src/net/i2p/crypto/YKGenerator.java index 165749a7cf52aecf92ac9131fb346e013edae69a..ef8546e2f0f415225669fc213101fbf3488ababe 100644 --- a/core/java/src/net/i2p/crypto/YKGenerator.java +++ b/core/java/src/net/i2p/crypto/YKGenerator.java @@ -60,7 +60,9 @@ class YKGenerator { // add to the defaults for every 128MB of RAM, up to 1GB long maxMemory = Runtime.getRuntime().maxMemory(); - int factor = Math.min(8, (int) (1 + (maxMemory / (128*1024*1024l)))); + if (maxMemory == Long.MAX_VALUE) + maxMemory = 127*1024*1024l; + int factor = (int) Math.max(1l, Math.min(8l, 1 + (maxMemory / (128*1024*1024l)))); int defaultMin = DEFAULT_YK_PRECALC_MIN * factor; int defaultMax = DEFAULT_YK_PRECALC_MAX * factor; MIN_NUM_BUILDERS = ctx.getProperty(PROP_YK_PRECALC_MIN, defaultMin); diff --git a/core/java/src/net/i2p/data/Base32.java b/core/java/src/net/i2p/data/Base32.java index 3071e0bc013ca784b8264c37589fa04809a38c3e..cbcb93515f9f8dcb90e3eaa73fdf1da862c706f5 100644 --- a/core/java/src/net/i2p/data/Base32.java +++ b/core/java/src/net/i2p/data/Base32.java @@ -72,13 +72,13 @@ public class Base32 { } private static void runApp(String args[]) { + if ("encodestring".equalsIgnoreCase(args[0])) { + System.out.println(encode(args[1].getBytes())); + return; + } + InputStream in = System.in; + OutputStream out = System.out; try { - if ("encodestring".equalsIgnoreCase(args[0])) { - System.out.println(encode(args[1].getBytes())); - return; - } - InputStream in = System.in; - OutputStream out = System.out; if (args.length >= 3) { out = new FileOutputStream(args[2]); } @@ -95,6 +95,9 @@ public class Base32 { } } catch (IOException ioe) { ioe.printStackTrace(System.err); + } finally { + try { in.close(); } catch (IOException e) {} + try { out.close(); } catch (IOException e) {} } } diff --git a/core/java/src/net/i2p/data/Base64.java b/core/java/src/net/i2p/data/Base64.java index fe730af6b4a0349e527f7347d32e094c16aeaa6c..52d59002d8ef654bff0b9314b9d48b348895e0b7 100644 --- a/core/java/src/net/i2p/data/Base64.java +++ b/core/java/src/net/i2p/data/Base64.java @@ -178,13 +178,13 @@ public class Base64 { } private static void runApp(String args[]) { + if ("encodestring".equalsIgnoreCase(args[0])) { + System.out.println(encode(args[1].getBytes())); + return; + } + InputStream in = System.in; + OutputStream out = System.out; try { - if ("encodestring".equalsIgnoreCase(args[0])) { - System.out.println(encode(args[1].getBytes())); - return; - } - InputStream in = System.in; - OutputStream out = System.out; if (args.length >= 3) { out = new FileOutputStream(args[2]); } @@ -201,6 +201,9 @@ public class Base64 { } } catch (IOException ioe) { ioe.printStackTrace(System.err); + } finally { + try { in.close(); } catch (IOException e) {} + try { out.close(); } catch (IOException e) {} } } diff --git a/core/java/src/net/i2p/data/ByteArray.java b/core/java/src/net/i2p/data/ByteArray.java index 7369a27d191c01e63c2d9ca9b4f10807b4f7f344..9f460fe4753f8eb41d4a7f399ee5c54bf166619d 100644 --- a/core/java/src/net/i2p/data/ByteArray.java +++ b/core/java/src/net/i2p/data/ByteArray.java @@ -24,6 +24,7 @@ public class ByteArray implements Serializable, Comparable { public ByteArray() { } + /** Sets valid */ public ByteArray(byte[] data) { _data = data; _valid = (data != null ? data.length : 0); @@ -38,6 +39,7 @@ public class ByteArray implements Serializable, Comparable { return _data; } + /** Warning, does not set valid */ public void setData(byte[] data) { _data = data; } diff --git a/core/java/src/net/i2p/data/Certificate.java b/core/java/src/net/i2p/data/Certificate.java index 5222000987f0a571ede238d73392827572383927..c6d7c61b222754ce609944f9dfb4513b8fb7abdb 100644 --- a/core/java/src/net/i2p/data/Certificate.java +++ b/core/java/src/net/i2p/data/Certificate.java @@ -44,7 +44,7 @@ public class Certificate extends DataStructureImpl { public final static int CERTIFICATE_TYPE_MULTIPLE = 4; /** - * Pull from cache or return new + * If null cert, return immutable static instance, else create new * @throws AIOOBE if not enough bytes * @since 0.8.3 */ @@ -57,7 +57,7 @@ public class Certificate extends DataStructureImpl { if (length == 0) return new Certificate(type, null); byte[] payload = new byte[length]; - System.arraycopy(data, off = 3, payload, 0, length); + System.arraycopy(data, off + 3, payload, 0, length); return new Certificate(type, payload); } diff --git a/core/java/src/net/i2p/data/DataHelper.java b/core/java/src/net/i2p/data/DataHelper.java index bd6bf260d9c5734186e6ae50f91b15274d52ed3a..9eab8649e569dc5581259382cfc57b19d3643f2a 100644 --- a/core/java/src/net/i2p/data/DataHelper.java +++ b/core/java/src/net/i2p/data/DataHelper.java @@ -31,6 +31,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.Date; import java.util.Iterator; import java.util.List; @@ -178,6 +179,7 @@ public class DataHelper { * @param props source * @return new offset */ + @Deprecated public static int toProperties(byte target[], int offset, Properties props) throws DataFormatException, IOException { if (props != null) { OrderedProperties p = new OrderedProperties(); @@ -218,6 +220,7 @@ public class DataHelper { * @param target returned Properties * @return new offset */ + @Deprecated public static int fromProperties(byte source[], int offset, Properties target) throws DataFormatException, IOException { int size = (int)fromLong(source, offset, 2); offset += 2; @@ -253,6 +256,7 @@ public class DataHelper { * * @throws RuntimeException if either is too long. */ + @Deprecated public static byte[] toProperties(Properties opts) { try { ByteArrayOutputStream baos = new ByteArrayOutputStream(2); @@ -543,6 +547,7 @@ public class DataHelper { } /** @deprecated unused */ + @Deprecated public static byte[] toDate(Date date) throws IllegalArgumentException { if (date == null) return toLong(DATE_LENGTH, 0L); @@ -677,6 +682,7 @@ public class DataHelper { * @throws IOException if there is an IO error writing the boolean * @deprecated unused */ + @Deprecated public static void writeBoolean(OutputStream out, Boolean bool) throws DataFormatException, IOException { if (bool == null) @@ -688,6 +694,7 @@ public class DataHelper { } /** @deprecated unused */ + @Deprecated public static Boolean fromBoolean(byte data[], int offset) { if (data[offset] == BOOLEAN_TRUE) return Boolean.TRUE; @@ -698,11 +705,13 @@ public class DataHelper { } /** @deprecated unused */ + @Deprecated public static void toBoolean(byte data[], int offset, boolean value) { data[offset] = (value ? BOOLEAN_TRUE : BOOLEAN_FALSE); } /** @deprecated unused */ + @Deprecated public static void toBoolean(byte data[], int offset, Boolean value) { if (value == null) data[offset] = BOOLEAN_UNKNOWN; @@ -711,12 +720,16 @@ public class DataHelper { } /** deprecated - used only in DatabaseLookupMessage */ + @Deprecated public static final byte BOOLEAN_TRUE = 0x1; /** deprecated - used only in DatabaseLookupMessage */ + @Deprecated public static final byte BOOLEAN_FALSE = 0x0; /** @deprecated unused */ + @Deprecated public static final byte BOOLEAN_UNKNOWN = 0x2; /** @deprecated unused */ + @Deprecated public static final int BOOLEAN_LENGTH = 1; // @@ -768,17 +781,17 @@ public class DataHelper { * This treats (null == null) as true, (null == (!null)) as false, * and unequal length arrays as false. * + * @return Arrays.equals(lhs, rhs) */ public final static boolean eq(byte lhs[], byte rhs[]) { - // this appears to be the way Arrays.equals is defined, so all the extra tests are unnecessary? - boolean eq = (((lhs == null) && (rhs == null)) || ((lhs != null) && (rhs != null) && (Arrays.equals(lhs, rhs)))); - return eq; + return Arrays.equals(lhs, rhs); } /** * Compare two integers, really just for consistency. * @deprecated inefficient */ + @Deprecated public final static boolean eq(int lhs, int rhs) { return lhs == rhs; } @@ -787,6 +800,7 @@ public class DataHelper { * Compare two longs, really just for consistency. * @deprecated inefficient */ + @Deprecated public final static boolean eq(long lhs, long rhs) { return lhs == rhs; } @@ -795,6 +809,7 @@ public class DataHelper { * Compare two bytes, really just for consistency. * @deprecated inefficient */ + @Deprecated public final static boolean eq(byte lhs, byte rhs) { return lhs == rhs; } @@ -844,7 +859,7 @@ public class DataHelper { */ public final static void xor(byte lhs[], int startLeft, byte rhs[], int startRight, byte out[], int startOut, int len) { if ( (lhs == null) || (rhs == null) || (out == null) ) - throw new NullPointerException("Invalid params to xor (" + lhs + ", " + rhs + ", " + out + ")"); + throw new NullPointerException("Null params to xor"); if (lhs.length < startLeft + len) throw new IllegalArgumentException("Left hand side is too short"); if (rhs.length < startRight + len) @@ -973,6 +988,7 @@ public class DataHelper { * @return true if the line was read, false if eof was reached before a * newline was found */ + @Deprecated public static boolean readLine(InputStream in, StringBuffer buf) throws IOException { return readLine(in, buf, null); } @@ -986,6 +1002,7 @@ public class DataHelper { * Warning - 8KB line length limit as of 0.7.13, @throws IOException if exceeded * @deprecated use StringBuilder version */ + @Deprecated public static boolean readLine(InputStream in, StringBuffer buf, Sha256Standalone hash) throws IOException { int c = -1; int i = 0; @@ -1040,25 +1057,45 @@ public class DataHelper { } /** - * Sort based on the Hash of the DataStructure + * Sort based on the Hash of the DataStructure. * Warning - relatively slow. - * Only used by RouterInfo - * Why? Just because it has to be consistent so signing will work? + * WARNING - this sort order must be consistent network-wide, so while the order is arbitrary, + * it cannot be changed. + * Why? Just because it has to be consistent so signing will work. * How to spec as returning the same type as the param? + * DEPRECATED - Only used by RouterInfo. */ public static List<? extends DataStructure> sortStructures(Collection<? extends DataStructure> dataStructures) { if (dataStructures == null) return Collections.EMPTY_LIST; - ArrayList<DataStructure> rv = new ArrayList(dataStructures.size()); - TreeMap<String, DataStructure> tm = new TreeMap(); - for (DataStructure struct : dataStructures) { - tm.put(struct.calculateHash().toString(), struct); - } - for (DataStructure struct : tm.values()) { - rv.add(struct); - } + + // This used to use Hash.toString(), which is insane, since a change to toString() + // would break the whole network. Now use Hash.toBase64(). + // Note that the Base64 sort order is NOT the same as the raw byte sort order, + // despite what you may read elsewhere. + + //ArrayList<DataStructure> rv = new ArrayList(dataStructures.size()); + //TreeMap<String, DataStructure> tm = new TreeMap(); + //for (DataStructure struct : dataStructures) { + // tm.put(struct.calculateHash().toString(), struct); + //} + //for (DataStructure struct : tm.values()) { + // rv.add(struct); + //} + ArrayList<DataStructure> rv = new ArrayList(dataStructures); + Collections.sort(rv, new DataStructureComparator()); return rv; } + /** + * See sortStructures() comments. + * @since 0.8.3 + */ + private static class DataStructureComparator implements Comparator<DataStructure> { + public int compare(DataStructure l, DataStructure r) { + return l.calculateHash().toBase64().compareTo(r.calculateHash().toBase64()); + } + } + /** * NOTE: formatDuration2() recommended in most cases for readability */ @@ -1157,6 +1194,10 @@ public class DataHelper { case 2: return str + "M"; case 3: return str + "G"; case 4: return str + "T"; + case 5: return str + "P"; + case 6: return str + "E"; + case 7: return str + "Z"; + case 8: return str + "Y"; default: return bytes + ""; } } @@ -1183,12 +1224,17 @@ public class DataHelper { case 2: return str + " M"; case 3: return str + " G"; case 4: return str + " T"; + case 5: return str + " P"; + case 6: return str + " E"; + case 7: return str + " Z"; + case 8: return str + " Y"; default: return bytes + " "; } } /** * Strip out any HTML (simply removing any less than / greater than symbols) + * @param orig may be null, returns empty string if null */ public static String stripHTML(String orig) { if (orig == null) return ""; diff --git a/core/java/src/net/i2p/data/DateAndFlags.java b/core/java/src/net/i2p/data/DateAndFlags.java new file mode 100644 index 0000000000000000000000000000000000000000..0810cddca6e9db88719b7ace262f38803c0ca30b --- /dev/null +++ b/core/java/src/net/i2p/data/DateAndFlags.java @@ -0,0 +1,139 @@ +package net.i2p.data; + +/* + * free (adj.): unencumbered; not under the control of others + * Released into the public domain + * with no warranty of any kind, either expressed or implied. + * + */ + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Date; + +/** + * A six-byte Date and 2 bytes of flags, since a Date won't encroach + * on the top two bytes until the year 10889. + * + * The flag format is not specified here. The bits may be used in + * an application-specific manner. The application should + * be designed so that a flags value of 0 is the default, for + * compatibility with an 8-byte Date. + * + * If we really need some more bits we could use the first few bits + * of the third byte. + * + * @author zzz + * @since 0.8.4 + */ +public class DateAndFlags extends DataStructureImpl { + private int _flags; + private long _date; + + public DateAndFlags() {} + + /** + * @param flags 0 - 65535 + */ + public DateAndFlags(long date, int flags) { + _flags = flags; + _date = date; + } + + /** + * @param flags 0 - 65535 + */ + public DateAndFlags(Date date, int flags) { + _flags = flags; + _date = date.getTime(); + } + + public int getFlags() { + return _flags; + } + + /** + * @param flags 0 - 65535 + */ + public void setFlags(int flags) { + _flags = flags; + } + + /** + * The Date object is created here, it is not cached. + * Use getTime() if you only need the long value. + */ + public Date getDate() { + return new Date(_date); + } + + public long getTime() { + return (_date); + } + + public void setDate(long date) { + _date = date; + } + + public void setDate(Date date) { + _date = date.getTime(); + } + + public void readBytes(InputStream in) throws DataFormatException, IOException { + _flags = (int) DataHelper.readLong(in, 2); + _date = DataHelper.readLong(in, 6); + } + + public void writeBytes(OutputStream out) throws DataFormatException, IOException { + DataHelper.writeLong(out, 2, _flags); + DataHelper.writeLong(out, 6, _date); + } + + /** + * Overridden for efficiency. + */ + @Override + public byte[] toByteArray() { + byte[] rv = DataHelper.toLong(8, _date); + rv[0] = (byte) ((_flags >> 8) & 0xff); + rv[1] = (byte) (_flags & 0xff); + return rv; + } + + /** + * Overridden for efficiency. + * @param data non-null + * @throws DataFormatException if null or wrong length + */ + @Override + public void fromByteArray(byte data[]) throws DataFormatException { + if (data == null) throw new DataFormatException("Null data passed in"); + if (data.length != 8) throw new DataFormatException("Bad data length"); + _flags = (int) DataHelper.fromLong(data, 0, 2); + _date = DataHelper.fromLong(data, 2, 6); + } + + @Override + public boolean equals(Object object) { + if ((object == null) || !(object instanceof DateAndFlags)) return false; + DateAndFlags daf = (DateAndFlags) object; + return _date == daf._date && _flags == daf._flags; + + } + + @Override + public int hashCode() { + return _flags + (int) _date; + } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder(64); + buf.append("[DateAndFlags: "); + buf.append("\n\tDate: ").append((new Date(_date)).toString()); + buf.append("\n\tFlags: 0x").append(Integer.toHexString(_flags)); + buf.append("]"); + return buf.toString(); + } +} diff --git a/core/java/src/net/i2p/data/PrivateKey.java b/core/java/src/net/i2p/data/PrivateKey.java index bf415bdc9c522acabcae644858666858c5cfff21..5b0a5e4bbb4512824e82ad355c3ec858e25b448f 100644 --- a/core/java/src/net/i2p/data/PrivateKey.java +++ b/core/java/src/net/i2p/data/PrivateKey.java @@ -16,6 +16,9 @@ import net.i2p.crypto.KeyGenerator; * A private key is 256byte Integer. The private key represents only the * exponent, not the primes, which are constant and defined in the crypto spec. * + * Note that we use short exponents, so all but the last 28.25 bytes are zero. + * See http://www.i2p2.i2p/how_cryptography for details. + * * @author jrandom */ public class PrivateKey extends SimpleDataStructure { @@ -50,4 +53,24 @@ public class PrivateKey extends SimpleDataStructure { return KeyGenerator.getPublicKey(this); } + /** + * We assume the data has enough randomness in it, so use the last 4 bytes for speed. + * Overridden since we use short exponents, so the first 227 bytes are all zero. + * Not that we are storing PrivateKeys in any Sets or Maps anywhere. + */ + @Override + public int hashCode() { + if (_data == null) + return 0; + int rv = _data[KEYSIZE_BYTES - 4]; + for (int i = 1; i < 4; i++) + rv ^= (_data[i + (KEYSIZE_BYTES - 4)] << (i*8)); + return rv; + } + + @Override + public boolean equals(Object obj) { + if ((obj == null) || !(obj instanceof PrivateKey)) return false; + return DataHelper.eq(_data, ((PrivateKey) obj)._data); + } } diff --git a/core/java/src/net/i2p/data/PrivateKeyFile.java b/core/java/src/net/i2p/data/PrivateKeyFile.java index 0c752f9d6a22c0eed86d5aeb97d99081997f8eb1..4f4af3cf9ae51a582bce40f0a7a0cb6c7a71c390 100644 --- a/core/java/src/net/i2p/data/PrivateKeyFile.java +++ b/core/java/src/net/i2p/data/PrivateKeyFile.java @@ -133,9 +133,15 @@ public class PrivateKeyFile { */ public Destination createIfAbsent() throws I2PException, IOException, DataFormatException { if(!this.file.exists()) { - FileOutputStream out = new FileOutputStream(this.file); - this.client.createDestination(out); - out.close(); + FileOutputStream out = null; + try { + out = new FileOutputStream(this.file); + this.client.createDestination(out); + } finally { + if (out != null) { + try { out.close(); } catch (IOException ioe) {} + } + } } return getDestination(); } @@ -243,29 +249,36 @@ public class PrivateKeyFile { public I2PSession open() throws I2PSessionException, IOException { return this.open(new Properties()); } + public I2PSession open(Properties opts) throws I2PSessionException, IOException { - // open input file - FileInputStream in = new FileInputStream(this.file); - - // create sesssion - I2PSession s = this.client.createSession(in, opts); - - // close file - in.close(); - - return s; + FileInputStream in = null; + try { + in = new FileInputStream(this.file); + I2PSession s = this.client.createSession(in, opts); + return s; + } finally { + if (in != null) { + try { in.close(); } catch (IOException ioe) {} + } + } } /** * Copied from I2PClientImpl.createDestination() */ public void write() throws IOException, DataFormatException { - FileOutputStream out = new FileOutputStream(this.file); - this.dest.writeBytes(out); - this.privKey.writeBytes(out); - this.signingPrivKey.writeBytes(out); - out.flush(); - out.close(); + FileOutputStream out = null; + try { + out = new FileOutputStream(this.file); + this.dest.writeBytes(out); + this.privKey.writeBytes(out); + this.signingPrivKey.writeBytes(out); + out.flush(); + } finally { + if (out != null) { + try { out.close(); } catch (IOException ioe) {} + } + } } @Override @@ -377,7 +390,8 @@ public class PrivateKeyFile { } } } - } catch (Exception ioe) { + } catch (DataFormatException dfe) { + } catch (IOException ioe) { } // not found, continue to the next file } diff --git a/core/java/src/net/i2p/data/RouterAddress.java b/core/java/src/net/i2p/data/RouterAddress.java index 1b4d6438f5e518caf134c9f4a9a61183f7aaf96e..647104574a2a8518f85178f6f6686f4939449348 100644 --- a/core/java/src/net/i2p/data/RouterAddress.java +++ b/core/java/src/net/i2p/data/RouterAddress.java @@ -131,10 +131,13 @@ public class RouterAddress extends DataStructureImpl { && DataHelper.eq(_transportStyle, addr.getTransportStyle()); } - /** the style should be sufficient, for speed */ + /** + * Just use style and hashCode for speed (expiration is always null). + * If we add multiple addresses of the same style, this may need to be changed. + */ @Override public int hashCode() { - return DataHelper.hashCode(_transportStyle); + return DataHelper.hashCode(_transportStyle) ^ _cost; } /** diff --git a/core/java/src/net/i2p/data/RouterInfo.java b/core/java/src/net/i2p/data/RouterInfo.java index 9c6db01f9111a728fb666b0d713b9ed18549c178..7d6ff8a8e5b2f5f9288fad7faaef4550214499d4 100644 --- a/core/java/src/net/i2p/data/RouterInfo.java +++ b/core/java/src/net/i2p/data/RouterInfo.java @@ -14,6 +14,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Collection; +import java.util.Collections; import java.util.Date; import java.util.HashSet; import java.util.Iterator; @@ -39,7 +40,8 @@ public class RouterInfo extends DatabaseEntry { private RouterIdentity _identity; private volatile long _published; private final Set<RouterAddress> _addresses; - private final Set<Hash> _peers; + /** may be null to save memory, no longer final */ + private Set<Hash> _peers; private /* FIXME final FIXME */ Properties _options; private volatile boolean _validated; private volatile boolean _isValid; @@ -47,6 +49,11 @@ public class RouterInfo extends DatabaseEntry { private volatile byte _byteified[]; private volatile int _hashCode; private volatile boolean _hashCodeInitialized; + /** should we cache the byte and string versions _byteified ? **/ + private boolean _shouldCache; + /** maybe we should check if we are floodfill? */ + private static final boolean CACHE_ALL = Runtime.getRuntime().maxMemory() > 128*1024*1024l && + Runtime.getRuntime().maxMemory() < Long.MAX_VALUE; public static final String PROP_NETWORK_ID = "netId"; public static final String PROP_CAPABILITIES = "caps"; @@ -58,7 +65,6 @@ public class RouterInfo extends DatabaseEntry { public RouterInfo() { _addresses = new HashSet(2); - _peers = new HashSet(0); _options = new OrderedProperties(); } @@ -70,6 +76,7 @@ public class RouterInfo extends DatabaseEntry { setPeers(old.getPeers()); setOptions(old.getOptions()); setSignature(old.getSignature()); + // copy over _byteified? } public long getDate() { @@ -105,6 +112,11 @@ public class RouterInfo extends DatabaseEntry { public void setIdentity(RouterIdentity ident) { _identity = ident; resetCache(); + // We only want to cache the bytes for our own RI, which is frequently written. + // To cache for all RIs doubles the RI memory usage. + // setIdentity() is only called when we are creating our own RI. + // Otherwise, the data is populated with readBytes(). + _shouldCache = true; } /** @@ -159,6 +171,8 @@ public class RouterInfo extends DatabaseEntry { * @deprecated Implemented here but unused elsewhere */ public Set<Hash> getPeers() { + if (_peers == null) + return Collections.EMPTY_SET; return _peers; } @@ -169,9 +183,15 @@ public class RouterInfo extends DatabaseEntry { * @deprecated Implemented here but unused elsewhere */ public void setPeers(Set<Hash> peers) { + if (peers == null || peers.isEmpty()) { + _peers = null; + return; + } + if (_peers == null) + _peers = new HashSet(2); synchronized (_peers) { _peers.clear(); - if (peers != null) _peers.addAll(peers); + _peers.addAll(peers); } resetCache(); } @@ -223,7 +243,6 @@ public class RouterInfo extends DatabaseEntry { if (_byteified != null) return _byteified; if (_identity == null) throw new DataFormatException("Router identity isn't set? wtf!"); if (_addresses == null) throw new DataFormatException("Router addressess isn't set? wtf!"); - if (_peers == null) throw new DataFormatException("Router peers isn't set? wtf!"); if (_options == null) throw new DataFormatException("Router options isn't set? wtf!"); long before = Clock.getInstance().now(); @@ -239,6 +258,9 @@ public class RouterInfo extends DatabaseEntry { DataHelper.writeLong(out, 1, sz); Collection<RouterAddress> addresses = _addresses; if (sz > 1) + // WARNING this sort algorithm cannot be changed, as it must be consistent + // network-wide. The signature is not checked at readin time, but only + // later, and the addresses are stored in a Set, not a List. addresses = (Collection<RouterAddress>) DataHelper.sortStructures(addresses); for (RouterAddress addr : addresses) { addr.writeBytes(out); @@ -248,12 +270,14 @@ public class RouterInfo extends DatabaseEntry { // answer: they're always empty... they're a placeholder for one particular // method of trusted links, which isn't implemented in the router // at the moment, and may not be later. - // fixme to reduce objects - allow _peers == null - int psz = _peers.size(); + int psz = _peers == null ? 0 : _peers.size(); DataHelper.writeLong(out, 1, psz); if (psz > 0) { Collection<Hash> peers = _peers; if (psz > 1) + // WARNING this sort algorithm cannot be changed, as it must be consistent + // network-wide. The signature is not checked at readin time, but only + // later, and the hashes are stored in a Set, not a List. peers = (Collection<Hash>) DataHelper.sortStructures(peers); for (Hash peerHash : peers) { peerHash.writeBytes(out); @@ -266,7 +290,8 @@ public class RouterInfo extends DatabaseEntry { byte data[] = out.toByteArray(); long after = Clock.getInstance().now(); _log.debug("getBytes() took " + (after - before) + "ms"); - _byteified = data; + if (CACHE_ALL || _shouldCache) + _byteified = data; return data; } @@ -466,10 +491,15 @@ public class RouterInfo extends DatabaseEntry { _addresses.add(address); } int numPeers = (int) DataHelper.readLong(in, 1); - for (int i = 0; i < numPeers; i++) { - Hash peerIdentityHash = new Hash(); - peerIdentityHash.readBytes(in); - _peers.add(peerIdentityHash); + if (numPeers == 0) { + _peers = null; + } else { + _peers = new HashSet(numPeers); + for (int i = 0; i < numPeers; i++) { + Hash peerIdentityHash = new Hash(); + peerIdentityHash.readBytes(in); + _peers.add(peerIdentityHash); + } } _options = DataHelper.readProperties(in); _signature = new Signature(); @@ -504,7 +534,7 @@ public class RouterInfo extends DatabaseEntry { && _published == info.getPublished() && DataHelper.eq(_addresses, info.getAddresses()) && DataHelper.eq(_options, info.getOptions()) - && DataHelper.eq(_peers, info.getPeers()); + && DataHelper.eq(getPeers(), info.getPeers()); } @Override @@ -530,7 +560,7 @@ public class RouterInfo extends DatabaseEntry { RouterAddress addr = (RouterAddress) iter.next(); buf.append("\n\t\tAddress: ").append(addr); } - Set peers = _peers; // getPeers() + Set peers = getPeers(); buf.append("\n\tPeers: #: ").append(peers.size()); for (Iterator iter = peers.iterator(); iter.hasNext();) { Hash hash = (Hash) iter.next(); diff --git a/core/java/src/net/i2p/data/SDSCache.java b/core/java/src/net/i2p/data/SDSCache.java index 562c49c79ae0ca8d880e0022fed1c619f8392d8f..8698f6a78b7d80c9ce89b4d18f480099412f4025 100644 --- a/core/java/src/net/i2p/data/SDSCache.java +++ b/core/java/src/net/i2p/data/SDSCache.java @@ -50,6 +50,8 @@ public class SDSCache<V extends SimpleDataStructure> { private static final double FACTOR; static { long maxMemory = Runtime.getRuntime().maxMemory(); + if (maxMemory == Long.MAX_VALUE) + maxMemory = 96*1024*1024l; FACTOR = Math.max(MIN_FACTOR, Math.min(MAX_FACTOR, maxMemory / (128*1024*1024d))); } diff --git a/core/java/src/net/i2p/data/SimpleDataStructure.java b/core/java/src/net/i2p/data/SimpleDataStructure.java index 0017e567cc41ae573874a9bba06c4ef25918b746..01ca5443f38fe5694b753d9ff3804365c6c2aa43 100644 --- a/core/java/src/net/i2p/data/SimpleDataStructure.java +++ b/core/java/src/net/i2p/data/SimpleDataStructure.java @@ -75,7 +75,7 @@ public abstract class SimpleDataStructure extends DataStructureImpl { /** * Sets the data. - * @param data of correct length, or null + * @param in the stream to read * @throws RuntimeException if data already set. */ public void readBytes(InputStream in) throws DataFormatException, IOException { diff --git a/core/java/src/net/i2p/data/TunnelId.java b/core/java/src/net/i2p/data/TunnelId.java index 2e625e606fbfb4f5c47f3082b5f4cee02eb7b45f..0e1c815f6005befb716fa5ca1d0ef3bb270ad063 100644 --- a/core/java/src/net/i2p/data/TunnelId.java +++ b/core/java/src/net/i2p/data/TunnelId.java @@ -50,6 +50,26 @@ public class TunnelId extends DataStructureImpl { DataHelper.writeLong(out, 4, _tunnelId); } + /** + * Overridden for efficiency. + */ + @Override + public byte[] toByteArray() { + return DataHelper.toLong(4, _tunnelId); + } + + /** + * Overridden for efficiency. + * @param data non-null + * @throws DataFormatException if null or wrong length + */ + @Override + public void fromByteArray(byte data[]) throws DataFormatException { + if (data == null) throw new DataFormatException("Null data passed in"); + if (data.length != 4) throw new DataFormatException("Bad data length"); + _tunnelId = (int) DataHelper.fromLong(data, 0, 4); + } + @Override public boolean equals(Object obj) { if ( (obj == null) || !(obj instanceof TunnelId)) diff --git a/core/java/src/net/i2p/data/i2cp/DestReplyMessage.java b/core/java/src/net/i2p/data/i2cp/DestReplyMessage.java index 788fb36a0d3930e45b7f2f98bef37790ab383f73..f4d44a3ae30103619d83147b5b3cb5f4d25f659a 100644 --- a/core/java/src/net/i2p/data/i2cp/DestReplyMessage.java +++ b/core/java/src/net/i2p/data/i2cp/DestReplyMessage.java @@ -74,10 +74,11 @@ public class DestReplyMessage extends I2CPMessageImpl { } protected byte[] doWriteMessage() throws I2CPMessageException, IOException { - if (_dest == null && _hash == null) - return new byte[0]; // null response allowed - if (_dest == null && _hash != null) + if (_dest == null) { + if (_hash == null) + return new byte[0]; // null response allowed return _hash.getData(); + } ByteArrayOutputStream os = new ByteArrayOutputStream(_dest.size()); try { _dest.writeBytes(os); diff --git a/core/java/src/net/i2p/data/i2cp/SendMessageExpiresMessage.java b/core/java/src/net/i2p/data/i2cp/SendMessageExpiresMessage.java index 9bcabe2fb77a4fb875d4bf0d38465a9409314008..08b31a6e759fb8c1b31242fbc89b25f127a2a2a3 100644 --- a/core/java/src/net/i2p/data/i2cp/SendMessageExpiresMessage.java +++ b/core/java/src/net/i2p/data/i2cp/SendMessageExpiresMessage.java @@ -16,32 +16,66 @@ import java.util.Date; import net.i2p.data.DataFormatException; import net.i2p.data.DataHelper; +import net.i2p.data.DateAndFlags; import net.i2p.data.Destination; import net.i2p.data.Payload; /** * Same as SendMessageMessage, but with an expiration to be passed to the router * + * As of 0.8.4, retrofitted to use DateAndFlags. Backwards compatible. + * * @author zzz */ public class SendMessageExpiresMessage extends SendMessageMessage { /* FIXME hides another field FIXME */ public final static int MESSAGE_TYPE = 36; - private SessionId _sessionId; - private Destination _destination; - private Payload _payload; - private Date _expiration; + private final DateAndFlags _daf; public SendMessageExpiresMessage() { super(); + _daf = new DateAndFlags(); } + /** + * The Date object is created here, it is not cached. + * Use getExpirationTime() if you only need the long value. + */ public Date getExpiration() { - return _expiration; + return _daf.getDate(); + } + + /** + * Use this instead of getExpiration().getTime() + * @since 0.8.4 + */ + public long getExpirationTime() { + return _daf.getTime(); } public void setExpiration(Date d) { - _expiration = d; + _daf.setDate(d); + } + + /** + * @since 0.8.4 + */ + public void setExpiration(long d) { + _daf.setDate(d); + } + + /** + * @since 0.8.4 + */ + public int getFlags() { + return _daf.getFlags(); + } + + /** + * @since 0.8.4 + */ + public void setFlags(int f) { + _daf.setFlags(f); } /** @@ -54,7 +88,7 @@ public class SendMessageExpiresMessage extends SendMessageMessage { super.readMessage(in, length, type); try { - _expiration = DataHelper.readDate(in); + _daf.readBytes(in); } catch (DataFormatException dfe) { throw new I2CPMessageException("Unable to load the message data", dfe); } @@ -68,7 +102,7 @@ public class SendMessageExpiresMessage extends SendMessageMessage { */ @Override public void writeMessage(OutputStream out) throws I2CPMessageException, IOException { - if ((getSessionId() == null) || (getDestination() == null) || (getPayload() == null) || (getNonce() <= 0) || (_expiration == null)) + if ((getSessionId() == null) || (getDestination() == null) || (getPayload() == null) || (getNonce() <= 0)) throw new I2CPMessageException("Unable to write out the message as there is not enough data"); int len = 2 + getDestination().size() + getPayload().getSize() + 4 + 4 + DataHelper.DATE_LENGTH; @@ -79,7 +113,7 @@ public class SendMessageExpiresMessage extends SendMessageMessage { getDestination().writeBytes(out); getPayload().writeBytes(out); DataHelper.writeLong(out, 4, getNonce()); - DataHelper.writeDate(out, _expiration); + _daf.writeBytes(out); } catch (DataFormatException dfe) { throw new I2CPMessageException("Error writing the msg", dfe); } @@ -96,7 +130,7 @@ public class SendMessageExpiresMessage extends SendMessageMessage { if ((object != null) && (object instanceof SendMessageExpiresMessage)) { SendMessageExpiresMessage msg = (SendMessageExpiresMessage) object; return super.equals(object) - && DataHelper.eq(getExpiration(), msg.getExpiration()); + && _daf.equals(msg._daf); } return false; diff --git a/core/java/src/net/i2p/internal/QueuedI2CPMessageReader.java b/core/java/src/net/i2p/internal/QueuedI2CPMessageReader.java index d713b678d4463a2ff617f54638a9e9500c8c421f..4b14d5ed8c4dcc70e5092eb84d2028804f5f236e 100644 --- a/core/java/src/net/i2p/internal/QueuedI2CPMessageReader.java +++ b/core/java/src/net/i2p/internal/QueuedI2CPMessageReader.java @@ -5,7 +5,7 @@ import net.i2p.data.i2cp.I2CPMessageReader; import net.i2p.util.I2PThread; /** - * Get messages off an In-JVM queue, zero-copy + * Get messages off an In-JVM queue, zero-copy. * * @author zzz * @since 0.8.3 @@ -13,6 +13,9 @@ import net.i2p.util.I2PThread; public class QueuedI2CPMessageReader extends I2CPMessageReader { private final I2CPMessageQueue in; + /** + * Creates a new instance of this QueuedMessageReader and spawns a pumper thread. + */ public QueuedI2CPMessageReader(I2CPMessageQueue in, I2CPMessageEventListener lsnr) { super(lsnr); this.in = in; @@ -25,13 +28,19 @@ public class QueuedI2CPMessageReader extends I2CPMessageReader { public QueuedI2CPMessageReaderRunner() { super(); } - + + /** + * Shuts the pumper down. + */ @Override public void cancelRunner() { super.cancelRunner(); _readerThread.interrupt(); } - + + /** + * Pumps messages from the incoming message queue to the listener. + */ @Override public void run() { while (_stayAlive) { @@ -40,11 +49,15 @@ public class QueuedI2CPMessageReader extends I2CPMessageReader { I2CPMessage msg = null; try { msg = in.take(); - if (msg.getType() == PoisonI2CPMessage.MESSAGE_TYPE) + if (msg.getType() == PoisonI2CPMessage.MESSAGE_TYPE) { + _listener.disconnected(QueuedI2CPMessageReader.this); cancelRunner(); - else + } else { _listener.messageReceived(QueuedI2CPMessageReader.this, msg); - } catch (InterruptedException ie) {} + } + } catch (InterruptedException ie) { + // hint that we probably should check the continue running flag + } } // ??? unused if (_stayAlive && !_doRun) { diff --git a/core/java/src/net/i2p/stat/FrequencyStat.java b/core/java/src/net/i2p/stat/FrequencyStat.java index dfa7bcfe675298c564d2169f4d8d95372c19e4ad..d18a469dbd3c921a640cf7e06d3141db968747be 100644 --- a/core/java/src/net/i2p/stat/FrequencyStat.java +++ b/core/java/src/net/i2p/stat/FrequencyStat.java @@ -89,7 +89,7 @@ public class FrequencyStat { /** @since 0.8.2 */ @Override public boolean equals(Object obj) { - if ((obj == null) || (obj.getClass() != FrequencyStat.class)) return false; + if ((obj == null) || !(obj instanceof FrequencyStat)) return false; return _statName.equals(((FrequencyStat)obj)._statName); } diff --git a/core/java/src/net/i2p/stat/PersistenceHelper.java b/core/java/src/net/i2p/stat/PersistenceHelper.java index d8c1312d42432ac31275f1fee0f6abdb0a459f79..1d5c6a46631700734765b6c70befcf413a4e3650 100644 --- a/core/java/src/net/i2p/stat/PersistenceHelper.java +++ b/core/java/src/net/i2p/stat/PersistenceHelper.java @@ -1,10 +1,16 @@ package net.i2p.stat; +import java.util.Date; import java.util.Properties; +import net.i2p.data.DataHelper; import net.i2p.util.Log; -/** object orientation gives you hairy palms. */ +/** + * Output rate data. + * This is used via ProfilePersistenceHelper and the output + * must be compatible. + */ class PersistenceHelper { private final static Log _log = new Log(PersistenceHelper.class); private final static String NL = System.getProperty("line.separator"); @@ -15,6 +21,18 @@ class PersistenceHelper { buf.append(prefix).append(name).append('=').append(value).append(NL).append(NL); } + /** @since 0.8.5 */ + public final static void addDate(StringBuilder buf, String prefix, String name, String description, long value) { + String when = value > 0 ? (new Date(value)).toString() : "Never"; + add(buf, prefix, name, description + ' ' + when, value); + } + + /** @since 0.8.5 */ + public final static void addTime(StringBuilder buf, String prefix, String name, String description, long value) { + String when = DataHelper.formatDuration(value); + add(buf, prefix, name, description + ' ' + when, value); + } + public final static void add(StringBuilder buf, String prefix, String name, String description, long value) { buf.append("# ").append(prefix).append(name).append(NL); buf.append("# ").append(description).append(NL); @@ -48,4 +66,4 @@ class PersistenceHelper { } return 0; } -} \ No newline at end of file +} diff --git a/core/java/src/net/i2p/stat/Rate.java b/core/java/src/net/i2p/stat/Rate.java index fd0fae49f00d197c575c866c87cc21aca98bfdd2..8bf5bcf472aa40d56d703fb60ebce622021ab4f9 100644 --- a/core/java/src/net/i2p/stat/Rate.java +++ b/core/java/src/net/i2p/stat/Rate.java @@ -3,6 +3,7 @@ package net.i2p.stat; import java.io.IOException; import java.util.Properties; +import net.i2p.data.DataHelper; import net.i2p.util.Log; /** @@ -399,42 +400,41 @@ public class Rate { } public void store(String prefix, StringBuilder buf) throws IOException { - PersistenceHelper.add(buf, prefix, ".period", "Number of milliseconds in the period", _period); - PersistenceHelper.add(buf, prefix, ".creationDate", - "When was this rate created? (milliseconds since the epoch, GMT)", _creationDate); - PersistenceHelper.add(buf, prefix, ".lastCoalesceDate", - "When did we last coalesce this rate? (milliseconds since the epoch, GMT)", + PersistenceHelper.addTime(buf, prefix, ".period", "Length of the period:", _period); + PersistenceHelper.addDate(buf, prefix, ".creationDate", + "When was this rate created?", _creationDate); + PersistenceHelper.addDate(buf, prefix, ".lastCoalesceDate", + "When did we last coalesce this rate?", _lastCoalesceDate); - PersistenceHelper.add(buf, prefix, ".currentDate", - "When did this data get written? (milliseconds since the epoch, GMT)", now()); + PersistenceHelper.addDate(buf, prefix, ".currentDate", + "When was this data written?", now()); PersistenceHelper.add(buf, prefix, ".currentTotalValue", "Total value of data points in the current (uncoalesced) period", _currentTotalValue); - PersistenceHelper - .add(buf, prefix, ".currentEventCount", + PersistenceHelper.add(buf, prefix, ".currentEventCount", "How many events have occurred in the current (uncoalesced) period?", _currentEventCount); - PersistenceHelper.add(buf, prefix, ".currentTotalEventTime", - "How many milliseconds have the events in the current (uncoalesced) period consumed?", + PersistenceHelper.addTime(buf, prefix, ".currentTotalEventTime", + "How much time have the events in the current (uncoalesced) period consumed?", _currentTotalEventTime); PersistenceHelper.add(buf, prefix, ".lastTotalValue", "Total value of data points in the most recent (coalesced) period", _lastTotalValue); PersistenceHelper.add(buf, prefix, ".lastEventCount", "How many events have occurred in the most recent (coalesced) period?", _lastEventCount); - PersistenceHelper.add(buf, prefix, ".lastTotalEventTime", - "How many milliseconds have the events in the most recent (coalesced) period consumed?", + PersistenceHelper.addTime(buf, prefix, ".lastTotalEventTime", + "How much time have the events in the most recent (coalesced) period consumed?", _lastTotalEventTime); PersistenceHelper.add(buf, prefix, ".extremeTotalValue", "Total value of data points in the most extreme period", _extremeTotalValue); PersistenceHelper.add(buf, prefix, ".extremeEventCount", "How many events have occurred in the most extreme period?", _extremeEventCount); - PersistenceHelper.add(buf, prefix, ".extremeTotalEventTime", - "How many milliseconds have the events in the most extreme period consumed?", + PersistenceHelper.addTime(buf, prefix, ".extremeTotalEventTime", + "How much time have the events in the most extreme period consumed?", _extremeTotalEventTime); PersistenceHelper.add(buf, prefix, ".lifetimeTotalValue", "Total value of data points since this stat was created", _lifetimeTotalValue); PersistenceHelper.add(buf, prefix, ".lifetimeEventCount", "How many events have occurred since this stat was created?", _lifetimeEventCount); - PersistenceHelper.add(buf, prefix, ".lifetimeTotalEventTime", - "How many milliseconds have the events since this stat was created consumed?", + PersistenceHelper.addTime(buf, prefix, ".lifetimeTotalEventTime", + "How much total time was consumed by the events since this stat was created?", _lifetimeTotalEventTime); } @@ -471,48 +471,28 @@ public class Rate { coalesce(); } + /** + * This is used in StatSummarizer and SummaryListener. + * We base it on the stat we are tracking, not the stored data. + */ @Override public boolean equals(Object obj) { - if ((obj == null) || (obj.getClass() != Rate.class)) return false; + if ((obj == null) || !(obj instanceof Rate)) return false; if (obj == this) return true; Rate r = (Rate) obj; return _period == r.getPeriod() && _creationDate == r.getCreationDate() && - //_lastCoalesceDate == r.getLastCoalesceDate() && - _currentTotalValue == r.getCurrentTotalValue() && _currentEventCount == r.getCurrentEventCount() - && _currentTotalEventTime == r.getCurrentTotalEventTime() && _lastTotalValue == r.getLastTotalValue() - && _lastEventCount == r.getLastEventCount() && _lastTotalEventTime == r.getLastTotalEventTime() - && _extremeTotalValue == r.getExtremeTotalValue() && _extremeEventCount == r.getExtremeEventCount() - && _extremeTotalEventTime == r.getExtremeTotalEventTime() - && _lifetimeTotalValue == r.getLifetimeTotalValue() && _lifetimeEventCount == r.getLifetimeEventCount() - && _lifetimeTotalEventTime == r.getLifetimeTotalEventTime(); + // do this the easy way to avoid NPEs. + // Alternative: compare name and group name (very carefully to avoid NPEs) + _stat == r._stat; } /** * It doesn't appear that Rates are ever stored in a Set or Map * (RateStat stores in an array) so let's make this easy. - * We can always make something faster if it's actually used. */ @Override public int hashCode() { -/***** - int hash = 5; - hash = 67 * hash + (int)(Double.doubleToLongBits(this._currentTotalValue) ^ (Double.doubleToLongBits(this._currentTotalValue) >>> 32)); - hash = 67 * hash + (int)(this._currentEventCount ^ (this._currentEventCount >>> 32)); - hash = 67 * hash + (int)(this._currentTotalEventTime ^ (this._currentTotalEventTime >>> 32)); - hash = 67 * hash + (int)(Double.doubleToLongBits(this._lastTotalValue) ^ (Double.doubleToLongBits(this._lastTotalValue) >>> 32)); - hash = 67 * hash + (int)(this._lastEventCount ^ (this._lastEventCount >>> 32)); - hash = 67 * hash + (int)(this._lastTotalEventTime ^ (this._lastTotalEventTime >>> 32)); - hash = 67 * hash + (int)(Double.doubleToLongBits(this._extremeTotalValue) ^ (Double.doubleToLongBits(this._extremeTotalValue) >>> 32)); - hash = 67 * hash + (int)(this._extremeEventCount ^ (this._extremeEventCount >>> 32)); - hash = 67 * hash + (int)(this._extremeTotalEventTime ^ (this._extremeTotalEventTime >>> 32)); - hash = 67 * hash + (int)(Double.doubleToLongBits(this._lifetimeTotalValue) ^ (Double.doubleToLongBits(this._lifetimeTotalValue) >>> 32)); - hash = 67 * hash + (int)(this._lifetimeEventCount ^ (this._lifetimeEventCount >>> 32)); - hash = 67 * hash + (int)(this._lifetimeTotalEventTime ^ (this._lifetimeTotalEventTime >>> 32)); - hash = 67 * hash + (int)(this._creationDate ^ (this._creationDate >>> 32)); - hash = 67 * hash + (int)(this._period ^ (this._period >>> 32)); - return hash; -******/ - return toString().hashCode(); + return DataHelper.hashCode(_stat) ^ ((int)_period) ^ ((int) _creationDate); } @Override diff --git a/core/java/src/net/i2p/stat/RateStat.java b/core/java/src/net/i2p/stat/RateStat.java index 79ddec51980efdcf689f9f95b4cade1f25223d18..fded9b019f4665dd15dc15214f75d67bdf8c0618 100644 --- a/core/java/src/net/i2p/stat/RateStat.java +++ b/core/java/src/net/i2p/stat/RateStat.java @@ -108,7 +108,7 @@ public class RateStat { @Override public boolean equals(Object obj) { - if ((obj == null) || (obj.getClass() != RateStat.class)) return false; + if ((obj == null) || !(obj instanceof RateStat)) return false; RateStat rs = (RateStat) obj; if (DataHelper.eq(getGroupName(), rs.getGroupName()) && DataHelper.eq(getDescription(), rs.getDescription()) && DataHelper.eq(getName(), rs.getName())) { diff --git a/core/java/src/net/i2p/stat/StatManager.java b/core/java/src/net/i2p/stat/StatManager.java index 531138d1a2b502df5d2b38948b820ce54ef5b627..868e18402a01ca5737846cb66e292d6841bdb290 100644 --- a/core/java/src/net/i2p/stat/StatManager.java +++ b/core/java/src/net/i2p/stat/StatManager.java @@ -54,7 +54,7 @@ public class StatManager { "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" + + "tunnel.acceptLoad,tunnel.buildRequestTime,tunnel.rejectOverloaded,tunnel.rejectTimeout," + "tunnel.buildClientExpire,tunnel.buildClientReject,tunnel.buildClientSuccess," + "tunnel.buildExploratoryExpire,tunnel.buildExploratoryReject,tunnel.buildExploratorySuccess," + "tunnel.buildRatio.*,tunnel.corruptMessage,tunnel.dropLoad*," + diff --git a/core/java/src/net/i2p/time/Timestamper.java b/core/java/src/net/i2p/time/Timestamper.java index a84882215c275ff3514e96e99b7a251671422827..2c798bab6b2bb75b9671b3951d6b17118fe81246 100644 --- a/core/java/src/net/i2p/time/Timestamper.java +++ b/core/java/src/net/i2p/time/Timestamper.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.StringTokenizer; +import java.util.concurrent.CopyOnWriteArrayList; import net.i2p.I2PAppContext; import net.i2p.util.I2PThread; @@ -56,7 +57,7 @@ public class Timestamper implements Runnable { public Timestamper(I2PAppContext ctx, UpdateListener lsnr, boolean daemon) { // moved here to prevent problems with synchronized statements. _servers = new ArrayList(3); - _listeners = new ArrayList(1); + _listeners = new CopyOnWriteArrayList(); // Don't bother starting a thread if we are disabled. // This means we no longer check every 5 minutes to see if we got enabled, // so the property must be set at startup. @@ -92,24 +93,16 @@ public class Timestamper implements Runnable { public boolean getIsDisabled() { return _disabled; } public void addListener(UpdateListener lsnr) { - synchronized (_listeners) { _listeners.add(lsnr); - } } public void removeListener(UpdateListener lsnr) { - synchronized (_listeners) { _listeners.remove(lsnr); - } } public int getListenerCount() { - synchronized (_listeners) { return _listeners.size(); - } } public UpdateListener getListener(int index) { - synchronized (_listeners) { return _listeners.get(index); - } } private void startTimestamper() { @@ -257,11 +250,8 @@ public class Timestamper implements Runnable { */ private void stampTime(long now, int stratum) { long before = _context.clock().now(); - synchronized (_listeners) { - for (int i = 0; i < _listeners.size(); i++) { - UpdateListener lsnr = _listeners.get(i); - lsnr.setNow(now, stratum); - } + for (UpdateListener lsnr : _listeners) { + lsnr.setNow(now, stratum); } if (_log.shouldLog(Log.DEBUG)) _log.debug("Stamped the time as " + now + " (delta=" + (now-before) + ")"); diff --git a/core/java/src/net/i2p/util/ByteCache.java b/core/java/src/net/i2p/util/ByteCache.java index 3ef72ca10c3ca55d352223eee1868403269e0730..2d3eb482db5b9f64a259e132fca70d1aeb53ae6e 100644 --- a/core/java/src/net/i2p/util/ByteCache.java +++ b/core/java/src/net/i2p/util/ByteCache.java @@ -69,6 +69,8 @@ public final class ByteCache { private static final int MAX_CACHE; static { long maxMemory = Runtime.getRuntime().maxMemory(); + if (maxMemory == Long.MAX_VALUE) + maxMemory = 96*1024*1024l; MAX_CACHE = (int) Math.min(4*1024*1024l, Math.max(128*1024l, maxMemory / 128)); } diff --git a/core/java/src/net/i2p/util/Clock.java b/core/java/src/net/i2p/util/Clock.java index 4fc5eaff075ba2e3d475fb9583f64117425d5ad2..ee43af44cc32248ab61c706e8c4de95addb6b6d8 100644 --- a/core/java/src/net/i2p/util/Clock.java +++ b/core/java/src/net/i2p/util/Clock.java @@ -1,8 +1,8 @@ package net.i2p.util; -import java.util.HashSet; import java.util.Iterator; import java.util.Set; +import java.util.concurrent.CopyOnWriteArraySet; import net.i2p.I2PAppContext; import net.i2p.time.Timestamper; @@ -19,19 +19,19 @@ import net.i2p.time.Timestamper; * */ public class Clock implements Timestamper.UpdateListener { - protected I2PAppContext _context; - private Timestamper _timestamper; - protected long _startedOn; + protected final I2PAppContext _context; + private final Timestamper _timestamper; + protected final long _startedOn; protected boolean _statCreated; + protected volatile long _offset; + protected boolean _alreadyChanged; + private final Set _listeners; public Clock(I2PAppContext context) { _context = context; - _offset = 0; - _alreadyChanged = false; - _listeners = new HashSet(1); + _listeners = new CopyOnWriteArraySet(); _timestamper = new Timestamper(context, this); _startedOn = System.currentTimeMillis(); - _statCreated = false; } public static Clock getInstance() { return I2PAppContext.getGlobalContext().clock(); @@ -41,10 +41,6 @@ public class Clock implements Timestamper.UpdateListener { /** we fetch it on demand to avoid circular dependencies (logging uses the clock) */ protected Log getLog() { return _context.logManager().getLog(Clock.class); } - - protected volatile long _offset; - protected boolean _alreadyChanged; - private final Set _listeners; /** if the clock is skewed by 3+ days, fuck 'em */ public final static long MAX_OFFSET = 3 * 24 * 60 * 60 * 1000; @@ -53,14 +49,22 @@ public class Clock implements Timestamper.UpdateListener { /** if the clock skewed changes by less than this, ignore the update (so we don't slide all over the place) */ public final static long MIN_OFFSET_CHANGE = 5 * 1000; + /** + * Specify how far away from the "correct" time the computer is - a positive + * value means that the system time is slow, while a negative value means the system time is fast. + * + * @param offsetMs the delta from System.currentTimeMillis() (NOT the delta from now()) + */ public void setOffset(long offsetMs) { setOffset(offsetMs, false); } /** * Specify how far away from the "correct" time the computer is - a positive - * value means that we are slow, while a negative value means we are fast. + * value means that the system time is slow, while a negative value means the system time is fast. * Warning - overridden in RouterClock + * + * @param offsetMs the delta from System.currentTimeMillis() (NOT the delta from now()) */ public void setOffset(long offsetMs, boolean force) { if (false) return; @@ -105,6 +109,9 @@ public class Clock implements Timestamper.UpdateListener { fireOffsetChanged(delta); } + /* + * @return the current delta from System.currentTimeMillis() in milliseconds + */ public long getOffset() { return _offset; } @@ -136,24 +143,18 @@ public class Clock implements Timestamper.UpdateListener { } public void addUpdateListener(ClockUpdateListener lsnr) { - synchronized (_listeners) { _listeners.add(lsnr); - } } public void removeUpdateListener(ClockUpdateListener lsnr) { - synchronized (_listeners) { _listeners.remove(lsnr); - } } protected void fireOffsetChanged(long delta) { - synchronized (_listeners) { for (Iterator iter = _listeners.iterator(); iter.hasNext();) { ClockUpdateListener lsnr = (ClockUpdateListener) iter.next(); lsnr.offsetChanged(delta); } - } } public static interface ClockUpdateListener { diff --git a/core/java/src/net/i2p/util/ConcurrentHashSet.java b/core/java/src/net/i2p/util/ConcurrentHashSet.java index 3610c54b939f3527648726d0e91fc0e84c057b49..6c6d8bfb675e1f63bc8b3aefeb0d9079b5f90806 100644 --- a/core/java/src/net/i2p/util/ConcurrentHashSet.java +++ b/core/java/src/net/i2p/util/ConcurrentHashSet.java @@ -14,7 +14,7 @@ import java.util.concurrent.ConcurrentHashMap; */ public class ConcurrentHashSet<E> extends AbstractSet<E> implements Set<E> { private static final Object DUMMY = new Object(); - private Map<E, Object> _map; + private final Map<E, Object> _map; public ConcurrentHashSet() { _map = new ConcurrentHashMap(); diff --git a/core/java/src/net/i2p/util/DecayingBloomFilter.java b/core/java/src/net/i2p/util/DecayingBloomFilter.java index 4179edd389625664757a36b3149c863b2928dffe..ff564b2656b659decc000a2a43d03732957d9d3f 100644 --- a/core/java/src/net/i2p/util/DecayingBloomFilter.java +++ b/core/java/src/net/i2p/util/DecayingBloomFilter.java @@ -20,28 +20,34 @@ import org.xlattice.crypto.filters.BloomSHA1; * Further analysis and tweaking for the tunnel IVV may be required. */ public class DecayingBloomFilter { - private I2PAppContext _context; - private Log _log; + protected final I2PAppContext _context; + protected final Log _log; private BloomSHA1 _current; private BloomSHA1 _previous; - private int _durationMs; - private int _entryBytes; + protected final int _durationMs; + protected final int _entryBytes; private byte _extenders[][]; private byte _extended[]; private byte _longToEntry[]; private long _longToEntryMask; protected long _currentDuplicates; - private boolean _keepDecaying; - private DecayEvent _decayEvent; + protected volatile boolean _keepDecaying; + protected SimpleTimer.TimedEvent _decayEvent; /** just for logging */ - private String _name; + protected final String _name; private static final int DEFAULT_M = 23; private static final int DEFAULT_K = 11; private static final boolean ALWAYS_MISS = false; - /** noop for DHS */ - public DecayingBloomFilter() {} + /** only for extension by DHS */ + protected DecayingBloomFilter(int durationMs, int entryBytes, String name, I2PAppContext context) { + _context = context; + _log = context.logManager().getLog(getClass()); + _entryBytes = entryBytes; + _name = name; + _durationMs = durationMs; + } /** * Create a bloom filter that will decay its entries over time. @@ -87,7 +93,6 @@ public class DecayingBloomFilter { _longToEntry = new byte[_entryBytes]; _longToEntryMask = (1l << (_entryBytes * 8l)) -1; } - _currentDuplicates = 0; _decayEvent = new DecayEvent(); _keepDecaying = true; SimpleTimer.getInstance().addEvent(_decayEvent, _durationMs); @@ -105,11 +110,13 @@ public class DecayingBloomFilter { } public long getCurrentDuplicateCount() { return _currentDuplicates; } + public int getInsertedCount() { synchronized (this) { return _current.size() + _previous.size(); } } + public double getFalsePositiveRate() { synchronized (this) { return _current.falsePositives(); @@ -117,12 +124,15 @@ public class DecayingBloomFilter { } /** - * return true if the entry added is a duplicate - * + * @return true if the entry added is a duplicate */ public boolean add(byte entry[]) { return add(entry, 0, entry.length); } + + /** + * @return true if the entry added is a duplicate + */ public boolean add(byte entry[], int off, int len) { if (ALWAYS_MISS) return false; if (entry == null) @@ -131,55 +141,52 @@ public class DecayingBloomFilter { throw new IllegalArgumentException("Bad entry [" + len + ", expected " + _entryBytes + "]"); synchronized (this) { - return locked_add(entry, off, len); + return locked_add(entry, off, len, true); } } /** - * return true if the entry added is a duplicate. the number of low order + * @return true if the entry added is a duplicate. the number of low order * bits used is determined by the entryBytes parameter used on creation of the * filter. * */ public boolean add(long entry) { if (ALWAYS_MISS) return false; + if (_entryBytes <= 7) + entry = ((entry ^ _longToEntryMask) & ((1 << 31)-1)) | (entry ^ _longToEntryMask); + //entry &= _longToEntryMask; + if (entry < 0) { + DataHelper.toLong(_longToEntry, 0, _entryBytes, 0-entry); + _longToEntry[0] |= (1 << 7); + } else { + DataHelper.toLong(_longToEntry, 0, _entryBytes, entry); + } synchronized (this) { - if (_entryBytes <= 7) - entry = ((entry ^ _longToEntryMask) & ((1 << 31)-1)) | (entry ^ _longToEntryMask); - //entry &= _longToEntryMask; - if (entry < 0) { - DataHelper.toLong(_longToEntry, 0, _entryBytes, 0-entry); - _longToEntry[0] |= (1 << 7); - } else { - DataHelper.toLong(_longToEntry, 0, _entryBytes, entry); - } - return locked_add(_longToEntry, 0, _longToEntry.length); + return locked_add(_longToEntry, 0, _longToEntry.length, true); } } /** - * return true if the entry is already known. this does NOT add the + * @return true if the entry is already known. this does NOT add the * entry however. * */ public boolean isKnown(long entry) { if (ALWAYS_MISS) return false; + if (_entryBytes <= 7) + entry = ((entry ^ _longToEntryMask) & ((1 << 31)-1)) | (entry ^ _longToEntryMask); + if (entry < 0) { + DataHelper.toLong(_longToEntry, 0, _entryBytes, 0-entry); + _longToEntry[0] |= (1 << 7); + } else { + DataHelper.toLong(_longToEntry, 0, _entryBytes, entry); + } synchronized (this) { - if (_entryBytes <= 7) - entry = ((entry ^ _longToEntryMask) & ((1 << 31)-1)) | (entry ^ _longToEntryMask); - if (entry < 0) { - DataHelper.toLong(_longToEntry, 0, _entryBytes, 0-entry); - _longToEntry[0] |= (1 << 7); - } else { - DataHelper.toLong(_longToEntry, 0, _entryBytes, entry); - } return locked_add(_longToEntry, 0, _longToEntry.length, false); } } - private boolean locked_add(byte entry[], int offset, int len) { - return locked_add(entry, offset, len, true); - } private boolean locked_add(byte entry[], int offset, int len, boolean addIfNew) { if (_extended != null) { // extend the entry to 32 bytes @@ -195,7 +202,6 @@ public class DecayingBloomFilter { } else { if (addIfNew) { _current.locked_insert(_extended); - _previous.locked_insert(_extended); } return false; } @@ -208,7 +214,6 @@ public class DecayingBloomFilter { } else { if (addIfNew) { _current.locked_insert(entry, offset, len); - _previous.locked_insert(entry, offset, len); } return false; } diff --git a/core/java/src/net/i2p/util/DecayingHashSet.java b/core/java/src/net/i2p/util/DecayingHashSet.java index a72b6b9e2e9a3fc01a92492514602d17d59b04cb..f090cf727b61989ca9bec1d4f205ba48767fba17 100644 --- a/core/java/src/net/i2p/util/DecayingHashSet.java +++ b/core/java/src/net/i2p/util/DecayingHashSet.java @@ -17,12 +17,15 @@ import net.i2p.data.DataHelper; * * ./router/java/src/net/i2p/router/tunnel/BuildMessageProcessor.java: * 32 bytes, peak 10 entries in 1m + * (320 peak entries seen on fast router) * * ./router/java/src/net/i2p/router/transport/udp/InboundMessageFragments.java: * 4 bytes, peak 150 entries in 10s + * (1600 peak entries seen on fast router) * * ./router/java/src/net/i2p/router/MessageValidator.java: * 8 bytes, peak 1K entries in 2m + * (36K peak entries seen on fast router) * * ./router/java/src/net/i2p/router/tunnel/BloomFilterIVValidator.java: * 16 bytes, peak 15K entries in 10m @@ -57,19 +60,10 @@ import net.i2p.data.DataHelper; * @author zzz */ public class DecayingHashSet extends DecayingBloomFilter { - private final I2PAppContext _context; - private final Log _log; private ConcurrentHashSet<ArrayWrapper> _current; private ConcurrentHashSet<ArrayWrapper> _previous; - private int _durationMs; - private int _entryBytes; - private volatile boolean _keepDecaying; - private final DecayEvent _decayEvent; - /** just for logging */ - private final String _name; /** synchronize against this lock when switching double buffers */ private final ReentrantReadWriteLock _reorganizeLock = new ReentrantReadWriteLock(true); - /** * Create a double-buffered hash set that will decay its entries over time. @@ -83,16 +77,11 @@ public class DecayingHashSet extends DecayingBloomFilter { /** @param name just for logging / debugging / stats */ public DecayingHashSet(I2PAppContext context, int durationMs, int entryBytes, String name) { + super(durationMs, entryBytes, name, context); if (entryBytes <= 0 || entryBytes > 32) throw new IllegalArgumentException("Bad size"); - _context = context; - _log = context.logManager().getLog(DecayingHashSet.class); - _entryBytes = entryBytes; - _name = name; _current = new ConcurrentHashSet(128); _previous = new ConcurrentHashSet(128); - _durationMs = durationMs; - _currentDuplicates = 0; _decayEvent = new DecayEvent(); _keepDecaying = true; SimpleScheduler.getInstance().addEvent(_decayEvent, _durationMs); @@ -111,6 +100,7 @@ public class DecayingHashSet extends DecayingBloomFilter { public int getInsertedCount() { return _current.size() + _previous.size(); } + /** pointless, only used for logging elsewhere */ @Override public double getFalsePositiveRate() { @@ -121,7 +111,6 @@ public class DecayingHashSet extends DecayingBloomFilter { /** * @return true if the entry added is a duplicate - * */ @Override public boolean add(byte entry[], int off, int len) { @@ -130,9 +119,10 @@ public class DecayingHashSet extends DecayingBloomFilter { if (len != _entryBytes) throw new IllegalArgumentException("Bad entry [" + len + ", expected " + _entryBytes + "]"); + ArrayWrapper w = new ArrayWrapper(entry, off, len); getReadLock(); try { - return locked_add(entry, off, len, true); + return locked_add(w, true); } finally { releaseReadLock(); } } @@ -158,35 +148,30 @@ public class DecayingHashSet extends DecayingBloomFilter { } private boolean add(long entry, boolean addIfNew) { - int len = Math.min(8, _entryBytes); - byte[] b = toLong(len, entry); + ArrayWrapper w = new ArrayWrapper(entry); getReadLock(); try { - return locked_add(b, 0, len, addIfNew); + return locked_add(w, addIfNew); } finally { releaseReadLock(); } } - /** from DataHelper, except negative values ok */ - private static byte[] toLong(int numBytes, long value) { - byte target[] = new byte[numBytes]; - for (int i = 0; i < numBytes; i++) - target[numBytes-i-1] = (byte)(value >>> (i*8)); - return target; - } - - /** so many questions... */ - private boolean locked_add(byte entry[], int offset, int len, boolean addIfNew) { - ArrayWrapper w = new ArrayWrapper(entry, offset, len); - boolean seen = _current.contains(w); - seen = seen || _previous.contains(w); + /** + * @param addIfNew if true, add the element to current if it is not already there; + * if false, only check + * @return if the element is in either the current or previous set + */ + private boolean locked_add(ArrayWrapper w, boolean addIfNew) { + boolean seen; + // only access _current once. This adds to _current even if seen in _previous. + if (addIfNew) + seen = !_current.add(w); + else + seen = _current.contains(w); + if (!seen) + seen = _previous.contains(w); if (seen) { - // why increment if addIfNew == false? - // why not add to current if only in previous? + // why increment if addIfNew == false? Only used for stats... _currentDuplicates++; - } else if (addIfNew) { - _current.add(w); - // why add to previous? - _previous.add(w); } return seen; } @@ -270,14 +255,22 @@ public class DecayingHashSet extends DecayingBloomFilter { * the maximum entropy given the length of the data. */ private static class ArrayWrapper { - private long _longhashcode; + private final long _longhashcode; + public ArrayWrapper(byte[] b, int offset, int len) { int idx = offset; int shift = Math.min(8, 64 / len); + long lhc = 0; for (int i = 0; i < len; i++) { // xor better than + in tests - _longhashcode ^= (((long) b[idx++]) << (i * shift)); + lhc ^= (((long) b[idx++]) << (i * shift)); } + _longhashcode = lhc; + } + + /** faster version for when storing <= 8 bytes */ + public ArrayWrapper(long b) { + _longhashcode = b; } public int hashCode() { diff --git a/core/java/src/net/i2p/util/EepGet.java b/core/java/src/net/i2p/util/EepGet.java index f055ce98cbbeb4594cc1a53d5de10bd4bf97a0a5..955ae8238dec3df9e54e2212fb2d87cfcaa0e241 100644 --- a/core/java/src/net/i2p/util/EepGet.java +++ b/core/java/src/net/i2p/util/EepGet.java @@ -28,21 +28,21 @@ import net.i2p.util.InternalSocket; * Bug: a malformed url http://example.i2p (no trailing '/') fails cryptically */ public class EepGet { - protected I2PAppContext _context; - protected Log _log; - protected boolean _shouldProxy; - private String _proxyHost; - private int _proxyPort; - protected int _numRetries; - private long _minSize; // minimum and maximum acceptable response size, -1 signifies unlimited, - private long _maxSize; // applied both against whole responses and chunks - protected String _outputFile; - protected OutputStream _outputStream; + protected final I2PAppContext _context; + protected final Log _log; + protected final boolean _shouldProxy; + private final String _proxyHost; + private final int _proxyPort; + protected final int _numRetries; + private final long _minSize; // minimum and maximum acceptable response size, -1 signifies unlimited, + private final long _maxSize; // applied both against whole responses and chunks + protected final String _outputFile; + protected final OutputStream _outputStream; /** url we were asked to fetch */ - protected String _url; + protected final String _url; /** the URL we actually fetch from (may differ from the _url in case of redirect) */ protected String _actualURL; - private String _postData; + private final String _postData; private boolean _allowCaching; protected final List<StatusListener> _listeners; @@ -106,7 +106,7 @@ public class EepGet { String outputFile, OutputStream outputStream, String url, boolean allowCaching, String etag, String lastModified, String postData) { _context = ctx; - _log = ctx.logManager().getLog(EepGet.class); + _log = ctx.logManager().getLog(getClass()); _shouldProxy = (proxyHost != null) && (proxyHost.length() > 0) && (proxyPort > 0) && shouldProxy; _proxyHost = proxyHost; _proxyPort = proxyPort; @@ -118,13 +118,7 @@ public class EepGet { _url = url; _actualURL = url; _postData = postData; - _alreadyTransferred = 0; - _bytesTransferred = 0; _bytesRemaining = -1; - _currentAttempt = 0; - _transferFailed = false; - _headersRead = false; - _aborted = false; _fetchHeaderTimeout = CONNECT_TIMEOUT; _listeners = new ArrayList(1); _etag = etag; @@ -255,9 +249,9 @@ public class EepGet { public void attempting(String url); } protected class CLIStatusListener implements StatusListener { - private int _markSize; - private int _lineSize; - private long _startedOn; + private final int _markSize; + private final int _lineSize; + private final long _startedOn; private long _written; private long _previousWritten; private long _discarded; @@ -271,9 +265,6 @@ public class EepGet { public CLIStatusListener(int markSize, int lineSize) { _markSize = markSize; _lineSize = lineSize; - _written = 0; - _previousWritten = 0; - _discarded = 0; _lastComplete = _context.clock().now(); _startedOn = _lastComplete; _firstTime = true; @@ -430,29 +421,33 @@ public class EepGet { _log.debug("Fetching (proxied? " + _shouldProxy + ") url=" + _actualURL); while (_keepFetching) { SocketTimeout timeout = null; - if (_fetchHeaderTimeout > 0) + if (_fetchHeaderTimeout > 0) { timeout = new SocketTimeout(_fetchHeaderTimeout); - final SocketTimeout stimeout = timeout; // ugly - why not use sotimeout? - timeout.setTimeoutCommand(new Runnable() { - public void run() { - if (_log.shouldLog(Log.DEBUG)) - _log.debug("timeout reached on " + _url + ": " + stimeout); - _aborted = true; - } - }); - timeout.setTotalTimeoutPeriod(_fetchEndTime); + final SocketTimeout stimeout = timeout; // ugly - why not use sotimeout? + timeout.setTimeoutCommand(new Runnable() { + public void run() { + if (_log.shouldLog(Log.DEBUG)) + _log.debug("timeout reached on " + _url + ": " + stimeout); + _aborted = true; + } + }); + timeout.setTotalTimeoutPeriod(_fetchEndTime); + } try { for (int i = 0; i < _listeners.size(); i++) _listeners.get(i).attempting(_url); sendRequest(timeout); - timeout.resetTimer(); + if (timeout != null) + timeout.resetTimer(); doFetch(timeout); - timeout.cancel(); + if (timeout != null) + timeout.cancel(); if (!_transferFailed) return true; break; } catch (IOException ioe) { - timeout.cancel(); + if (timeout != null) + timeout.cancel(); for (int i = 0; i < _listeners.size(); i++) _listeners.get(i).attemptFailed(_url, _bytesTransferred, _bytesRemaining, _currentAttempt, _numRetries, ioe); if (_log.shouldLog(Log.WARN)) @@ -492,7 +487,10 @@ public class EepGet { return false; } - /** single fetch */ + /** + * single fetch + * @param timeout may be null + */ protected void doFetch(SocketTimeout timeout) throws IOException { _headersRead = false; _aborted = false; @@ -504,11 +502,13 @@ public class EepGet { if (_aborted) throw new IOException("Timed out reading the HTTP headers"); - timeout.resetTimer(); - if (_fetchInactivityTimeout > 0) - timeout.setInactivityTimeout(_fetchInactivityTimeout); - else - timeout.setInactivityTimeout(INACTIVITY_TIMEOUT); + if (timeout != null) { + timeout.resetTimer(); + if (_fetchInactivityTimeout > 0) + timeout.setInactivityTimeout(_fetchInactivityTimeout); + else + timeout.setInactivityTimeout(INACTIVITY_TIMEOUT); + } if (_redirectLocation != null) { //try { @@ -571,7 +571,8 @@ public class EepGet { int read = _proxyIn.read(buf, 0, toRead); if (read == -1) break; - timeout.resetTimer(); + if (timeout != null) + timeout.resetTimer(); _out.write(buf, 0, read); _bytesTransferred += read; if ((_maxSize > -1) && (_alreadyTransferred + read > _maxSize)) // could transfer a little over maxSize @@ -597,7 +598,8 @@ public class EepGet { read++; } } - timeout.resetTimer(); + if (timeout != null) + timeout.resetTimer(); if (_bytesRemaining >= read) // else chunked? _bytesRemaining -= read; if (read > 0) { @@ -622,7 +624,8 @@ public class EepGet { if (_aborted) throw new IOException("Timed out reading the HTTP data"); - timeout.cancel(); + if (timeout != null) + timeout.cancel(); if (_log.shouldLog(Log.DEBUG)) _log.debug("Done transferring " + _bytesTransferred + " (ok? " + !_transferFailed + ")"); @@ -867,6 +870,9 @@ public class EepGet { private static final byte NL = '\n'; private static boolean isNL(byte b) { return (b == NL); } + /** + * @param timeout may be null + */ protected void sendRequest(SocketTimeout timeout) throws IOException { if (_outputStream != null) { // We are reading into a stream supplied by a caller, @@ -907,7 +913,8 @@ public class EepGet { _proxyIn = _proxy.getInputStream(); _proxyOut = _proxy.getOutputStream(); - timeout.setSocket(_proxy); + if (timeout != null) + timeout.setSocket(_proxy); _proxyOut.write(DataHelper.getUTF8(req)); _proxyOut.flush(); @@ -945,8 +952,6 @@ public class EepGet { buf.append(_alreadyTransferred); buf.append("-\r\n"); } - if (_shouldProxy) - buf.append("X-Accept-Encoding: x-i2p-gzip;q=1.0, identity;q=0.5, deflate;q=0, gzip;q=0, *;q=0\r\n"); if (!_allowCaching) { buf.append("Cache-control: no-cache\r\n" + "Pragma: no-cache\r\n"); diff --git a/core/java/src/net/i2p/util/EepHead.java b/core/java/src/net/i2p/util/EepHead.java index 5c0d9c8fc2e6337428da9bfdc4a312b4240f6e29..bb8304a3963a04b0d739c28f6efcd9ea5a7adfb5 100644 --- a/core/java/src/net/i2p/util/EepHead.java +++ b/core/java/src/net/i2p/util/EepHead.java @@ -202,8 +202,6 @@ public class EepHead extends EepGet { buf.append("HEAD ").append(_actualURL).append(" HTTP/1.1\r\n"); buf.append("Host: ").append(url.getHost()).append("\r\n"); buf.append("Accept-Encoding: \r\n"); - if (_shouldProxy) - buf.append("X-Accept-Encoding: x-i2p-gzip;q=1.0, identity;q=0.5, deflate;q=0, gzip;q=0, *;q=0\r\n"); // This will be replaced if we are going through I2PTunnelHTTPClient buf.append("User-Agent: " + USER_AGENT + "\r\n"); buf.append("Connection: close\r\n\r\n"); diff --git a/core/java/src/net/i2p/util/EepPost.java b/core/java/src/net/i2p/util/EepPost.java index 615361e2045ef3ed4742ec620a7fd68c8a029a1a..2e7836f62645a3576155604fcb4be902e389d566 100644 --- a/core/java/src/net/i2p/util/EepPost.java +++ b/core/java/src/net/i2p/util/EepPost.java @@ -31,6 +31,7 @@ public class EepPost { _log = ctx.logManager().getLog(EepPost.class); } +/***** public static void main(String args[]) { EepPost e = new EepPost(); Map fields = new HashMap(); @@ -47,6 +48,8 @@ public class EepPost { //e.postFiles("http://localhost/cgi-bin/read.pl", null, -1, fields, null); //e.postFiles("http://localhost:2001/import.jsp", null, -1, fields, null); } +*****/ + /** * Submit an HTTP POST to the given URL (using the proxy if specified), * uploading the given fields. If the field's value is a File object, then @@ -117,7 +120,7 @@ public class EepPost { } } out.close(); - } catch (Exception e) { + } catch (IOException e) { e.printStackTrace(); } finally { if (s != null) try { s.close(); } catch (IOException ioe) {} diff --git a/core/java/src/net/i2p/util/Executor.java b/core/java/src/net/i2p/util/Executor.java index 8092d7ac447ee98f152306101d59e925fb18baf6..3c81d46f157f581455d30c4ea19f52b2b6232e19 100644 --- a/core/java/src/net/i2p/util/Executor.java +++ b/core/java/src/net/i2p/util/Executor.java @@ -5,10 +5,10 @@ import java.util.List; import net.i2p.I2PAppContext; class Executor implements Runnable { - private I2PAppContext _context; + private final I2PAppContext _context; private Log _log; private final List _readyEvents; - private SimpleStore runn; + private final SimpleStore runn; public Executor(I2PAppContext ctx, Log log, List events, SimpleStore x) { _context = ctx; @@ -31,9 +31,10 @@ class Executor implements Runnable { try { evt.timeReached(); } catch (Throwable t) { - log("wtf, event borked: " + evt, t); + log("Executing task " + evt + " exited unexpectedly, please report", t); } long time = _context.clock().now() - before; + // FIXME _log won't be non-null unless we already had a CRIT if ( (time > 1000) && (_log != null) && (_log.shouldLog(Log.WARN)) ) _log.warn("wtf, event execution took " + time + ": " + evt); } diff --git a/core/java/src/net/i2p/util/FileUtil.java b/core/java/src/net/i2p/util/FileUtil.java index b5bb48a4353fef584bc6088f0408df34d97f5568..de9d354aa42b71c20987a36f28dc69e6d7721455 100644 --- a/core/java/src/net/i2p/util/FileUtil.java +++ b/core/java/src/net/i2p/util/FileUtil.java @@ -122,24 +122,24 @@ public class FileUtil { } } } else { + InputStream in = null; + FileOutputStream fos = null; + JarOutputStream jos = null; try { - InputStream in = zip.getInputStream(entry); + in = zip.getInputStream(entry); if (entry.getName().endsWith(".jar.pack") || entry.getName().endsWith(".war.pack")) { target = new File(targetDir, entry.getName().substring(0, entry.getName().length() - ".pack".length())); - JarOutputStream fos = new JarOutputStream(new FileOutputStream(target)); - unpack(in, fos); - fos.close(); + jos = new JarOutputStream(new FileOutputStream(target)); + unpack(in, jos); System.err.println("INFO: File [" + entry.getName() + "] extracted and unpacked"); } else { - FileOutputStream fos = new FileOutputStream(target); + fos = new FileOutputStream(target); int read = 0; while ( (read = in.read(buf)) != -1) { fos.write(buf, 0, read); } - fos.close(); System.err.println("INFO: File [" + entry.getName() + "] extracted"); } - in.close(); } catch (IOException ioe) { System.err.println("ERROR: Error extracting the zip entry (" + entry.getName() + ')'); if (ioe.getMessage() != null && ioe.getMessage().indexOf("CAFED00D") >= 0) @@ -151,6 +151,10 @@ public class FileUtil { System.err.println("ERROR: Error unpacking the zip entry (" + entry.getName() + "), your JVM does not support unpack200"); return false; + } finally { + try { if (in != null) in.close(); } catch (IOException ioe) {} + try { if (fos != null) fos.close(); } catch (IOException ioe) {} + try { if (jos != null) jos.close(); } catch (IOException ioe) {} } } } @@ -353,6 +357,9 @@ public class FileUtil { * Dump the contents of the given path (relative to the root) to the output * stream. The path must not go above the root, either - if it does, it will * throw a FileNotFoundException + * + * Closes the OutputStream out on successful completion + * but leaves it open when throwing IOE. */ public static void readFile(String path, String root, OutputStream out) throws IOException { File rootDir = new File(root); @@ -372,10 +379,10 @@ public class FileUtil { int read = 0; while ( (read = in.read(buf)) != -1) out.write(buf, 0, read); - out.close(); + try { out.close(); } catch (IOException ioe) {} } finally { if (in != null) - in.close(); + try { in.close(); } catch (IOException ioe) {} } } @@ -401,21 +408,24 @@ public class FileUtil { if (dst.exists() && !overwriteExisting) return false; byte buf[] = new byte[4096]; + InputStream in = null; + OutputStream out = null; try { - FileInputStream in = new FileInputStream(src); - FileOutputStream out = new FileOutputStream(dst); + in = new FileInputStream(src); + out = new FileOutputStream(dst); int read = 0; while ( (read = in.read(buf)) != -1) out.write(buf, 0, read); - in.close(); - out.close(); return true; } catch (IOException ioe) { if (!quiet) ioe.printStackTrace(); return false; + } finally { + try { if (in != null) in.close(); } catch (IOException ioe) {} + try { if (out != null) out.close(); } catch (IOException ioe) {} } } diff --git a/core/java/src/net/i2p/util/I2PAppThread.java b/core/java/src/net/i2p/util/I2PAppThread.java index a9f027caeb15091cf17698b7d794fd9638b6a921..8111083551d93cfb1c6e75d5d93477a2a8aa204d 100644 --- a/core/java/src/net/i2p/util/I2PAppThread.java +++ b/core/java/src/net/i2p/util/I2PAppThread.java @@ -10,9 +10,9 @@ package net.i2p.util; */ -import java.util.HashSet; import java.util.Iterator; import java.util.Set; +import java.util.concurrent.CopyOnWriteArraySet; /** * Like I2PThread but with per-thread OOM listeners, @@ -22,7 +22,7 @@ import java.util.Set; */ public class I2PAppThread extends I2PThread { - private Set _threadListeners = new HashSet(0); + private final Set _threadListeners = new CopyOnWriteArraySet(); public I2PAppThread() { super(); diff --git a/core/java/src/net/i2p/util/I2PProperties.java b/core/java/src/net/i2p/util/I2PProperties.java new file mode 100644 index 0000000000000000000000000000000000000000..e943f561fdfa094ce58c82af8c62b6f1f9c7ea9f --- /dev/null +++ b/core/java/src/net/i2p/util/I2PProperties.java @@ -0,0 +1,53 @@ +package net.i2p.util; + +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; +import java.util.concurrent.CopyOnWriteArrayList; + +/** + * This class contains a number of properties ((key,value)-pairs). + * Additionally, it adds the possibility for callbacks, + * to allow immediate response to changing properties. + * @author Mathiasdm + * + */ +public class I2PProperties extends Properties { + + /** + * Keep a list of callbacks to contact the interested parties + * that want to know about property changes. + */ + private final List<I2PPropertyCallback> _callbacks = new CopyOnWriteArrayList<I2PPropertyCallback>(); + + public I2PProperties() { + super(); + } + + public I2PProperties(Properties defaults) { + super(defaults); + } + + public void addCallBack(I2PPropertyCallback callback) { + _callbacks.add(callback); + } + + public void removeCallBack(I2PPropertyCallback callback) { + _callbacks.remove(callback); + } + + public Object setProperty(String key, String value) { + Object returnValue = super.setProperty(key, value); + for(I2PPropertyCallback callback: _callbacks) { + callback.propertyChanged(key, value); + } + return returnValue; + } + + public interface I2PPropertyCallback { + + public void propertyChanged(String key, String value); + + } + +} diff --git a/core/java/src/net/i2p/util/I2PThread.java b/core/java/src/net/i2p/util/I2PThread.java index 9b76b8fc9c92c9261c1e2338e3c5a05931f4e9fa..90c95d3818d70b3a3c17c566a5a6190cf5ade57d 100644 --- a/core/java/src/net/i2p/util/I2PThread.java +++ b/core/java/src/net/i2p/util/I2PThread.java @@ -10,9 +10,9 @@ package net.i2p.util; */ -import java.util.HashSet; import java.util.Iterator; import java.util.Set; +import java.util.concurrent.CopyOnWriteArraySet; /** * In case its useful later... @@ -21,7 +21,7 @@ import java.util.Set; */ public class I2PThread extends Thread { private static volatile Log _log; - private static Set _listeners = new HashSet(4); + private static final Set _listeners = new CopyOnWriteArraySet(); private String _name; private Exception _createdBy; diff --git a/core/java/src/net/i2p/util/Log.java b/core/java/src/net/i2p/util/Log.java index b22325adb4d213f809f5f3d2d74824e097d6dfd8..6ce320c9d124beacdde2ae0a6a2eaf5942c77e8e 100644 --- a/core/java/src/net/i2p/util/Log.java +++ b/core/java/src/net/i2p/util/Log.java @@ -205,7 +205,8 @@ public class Log { } @Override public boolean equals(Object obj) { - if (obj == null) throw new NullPointerException("Null object scope?"); + if (obj == null) + return false; if (obj instanceof LogScope) { LogScope s = (LogScope)obj; return s._scopeCache.equals(_scopeCache); diff --git a/core/java/src/net/i2p/util/LogManager.java b/core/java/src/net/i2p/util/LogManager.java index 49eaf291febff73acf522210ae7d186ac07684ad..a57512d4d33e9ac50225f311d8ba7a9ce4db26d5 100644 --- a/core/java/src/net/i2p/util/LogManager.java +++ b/core/java/src/net/i2p/util/LogManager.java @@ -152,7 +152,9 @@ public class LogManager { if (_writer != null) return; _writer = new LogWriter(this); - Thread t = new I2PThread(_writer, "LogWriter", true); + // NOT an I2PThread, as it contains logging and we end up with problems + Thread t = new Thread(_writer, "LogWriter"); + t.setDaemon(true); t.start(); } @@ -164,8 +166,10 @@ public class LogManager { Log rv = _logs.get(scope); if (rv == null) { rv = new Log(this, cls, name); - _logs.putIfAbsent(scope, rv); - isNew = true; + Log old = _logs.putIfAbsent(scope, rv); + isNew = old == null; + if (!isNew) + rv = old; } if (isNew) updateLimit(rv); @@ -178,8 +182,9 @@ public class LogManager { } void addLog(Log log) { - _logs.putIfAbsent(log.getScope(), log); - updateLimit(log); + Log old = _logs.putIfAbsent(log.getScope(), log); + if (old == null) + updateLimit(log); } public LogConsoleBuffer getBuffer() { return _consoleBuffer; } @@ -634,6 +639,7 @@ public class LogManager { return _dateFormatPattern; } +/***** public static void main(String args[]) { I2PAppContext ctx = new I2PAppContext(); Log l1 = ctx.logManager().getLog("test.1"); @@ -654,6 +660,7 @@ public class LogManager { } System.exit(0); } +*****/ public void shutdown() { if (_writer != null) { diff --git a/core/java/src/net/i2p/util/LogRecordFormatter.java b/core/java/src/net/i2p/util/LogRecordFormatter.java index 52583b63c393290f4da98836635d731219d4cefc..58d08af74a789611ea1dd09aa3031f0af7943290 100644 --- a/core/java/src/net/i2p/util/LogRecordFormatter.java +++ b/core/java/src/net/i2p/util/LogRecordFormatter.java @@ -92,10 +92,13 @@ class LogRecordFormatter { } /** don't translate */ +/**** private static String getPriority(LogRecord rec) { return toString(Log.toLevelString(rec.getPriority()), MAX_PRIORITY_LENGTH); } +****/ + /** */ private static final String BUNDLE_NAME = "net.i2p.router.web.messages"; /** translate @since 0.7.14 */ diff --git a/core/java/src/net/i2p/util/LogWriter.java b/core/java/src/net/i2p/util/LogWriter.java index 51108e18b8841207d06d0f9f1d76654df5f212c2..c141cc24343ee861576d7e0d89d3a96b535ab0da 100644 --- a/core/java/src/net/i2p/util/LogWriter.java +++ b/core/java/src/net/i2p/util/LogWriter.java @@ -77,7 +77,8 @@ class LogWriter implements Runnable { writeRecord(rec); } try { - _currentOut.flush(); + if (_currentOut != null) + _currentOut.flush(); } catch (IOException ioe) { if (++_diskFullMessageCount < MAX_DISKFULL_MESSAGES) System.err.println("Error writing the router log - disk full? " + ioe); @@ -180,7 +181,8 @@ class LogWriter implements Runnable { try { _currentOut = new BufferedWriter(new OutputStreamWriter(new SecureFileOutputStream(f), "UTF-8")); } catch (IOException ioe) { - System.err.println("Error rotating into [" + f.getAbsolutePath() + "]" + ioe); + if (++_diskFullMessageCount < MAX_DISKFULL_MESSAGES) + System.err.println("Error creating log file [" + f.getAbsolutePath() + "]" + ioe); } } diff --git a/core/java/src/net/i2p/util/LookaheadInputStream.java b/core/java/src/net/i2p/util/LookaheadInputStream.java index 7b23d26aeef4208cdc2659345a757e49ef60a148..d9a1d9f93e44a78025c1e7a37df98c8adf4c1946 100644 --- a/core/java/src/net/i2p/util/LookaheadInputStream.java +++ b/core/java/src/net/i2p/util/LookaheadInputStream.java @@ -78,6 +78,7 @@ public class LookaheadInputStream extends FilterInputStream { /** grab the lookahead footer */ public byte[] getFooter() { return _footerLookahead; } +/******* public static void main(String args[]) { byte buf[] = new byte[32]; for (int i = 0; i < 32; i++) @@ -128,4 +129,5 @@ public class LookaheadInputStream extends FilterInputStream { return false; } } +******/ } diff --git a/core/java/src/net/i2p/util/PartialEepGet.java b/core/java/src/net/i2p/util/PartialEepGet.java index 5b18bc7619ffbdc4ebe2e749243d5f9186735e04..1b44fce25d8c3eb5fc9919dfdbf8f5034171d8ed 100644 --- a/core/java/src/net/i2p/util/PartialEepGet.java +++ b/core/java/src/net/i2p/util/PartialEepGet.java @@ -114,8 +114,6 @@ public class PartialEepGet extends EepGet { buf.append(_fetchSize - 1); buf.append("\r\n"); - if (_shouldProxy) - buf.append("X-Accept-Encoding: x-i2p-gzip;q=1.0, identity;q=0.5, deflate;q=0, gzip;q=0, *;q=0\r\n"); buf.append("Cache-control: no-cache\r\n" + "Pragma: no-cache\r\n"); // This will be replaced if we are going through I2PTunnelHTTPClient diff --git a/core/java/src/net/i2p/util/RandomSource.java b/core/java/src/net/i2p/util/RandomSource.java index c7c87239c9db5484c311d0158a2722e83465f0b9..fe042915212baa352031616a60fba01f91e9f9ca 100644 --- a/core/java/src/net/i2p/util/RandomSource.java +++ b/core/java/src/net/i2p/util/RandomSource.java @@ -146,14 +146,18 @@ public class RandomSource extends SecureRandom implements EntropyHarvester { public final boolean initSeed(byte buf[]) { // why urandom? because /dev/random blocks, and there are arguments // suggesting such blockages are largely meaningless - boolean ok = seedFromFile("/dev/urandom", buf); + boolean ok = seedFromFile(new File("/dev/urandom"), buf); // we merge (XOR) in the data from /dev/urandom with our own seedfile - ok = seedFromFile("prngseed.rnd", buf) || ok; + File localFile = new File(_context.getConfigDir(), SEEDFILE); + ok = seedFromFile(localFile, buf) || ok; return ok; } - private static final boolean seedFromFile(String filename, byte buf[]) { - File f = new File(I2PAppContext.getGlobalContext().getConfigDir(), filename); + /** + * @param f absolute path + * @return success + */ + private static final boolean seedFromFile(File f, byte buf[]) { if (f.exists()) { FileInputStream fis = null; try { diff --git a/core/java/src/net/i2p/util/SSLEepGet.java b/core/java/src/net/i2p/util/SSLEepGet.java index e3ba43ae7a3ad12138f924749fbecfef74b188c9..d35545ae7e54bb039ce7e855eeec01b56034bd2b 100644 --- a/core/java/src/net/i2p/util/SSLEepGet.java +++ b/core/java/src/net/i2p/util/SSLEepGet.java @@ -482,12 +482,14 @@ public class SSLEepGet extends EepGet { if (_aborted) throw new IOException("Timed out reading the HTTP headers"); - timeout.resetTimer(); - if (_fetchInactivityTimeout > 0) - timeout.setInactivityTimeout(_fetchInactivityTimeout); - else - timeout.setInactivityTimeout(60*1000); - + if (timeout != null) { + timeout.resetTimer(); + if (_fetchInactivityTimeout > 0) + timeout.setInactivityTimeout(_fetchInactivityTimeout); + else + timeout.setInactivityTimeout(60*1000); + } + if (_redirectLocation != null) { throw new IOException("Server redirect to " + _redirectLocation + " not allowed"); } @@ -506,7 +508,8 @@ public class SSLEepGet extends EepGet { int read = _proxyIn.read(buf, 0, toRead); if (read == -1) break; - timeout.resetTimer(); + if (timeout != null) + timeout.resetTimer(); _out.write(buf, 0, read); _bytesTransferred += read; @@ -531,7 +534,8 @@ public class SSLEepGet extends EepGet { read++; } } - timeout.resetTimer(); + if (timeout != null) + timeout.resetTimer(); if (_bytesRemaining >= read) // else chunked? _bytesRemaining -= read; if (read > 0) { @@ -556,7 +560,8 @@ public class SSLEepGet extends EepGet { if (_aborted) throw new IOException("Timed out reading the HTTP data"); - timeout.cancel(); + if (timeout != null) + timeout.cancel(); if (_transferFailed) { // 404, etc - transferFailed is called after all attempts fail, by fetch() above diff --git a/core/java/src/net/i2p/util/ShellCommand.java b/core/java/src/net/i2p/util/ShellCommand.java index 12b668f67ee7b9345b4d3c301e3969b182c7f96c..bb0aec5f80b8bd420ece4131da52c9d28fdcae03 100644 --- a/core/java/src/net/i2p/util/ShellCommand.java +++ b/core/java/src/net/i2p/util/ShellCommand.java @@ -89,7 +89,7 @@ public class ShellCommand { * * @author hypercubus */ - private class StreamConsumer extends Thread { + private static class StreamConsumer extends Thread { private BufferedReader bufferedReader; private InputStreamReader inputStreamReader; @@ -123,7 +123,7 @@ public class ShellCommand { * * @author hypercubus */ - private class StreamReader extends Thread { + private static class StreamReader extends Thread { private BufferedReader bufferedReader; private InputStreamReader inputStreamReader; @@ -159,7 +159,7 @@ public class ShellCommand { * * @author hypercubus */ - private class StreamWriter extends Thread { + private static class StreamWriter extends Thread { private BufferedWriter bufferedWriter; private BufferedReader in; @@ -183,7 +183,7 @@ public class ShellCommand { bufferedWriter.write(input, 0, input.length()); bufferedWriter.flush(); } - } catch (Exception e) { + } catch (IOException e) { try { bufferedWriter.flush(); } catch (IOException e1) { diff --git a/core/java/src/net/i2p/util/SimpleScheduler.java b/core/java/src/net/i2p/util/SimpleScheduler.java index f764debe99f6cad3d730c64bae342b9679011d13..61e2e66b347bcb3e823e8a4bf815ef6a9234bfec 100644 --- a/core/java/src/net/i2p/util/SimpleScheduler.java +++ b/core/java/src/net/i2p/util/SimpleScheduler.java @@ -30,10 +30,10 @@ public class SimpleScheduler { public static SimpleScheduler getInstance() { return _instance; } private static final int MIN_THREADS = 2; private static final int MAX_THREADS = 4; - private I2PAppContext _context; - private Log _log; - private ScheduledThreadPoolExecutor _executor; - private String _name; + private final I2PAppContext _context; + private final Log _log; + private final ScheduledThreadPoolExecutor _executor; + private final String _name; private int _count; private final int _threads; @@ -42,8 +42,9 @@ public class SimpleScheduler { _context = I2PAppContext.getGlobalContext(); _log = _context.logManager().getLog(SimpleScheduler.class); _name = name; - _count = 0; long maxMemory = Runtime.getRuntime().maxMemory(); + if (maxMemory == Long.MAX_VALUE) + maxMemory = 96*1024*1024l; _threads = (int) Math.max(MIN_THREADS, Math.min(MAX_THREADS, 1 + (maxMemory / (32*1024*1024)))); _executor = new ScheduledThreadPoolExecutor(_threads, new CustomThreadFactory()); _executor.prestartAllCoreThreads(); @@ -139,7 +140,7 @@ public class SimpleScheduler { try { _timedEvent.timeReached(); } catch (Throwable t) { - _log.log(Log.CRIT, _name + " wtf, event borked: " + _timedEvent, t); + _log.log(Log.CRIT, _name + ": Scheduled task " + _timedEvent + " exited unexpectedly, please report", t); } long time = System.currentTimeMillis() - before; if (time > 1000 && _log.shouldLog(Log.WARN)) diff --git a/core/java/src/net/i2p/util/SimpleTimer.java b/core/java/src/net/i2p/util/SimpleTimer.java index 0b543071199669c8ea3e802ead0b4aae82c7b254..b19b5d691ac542a585a19a8a783878de3c7ad2f1 100644 --- a/core/java/src/net/i2p/util/SimpleTimer.java +++ b/core/java/src/net/i2p/util/SimpleTimer.java @@ -14,6 +14,8 @@ import net.i2p.I2PAppContext; * appropriate time. The method that is fired however should NOT block (otherwise * they b0rk the timer). * + * WARNING - Deprecated. + * This is an inefficient mess. Use SimpleScheduler or SimpleTimer2 if possible. */ public class SimpleTimer { private static final SimpleTimer _instance = new SimpleTimer(); @@ -42,6 +44,8 @@ public class SimpleTimer { runner.setDaemon(true); runner.start(); long maxMemory = Runtime.getRuntime().maxMemory(); + if (maxMemory == Long.MAX_VALUE) + maxMemory = 128*1024*1024l; int threads = (int) Math.max(MIN_THREADS, Math.min(MAX_THREADS, 1 + (maxMemory / (32*1024*1024)))); for (int i = 1; i <= threads ; i++) { I2PThread executor = new I2PThread(new Executor(_context, _log, _readyEvents, runn)); @@ -90,7 +94,7 @@ public class SimpleTimer { int totalEvents = 0; long now = System.currentTimeMillis(); long eventTime = now + timeoutMs; - Long time = new Long(eventTime); + Long time = Long.valueOf(eventTime); synchronized (_events) { // remove the old scheduled position, then reinsert it Long oldTime = (Long)_eventTimes.get(event); diff --git a/core/java/src/net/i2p/util/SimpleTimer2.java b/core/java/src/net/i2p/util/SimpleTimer2.java index bda41e6211b5a58c8ebd483d4118094eaa9e4e60..955f8faa3a3b034c218c523232aa07d8d23a8477 100644 --- a/core/java/src/net/i2p/util/SimpleTimer2.java +++ b/core/java/src/net/i2p/util/SimpleTimer2.java @@ -29,10 +29,10 @@ public class SimpleTimer2 { public static SimpleTimer2 getInstance() { return _instance; } private static final int MIN_THREADS = 2; private static final int MAX_THREADS = 4; - private I2PAppContext _context; + private final I2PAppContext _context; private static Log _log; // static so TimedEvent can use it - private ScheduledThreadPoolExecutor _executor; - private String _name; + private final ScheduledThreadPoolExecutor _executor; + private final String _name; private int _count; private final int _threads; @@ -43,6 +43,8 @@ public class SimpleTimer2 { _name = name; _count = 0; long maxMemory = Runtime.getRuntime().maxMemory(); + if (maxMemory == Long.MAX_VALUE) + maxMemory = 96*1024*1024l; _threads = (int) Math.max(MIN_THREADS, Math.min(MAX_THREADS, 1 + (maxMemory / (32*1024*1024)))); _executor = new CustomScheduledThreadPoolExecutor(_threads, new CustomThreadFactory()); _executor.prestartAllCoreThreads(); @@ -55,7 +57,7 @@ public class SimpleTimer2 { _executor.shutdownNow(); } - private class CustomScheduledThreadPoolExecutor extends ScheduledThreadPoolExecutor { + private static class CustomScheduledThreadPoolExecutor extends ScheduledThreadPoolExecutor { public CustomScheduledThreadPoolExecutor(int threads, ThreadFactory factory) { super(threads, factory); } @@ -223,7 +225,7 @@ public class SimpleTimer2 { try { timeReached(); } catch (Throwable t) { - _log.log(Log.CRIT, _pool + " wtf, event borked: " + this, t); + _log.log(Log.CRIT, _pool + ": Timed task " + this + " exited unexpectedly, please report", t); } long time = System.currentTimeMillis() - before; if (time > 500 && _log.shouldLog(Log.WARN)) diff --git a/core/java/test/net/i2p/crypto/SHA1Test.java b/core/java/test/net/i2p/crypto/SHA1Test.java deleted file mode 100644 index 2c532c5cdee1742581fc544caf0869d27eebe31c..0000000000000000000000000000000000000000 --- a/core/java/test/net/i2p/crypto/SHA1Test.java +++ /dev/null @@ -1,192 +0,0 @@ -package net.i2p.crypto; -/* @(#)SHA1Test.java 1.10 2004-04-24 - * This file was freely contributed to the LimeWire project and is covered - * by its existing GPL licence, but it may be used individually as a public - * domain implementation of a published algorithm (see below for references). - * It was also freely contributed to the Bitzi public domain sources. - * @author Philippe Verdy - */ - -/* Sun may wish to change the following package name, if integrating this - * class in the Sun JCE Security Provider for Java 1.5 (code-named Tiger). - */ -//package com.bitzi.util; - -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; - -public class SHA1Test { - - private static final SHA1 hash = new SHA1(); - - public static void main(String args[]) { -// http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf - System.out.println("****************************************"); - System.out.println("* Basic FIPS PUB 180-1 test vectors... *"); - System.out.println("****************************************"); - tst(1, 1, - "abc", - "A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D"); - tst(1, 2, - "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", - "84983E44 1C3BD26e BAAE4AA1 F95129E5 E54670F1"); - tst(1, 3, /* one million bytes */ - 1000000, "a", - "34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F"); - System.out.println(); - -// http://csrc.ncsl.nist.gov/cryptval/shs/SHAVS.pdf - System.out.println("********************************************************"); - System.out.println("* SHSV Examples of the selected short messages test... *"); - System.out.println("********************************************************"); - tst(2, 2, new byte[] {/* 8 bits, i.e. 1 byte */ - (byte)0x5e}, - "5e6f80a3 4a9798ca fc6a5db9 6cc57ba4 c4db59c2"); - tst(2, 4, new byte[] {/* 128 bits, i.e. 16 bytes */ - (byte)0x9a,(byte)0x7d,(byte)0xfd,(byte)0xf1,(byte)0xec,(byte)0xea,(byte)0xd0,(byte)0x6e, - (byte)0xd6,(byte)0x46,(byte)0xaa,(byte)0x55,(byte)0xfe,(byte)0x75,(byte)0x71,(byte)0x46}, - "82abff66 05dbe1c1 7def12a3 94fa22a8 2b544a35"); - System.out.println(); - - System.out.println("*******************************************************"); - System.out.println("* SHSV Examples of the selected long messages test... *"); - System.out.println("*******************************************************"); - tst(3, 2, new byte[] {/* 1304 bits, i.e. 163 bytes */ - (byte)0xf7,(byte)0x8f,(byte)0x92,(byte)0x14,(byte)0x1b,(byte)0xcd,(byte)0x17,(byte)0x0a, - (byte)0xe8,(byte)0x9b,(byte)0x4f,(byte)0xba,(byte)0x15,(byte)0xa1,(byte)0xd5,(byte)0x9f, - (byte)0x3f,(byte)0xd8,(byte)0x4d,(byte)0x22,(byte)0x3c,(byte)0x92,(byte)0x51,(byte)0xbd, - (byte)0xac,(byte)0xbb,(byte)0xae,(byte)0x61,(byte)0xd0,(byte)0x5e,(byte)0xd1,(byte)0x15, - (byte)0xa0,(byte)0x6a,(byte)0x7c,(byte)0xe1,(byte)0x17,(byte)0xb7,(byte)0xbe,(byte)0xea, - (byte)0xd2,(byte)0x44,(byte)0x21,(byte)0xde,(byte)0xd9,(byte)0xc3,(byte)0x25,(byte)0x92, - (byte)0xbd,(byte)0x57,(byte)0xed,(byte)0xea,(byte)0xe3,(byte)0x9c,(byte)0x39,(byte)0xfa, - (byte)0x1f,(byte)0xe8,(byte)0x94,(byte)0x6a,(byte)0x84,(byte)0xd0,(byte)0xcf,(byte)0x1f, - (byte)0x7b,(byte)0xee,(byte)0xad,(byte)0x17,(byte)0x13,(byte)0xe2,(byte)0xe0,(byte)0x95, - (byte)0x98,(byte)0x97,(byte)0x34,(byte)0x7f,(byte)0x67,(byte)0xc8,(byte)0x0b,(byte)0x04, - (byte)0x00,(byte)0xc2,(byte)0x09,(byte)0x81,(byte)0x5d,(byte)0x6b,(byte)0x10,(byte)0xa6, - (byte)0x83,(byte)0x83,(byte)0x6f,(byte)0xd5,(byte)0x56,(byte)0x2a,(byte)0x56,(byte)0xca, - (byte)0xb1,(byte)0xa2,(byte)0x8e,(byte)0x81,(byte)0xb6,(byte)0x57,(byte)0x66,(byte)0x54, - (byte)0x63,(byte)0x1c,(byte)0xf1,(byte)0x65,(byte)0x66,(byte)0xb8,(byte)0x6e,(byte)0x3b, - (byte)0x33,(byte)0xa1,(byte)0x08,(byte)0xb0,(byte)0x53,(byte)0x07,(byte)0xc0,(byte)0x0a, - (byte)0xff,(byte)0x14,(byte)0xa7,(byte)0x68,(byte)0xed,(byte)0x73,(byte)0x50,(byte)0x60, - (byte)0x6a,(byte)0x0f,(byte)0x85,(byte)0xe6,(byte)0xa9,(byte)0x1d,(byte)0x39,(byte)0x6f, - (byte)0x5b,(byte)0x5c,(byte)0xbe,(byte)0x57,(byte)0x7f,(byte)0x9b,(byte)0x38,(byte)0x80, - (byte)0x7c,(byte)0x7d,(byte)0x52,(byte)0x3d,(byte)0x6d,(byte)0x79,(byte)0x2f,(byte)0x6e, - (byte)0xbc,(byte)0x24,(byte)0xa4,(byte)0xec,(byte)0xf2,(byte)0xb3,(byte)0xa4,(byte)0x27, - (byte)0xcd,(byte)0xbb,(byte)0xfb}, - "cb0082c8 f197d260 991ba6a4 60e76e20 2bad27b3"); - System.out.println(); - -// See also http://csrc.ncsl.nist.gov/cryptval/shs/sha1-vectors.zip - - { - final int RETRIES = 10; - final int ITERATIONS = 2000; - final int BLOCKSIZE = 65536; - byte[] input = new byte[BLOCKSIZE]; - for (int i = BLOCKSIZE; --i >= 0; ) - input[i] = (byte)i; - long best = 0; - for (int i = 0; i < 1000; i++) // training for stable measure - System.currentTimeMillis(); - - for (int retry = 0; retry < RETRIES; retry++) { - long t0 = System.currentTimeMillis(); - for (int i = ITERATIONS; --i >= 0; ); - long t1 = System.currentTimeMillis(); - for (int i = ITERATIONS; --i >= 0; ) - hash.engineUpdate(input, 0, BLOCKSIZE); - long t2 = System.currentTimeMillis(); - long time = (t2 - t1) - (t1 - t0); - if (retry == 0 || time < best) - best = time; - } - hash.engineReset(); - double rate = 1000.0 * ITERATIONS * BLOCKSIZE / best; - System.out.println("Our rate = " + - (float)(rate * 8) + " bits/s = " + - (float)(rate / (1024 * 1024)) + " Megabytes/s"); - // Java 1.5 beta-b32c, on Athlon XP 1800+: - // with java -client: 48.21 Megabytes/s. - // with java -server: 68.23 Megabytes/s. - - try { - MessageDigest md = MessageDigest.getInstance("SHA"); - for (int retry = 0; retry < RETRIES; retry++) { - long t0 = System.currentTimeMillis(); - for (int i = ITERATIONS; --i >= 0; ); - long t1 = System.currentTimeMillis(); - for (int i = ITERATIONS; --i >= 0; ) - md.update(input, 0, BLOCKSIZE); - long t2 = System.currentTimeMillis(); - long time = (t2 - t1) - (t1 - t0); - if (retry == 0 || time < best) - best = time; - } - md.reset(); - rate = 1000.0 * ITERATIONS * BLOCKSIZE / best; - System.out.println("JCE rate = " + - (float)(rate * 8) + " bits/s = " + - (float)(rate / (1024 * 1024)) + " Megabytes/s"); - } catch (NoSuchAlgorithmException nsae) { - System.out.println("No SHA algorithm in local JCE Security Providers"); - } - // Java 1.5 beta-b32c, on Athlon XP 1800+: - // with java -client: 23.20 Megabytes/s. - // with java -server: 45.72 Megabytes/s. - } - } - - private static final boolean tst(final int set, final int vector, - final String source, - final String expect) { - byte[] input = new byte[source.length()]; - for (int i = 0; i < input.length; i++) - input[i] = (byte)source.charAt(i); - return tst(set, vector, input, expect); - } - - private static final boolean tst(final int set, final int vector, - final byte[] input, - final String expect) { - System.out.print("Set " + set + ", vector# " + vector + ": "); - hash.engineUpdate(input, 0, input.length); - return tstResult(expect); - } - - private static final boolean tst(final int set, final int vector, - final int times, final String source, - final String expect) { - byte[] input = new byte[source.length()]; - for (int i = 0; i < input.length; i++) - input[i] = (byte)source.charAt(i); - System.out.print("Set " + set + ", vector# " + vector + ": "); - for (int i = 0; i < times; i++) - hash.engineUpdate(input, 0, input.length); - return tstResult(expect); - } - - private static final boolean tstResult(String expect) { - final String result = toHex(hash.engineDigest()); - expect = expect.toUpperCase(); - if (!expect.equals(result)) { - System.out.println("**************** WRONG ***************"); - System.out.println(" expect: " + expect); - System.out.println(" result: " + result); - return false; - } - System.out.println("OK"); - return true; - } - - private static final String toHex(final byte[] bytes) { - StringBuilder buf = new StringBuilder(bytes.length * 2); - for (int i = 0; i < bytes.length; i++) { - if ((i & 3) == 0 && i != 0) - buf.append(' '); - buf.append(HEX.charAt((bytes[i] >> 4) & 0xF)) - .append(HEX.charAt( bytes[i] & 0xF)); - } - return buf.toString(); - } - private static final String HEX = "0123456789ABCDEF"; -} diff --git a/core/java/test/net/i2p/crypto/SHA256Test.java b/core/java/test/net/i2p/crypto/SHA256Test.java index 9778887db3d80a3bdfb80c5c906eb1632687bf5c..4e6d1a032099a0e160d3823b2825e834f73b16f5 100644 --- a/core/java/test/net/i2p/crypto/SHA256Test.java +++ b/core/java/test/net/i2p/crypto/SHA256Test.java @@ -32,66 +32,19 @@ public class SHA256Test extends TestCase{ SHA256Generator.getInstance().calculateHash(message); } } - - public void testCopyConstructor(){ - SHA256Digest orig = new SHA256Digest(); - byte[] message = "update this!".getBytes(); - orig.update(message, 0, message.length); - - SHA256Digest copy = new SHA256Digest(orig); - - byte[] origData = new byte[32]; - orig.doFinal(origData, 0); - byte[] copyData = new byte[32]; - copy.doFinal(copyData, 0); - - assertTrue(DataHelper.eq(origData, copyData)); - - } - - public void testCheckName(){ - SHA256Digest digest = new SHA256Digest(); - assertEquals("SHA-256", digest.getAlgorithmName()); - } - - public void testManualUpdate(){ - byte[] data = "deathnotronic".getBytes(); - - SHA256Digest one = new SHA256Digest(); - for(int i = 0; i < data.length; i++){ - one.update(data[i]); + + /** + * Check if the behaviour remains the same. + */ + public void testMultipleEquality(){ + byte[] data = "blahblah".getBytes(); + + Hash firstHash = SHA256Generator.getInstance().calculateHash(data); + + for(int i=0; i<5; i++){ + Hash h = SHA256Generator.getInstance().calculateHash(data); + assertEquals(firstHash, h); } - - SHA256Digest two = new SHA256Digest(); - two.update(data[0]); - two.update(data, 1, data.length-1); - - byte[] oneData = new byte[32]; - one.doFinal(oneData, 0); - byte[] twoData = new byte[32]; - two.doFinal(twoData, 0); - - assertTrue(DataHelper.eq(oneData, twoData)); - } - - public void test14Words(){ - byte message[] = new byte[56]; - _context.random().nextBytes(message); - SHA256Digest orig = new SHA256Digest(); - orig.update(message, 0, message.length); - orig.doFinal(new byte[32], 0); - } - - public void testSHA(){ - I2PAppContext ctx = I2PAppContext.getGlobalContext(); - byte orig[] = new byte[4096]; - ctx.random().nextBytes(orig); - Hash old = ctx.sha().calculateHash(orig); - SHA256Digest d = new SHA256Digest(); - d.update(orig, 0, orig.length); - byte out[] = new byte[Hash.HASH_LENGTH]; - d.doFinal(out, 0); - assertTrue(DataHelper.eq(out, old.getData())); } -} \ No newline at end of file +} diff --git a/core/java/test/net/i2p/crypto/SessionEncryptionTest.java b/core/java/test/net/i2p/crypto/SessionEncryptionTest.java index c6ec05326c11f7748e1a987810a25f8d42a7f907..0641db6ab144a6b74a519fc1a95c42cca3add81b 100644 --- a/core/java/test/net/i2p/crypto/SessionEncryptionTest.java +++ b/core/java/test/net/i2p/crypto/SessionEncryptionTest.java @@ -102,7 +102,8 @@ public class SessionEncryptionTest extends TestCase{ - _context.sessionKeyManager().tagsDelivered(pubKey, curKey, firstTags); + TagSetHandle tsh = _context.sessionKeyManager().tagsDelivered(pubKey, curKey, firstTags); + _context.sessionKeyManager().tagsAcked(pubKey, curKey, tsh); curKey = _context.sessionKeyManager().getCurrentKey(pubKey); SessionTag curTag = _context.sessionKeyManager().consumeNextAvailableTag(pubKey, curKey); @@ -130,7 +131,8 @@ public class SessionEncryptionTest extends TestCase{ - _context.sessionKeyManager().tagsDelivered(pubKey, curKey, secondTags); + tsh = _context.sessionKeyManager().tagsDelivered(pubKey, curKey, secondTags); + _context.sessionKeyManager().tagsAcked(pubKey, curKey, tsh); curKey = _context.sessionKeyManager().getCurrentKey(pubKey); curTag = _context.sessionKeyManager().consumeNextAvailableTag(pubKey, curKey); @@ -199,7 +201,8 @@ public class SessionEncryptionTest extends TestCase{ - _context.sessionKeyManager().tagsDelivered(pubKey, curKey, firstTags); + TagSetHandle tsh = _context.sessionKeyManager().tagsDelivered(pubKey, curKey, firstTags); + _context.sessionKeyManager().tagsAcked(pubKey, curKey, tsh); curKey = _context.sessionKeyManager().getCurrentKey(pubKey); SessionTag curTag = _context.sessionKeyManager().consumeNextAvailableTag(pubKey, curKey); @@ -226,7 +229,8 @@ public class SessionEncryptionTest extends TestCase{ - _context.sessionKeyManager().tagsDelivered(pubKey, nextKey, secondTags); // note nextKey not curKey + tsh = _context.sessionKeyManager().tagsDelivered(pubKey, nextKey, secondTags); // note nextKey not curKey + _context.sessionKeyManager().tagsAcked(pubKey, nextKey, tsh); curKey = _context.sessionKeyManager().getCurrentKey(pubKey); curTag = _context.sessionKeyManager().consumeNextAvailableTag(pubKey, curKey); @@ -288,9 +292,11 @@ public class SessionEncryptionTest extends TestCase{ if ( (tags != null) && (tags.size() > 0) ) { if (nextKey == null) { - _context.sessionKeyManager().tagsDelivered(pubKey, curKey, tags); + TagSetHandle tsh = _context.sessionKeyManager().tagsDelivered(pubKey, curKey, tags); + _context.sessionKeyManager().tagsAcked(pubKey, curKey, tsh); } else { - _context.sessionKeyManager().tagsDelivered(pubKey, nextKey, tags); + TagSetHandle tsh = _context.sessionKeyManager().tagsDelivered(pubKey, nextKey, tags); + _context.sessionKeyManager().tagsAcked(pubKey, nextKey, tsh); } } } diff --git a/core/java/test/net/i2p/data/LeaseSetTest.java b/core/java/test/net/i2p/data/LeaseSetTest.java index 61c3b73c6de2625c97f4427efe47b38f5c3d0aed..30fb8c11fb2041ee3d69076d7b5d1fc4b0f92c22 100644 --- a/core/java/test/net/i2p/data/LeaseSetTest.java +++ b/core/java/test/net/i2p/data/LeaseSetTest.java @@ -25,4 +25,50 @@ public class LeaseSetTest extends StructureTest { return leaseSet; } public DataStructure createStructureToRead() { return new LeaseSet(); } + + public void testGetLeaseInvalid() { + // create test subject + LeaseSet subj = new LeaseSet(); + + // should contain no leases now.. + try { + assertNull(subj.getLease(0)); + } catch(RuntimeException exc) { + // all good + } + + // this shouldn't work either + try { + assertNull(subj.getLease(-1)); + } catch(RuntimeException exc) { + // all good + } + } + + public void testAddLeaseNull() { + // create test subject + LeaseSet subj = new LeaseSet(); + + // now add an null lease + try { + subj.addLease(null); + fail("Failed at failing."); + } catch(IllegalArgumentException exc) { + // all good + } + } + + public void testAddLeaseInvalid() { + // create test subject + LeaseSet subj = new LeaseSet(); + + // try to add completely invalid lease(ie. no data) + try { + subj.addLease(new Lease()); + fail("Failed at failing."); + } catch(IllegalArgumentException exc) { + // all good + } + } + } diff --git a/core/java/test/net/i2p/data/PrivateKeyTest.java b/core/java/test/net/i2p/data/PrivateKeyTest.java index cb3c3124d90028c60282227bbebc0809c80f9768..9d25fb449ababe1489d4c57f298c39f01698c70d 100644 --- a/core/java/test/net/i2p/data/PrivateKeyTest.java +++ b/core/java/test/net/i2p/data/PrivateKeyTest.java @@ -66,13 +66,15 @@ public class PrivateKeyTest extends StructureTest { byte data[] = new byte[56]; for (int i = 0; i < data.length; i++) data[i] = (byte)(i); - privateKey.setData(data); boolean error = false; try{ + privateKey.setData(data); privateKey.writeBytes(new ByteArrayOutputStream()); }catch(DataFormatException dfe){ error = true; + }catch(IllegalArgumentException exc) { + error = true; } assertTrue(error); } diff --git a/core/java/test/net/i2p/data/PublicKeyTest.java b/core/java/test/net/i2p/data/PublicKeyTest.java index 8ca6282ccc129039e477e86af9261ff5a5152ea9..8fed332bd5aacec06708172f3e94dab2c8a6c767 100644 --- a/core/java/test/net/i2p/data/PublicKeyTest.java +++ b/core/java/test/net/i2p/data/PublicKeyTest.java @@ -66,13 +66,15 @@ public class PublicKeyTest extends StructureTest { byte data[] = new byte[56]; for (int i = 0; i < data.length; i++) data[i] = (byte)(i); - publicKey.setData(data); boolean error = false; try{ + publicKey.setData(data); publicKey.writeBytes(new ByteArrayOutputStream()); }catch(DataFormatException dfe){ error = true; + }catch(IllegalArgumentException exc) { + error = true; } assertTrue(error); } diff --git a/core/java/test/net/i2p/data/RouterAddressTest.java b/core/java/test/net/i2p/data/RouterAddressTest.java index 65a44f92128aff26350a5467bef22d09e17b1718..aab4a88bb9ac593362200f066a2d4774ffd54d57 100644 --- a/core/java/test/net/i2p/data/RouterAddressTest.java +++ b/core/java/test/net/i2p/data/RouterAddressTest.java @@ -58,6 +58,7 @@ public class RouterAddressTest extends StructureTest { addr.setOptions(options); addr.setTransportStyle("Blah"); assertFalse(addr.equals(null)); + assertFalse(addr.equals("")); } public void testToString(){ @@ -73,5 +74,7 @@ public class RouterAddressTest extends StructureTest { addr.setOptions(options); addr.setTransportStyle("Blah"); addr.toString(); + addr.setOptions(null); + addr.toString(); } } diff --git a/core/java/test/net/i2p/data/SigningPrivateKeyTest.java b/core/java/test/net/i2p/data/SigningPrivateKeyTest.java index bafc3bdaca72d2453152cd4755f0b728930e991c..baa038812d55e237743825daacb821d097634b32 100644 --- a/core/java/test/net/i2p/data/SigningPrivateKeyTest.java +++ b/core/java/test/net/i2p/data/SigningPrivateKeyTest.java @@ -66,13 +66,15 @@ public class SigningPrivateKeyTest extends StructureTest { byte data[] = new byte[56]; for (int i = 0; i < data.length; i++) data[i] = (byte)(i); - signingPrivateKey.setData(data); boolean error = false; try{ + signingPrivateKey.setData(data); signingPrivateKey.writeBytes(new ByteArrayOutputStream()); }catch(DataFormatException dfe){ error = true; + }catch(IllegalArgumentException exc) { + error = true; } assertTrue(error); } diff --git a/core/java/test/net/i2p/data/SigningPublicKeyTest.java b/core/java/test/net/i2p/data/SigningPublicKeyTest.java index f976e53dac06343762ad91f9a3a453548219d19f..b97099e6e2de2e0cd2c644520d8fb23c2923e9a5 100644 --- a/core/java/test/net/i2p/data/SigningPublicKeyTest.java +++ b/core/java/test/net/i2p/data/SigningPublicKeyTest.java @@ -66,14 +66,17 @@ public class SigningPublicKeyTest extends StructureTest { byte data[] = new byte[56]; for (int i = 0; i < data.length; i++) data[i] = (byte)(i); - publicKey.setData(data); boolean error = false; try{ + publicKey.setData(data); publicKey.writeBytes(new ByteArrayOutputStream()); }catch(DataFormatException dfe){ error = true; + }catch(IllegalArgumentException exc) { + error = true; } + assertTrue(error); } diff --git a/core/java/test/net/i2p/data/SimpleDataStructureTest.java b/core/java/test/net/i2p/data/SimpleDataStructureTest.java new file mode 100644 index 0000000000000000000000000000000000000000..4cf8233429a2e76b63f27c4dff66bc2fe9604b73 --- /dev/null +++ b/core/java/test/net/i2p/data/SimpleDataStructureTest.java @@ -0,0 +1,96 @@ +package net.i2p.data; +/* + * free (adj.): unencumbered; not under the control of others + * Written by jrandom in 2003 and released into the public domain + * with no warranty of any kind, either expressed or implied. + * It probably won't make your computer catch on fire, or eat + * your children, but it might. Use at your own risk. + * + */ + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; + +import junit.framework.TestCase; + +/** + * Test harness for the simple data structure + * + * @author welterde + */ +public class SimpleDataStructureTest extends TestCase { + + public void testSetDataImmutable() throws Exception { + // create new test subject + TestStruct struct = new TestStruct(); + + // try to set null object.. should not fail.. + struct.setData(null); + + // set data to something + struct.setData(new byte[3]); + + // now setting it to null should fail + try { + struct.setData(null); + fail("Should not have allowed us to change this.."); + } catch(RuntimeException exc) { + // all good + } + + // setting it to something non-null should fail as well. + try { + struct.setData(new byte[3]); + fail("Should not have allowed us to change this.."); + } catch(RuntimeException exc) { + // all good + } + } + + public void testReadBytesImmutable() throws Exception { + // create new test subject + TestStruct struct = new TestStruct(); + + // load some data using setData + struct.setData(new byte[3]); + + // now try to load via readBytes + try { + struct.readBytes(null); + fail("blah blah blah.."); + } catch(RuntimeException exc) { + // all good + } + } + + public void testToBase64Safe() throws Exception { + // create new test subject + TestStruct struct = new TestStruct(); + + // now try to get the Base64.. should not throw an exception, but should not be an empty string either + assertNull(struct.toBase64()); + } + + public void testCalculateHashSafe() throws Exception { + // create new test subject + TestStruct struct = new TestStruct(); + + // now try to get the hash.. should not throw an exception + assertNull(struct.calculateHash()); + } + + public void testHashCodeSafe() throws Exception { + // create new test subject + TestStruct struct = new TestStruct(); + + // just make sure it doesn't explode in our face + struct.hashCode(); + } + + public class TestStruct extends SimpleDataStructure { + public int length() { + return 3; + } + } + +} \ No newline at end of file diff --git a/core/java/test/net/i2p/stat/RateTest.java b/core/java/test/net/i2p/stat/RateTest.java index 471e7bb8f328ac396e848a83bc13852f63f60a77..82235a785def51e6cc8161d696ec6395d64833a0 100644 --- a/core/java/test/net/i2p/stat/RateTest.java +++ b/core/java/test/net/i2p/stat/RateTest.java @@ -1,5 +1,6 @@ package net.i2p.stat; +import java.io.ByteArrayInputStream; import java.util.Properties; import junit.framework.TestCase; @@ -7,7 +8,7 @@ import junit.framework.TestCase; public class RateTest extends TestCase { public void testRate() throws Exception{ - Rate rate = new Rate(1000); + Rate rate = new Rate(5000); for (int i = 0; i < 50; i++) { Thread.sleep(20); rate.addData(i * 100, 20); @@ -19,10 +20,10 @@ public class RateTest extends TestCase { byte data[] = buf.toString().getBytes(); Properties props = new Properties(); - props.load(new java.io.ByteArrayInputStream(data)); + props.load(new ByteArrayInputStream(data)); Rate r = new Rate(props, "rate.test", true); assertEquals(r, rate); } -} \ No newline at end of file +} diff --git a/core/java/test/net/i2p/stat/SizeTest.java b/core/java/test/net/i2p/stat/SizeMeasure.java similarity index 98% rename from core/java/test/net/i2p/stat/SizeTest.java rename to core/java/test/net/i2p/stat/SizeMeasure.java index aaf157c1aa26378f7498e3a46285dcd5a6b44892..7bb162604ee62d6cf19bf5e7983a380c88fd8275 100644 --- a/core/java/test/net/i2p/stat/SizeTest.java +++ b/core/java/test/net/i2p/stat/SizeMeasure.java @@ -1,6 +1,6 @@ package net.i2p.stat; -public class SizeTest { +public class SizeMeasure { public static void main(String args[]) { testRateSize(100); //117KB testRateSize(100000); // 4.5MB diff --git a/core/java/test/net/i2p/util/LogSettingsTest.java b/core/java/test/net/i2p/util/LogSettingsTest.java index face457257307725ea7abced3809ef1165c8b390..529190a77cda8e0feb037c6d698e4876a52ab3b4 100644 --- a/core/java/test/net/i2p/util/LogSettingsTest.java +++ b/core/java/test/net/i2p/util/LogSettingsTest.java @@ -82,28 +82,37 @@ public class LogSettingsTest extends TestCase { System.setOut(pout); - log.debug("DEBUG" + ": debug"); - log.info("DEBUG" + ": info"); - log.warn("DEBUG" + ": warn"); - log.error("DEBUG" + ": error"); - log.log(Log.CRIT, "DEBUG" + ": crit"); - _context.logManager().shutdown(); - - String l1 = in.readLine(); - String l2 = in.readLine(); - String l3 = in.readLine(); - String l4 = in.readLine(); - String l5 = in.readLine(); - - assertTrue( - l1.matches(".*DEBUG: debug") && - l2.matches(".*DEBUG: info") && - l3.matches(".*DEBUG: warn") && - l4.matches(".*DEBUG: error") && - l5.matches(".*DEBUG: crit") - ); - - System.setOut(systemOut); + try { + log.debug("DEBUG" + ": debug"); + log.info("DEBUG" + ": info"); + log.warn("DEBUG" + ": warn"); + log.error("DEBUG" + ": error"); + log.log(Log.CRIT, "DEBUG" + ": crit"); + + // Wait for the LogWriter to flush, then write extra stuff so + // the test doesn't hang on failure + try { Thread.sleep(12*1000); } catch (InterruptedException ie) {} + for (int i = 0; i < 5; i++) + pout.println(""); + pout.flush(); + String l1 = in.readLine(); + String l2 = in.readLine(); + String l3 = in.readLine(); + String l4 = in.readLine(); + String l5 = in.readLine(); + + assertTrue( + l1.matches(".*DEBUG: debug") && + l2.matches(".*DEBUG: info") && + l3.matches(".*DEBUG: warn") && + l4.matches(".*DEBUG: error") && + l5.matches(".*DEBUG: crit") + ); + } finally { + System.setOut(systemOut); + pout.close(); + } + } @@ -122,26 +131,35 @@ public class LogSettingsTest extends TestCase { System.setOut(pout); - log.debug("INFO" + ": debug"); - log.info("INFO" + ": info"); - log.warn("INFO" + ": warn"); - log.error("INFO" + ": error"); - log.log(Log.CRIT, "INFO" + ": crit"); - _context.logManager().shutdown(); - - String l1 = in.readLine(); - String l2 = in.readLine(); - String l3 = in.readLine(); - String l4 = in.readLine(); - - assertTrue( - l1.matches(".*INFO: info") && - l2.matches(".*INFO: warn") && - l3.matches(".*INFO: error") && - l4.matches(".*INFO: crit") - ); - - System.setOut(systemOut); + try { + log.debug("INFO" + ": debug"); + log.info("INFO" + ": info"); + log.warn("INFO" + ": warn"); + log.error("INFO" + ": error"); + log.log(Log.CRIT, "INFO" + ": crit"); + + // Wait for the LogWriter to flush, then write extra stuff so + // the test doesn't hang on failure + try { Thread.sleep(12*1000); } catch (InterruptedException ie) {} + for (int i = 0; i < 4; i++) + pout.println(""); + pout.flush(); + String l1 = in.readLine(); + String l2 = in.readLine(); + String l3 = in.readLine(); + String l4 = in.readLine(); + + assertTrue( + l1.matches(".*INFO: info") && + l2.matches(".*INFO: warn") && + l3.matches(".*INFO: error") && + l4.matches(".*INFO: crit") + ); + } finally { + System.setOut(systemOut); + pout.close(); + } + } @@ -160,24 +178,33 @@ public class LogSettingsTest extends TestCase { System.setOut(pout); - log.debug("WARN" + ": debug"); - log.info("WARN" + ": info"); - log.warn("WARN" + ": warn"); - log.error("WARN" + ": error"); - log.log(Log.CRIT, "WARN" + ": crit"); - _context.logManager().shutdown(); - - String l1 = in.readLine(); - String l2 = in.readLine(); - String l3 = in.readLine(); - - assertTrue( - l1.matches(".*WARN: warn") && - l2.matches(".*WARN: error") && - l3.matches(".*WARN: crit") - ); + try { + log.debug("WARN" + ": debug"); + log.info("WARN" + ": info"); + log.warn("WARN" + ": warn"); + log.error("WARN" + ": error"); + log.log(Log.CRIT, "WARN" + ": crit"); + + // Wait for the LogWriter to flush, then write extra stuff so + // the test doesn't hang on failure + try { Thread.sleep(12*1000); } catch (InterruptedException ie) {} + for (int i = 0; i < 3; i++) + pout.println(""); + pout.flush(); + String l1 = in.readLine(); + String l2 = in.readLine(); + String l3 = in.readLine(); + + assertTrue( + l1.matches(".*WARN: warn") && + l2.matches(".*WARN: error") && + l3.matches(".*WARN: crit") + ); + } finally { + System.setOut(systemOut); + pout.close(); + } - System.setOut(systemOut); } public void testError() throws IOException{ @@ -195,22 +222,31 @@ public class LogSettingsTest extends TestCase { System.setOut(pout); - log.debug("ERROR" + ": debug"); - log.info("ERROR" + ": info"); - log.warn("ERROR" + ": warn"); - log.error("ERROR" + ": error"); - log.log(Log.CRIT, "ERROR" + ": crit"); - _context.logManager().shutdown(); - - String l1 = in.readLine(); - String l2 = in.readLine(); - - assertTrue( - l1.matches(".*ERROR: error") && - l2.matches(".*ERROR: crit") - ); + try { + log.debug("ERROR" + ": debug"); + log.info("ERROR" + ": info"); + log.warn("ERROR" + ": warn"); + log.error("ERROR" + ": error"); + log.log(Log.CRIT, "ERROR" + ": crit"); + + // Wait for the LogWriter to flush, then write extra stuff so + // the test doesn't hang on failure + try { Thread.sleep(12*1000); } catch (InterruptedException ie) {} + for (int i = 0; i < 2; i++) + pout.println(""); + pout.flush(); + String l1 = in.readLine(); + String l2 = in.readLine(); + + assertTrue( + l1.matches(".*ERROR: error") && + l2.matches(".*ERROR: crit") + ); + } finally { + System.setOut(systemOut); + pout.close(); + } - System.setOut(systemOut); } public void testCrit() throws IOException { @@ -228,21 +264,29 @@ public class LogSettingsTest extends TestCase { System.setOut(pout); - log.debug("CRIT" + ": debug"); - log.info("CRIT" + ": info"); - log.warn("CRIT" + ": warn"); - log.error("CRIT" + ": error"); - log.log(Log.CRIT, "CRIT" + ": crit"); - _context.logManager().shutdown(); - - String l1 = in.readLine(); - - assertTrue( - l1.matches(".*CRIT: crit") - ); + try { + log.debug("CRIT" + ": debug"); + log.info("CRIT" + ": info"); + log.warn("CRIT" + ": warn"); + log.error("CRIT" + ": error"); + log.log(Log.CRIT, "CRIT" + ": crit"); + + // Wait for the LogWriter to flush, then write extra stuff so + // the test doesn't hang on failure + try { Thread.sleep(12*1000); } catch (InterruptedException ie) {} + pout.println(""); + pout.flush(); + String l1 = in.readLine(); + + assertTrue( + l1.matches(".*CRIT: crit") + ); + } finally { + System.setOut(systemOut); + pout.close(); + } - System.setOut(systemOut); } -} \ No newline at end of file +} diff --git a/history.txt b/history.txt index 187b3623a705cd8a2616608912804153dc04f42a..b552cc43e39abeae5f68bdbd891ee6d9413dce40 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,311 @@ +* 2011-05-16 0.8.6 released + +2011-05-13 zzz + * Increase min floodfills; decrease min routerinfo expiration + +2011-05-11 zzz + * Use partitions of fast tier for various hops of client tunnels + +2011-05-06 zzz + * Tunnels and profiles: + - Increase max fast and high-cap tier sizes + - Slow profile eval cycle after sufficient uptime + - Fix bug which started a new build after a successful build + - Misc. cleanups + +2011-04-28 zzz + * Console: Try to prevent cascaded IllegalStateExceptions in .jsp code; + add logging for original error + * peers.jsp: Tag UPnP strings + * UPnP: Strip trailing nulls from incoming XML to prevent + "content not allowed in trailing section" exceptions + +* 2011-04-18 0.8.5 released + +2011-04-11 zzz + * Console: Hide iframe on mobile browsers + * DataHelper: Speed up eq() (Ticket #437) + * HTTPServer: Strip inbound X-Accept-Encoding header + * netdb.jsp: HTML fixes + * Plugins: Log error when console server not found + * Reseed: Log tweak + +2011-04-02 m1xxy + * routerconsole, i2psnark, ... I2P ahora también en español: ¡Bienvenidos los hispanohablantes! + - routerconsole, i2ptunnel, i2psnark, SusiDNS, Susimail fully translated into Spanish + (thx to PunkiBastardo and user) + * routerconsole, i2psnark, ... + - French translations completed by magma + +2011-03-22 zzz + * Handle GNU JRE returning Long.MAX_VALUE for max memory + * i2ptunnel: HTML fixes + +2011-03-20 zzz + * Console: Remove cache directives + * i2psnark: Fix peers stuck at uninteresting after metainfo fetch + * i2ptunnel: Change all clients to 3 hops by default (new installs only) + * Profiles: + - Nicer profile dump + - More efficient profile lookup for display + - Fix dumpprofile NPE + - Change file suffix from .dat to .txt.gz + - Set firstHeardAbout on creation + * Rate: Fix equals() + * Recognize links and links2 as text browsers + +2011-03-12 zzz + * Blocklist: Add bogons since they won't change any more + * BuildHandler: Loop double-check + * Console: + - Fix HTML errors in form message box, + logs.jsp, netdb.jsp, profiles.jsp, stats.jsp, + configpeer.jsp, configtunnels.jsp, configupdate.jsp + - ngettext cleanups + * LogWriter: Prevent NPE after permissions fail + +2011-03-11 duck + * Susimail: translation support, including dutch translation. + +2011-03-10 zzz + * configclients.jsp: Split form up, fix HTML warnings + * configui.jsp: Fix lang setting broken by previous nonce change + * Console: Consolidate nonce handling + * eepget: Don't send X-Accept-Encoding header to proxy (ticket #422) + * logs.jsp: Fix NPE (ticket #430) + * netdb.jsp: Fix table alignment + * Tunnel Preprocessor: Use entropy for padding more efficiently + +2011-03-08 zzz + * Clock: Cleanups and javadocs + * Console: + - Parameterize download button tags (ticket #425) + - Clean up summary bar HTML warnings + - Just display a summary bar link for text browsers + - Move welcome div from the readme files to index.jsp + - Require a nonce to change language + * EepGet: Cleanups and javadocs + * i2psnark: + - More efficient metainfo handling, reduce instantiations + - Improved handling of storage errors + - Improved handling of duplicate file names + - More metainfo sanity checks + - Metadata transfer error handling improvements + - Code cleanup, remove dead and duplicated code + * Reseed: Use the reseeder as a clock source + +2011-03-02 zzz + * BuildHandler: + - Limit request queue size + - Concurrent request queue + - Remove dead code for queued reply handling + * OutNetMessage: Remove dead code + * Tunnel cleanups, final, javadoc + +* 2011-03-02 0.8.4 released + +2011-02-27 zzz + * Console: + - Fix numerous readme HTML errors + - Fix flag locations in readmes + - desktopgui.enable now defaults to false; run systray if false + - Start icon app before console + - Restore systray form in configservice.jsp + - Only save lang when clicking on flags if desktopgui is running + - Only allow two-letter lang code from cgi parameter + * Reseed: Disable HTTPS until we have enough working hosts again + +2011-02-24 zzz + * i2psnark: + - Fix delete and remove buttons for Opera and w3m + - Stop torrent if no valid trackers + - Fix war build dependencies + +2011-02-23 zzz + * BuildHandler: + - Lower participating throttler max limit + - Cleanups and loop checks + * Console: Fix summary bar HTML error + +2011-02-22 zzz + * BuildHandler: Prelmiinary participating tunnel throttler + * I2PTunnel: + - Add spellcheck=false to textareas + - Fix HTML error in 503 error page + +2011-02-19 zzz + * I2PTunnel: Fix standalone server tunnels + http://forum.i2p/viewtopic.php?t=5376 + * Plugins: Fix signature verification if router.config specifies + trustedUpdateKeys (ticket #416) + +2011-02-18 Mathiasdm + * Desktopgui now has an option to be disabled (desktopgui.enabled) + +2011-02-17 zzz + * Build: + - Add includeAntRuntime=false to all javac targets + - Add build date, mtn rev, and changed file list to all manifests + - Add unless=uptodate to all jar and war targets + (bob and dtg still todo) + * Console: Add Arabic + * i2ptunnel: outproxy2 -> outproxyng (Ticket #394 take 2) + +2011-02-15 zzz + * i2psnark: Details link shuffle, mostly restore 0.8.3 behavior + * Profiles: Punish rejections more, in an attempt to spread the + load more through the network + * Timers: Log cleanup + +2011-02-14 Mathiasdm + * Fix headless issue without reboot + +2011-02-13 zzz + * Connect Client: Minor NPE fix cleanup + * JobQueue: Prevent NPE at shutdown (thanks liberty) + * GeoIP: Prevent startup NPE (ticket #413, thanks RN) + * NetDB: Prevent ExpireLeaseJob NPE (thanks sponge) + +2011-02-11 Mathiasdm + * routerconsole: fixed graphs using jrobin; and headless issue + in general: no more switches between headless and non-headless. + +2011-02-11 sponge + * I2PTunnel: fix NPE in I2PTunnelConnectClient + +2011-02-10 sponge + * I2CP: fix NPE in QueuedClientConnectionRunner + +2011-02-10 zzz + * I2CP: Correctly close internal connections on the router side + when closed by the client, was causing massive memory leak + for internal clients using lots of sessions (thanks sponge) + (ticket #397) + * i2psnark: + - Improved magnet link parsing, use tr parameter if present + * i2ptunnel: Change shared clients default for new clients to false + * Streaming: Don't use iter.remove() on a COWAS + +2011-02-09 sponge + * BOB: fixup delivery in config, adds config file versioning. + * I2CP: Fix most of the I2CP leaks. Two leaks remain, but they are small. + net.i2p.internal.QueuedI2CPMessageReader and + net.i2p.router.client.I2CPMessageQueueImpl + are the two remaining leaks. + +2011-02-07 zzz + * i2psnark: + - Check for dup magnet torrent when adding torrent file + - Add exotrack.i2p (ticket #403) + - Disable spellcheck in textarea + * i2ptunnel: Generate error message when i2ptunnel.config save fails + (ticket #404) + +2011-02-06 zzz + * i2psnark: Fix maggot links, and magnet links with trailing parameters (thx user) + +2011-02-05 zzz + * .mtn-ignore: New, to make it harder to check in stuff you shouldn't + * BOB: Drop checked-in build dir + * i2psnark: + - Big refactor to support torrents where only the infohash is known + (i.e., added by magnet links) + - Big refactor to use accessors instead of public fields + - Add support for metadata transfer (BEP 9) via the + extension protocol (BEP 10) + - Add support for adding torrents via standard magnet links (BEP 9) + and "maggot" links (http://sponge.i2p/files/maggotspec.txt) + - Add support for peer exchange (i2p_pex) + - Add stubs for future DHT support (BEP 5) + - Add more information on torrent details page; + add details page for single-file torrents + - Make filename filtering consistent (ticket #368) + - Fix add-torrent locking (ticket #371) + - Fix opentracker configuration + - Add several connect-to-self checks + - Add support for using new I2CP bandwidth limiter + - Add support for using new in-session I2CP naming lookups + - Don't expire outbound Piece messages, since we now defer loading the + data from disk + * i2ptunnel: + - Change connect proxy default to outproxy2.h2ik.i2p (ticket #394) + - IRCClient: Use tunnel log instance + - Server: Full queue log tweak + +2011-02-03 zzz + * Build: + - Remove dup flag files (ticket #316) + - Remove BOB dependency on i2ptunnel + * Console: Add DTG to classpath for old installs + * I2PTunnel: Fix NPE + * RandomSource: Fix seeding from /dev/urandom + * Reseed: Limit time spent downloading from a single source + +2011-02-02 sponge + * BOB: Revise lookup code, bump BOB version + +2011-01-31 zzz + * Console: Put all socket handlers in same thread pool, + set min/max threads and idle timeout + * Context: Fix properties init + * DataStructures: + - Cleanups + * DecayingBloomFilter, DecayingHashSet: Cleanups and speedups + * Findbugs: Lots of cleanups + * I2CP: + - Add experimental bandwidth limiter + - Add I2PSession API method to update tunnel and bandwidth + configuration on an existing session + - Filter more system properties before passing them to the router + - Start work on passing per-message flags to the router via I2CP + * I2PAppContext: New getProperties() method + * i2ptunnel: + - Use context properties as defaults + * NetDB, DatabaseStoreMessage: + - Convert everything from DataStructure to the + new DatabaseEntry superclass + - Optimizations made possible by DatabaseEntry + - Don't rescan netDb directory unless changed + * OCMOSJ: + - Don't send expired messages + - Clean up stat init + * PeerManager: Make calculators static, take out of router context + * Router: + - Add new RandomIterator, use in UDP, peer selector, + profile organizer + - Add a stat to monitor peer selector run time + * RouterContext: Clean up clock overrides + * Streaming: + - Add new real sockets for easier porting of apps. + See http://zzz.i2p/topics/792 for info. Untested. + - Case cleanups + - Javadoc + +* 2011-01-24 0.8.3 released + +2011-01-16 zzz + * Console: Allow editing of console args + * UDP: Prevent rare startup NPE + * UPnP: + - Change all log errors to warns (tickets #76, #95, #120) + - Double socket soTimeout to 2 seconds + +2011-01-15 zzz + * Console: Add some HTTP headers in the view servlets + +2011-01-12 zzz + * Log: Fix rare initialization problem + * PrivateKey: Fix hashCode() + +2011-01-09 zzz + * DataHelper: Speed up and annotate sortStructures() + * Data Structures: More caching improvements, don't cache where we shouldn't + * NetDB: Don't rescan netDb directory unless changed, + to reduce Hash cache thrash (backport from test4) + * RouterInfo: + - Don't cache byteified data by default, to save ~1.5 MB + - Don't create empty peers Set, to save ~100KB + 2011-01-07 zzz * Data Structures: More caching * i2psnark: Improve request tracking to reduce memory usage diff --git a/installer/install.xml b/installer/install.xml index 5b685f0a358a4b6c511d1e6af9b9b756ebf1e500..4c0e9057e6facb955a666df0a7dba85cab8fea8c 100644 --- a/installer/install.xml +++ b/installer/install.xml @@ -4,7 +4,7 @@ <info> <appname>i2p</appname> - <appversion>0.8.2</appversion> + <appversion>0.8.6</appversion> <authors> <author name="I2P" email="http://forum.i2p2.de/"/> </authors> @@ -105,13 +105,14 @@ <panels> <panel classname="HelloPanel"/> <panel classname="InfoPanel"/> + <panel classname="PacksPanel"><os family="windows" /></panel> <panel classname="TargetPanel"/> - <panel classname="InstallPanel"/> <panel classname="ShortcutPanel"><os family="windows" /></panel> <!-- <panel classname="ProcessPanel"><os family="windows" /></panel> --> <!-- unix|mac doesn't work, displays for windows too --> <panel classname="XInfoPanel" ><os family="unix" /></panel> <panel classname="XInfoPanel" ><os family="mac" /></panel> + <panel classname="InstallPanel"/> <panel classname="SimpleFinishPanel"/> </panels> @@ -178,6 +179,32 @@ <args><arg value="$INSTALL_PATH" /></args></executable> </pack> + + <pack name="Windows Service" required="no"> + <description>Automatically start I2P in the background</description> + <os family="windows" /> + <executable targetfile="$INSTALL_PATH/set_config_dir_for_nt_service.bat" stage="postinstall" failure="warn" keep="false" /> +<!-- +--> + <executable targetfile="$INSTALL_PATH/install_i2p_service_winnt.bat" stage="postinstall" failure="warn" keep="true"> + <args> + <arg value="$INSTALL_PATH\wrapper.config" /> + <arg value="--nopause" /> + </args> + </executable> + <executable targetfile="$INSTALL_PATH/I2Psvc.exe" stage="postinstall" failure="warn" keep="true"> + <args> + <arg value="-t" /> + <arg value="$INSTALL_PATH\wrapper.config" /> + </args> + </executable> + <executable targetfile="$INSTALL_PATH/uninstall_i2p_service_winnt.bat" stage="uninstall" failure="warn" keep="true"> + <args> + <arg value="$INSTALL_PATH\wrapper.config" /> + <arg value="--nopause" /> + </args> + </executable> + </pack> </packs> </installation> diff --git a/installer/resources/blocklist.txt b/installer/resources/blocklist.txt index 99570520c1a983e55e56f914336e6298d85cc310..6108d17823bfe6696176800443cc05729f78b8e7 100644 --- a/installer/resources/blocklist.txt +++ b/installer/resources/blocklist.txt @@ -4,7 +4,8 @@ # edit the file in the configuration directory, NOT the install directory. # # Blocking is now enabled by default. -# To disable blocking, set router.blocklist.enable=false on configadvanced.jsp and restart. +# To disable blocking, set router.blocklist.enable=false on configadvanced.jsp, +# or simply delete this file or remove all the entries below, and restart. # # Add additional entries as desired, sorting not required. # This file is only read at router startup. @@ -14,8 +15,8 @@ # For example, http://www.bluetack.co.uk/config/splist.zip is very broad and includes Tor users, it is not recommended. # A more reasonable list: http://www.bluetack.co.uk/config/level1.zip # -# You may also wish to add the bogons from http://www.cymru.com/Documents/bogon-list.html , -# but you will have to update your blocklist manually as IP ranges are assigned. +# We have included the bogons from http://www.team-cymru.org/Services/Bogons/http.html , +# but you will have to update your blocklist manually if the bogon list changes. # You must update this list yourself, it is not overwritten by the update process. # # * Acceptable formats (IPV4 only): @@ -34,7 +35,19 @@ # * For further information and downloads: # * http://www.bluetack.co.uk/forums/index.php?autocom=faq&CODE=02&qid=17 # * http://blocklist.googlepages.com/ -# * http://www.cymru.com/Documents/bogon-list.html +# * http://www.team-cymru.org/Services/Bogons/http.html # Chinese Floodfill Flooder:159.226.40.7 Friend of the Chinese Floodfill Flooder:159.226.40.3 +<a href="http://www.team-cymru.org/Services/Bogons/http.html">The Team Cymru Bogon List v6.8 03 FEB 2011</a>:0.0.0.0/8 +<a href="http://www.team-cymru.org/Services/Bogons/http.html">The Team Cymru Bogon List v6.8 03 FEB 2011</a>:10.0.0.0/8 +<a href="http://www.team-cymru.org/Services/Bogons/http.html">The Team Cymru Bogon List v6.8 03 FEB 2011</a>:127.0.0.0/8 +<a href="http://www.team-cymru.org/Services/Bogons/http.html">The Team Cymru Bogon List v6.8 03 FEB 2011</a>:169.254.0.0/16 +<a href="http://www.team-cymru.org/Services/Bogons/http.html">The Team Cymru Bogon List v6.8 03 FEB 2011</a>:172.16.0.0/12 +<a href="http://www.team-cymru.org/Services/Bogons/http.html">The Team Cymru Bogon List v6.8 03 FEB 2011</a>:192.0.0.0/24 +<a href="http://www.team-cymru.org/Services/Bogons/http.html">The Team Cymru Bogon List v6.8 03 FEB 2011</a>:192.0.2.0/24 +<a href="http://www.team-cymru.org/Services/Bogons/http.html">The Team Cymru Bogon List v6.8 03 FEB 2011</a>:192.168.0.0/16 +<a href="http://www.team-cymru.org/Services/Bogons/http.html">The Team Cymru Bogon List v6.8 03 FEB 2011</a>:198.18.0.0/15 +<a href="http://www.team-cymru.org/Services/Bogons/http.html">The Team Cymru Bogon List v6.8 03 FEB 2011</a>:198.51.100.0/24 +<a href="http://www.team-cymru.org/Services/Bogons/http.html">The Team Cymru Bogon List v6.8 03 FEB 2011</a>:203.0.113.0/24 +<a href="http://www.team-cymru.org/Services/Bogons/http.html">The Team Cymru Bogon List v6.8 03 FEB 2011</a>:224.0.0.0/3 diff --git a/installer/resources/certificates/forum.i2p2.de.crt b/installer/resources/certificates/forum.i2p2.de.crt new file mode 100644 index 0000000000000000000000000000000000000000..e28b1cc59fcb1ce9069737b490ca4e3abe83e891 --- /dev/null +++ b/installer/resources/certificates/forum.i2p2.de.crt @@ -0,0 +1,30 @@ +-----BEGIN CERTIFICATE----- +MIIFLDCCAxQCCQDLNmFBp0hvZzANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJV +SzEPMA0GA1UECBMGTG9uZG9uMQwwCgYDVQQKEwNJMlAxEjAQBgNVBAsTCVRoZSBG +b3J1bTEWMBQGA1UEAxMNZm9ydW0uaTJwMi5kZTAeFw0xMDEyMTkxNTAzNTJaFw0y +MDEyMTYxNTAzNTJaMFgxCzAJBgNVBAYTAlVLMQ8wDQYDVQQIEwZMb25kb24xDDAK +BgNVBAoTA0kyUDESMBAGA1UECxMJVGhlIEZvcnVtMRYwFAYDVQQDEw1mb3J1bS5p +MnAyLmRlMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4y3yMKKnJZ6I +Q/f6e+e6LgsGGMWvpa8+EqQKMR4UH3n+8olwTdUqMx3XnyXhmeSYA8idpF+7Izdj +y/z/2UXZWJM5eEl3OER7Uv64CStr8Q1Xdq7Zg+4nomnWrCDv7pDVgwUlIplctFDk +uPijXdfgs8xHERR20DmgBGMIW9U+gkyCfcqis9OOcsV8xgFMqAqaGRyPnHW4WGR6 +93IVFavox8nWDy0KhY4TL3DDV1uEeaQqF9F97k1nQxSepH1yR23qB3Nta7E3OsHZ +7uwU/cBcNxGag1HsfXufPub0pay9jc8anXT3Ip5OFYpTaUjpYVRBq9m1VW+BUJiV +ir06wRiPLx5/rAVtsWquuyEn4Ou9kXnil3Lenq8IHfv3yEHq7EMQm7AgK8brSVRb +PyUXGOpgC/jfDydXDh4Dc0jJ2O6czk1U5BZcIxAHJ+x3t/vE4ks2tPLlJUoQ/lMt +3fn2u9jWY/eZMOe/V1lkEbGc4Vi6qrJoI6VIESwsgFmV7R9g4C1e3cAmbRMINV5r +0SAJ2pwzO+rSgVTnYd3Hq3GzvC1MmJd8tme3WVZVggLQbOaeLnzAKmX9ktfA4VUl +kGUIixnL0K96u5iAoH9bwwbirWRHnfmY1HnmQXidSmDj9clSrsrD64VYwv6ACy5b +wkb/XPtXzx/b9Pr6Co79141eqT9ArtECAwEAATANBgkqhkiG9w0BAQUFAAOCAgEA +1oaksgeb8eqVH17+lkIr1cs43jA1rMJ2ogYdLxodrwtGzniv7pGpv/MNMFQ6rN9a +dGwJKm1mo/uOpsPBIcSSScZA4ER7RWMXbuR+vIGpmjO6RMr0sjRLoc7VoK9NBP02 +AcudKm9/6dQ2X46oByUCqaTk0INQkWWOOX4M8GXqXFuEle1aZF6KC2wytxdzspyA +BpE+7xbV68DAdE3FbZuowjHcWlebaDp1JBFj1H1WwLGC0gyIwIevxPft6eW0Z5m2 +p3B4EDG6ZChurBjng9bcMBJNqRFWo0Zo2FfdyLkFRYOtGzhWUgjLJqkEJsLC3Gpx +83y2fXQ0qdxY6yNuwoZSXEX0vLQPJbVvB3Apcmjc2Q0xg+CkONP6S+D6eziRcqyh +LaRLWKNELUB7ikWj1IpDmAb/dZ/zaL51rqCqwN4glebAg2HWqzFm/MNT7YfTKI4+ +/QC7812Tcge8j+/368dmbfcQqOMB+nQha1YpNw5i+cUgKW4HJMwuoSGEaDQ9NLg6 +JH110OAwLL5tCwbgRlC+Cr1zTtwHkq1NRk3eIjAlz6HKsSos0IBxW8m0TLvrsHKE +/3B9w2hv+20k24ND1hiCYv4ShghpAeaaJEs0Rb1Km/jgH9jeHSRUBzpZYAhkKIzr +PlrC0DfYlSLTdTJ3MTx9gXyK8RqSh16M+tTvoQ0zEl8= +-----END CERTIFICATE----- diff --git a/installer/resources/eepsite.help/help/lib/cn.png b/installer/resources/eepsite.help/help/lib/cn.png deleted file mode 100644 index 89144146219e6fbec7eaa89e1bf4b073d299569e..0000000000000000000000000000000000000000 Binary files a/installer/resources/eepsite.help/help/lib/cn.png and /dev/null differ diff --git a/installer/resources/eepsite.help/help/lib/de.png b/installer/resources/eepsite.help/help/lib/de.png deleted file mode 100644 index ac4a977362738ca7daa20784717f10f9617136b4..0000000000000000000000000000000000000000 Binary files a/installer/resources/eepsite.help/help/lib/de.png and /dev/null differ diff --git a/installer/resources/eepsite.help/help/lib/es.png b/installer/resources/eepsite.help/help/lib/es.png deleted file mode 100644 index c2de2d7111e3cb59cf6511dd2ab045e824bdb43e..0000000000000000000000000000000000000000 Binary files a/installer/resources/eepsite.help/help/lib/es.png and /dev/null differ diff --git a/installer/resources/eepsite.help/help/lib/fr.png b/installer/resources/eepsite.help/help/lib/fr.png deleted file mode 100644 index 8332c4ec23c853944c29b02d7b32a88033f48a71..0000000000000000000000000000000000000000 Binary files a/installer/resources/eepsite.help/help/lib/fr.png and /dev/null differ diff --git a/installer/resources/eepsite.help/help/lib/ir.png b/installer/resources/eepsite.help/help/lib/ir.png deleted file mode 100644 index c5fd136aee534ecb59914e336cad18d18ead2a4a..0000000000000000000000000000000000000000 Binary files a/installer/resources/eepsite.help/help/lib/ir.png and /dev/null differ diff --git a/installer/resources/eepsite.help/help/lib/it.png b/installer/resources/eepsite.help/help/lib/it.png deleted file mode 100644 index 89692f74f051cd43503744c3dab65c8ba773b7e2..0000000000000000000000000000000000000000 Binary files a/installer/resources/eepsite.help/help/lib/it.png and /dev/null differ diff --git a/installer/resources/eepsite.help/help/lib/jp.png b/installer/resources/eepsite.help/help/lib/jp.png deleted file mode 100644 index 325fbad3ffd3075a4a84d8d898ad26ef7d3e0d56..0000000000000000000000000000000000000000 Binary files a/installer/resources/eepsite.help/help/lib/jp.png and /dev/null differ diff --git a/installer/resources/eepsite.help/help/lib/nl.png b/installer/resources/eepsite.help/help/lib/nl.png deleted file mode 100644 index fe44791e32b790949b0317ab3c258864b9024ebe..0000000000000000000000000000000000000000 Binary files a/installer/resources/eepsite.help/help/lib/nl.png and /dev/null differ diff --git a/installer/resources/eepsite.help/help/lib/ru.png b/installer/resources/eepsite.help/help/lib/ru.png deleted file mode 100644 index 47da4214fd9edb383687c1d4f84fe8b42a51ceb2..0000000000000000000000000000000000000000 Binary files a/installer/resources/eepsite.help/help/lib/ru.png and /dev/null differ diff --git a/installer/resources/eepsite.help/help/lib/se.png b/installer/resources/eepsite.help/help/lib/se.png deleted file mode 100644 index 1994653dac1fc1c6ee3c9fcb35c8af97f16eefc7..0000000000000000000000000000000000000000 Binary files a/installer/resources/eepsite.help/help/lib/se.png and /dev/null differ diff --git a/installer/resources/eepsite.help/help/lib/us.png b/installer/resources/eepsite.help/help/lib/us.png deleted file mode 100644 index 10f451fe85c41c6c9a06d543a57114ae2f87ecc1..0000000000000000000000000000000000000000 Binary files a/installer/resources/eepsite.help/help/lib/us.png and /dev/null differ diff --git a/installer/resources/hosts.txt b/installer/resources/hosts.txt index 3af2337760169f14e22f9c95dafe56e90390ca05..594d4d8d6f7ba3e64c6e65899223b3104633e4fd 100644 --- a/installer/resources/hosts.txt +++ b/installer/resources/hosts.txt @@ -323,4 +323,7 @@ outproxy.h2ik.i2p=Wa-LfCQjQBcJVItWynp6NWNnjbCDNAD9HJl2v6koEq3B3nGfID7Xxbyq17h9mY trac.i2p2.i2p=24SmhWiRDm-GzpV5Gq2sXhuvPpa1OihY7rkxQO4aHy5qKjr6zmEnZ3xQXdkFJJ0Z1lKy73XRmgCyys02G25Hl3cuxlZ2fNbp6KhOzlRKpOIAWFdSWZNF4Fp7sos0x-a-9fxOWnwwQ9MFcRYwixE~iCZf4JG~-Pd-MHgAuDhIX0P3~GmfUvo~9xPjof1ZsnaOV1zC0XUkHxZA5D6V0Bse~Ptfb66lPNcgBxIEntCStBAy~rTjaA3SdAufG29IRWDscpFq1-D4XPaXHnlXu7n7WdpFEM8WWd3ebUMqnq8XvLL1eqoWYzKCe3aaavC3W6~pJp8cxKl2IKrhvSFatHZ0chRg3B4~ja1Cxmw1psisplSkJqMnF921E6pury0i6GH52XAVoj4iiDY~EAvqDhzG-ThwlzTs~2JKzslwxOrD2ejd-dcKdi4i9xvi2JQ4Ib2Mw2ktaQhuAw3Y9EkqAs7oriQQN8N8dwIoYkJLfvh7ousm0iKJJvMt3s55PccM46SoAAAA i2plugins.i2p=7oQz2gHOxFXxXTI6uGMk1Giv9UmviBhbubWKDjDqW1Rxvmm55tvC1znaAAZoV0X6YPd9aubYwsvfXAYatPHY1eehlELe3XdrgzqWvj566j62gv8atxhJQHjbaWqF-ZvntYRefVRFJ49sPi~MmAv5EBoSUKGuVu~8Bw-nKlCEhL7PLRdzA98515U5cFC6-srI2poZiWJ35rfbIqbEOLbECC4HbTedXv2PbRyukCiGrU-wPx4GnfSSaMeYMTAtHOf0IiYEKPSExjWkovgWbnCQaBzP4M-fAKIkSIMuOF8T4wmGaGESLCgiHukDoiiXmsTRm3cNeotm-BXncF~tft8sL4OB9cV-SeOtgkgIsaoO1JpQ1ACdtgOzlIB6H032jpuMQ5U9u1OQbTS8CtdRIlBv7Zcd6621MI2KGXLldHpcMs5hecbqctit~it5lB-wSkG6lllT2ZXBn8Yxeu8xo6kdrZ4bkolBYPEH1RPxiCj9GEchhUSPi75dkgb-vgoMnSMgAAAA i2pbote.i2p=~taSfBfeiMM5fW~qwUGZr4kAXmSoentWVjlQhTCKWhVj04KV34tLguNQEpHb1cA2eIwlkTpY0TPYUVKt866jLgQEteuIImmNuStVgm6DWh4baPqI22oSNC7O-4EW6PJy1tT9nr1NXu5p4w2jY4P4Css76xthaf6Z5YUOWAIwnMlptyac-qFHmjmU3CFqvKQgBnA4NB0ts7Y2~TcvciANllfsjfsMgFdg--FYpKiwC8bSsTHKJ3~oGb6osMqql~Vzr6kvIzfLnvabbuW8wjG2JvATBuJ3IY-BN59KdT84nc00SuMgmt1ywVvHOl0~n8Cjr1hASYiJ2FTxEQRbQ9WRaxbnk5BO~yeiedCsjw7ImsSES3GzcU5zVVx9p3bgx7P~X0h52VripL6bovj9YJznN3qw0eRCJGjY-du8azFNV6~6ZZ6ss14RNC~HKIzlhR7F5kF~4H2wfC1EdNlmm1cI0iYRdEdwSSVX47LngHyK-ZQbVZOGeEeCU8J8Vhk~8WdLAAAA -planet.i2p=W0omtMApOdlTkgJoct08QnzDkeb~xc60df5Cx3k3qqOFmyEkRB65NdpSdvldI5STmXmXlZe68f8Hu1dfBMmKvfpBFMpP-mRVYuHbEa4N1dRkp3AOswZFO51lSC~MVPMZKGHAv0cfv5WFaJ9nfuaR7iYYWJF11xotoPTMbJdB-I3XPC8rxHI-73ATlOD4cU9oZ6BYcBE0dun9zw4IHBcRpnFRx~s-TkevNfPnBqujB-NNgA8a5s~QUj0h3FwwUWsNB8f1Uwy~DwoQh7pMp6dsZ3umEyBn2HaXZasSmbzB30qkQRs9vrAtIFdIzCQ~8gI2cHdHEPgExUQX~xlM8QZEgnLXSfS93asWPdpitv~KT7bO-35BgTBdCozHTCcvys6bYJ24UnkFVBE0D2L0t98neelWkJSaEU0QzxdRphoCZY8OABQIaS4qw6PEFD1Un1vxNCh~TDFWcYBZ3Rqsc~ISW0wF7oOS6-DPT3q5O8cGLc8iAEdRchrU9XyAHAKVlEZxAAAA \ No newline at end of file +planet.i2p=W0omtMApOdlTkgJoct08QnzDkeb~xc60df5Cx3k3qqOFmyEkRB65NdpSdvldI5STmXmXlZe68f8Hu1dfBMmKvfpBFMpP-mRVYuHbEa4N1dRkp3AOswZFO51lSC~MVPMZKGHAv0cfv5WFaJ9nfuaR7iYYWJF11xotoPTMbJdB-I3XPC8rxHI-73ATlOD4cU9oZ6BYcBE0dun9zw4IHBcRpnFRx~s-TkevNfPnBqujB-NNgA8a5s~QUj0h3FwwUWsNB8f1Uwy~DwoQh7pMp6dsZ3umEyBn2HaXZasSmbzB30qkQRs9vrAtIFdIzCQ~8gI2cHdHEPgExUQX~xlM8QZEgnLXSfS93asWPdpitv~KT7bO-35BgTBdCozHTCcvys6bYJ24UnkFVBE0D2L0t98neelWkJSaEU0QzxdRphoCZY8OABQIaS4qw6PEFD1Un1vxNCh~TDFWcYBZ3Rqsc~ISW0wF7oOS6-DPT3q5O8cGLc8iAEdRchrU9XyAHAKVlEZxAAAA +exotrack.i2p=Ly1vs4plBuGisqlMiQOjhVkXFZPBMy9joSCrus~tuLXBRXDrPYG9WXJMzY4gb3LiW0VVawv0kLgikX8eeeruXmgKwQW5zB9UPSP0CQnXTRelE3Jn7lev~re4woHvgS-EGBwWikxqXF3f7W8-LhieI0JhBZxItiWhJJME07oncW0kgS8UIMl0wqN2Y-p0sryFCN056TfGNTXigfxrSLqKnpi6a2OyEkF62qvRID3qXzRque0vKQjqvavq2mqxjFrSgLUoyKod5h9Px6qK08gtoAyDKMLPk7fPgReYKj6awiOxRSGfsMpZD3~ZuV0Sts2XtCau3S3myYMIDe5oKziPtZRIej4KBDxT0YYIw5v4RoqzqF88gNgHDfkPZ25JKTOt5xGcPTG8kwYrtx39PX6NrJmv-I~LUz6sZZlIW24k1qbO7zBxZ6mazldQY1~FJGXzn5MNzsxp44iOZdMDJJh18N0Psthk2hqlQOS4L0Ss1Odm1czhBxf1Y~j3L-QsMttcAAAA +outproxyng.h2ik.i2p=1RqMQd58RgA4D~XT34rCjQteJVQwFKQbPK5P03GetL-DyCfKV6Vg61xyxGOZK-K4KTXXf45PG~oDAWIzE7UY5aXN9oAjHXfPrU9hHxv35BaxFqUpsJLgjWu41OwSjl5aN2-freH4gGVSiL62I1y2bcXHc2kVHlbToQOy8bJoS3KSDHEeU0r79f~cY3xf6rBHpHNMJtdYdnWlLq5KFc2cz~8lIut~sSIAwUEfebBkhfl2ctvdEGdSshBWGTxXiahtQX0xraynF-Cex2hxvBAl0g9aoOnrLx~Gses54WPD-m3RArI3fiaxEALRuFa0mfrrEgjOhBtVU8IlTYrTEkR8JSGofsEmuqqM03FIrwOv6lJZi-xemiNUr3OX6VdO4ckIg69BxpCYzP2IxLO5r8lSwyHqGbYPFxBIjbSMsv6tGWWdglV4Y9sQHTarboA-XDih3DzDpomb1~78cSiV3PRidjj4MDggn1abkQbRVd6WLV~eTi54bctS-JwW-I5Xyqq~AAAA +inr.i2p=GGB99wXYBnX-wOxQ~Xrvo7AvngoYgifvZZL54ksZWzclcirG7AysqfkAKyv906PxfM4y2DcN2K9m4-D99yFj-1BdnUuIEqfi2yuaaVoWuOffT3h9ne~kZnq3C-wrmczD70Gxk4shvSVxMdUEFvEip8QY4K0R-FiKBsFAfWGTE3b9d-QCzP0H9VP5V-CaYjYVQuMRgMluk9gnoLRipvV7483f~rmGgYX8xwygEAQ3v9P4hrAlJrP0lWJLI1K6KQucP3THIxZ4A9Xxnl0I7EZAT8bHwzschFrcDPYM~DtQdkJTz2VphocbNLfIExTrFt88-xC69WE-fSbaMf9jucT4f5kdpfpRu0kM~am40etxPs8uXGF-L9IXCjgUkJHrWdPHeGhnx-ye2xvUTLO2jyga8iY89Ee3IpqivVUg-iAQJzX9NXC29sf0YzNj8d8mdWRNuzbLSx9CVJ3l1NPJr4k7hmCqf8lBGXNIFZQL4Wez1PPcM4gw0o73gqIxkxvVzVcpAAAA diff --git a/installer/resources/i2ptunnel.config b/installer/resources/i2ptunnel.config index ecb45b2067b3b51c66fa398cd46b945de915eeb3..0a7f3fe4015a8cbbd99d7feeb2b06a711360299e 100644 --- a/installer/resources/i2ptunnel.config +++ b/installer/resources/i2ptunnel.config @@ -21,6 +21,10 @@ tunnel.0.option.i2cp.reduceIdleTime=900000 tunnel.0.option.i2cp.reduceOnIdle=true tunnel.0.option.i2cp.reduceQuantity=1 tunnel.0.option.i2p.streaming.connectDelay=1000 +tunnel.0.option.inbound.length=3 +tunnel.0.option.inbound.lengthVariance=0 +tunnel.0.option.outbound.length=3 +tunnel.0.option.outbound.lengthVariance=0 tunnel.0.startOnLoad=true # irc @@ -44,6 +48,10 @@ tunnel.1.option.i2cp.reduceOnIdle=true tunnel.1.option.i2cp.reduceQuantity=1 tunnel.1.option.i2p.streaming.connectDelay=1000 tunnel.1.option.i2p.streaming.maxWindowSize=16 +tunnel.1.option.inbound.length=3 +tunnel.1.option.inbound.lengthVariance=0 +tunnel.1.option.outbound.length=3 +tunnel.1.option.outbound.lengthVariance=0 tunnel.1.startOnLoad=true # I2P's mtn server @@ -61,6 +69,10 @@ tunnel.2.option.outbound.nickname=shared clients tunnel.2.option.i2cp.reduceIdleTime=900000 tunnel.2.option.i2cp.reduceOnIdle=true tunnel.2.option.i2cp.reduceQuantity=1 +tunnel.2.option.inbound.length=3 +tunnel.2.option.inbound.lengthVariance=0 +tunnel.2.option.outbound.length=3 +tunnel.2.option.outbound.lengthVariance=0 tunnel.2.startOnLoad=false # local eepserver @@ -94,6 +106,10 @@ tunnel.4.option.i2cp.reduceIdleTime=900000 tunnel.4.option.i2cp.reduceOnIdle=true tunnel.4.option.i2cp.reduceQuantity=1 tunnel.4.option.i2p.streaming.connectDelay=1000 +tunnel.4.option.inbound.length=3 +tunnel.4.option.inbound.lengthVariance=0 +tunnel.4.option.outbound.length=3 +tunnel.4.option.outbound.lengthVariance=0 tunnel.4.startOnLoad=true tunnel.4.targetDestination=smtp.postman.i2p tunnel.4.type=client @@ -112,6 +128,10 @@ tunnel.5.option.i2cp.reduceIdleTime=900000 tunnel.5.option.i2cp.reduceOnIdle=true tunnel.5.option.i2cp.reduceQuantity=1 tunnel.5.option.i2p.streaming.connectDelay=1000 +tunnel.5.option.inbound.length=3 +tunnel.5.option.inbound.lengthVariance=0 +tunnel.5.option.outbound.length=3 +tunnel.5.option.outbound.lengthVariance=0 tunnel.5.startOnLoad=true tunnel.5.targetDestination=pop.postman.i2p tunnel.5.type=client @@ -124,7 +144,7 @@ tunnel.6.type=connectclient tunnel.6.sharedClient=true tunnel.6.interface=127.0.0.1 tunnel.6.listenPort=4445 -tunnel.6.proxyList=outproxy.h2ik.i2p +tunnel.6.proxyList=outproxyng.h2ik.i2p tunnel.6.i2cpHost=127.0.0.1 tunnel.6.i2cpPort=7654 tunnel.6.option.inbound.nickname=shared clients @@ -133,5 +153,9 @@ tunnel.6.option.i2cp.reduceIdleTime=900000 tunnel.6.option.i2cp.reduceOnIdle=true tunnel.6.option.i2cp.reduceQuantity=1 tunnel.6.option.i2p.streaming.connectDelay=1000 +tunnel.6.option.inbound.length=3 +tunnel.6.option.inbound.lengthVariance=0 +tunnel.6.option.outbound.length=3 +tunnel.6.option.outbound.lengthVariance=0 tunnel.6.startOnLoad=true diff --git a/installer/resources/icons/flags/ch.png b/installer/resources/icons/flags/ch.png index 4e6fa9641e85e30b303edd6553096290bf0e4531..3fe13cab509b4dc01fd09daccc4bcf136c3dd9de 100644 Binary files a/installer/resources/icons/flags/ch.png and b/installer/resources/icons/flags/ch.png differ diff --git a/installer/resources/icons/flags/lang_ar.png b/installer/resources/icons/flags/lang_ar.png new file mode 100644 index 0000000000000000000000000000000000000000..f9dee35851c8c76ae16b6cc53fe27aa1ead25f3d Binary files /dev/null and b/installer/resources/icons/flags/lang_ar.png differ diff --git a/installer/resources/initialNews/initialNews_ar.xml b/installer/resources/initialNews/initialNews_ar.xml new file mode 100644 index 0000000000000000000000000000000000000000..e21ae5cb8eacc4f5f429aae4a2a7e2a0f8c83c68 --- /dev/null +++ b/installer/resources/initialNews/initialNews_ar.xml @@ -0,0 +1,20 @@ +<div lang="ar" dir="rtl"> +<h3>Congratulations on getting I2P installed!</h3> +<p> +<b> !I2P مرØبا بك ÙÙŠ شبكة</b> +انتظر قليلا بينما يتم ربط الإتصال بباقي أعضاء الشبكة. +</p> +<p> + +بسنما يتم الإتصال <b>بتغير بيانات سرعة الشبكة ÙÙŠ</b> قم +<a href="config.jsp">صÙØØ© الخيارات</a>. +</p> +<p> +عندما تظهر عبارة "shared clients" على اليسار يمكنك Øينها <b>زيارة</b> +<a href="http://www.i2p2.i2p/faq.html">الأسئلة الشائعة</a>. +</p> +<p>IRC اتصل بخادم الدردشة الÙورية على + <b>localhost:6668</b> +<a href="irc://127.0.0.1:6668/i2p-help">#i2p-help</a> or <a href="irc://127.0.0.1:6668/i2p">#i2p</a>. +</p> +</div> diff --git a/installer/resources/initialNews/initialNews_fr.xml b/installer/resources/initialNews/initialNews_fr.xml new file mode 100644 index 0000000000000000000000000000000000000000..8f027c270471183f55f8d0607fd5940e6d6dfe07 --- /dev/null +++ b/installer/resources/initialNews/initialNews_fr.xml @@ -0,0 +1,20 @@ +<div lang="fr"> +<h3>Merci d'utiliser I2P !</h3> +<p> +<b>Bienvenue sur I2P !</b> +Merci de <b>patienter</b> le temps qu'I2P démarre et trouve des pairs. +</p> +<p> +Pendant ce temps, merci d'<b>adjuster vos réglages de bande passante</b> sur la page de +<a href="config.jsp">configuration</a>. +</p> +<p> +Une fois que vous avez une indication "clients partagés…" listée sur la gauche, +merci de <b>jeter un Å“il</b> à la <a href="http://www.i2p2.i2p/faq_fr.html">FAQ</a>. +</p> +<p> +Pointez votre client IRC sur <b>localhost:6668</b> et venez nous faire coucou sur +<a href="irc://127.0.0.1:6668/i2p-help">#i2p-help</a>, <a href="irc://127.0.0.1:6668/i2p-fr">#i2p-fr</a> +ou <a href="irc://127.0.0.1:6668/i2p">#i2p</a>. +</p> +</div> diff --git a/installer/resources/install_i2p_service_winnt.bat b/installer/resources/install_i2p_service_winnt.bat index fb668c64a7e292c869c16c81eed64671dc0a276e..a6eb0495d17e265c1291e77012d60ff77733757c 100644 --- a/installer/resources/install_i2p_service_winnt.bat +++ b/installer/resources/install_i2p_service_winnt.bat @@ -31,5 +31,6 @@ rem :startup "%_WRAPPER_EXE%" -i %_WRAPPER_CONF% if not errorlevel 1 goto :eof +if %2=="--nopause" goto :eof pause diff --git a/installer/resources/jetty.xml b/installer/resources/jetty.xml index 29900cb6b07975af1d9488ce9a82721971bc9c84..a5072d8d757d197a3a0891b827578cb0364ed67c 100644 --- a/installer/resources/jetty.xml +++ b/installer/resources/jetty.xml @@ -12,7 +12,9 @@ <!-- been patched to allow IPv6 addresses as well, --> <!-- enclosed in brackets e.g. [::1] --> <!-- * port: Default 7658 in the addListener section --> -<!-- * threads: Raise MaxThreads in the addListener section --> +<!-- * docroot: Change the ResourceBase in the addContext section --> +<!-- to serve files from a different location. --> +<!-- * threads: Raise MinThreads and/or MaxThreads in the addListener section --> <!-- if you have a high-traffic site and get a lot of warnings. --> <!-- * Uncomment the addWebApplications section to use to enable --> <!-- war files placed in the webapps/ dir. --> @@ -23,7 +25,7 @@ <!-- found in Jetty 5, you may install and run Jetty 6 in a different JVM, --> <!-- or run any other web server such as Apache. If you do run another --> <!-- web server instead, be sure and disable the Jetty 5 server for your --> -<!-- eepsite on http://127.0.0.1/configclients.jsp . --> +<!-- eepsite on http://127.0.0.1:7657/configclients.jsp . --> <!-- --> <!-- Jetty errors and warnings will appear in wrapper.log, check there --> <!-- to diagnose problems. --> @@ -57,13 +59,12 @@ <Set name="port">7658</Set> </New> </Arg> - <Set name="MinThreads">3</Set> - <Set name="MaxThreads">10</Set> + <Set name="MinThreads">1</Set> + <Set name="MaxThreads">16</Set> <Set name="MaxIdleTimeMs">60000</Set> <Set name="LowResourcePersistTimeMs">1000</Set> <Set name="ConfidentialPort">8443</Set> <Set name="IntegralPort">8443</Set> - <Set name="PoolName">main</Set> </New> </Arg> </Call> @@ -90,9 +91,7 @@ <Set name="Port">8443</Set> <Set name="PoolName">main</Set> <Set name="Keystore">./eepsite/keystore.ks</Set> - <!-- the keystore password --> <Set name="Password">changeit</Set> - <!-- the X.509 certificate password --> <Set name="KeyPassword">myKeyPassword</Set> <Set name="NonPersistentUserAgent">MSIE 5</Set> </New> diff --git a/installer/resources/news.xml b/installer/resources/news.xml index e542e7a2496e4716a22705716f39b8aa9309814b..e978528c5f5d100b9149fb29824210df1d4b2309 100644 --- a/installer/resources/news.xml +++ b/installer/resources/news.xml @@ -1,17 +1,13 @@ <!-- -<i2p.news date="$Date: 2010-12-22 00:00:00 $"> -<i2p.release version="0.8.2" date="2010/12/22" minVersion="0.6" /> +<i2p.news date="$Date: 2011-05-16 00:00:00 $"> +<i2p.release version="0.8.6" date="2011/05/16" minVersion="0.6" /> --> <div lang="en"> -<h3>2010-12-22: <b>0.8.2 <a href="http://www.i2p2.i2p/release-0.8.2.html">Released</a></b></h3> +<h3>2011-05-16: <b>0.8.6 <a href="http://www.i2p2.i2p/release-0.8.6.html">Released</a></b></h3> <p> -The 0.8.2 release includes extensive bug fixes and theme updates in the router and in i2psnark. -There are also optimizations to reduce memory usage in i2psnark. -The HTTP and SOCKS proxies now support local and remote authorization. -As usual, upgrading is recommended. -</p><p> -I2P will be at 27C3 in Berlin the week of the December 27th. -Look for the I2P people there and ask for I2P stickers! +The 0.8.6 release contains more peer selection defenses to resist powerful attackers, and +tweaks to adjust to the recent rapid growth in the network. +Upgrading is recommended. </p><p> Please help grow the network. Say hello to the volunteers on the <a href="irc://127.0.0.1:6668/i2p-help">#i2p-help IRC channel</a>. @@ -20,6 +16,6 @@ spread the word, and <a href="http://www.i2p2.i2p/donate.html">donate</a>! If you find a bug, please enter a report on <a href="http://trac.i2p2.i2p/report/1">trac</a>. We are still looking for volunteers to work on new and existing translations. -Please volunteer on <a href="irc://127.0.0.1:6668/i2p">IRC #i2p</a>. +Please volunteer on <a href="irc://127.0.0.1:6668/i2p">IRC #i2p-dev</a>. </p> </div> diff --git a/installer/resources/news_fr.xml b/installer/resources/news_fr.xml new file mode 100644 index 0000000000000000000000000000000000000000..ab045e4bfaf6a2b7c022a29607250c85476c864d --- /dev/null +++ b/installer/resources/news_fr.xml @@ -0,0 +1,21 @@ +<!-- +<i2p.news date="$Date: 2011-03-02 00:00:00 $"> +<i2p.release version="0.8.4" date="2011/03/02" minVersion="0.6" /> +--> +<div lang="fr"> +<h3>2011-03-02: <b>La version 0.8.4 <a href="http://www.i2p2.i2p/release-0.8.4_fr.html">est sortie</a></b></h3> +<p> +Cette version 0.8.4 contient quelques améliorations de performances et des corrections de bogues importantes. +i2psnark prend désormais en charge les liens magnet. +Comme d'habitude, la mise à jour est recommmandée. +</p><p> +Merci de participer à la croissance du réseau. +Venez nous encourager sur le <a href="irc://127.0.0.1:6668/i2p-help">canal IRC #i2p-help</a>. +<a href="http://www.i2p2.i2p/getinvolved.html">Impliquez-vous</a>, +passez le mot, +et <a href="http://www.i2p2.i2p/donate.html">un petit don</a>! +Si vous trouvez un bogue, merci d'entrer un rapport sur <a href="http://trac.i2p2.i2p/report/1">trac</a>. +Nous cherchons toujours des volontaires pour travailler sur les traductions existantes et des nouvelles. +Merci de vous manifester sur l'<a href="irc://127.0.0.1:6668/i2p">IRC #i2p-dev</a>. +</p> +</div> diff --git a/installer/resources/proxy/ahelper-conflict-header.ht b/installer/resources/proxy/ahelper-conflict-header.ht index 670a64693c92b85b0dfc7f87b18feb19b5ad9802..e15e0f57e39f7417729475ae58290e0921fe543d 100644 --- a/installer/resources/proxy/ahelper-conflict-header.ht +++ b/installer/resources/proxy/ahelper-conflict-header.ht @@ -1,28 +1,28 @@ -HTTP/1.1 409 Conflict -Content-Type: text/html; charset=UTF-8 -Cache-control: no-cache -Connection: close -Proxy-Connection: close - -<html><head> -<title>I2P Warning: Destination key conflict</title> -<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" > -<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" > -</head> -<body> -<div class=logo> - <a href="http://127.0.0.1:7657/index.jsp" title="Router Console"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="I2P Router Console" border="0"></a><hr> - <a href="http://127.0.0.1:7657/config.jsp">Configuration</a> <a href="http://127.0.0.1:7657/help.jsp">Help</a> <a href="http://127.0.0.1:7657/susidns/">Addressbook</a> -</div> -<div class=warning id=warning> -<h3>Warning: Destination Key Conflict</h3> -The addresshelper link you followed specifies a different destination key -than a host entry in your host database. -Someone could be trying to impersonate another eepsite, -or people have given two eepsites identical names. -<p> -You can resolve the conflict by considering which key you trust, -and either discarding the addresshelper link, -discarding the host entry from your host database, -or naming one of them differently. -<p> +HTTP/1.1 409 Conflict +Content-Type: text/html; charset=UTF-8 +Cache-control: no-cache +Connection: close +Proxy-Connection: close + +<html><head> +<title>I2P Warning: Destination key conflict</title> +<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" > +<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" > +</head> +<body> +<div class=logo> + <a href="http://127.0.0.1:7657/index.jsp" title="Router Console"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="I2P Router Console" border="0"></a><hr> + <a href="http://127.0.0.1:7657/config.jsp">Configuration</a> <a href="http://127.0.0.1:7657/help.jsp">Help</a> <a href="http://127.0.0.1:7657/susidns/">Addressbook</a> +</div> +<div class=warning id=warning> +<h3>Warning: Destination Key Conflict</h3> +The addresshelper link you followed specifies a different destination key +than a host entry in your host database. +Someone could be trying to impersonate another eepsite, +or people have given two eepsites identical names. +<p> +You can resolve the conflict by considering which key you trust, +and either discarding the addresshelper link, +discarding the host entry from your host database, +or naming one of them differently. +<p> diff --git a/installer/resources/proxy/ahelper-conflict-header_ar.ht b/installer/resources/proxy/ahelper-conflict-header_ar.ht new file mode 100644 index 0000000000000000000000000000000000000000..d3a4d8380dc2f036e7ed6dc9c6d890b0e224dc20 --- /dev/null +++ b/installer/resources/proxy/ahelper-conflict-header_ar.ht @@ -0,0 +1,28 @@ +HTTP/1.1 409 Conflict +Content-Type: text/html; charset=UTF-8 +Cache-control: no-cache +Connection: close +Proxy-Connection: close + +<html lang="ar" dir="rtl"><head> +<title>I2P Warning: Destination key conflict</title> +<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" > +<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" > +</head> +<body> +<div class=logo> + <a href="http://127.0.0.1:7657/index.jsp" title="Router Console"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="I2P Router Console" border="0"></a><hr> + <a href="http://127.0.0.1:7657/config.jsp">اعدادات</a> <a href="http://127.0.0.1:7657/help.jsp">مساعدة</a> <a href="http://127.0.0.1:7657/susidns/">دÙتر العناوين</a> +</div> +<div class=warning id=warning> +<h3>Warning: Destination Key Conflict</h3> +The addresshelper link you followed specifies a different destination key +than a host entry in your host database. +Someone could be trying to impersonate another eepsite, +or people have given two eepsites identical names. +<p> +You can resolve the conflict by considering which key you trust, +and either discarding the addresshelper link, +discarding the host entry from your host database, +or naming one of them differently. +<p> diff --git a/installer/resources/proxy/ahelper-conflict-header_fr.ht b/installer/resources/proxy/ahelper-conflict-header_fr.ht new file mode 100644 index 0000000000000000000000000000000000000000..071bf7ab8918ace32896949c0f2d5c799c3715b4 --- /dev/null +++ b/installer/resources/proxy/ahelper-conflict-header_fr.ht @@ -0,0 +1,24 @@ +HTTP/1.1 409 Conflict +Content-Type: text/html; charset=UTF-8 +Cache-control: no-cache +Connection: close +Proxy-Connection: close + +<html><head> +<title>Avertissement I2P: conflit de clef de destination</title> +<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" > +<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" > +</head> +<body> +<div class=logo> + <a href="http://127.0.0.1:7657/index.jsp" title="Console routeur I2P"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="Console routeur I2P" border="0"></a><hr> + <a href="http://127.0.0.1:7657/config.jsp">Configuration</a> <a href="http://127.0.0.1:7657/help.jsp">Aide</a> <a href="http://127.0.0.1:7657/susidns/">Carnet d'adresses</a> +</div> +<div class=warning id=warning> +<h3>Avertissement: conflit de clef de destination</h3> +Le lien d'adresse que vous avez suivi indique une clef de destination différente de celle de votre carnet d'adresses. +Quelqu'un est peut-être en train d'usurper un autre site eep, ou des gens ont donné le même nom à des sites eep différents. +<p> +Vous pouvez résoudre le conflit en décidant à quelle clé accorder votre confiance, +et soit écarter le lien d'adresse, supprimer l'entrée de votre carnet d'adresses, ou renommer un des deux. +<p> diff --git a/installer/resources/proxy/auth-header_fr.ht b/installer/resources/proxy/auth-header_fr.ht new file mode 100644 index 0000000000000000000000000000000000000000..cace47865e6ff44197922632489b337838f9708a --- /dev/null +++ b/installer/resources/proxy/auth-header_fr.ht @@ -0,0 +1,23 @@ +HTTP/1.1 407 Proxy Authorization Required +Content-Type: text/html; charset=UTF-8 +Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.5 +Proxy-Authenticate: Basic realm="I2P HTTP Proxy" +Cache-control: no-cache +Connection: close +Proxy-Connection: close + +<html><head> +<title>Autorisation Proxy requise</title> +<!-- we cannot have links to CSS or images here, but we could put in some simple inline style --> +</head> +<body> +<div class=warning id=warning> +<h3>Autorisation I2P HTTP Proxy requise</h3> +Ce mandataire est configuré pour demander un nom d'utilisateur et un mot de passe pour les accès. +Merci d'entrer votre identifiant / mot de passe, ou vérifier la +<a href="http://127.0.0.1:7657/advancedconfig.jsp">configuration</a> de votre routeur, +ou du +<a href="http://127.0.0.1:7657/i2ptunnel/index.jsp">I2PTunnel</a>. +Pour désactiver le contrôle d'accès, supprimez la configuration +<code>i2ptunnel.proxy.auth=basic</code>, puis redémarrez le tunnel proxy HTTP. +</div> diff --git a/installer/resources/proxy/denied-header_ar.ht b/installer/resources/proxy/denied-header_ar.ht new file mode 100644 index 0000000000000000000000000000000000000000..9e9d83a83d541af1b8acd1c9b13c77151417cbab --- /dev/null +++ b/installer/resources/proxy/denied-header_ar.ht @@ -0,0 +1,20 @@ +HTTP/1.1 403 Request Denied +Content-Type: text/html; charset=UTF-8 +Cache-control: no-cache +Connection: close +Proxy-Connection: close + +<html lang="ar" dir="rtl"><head> +<title>تØذير: لم ÙŠØدد بروكسي خارجي</title> +<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" > +<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" > +</head> +<body> +<div class=logo> + <a href="http://127.0.0.1:7657/index.jsp" title="Router Console"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="I2P Router Console" border="0"></a><hr> + <a href="http://127.0.0.1:7657/config.jsp">اعدادات</a> <a href="http://127.0.0.1:7657/help.jsp">مساعدة</a> <a href="http://127.0.0.1:7657/susidns/">دÙتر العناوين</a> +</div> +<div class=warning id=warning> +<h3>تØذير : رÙض طلب</h3> +Øاولت الدخول الى موقع I2P خارج الشبكة. +</div> diff --git a/installer/resources/proxy/denied-header_fr.ht b/installer/resources/proxy/denied-header_fr.ht new file mode 100644 index 0000000000000000000000000000000000000000..0f05e5a618584c19b3cf5b074882b97b301a2d8c --- /dev/null +++ b/installer/resources/proxy/denied-header_fr.ht @@ -0,0 +1,20 @@ +HTTP/1.1 403 Requête refusée +Content-Type: text/html; charset=UTF-8 +Cache-control: no-cache +Connection: close +Proxy-Connection: close + +<html><head> +<title>Avertissement I2P: Requête refusée</title> +<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" > +<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" > +</head> +<body> +<div class=logo> + <a href="http://127.0.0.1:7657/index.jsp" title="Console routeur I2P"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="Console routeur I2P" border="0"></a><hr> + <a href="http://127.0.0.1:7657/config.jsp">Configuration</a> <a href="http://127.0.0.1:7657/help.jsp">Aide</a> <a href="http://127.0.0.1:7657/susidns/index.jsp">Carnet d'adresse</a> +</div> +<div class=warning id=warning> +<h3>Avertissement I2P: Requête refusée</h3> +Vous avez tenté de vous connecter a un site ou emplacement non-I2P. +</div> diff --git a/installer/resources/proxy/dnf-header_fr.ht b/installer/resources/proxy/dnf-header_fr.ht new file mode 100644 index 0000000000000000000000000000000000000000..e0dea27996fa2b8f78aafc596e7605c55eb084fc --- /dev/null +++ b/installer/resources/proxy/dnf-header_fr.ht @@ -0,0 +1,23 @@ +HTTP/1.1 504 Gateway Timeout +Content-Type: text/html; charset=UTF-8 +Cache-control: no-cache +Connection: close +Proxy-Connection: close + +<html><head> +<title>Avertissement I2P: site eep non joignable</title> +<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" > +<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" > +</head> +<body> +<div class=logo> + <a href="http://127.0.0.1:7657/index.jsp" title="Console routeur I2P"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="Console routeur I2P" border="0"></a><hr> + <a href="http://127.0.0.1:7657/config.jsp">Configuration</a> <a href="http://127.0.0.1:7657/help.jsp">Aide</a> <a href="http://127.0.0.1:7657/susidns/index.jsp">Carnet d'adresse</a> +</div> +<div class=warning id=warning> +<h3>Avertissement I2P: site eep non joignable</h3> +Le site eep n'a pas pu être atteint. Il est hors service, +le réseau est surchargé, ou votre routeur n'est pas bien intégré aux pairs. +Vous pouvez +<a href="javascript: window.location.reload()">réessayer</a>. +<hr><b>Destination injoignable:</b><BR><BR> diff --git a/installer/resources/proxy/dnfb-header_ar.ht b/installer/resources/proxy/dnfb-header_ar.ht new file mode 100644 index 0000000000000000000000000000000000000000..1ceb0d1025115e57b25ed4ab48a889ea1b046c38 --- /dev/null +++ b/installer/resources/proxy/dnfb-header_ar.ht @@ -0,0 +1,26 @@ +HTTP/1.1 400 Destination Not Found +Content-Type: text/html; charset=UTF-8 +Cache-control: no-cache +Connection: close +Proxy-Connection: close + +<html lang="ar" dir="rtl"><head> +<title> +تØذير: عنوان eepsite خاطئ +</title> +<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" > +<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" > +</head> +<body> +<div class=logo> + <a href="http://127.0.0.1:7657/index.jsp" title="Router Console"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="I2P Router Console" border="0"></a><hr> + <a href="http://127.0.0.1:7657/config.jsp">اعدادات</a> <a href="http://127.0.0.1:7657/help.jsp">مساعدة</a> <a href="http://127.0.0.1:7657/susidns/">دÙتر العناوين</a> +</div> +<div class=warning id=warning> +<h3> +تØذير: عنوان eepsite خاطئ +</h3> +عنوان الموقع eepsite خاطئ، أو ربما قمت بلصق عنوان غير موجود، أو الموقع متوقÙ. يمكنك + +<a href="javascript: window.location.reload()">اعادة المØاولة</a>. +<hr><b>لم يتم الوصول الى هذا العنوان:</b><BR><BR> diff --git a/installer/resources/proxy/dnfb-header_fr.ht b/installer/resources/proxy/dnfb-header_fr.ht new file mode 100644 index 0000000000000000000000000000000000000000..c7ed858f459fd9f526b9725745519db3cf75d038 --- /dev/null +++ b/installer/resources/proxy/dnfb-header_fr.ht @@ -0,0 +1,23 @@ +HTTP/1.1 400 Destination non trouvée +Content-Type: text/html; charset=UTF-8 +Cache-control: no-cache +Connection: close +Proxy-Connection: close + +<html><head> +<title>Avertissement I2P: destination eep site incorrecte</title> +<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" > +<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" > +</head> +<body> +<div class=logo> + <a href="http://127.0.0.1:7657/index.jsp" title="Console routeur I2P"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="Console routeur I2P" border="0"></a><hr> + <a href="http://127.0.0.1:7657/config.jsp">Configuration</a> <a href="http://127.0.0.1:7657/help.jsp">Aide</a> <a href="http://127.0.0.1:7657/susidns/index.jsp">Carnet d'adresse</a> +</div> +<div class=warning id=warning> +<h3>Avertissement I2P: destination eep site incorrecte</h3> +La destination du site eep indiquée est incorrecte, ou injoignable. +Vous avez peut-être collé une chaîne BASE64 incorrecte le lien que vous suivez est incorrect. +L'hôte I2P est peut-être aussi hors-servicehost. +Vous pouvez <a href="javascript: window.location.reload()">réessayer</a>. +<hr><b>Destination non trouvée:</b><BR><BR> diff --git a/installer/resources/proxy/dnfh-header_fr.ht b/installer/resources/proxy/dnfh-header_fr.ht new file mode 100644 index 0000000000000000000000000000000000000000..157173973fbe1c7050e2fa502b5a02afe171598d --- /dev/null +++ b/installer/resources/proxy/dnfh-header_fr.ht @@ -0,0 +1,27 @@ +HTTP/1.1 404 Domaine non trouvé +Content-Type: text/html; charset=UTF-8 +Cache-control: no-cache +Connection: close +Proxy-Connection: close + +<html><head> +<title>Avertissement I2P: site eep inconnu</title> +<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" > +<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" > +</head> +<body> +<div class=logo> + <a href="http://127.0.0.1:7657/index.jsp" title="Console routeur I2P"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="Console routeur I2P" border="0"></a><hr> + <a href="http://127.0.0.1:7657/config.jsp">Configuration</a> <a href="http://127.0.0.1:7657/help.jsp">Aide</a> <a href="http://127.0.0.1:7657/susidns/index.jsp">Carnet d'adresse</a> +</div> +<div class=warning id=warning> +<h3>Avertissement I2P: site eep non trouvé dans le carnet d'adresses</h3> +Le site eep n'était pas dans le carnet d'adresses de votre routeur. +Vérifiez le lien ou trouvez l'adresse BASE64. +Si vous avez l'adresse BASE64, reportez-la dans votre fichier userhosts.txt en passant par +<a href="http://127.0.0.1:7657/susidns/addressbook.jsp?book=master">SusiDNS</a>, +utilisez un lien d'adresse BASE64, ou un service de saut (jump) en lien ci-dessous.<br><br> +Si vous voyez cette page souvent: lisez la <a href="http://www.i2p2.i2p/faq_fr.html#subscriptions">faq</a> pour obtenir +de l'aide sur <a href="http://127.0.0.1:7657/susidns/config.jsp">l'ajout de quelques souscrptions</a> à votre carnet +d'adresses.<hr> +<b>Destination introuvable:</b><BR><BR> diff --git a/installer/resources/proxy/dnfp-header_ar.ht b/installer/resources/proxy/dnfp-header_ar.ht new file mode 100644 index 0000000000000000000000000000000000000000..b194b1266e003e1b6d89e65a7a6d7a66b7cf9ecd --- /dev/null +++ b/installer/resources/proxy/dnfp-header_ar.ht @@ -0,0 +1,28 @@ +HTTP/1.1 504 Gateway Timeout +Content-Type: text/html; charset=UTF-8 +Cache-control: no-cache +Connection: close +Proxy-Connection: close + +<html lang="ar" dir="rtl"><head> +<title>تØذير: لابوجد بروكسي خارجي</title> +<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" > +<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" > +</head> +<body> +<div class=logo> + <a href="http://127.0.0.1:7657/index.jsp" title="Router Console"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="I2P Router Console" border="0"></a><hr> + <a href="http://127.0.0.1:7657/config.jsp">اعدادات</a> <a href="http://127.0.0.1:7657/help.jsp">مساعدة</a> <a href="http://127.0.0.1:7657/susidns/">دÙتر العناوين</a> +</div> +<div class=warning id=warning> +<h3>تØذير: لابوجد بروكسي خارجي</h3> +لم يتم ايجاد بروكسي خارجي www +خارج الشبكة أو غير متصل جيدا بباقي المستخدمين. +يمكنك +<a href="javascript: parent.window.location.reload()">اعادة المØاولة</a> +لإختيار بروكسي خارجي جديد +<a href="http://127.0.0.1:7657/i2ptunnel/index.jsp">هنا</a> +(اذا كان لديك اكثر من واØد). +اذا استمر المشكل قم بتØرير قائمة البروكسي الخارجية +<a href="http://127.0.0.1:7657/i2ptunnel/edit.jsp?tunnel=0">هنا</a>. +<hr><b>لم يستطع الوصول الى هذا العنوان</b><BR><BR> diff --git a/installer/resources/proxy/dnfp-header_fr.ht b/installer/resources/proxy/dnfp-header_fr.ht new file mode 100644 index 0000000000000000000000000000000000000000..40e9ad82f06a1800f332407584905f8a29df985b --- /dev/null +++ b/installer/resources/proxy/dnfp-header_fr.ht @@ -0,0 +1,29 @@ +HTTP/1.1 504 Délai d'attente de passerelle dépassé +Content-Type: text/html; charset=UTF-8 +Cache-control: no-cache +Connection: close +Proxy-Connection: close + +<html><head> +<title>Avertissement I2P: Proxy sortant non trouvé</title> +<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" > +<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" > +</head> +<body> +<div class=logo> + <a href="http://127.0.0.1:7657/index.jsp" title="Console routeur I2P"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="Console routeur I2P" border="0"></a><hr> + <a href="http://127.0.0.1:7657/config.jsp">Configuration</a> <a href="http://127.0.0.1:7657/help.jsp">Aide</a> <a href="http://127.0.0.1:7657/susidns/">Carnet d'adresses</a> +</div> +<div class=warning id=warning> +<h3>Avertissement I2P: Proxy sortant non trouvé</h3> +Le serveur mandataire sortant est introuvable. +Il est hors service, le réseau est surchargé, +ou votre routeur n'est pas encore bien intégré avec des pairs. +Vous pouvez essayer de +<a href="javascript: parent.window.location.reload()">retenter</a> +car il se produira une sélection aléatoire de mandataire dans le groupe que vous avez défini +<a href="http://127.0.0.1:7657/i2ptunnel/index.jsp">ici</a> +(si vous en avez plus d'un de défini). +Si vous avez toujours des problèmes vous pouvez modifier votre liste de +mandataires <a href="http://127.0.0.1:7657/i2ptunnel/edit.jsp?tunnel=0">ici</a>. +<hr><b>Destination suivante introuvable:</b><BR><BR> diff --git a/installer/resources/proxy/localhost-header_ar.ht b/installer/resources/proxy/localhost-header_ar.ht new file mode 100644 index 0000000000000000000000000000000000000000..dc6b0304e833ea5b0d0412bca5272b499235c994 --- /dev/null +++ b/installer/resources/proxy/localhost-header_ar.ht @@ -0,0 +1,24 @@ +HTTP/1.1 403 Access Denied +Content-Type: text/html; charset=UTF-8 +Cache-control: no-cache +Connection: close +Proxy-Connection: close + +<html lang="ar" dir="rtl"><head> +<title>خطأ: تم رÙض الطلب</title> +<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" > +<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" > +</head> +<body> +<!----------------------------- + Let's not infinite loop here.... +<div class=logo> + <a href="http://127.0.0.1:7657/index.jsp" title="Router Console"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="I2P Router Console" border="0"></a><hr> + <a href="http://127.0.0.1:7657/config.jsp">Configuration</a> <a href="http://127.0.0.1:7657/help.jsp">Help</a> <a href="http://127.0.0.1:7657/susidns/">Addressbook</a> +</div> +------------------------------> +<div class=warning id=warning> +<h3>خطـأ: عنوان Ù…Øلي</h3> +خطأ ÙÙŠ اعدادات المتصÙØ. لا تستعمل بروكسي للوصول الى شاشة التØكم، localhost او الشبكة المØلية LAN. + +</div> diff --git a/installer/resources/proxy/localhost-header_fr.ht b/installer/resources/proxy/localhost-header_fr.ht new file mode 100644 index 0000000000000000000000000000000000000000..c38f220b8ac20ef5eebf0a54bd199eebc7febb4e --- /dev/null +++ b/installer/resources/proxy/localhost-header_fr.ht @@ -0,0 +1,24 @@ +HTTP/1.1 403 Accès refusé +Content-Type: text/html; charset=UTF-8 +Cache-control: no-cache +Connection: close +Proxy-Connection: close + +<html><head> +<title>Erreur I2P: Requête refusée</title> +<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" > +<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" > +</head> +<body> +<!----------------------------- + Let's not infinite loop here.... +<div class=logo> + <a href="http://127.0.0.1:7657/index.jsp" title="Router Console"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="I2P Router Console" border="0"></a><hr> + <a href="http://127.0.0.1:7657/config.jsp">Configuration</a> <a href="http://127.0.0.1:7657/help.jsp">Help</a> <a href="http://127.0.0.1:7657/susidns/">Addressbook</a> +</div> +------------------------------> +<div class=warning id=warning> +<h3>Erreur: Accès local</h3> +Votre navigateur est mal configuré. N'utilisez pas de mandataire pour accéder à la console du routeur I2P, +à l'hôte local (localhost), ou des destinations LAN: définissez une exception. +</div> diff --git a/installer/resources/proxy/noproxy-header_ar.ht b/installer/resources/proxy/noproxy-header_ar.ht new file mode 100644 index 0000000000000000000000000000000000000000..0f6f1ba643f9a1b8858a14a02138441e10e3efa6 --- /dev/null +++ b/installer/resources/proxy/noproxy-header_ar.ht @@ -0,0 +1,20 @@ +HTTP/1.1 503 Service Unavailable +Content-Type: text/html; charset=UTF-8 +Cache-control: no-cache +Connection: close +Proxy-Connection: close + +<html lang="ar" dir="rtl"><head> +<title>تØذير: لم ÙŠØدد بروكسي خارجي</title> +<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" > +<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" > +</head> +<body> +<div class=logo> + <a href="http://127.0.0.1:7657/index.jsp" title="Router Console"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="I2P Router Console" border="0"></a><hr> + <a href="http://127.0.0.1:7657/config.jsp">اعدادات</a> <a href="http://127.0.0.1:7657/help.jsp">مساعدة</a> <a href="http://127.0.0.1:7657/susidns/">دÙتر العناوين</a> +</div> +<div class=warning id=warning> +<h3>تØذير: لم ÙŠØدد بروكسي خارجي</h3> +قمت بطلب موقع خارج عن شبكة I2PØŒ لكن لم تقم بتØديد بروكسي خارجي. قم يتØديد بروكسي خارجي ÙÙŠ اعدادات I2PTunnel. +</div> diff --git a/installer/resources/proxy/noproxy-header_fr.ht b/installer/resources/proxy/noproxy-header_fr.ht new file mode 100644 index 0000000000000000000000000000000000000000..96e9f3e78261ec00f0290d639c7ffa28a59d8a73 --- /dev/null +++ b/installer/resources/proxy/noproxy-header_fr.ht @@ -0,0 +1,21 @@ +HTTP/1.1 503 Service indisponible +Content-Type: text/html; charset=UTF-8 +Cache-control: no-cache +Connection: close +Proxy-Connection: close + +<html><head> +<title>Avertissement I2P: Mandataire non configuré</title> +<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" > +<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" > +</head> +<body> +<div class=logo> + <a href="http://127.0.0.1:7657/index.jsp" title="Console Routeur I2P"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="Console Routeur I2P" border="0"></a><hr> + <a href="http://127.0.0.1:7657/config.jsp">Configuration</a> <a href="http://127.0.0.1:7657/help.jsp">Aide</a> <a href="http://127.0.0.1:7657/susidns/">Carnet d'adresses</a> +</div> +<div class=warning id=warning> +<h3>Avertissement I2P: Mandataire non configuré</h3> +Votre requête était pour un site hors du réseau I2P, mais vous n'avez pas de mandataire +configuré. Merci de configurer un mandataire dans I2PTunnel. +</div> diff --git a/installer/resources/proxy/protocol-header_ar.ht b/installer/resources/proxy/protocol-header_ar.ht new file mode 100644 index 0000000000000000000000000000000000000000..d31c7579102fa532c4ee3a9324606b994be5828a --- /dev/null +++ b/installer/resources/proxy/protocol-header_ar.ht @@ -0,0 +1,21 @@ +HTTP/1.1 403 Bad Protocol +Content-Type: text/html; charset=UTF-8 +Cache-control: no-cache +Connection: close +Proxy-Connection: close + +<html lang="ar" dir="rtl"><head> +<title>HTTP تØذير: استعمال بروتوكول غير متواÙÙ‚ مع </title> +<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" > +<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" > +</head> +<body> +<div class=logo> + <a href="http://127.0.0.1:7657/index.jsp" title="Router Console"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="I2P Router Console" border="0"></a><hr> + <a href="http://127.0.0.1:7657/config.jsp">اعدادات</a> <a href="http://127.0.0.1:7657/help.jsp">مساعدة</a> <a href="http://127.0.0.1:7657/susidns/">دÙتر العناوين</a> +</div> +<div class=warning id=warning> +<h3>HTTP تØذير: استعمال بروتوكول غير متواÙÙ‚ مع </h3> +تم استعمال بروتوكول غير متواÙÙ‚. +بروكسي I2P يدعم طلبات http:// Ùقط. باقي البروتوكولات مثل https:// Ùˆ ftp:// غير مدعومة. +</div> diff --git a/installer/resources/proxy/protocol-header_fr.ht b/installer/resources/proxy/protocol-header_fr.ht new file mode 100644 index 0000000000000000000000000000000000000000..47fdc9fa9f2adc4672e2c5dd26edd0b75266e7fd --- /dev/null +++ b/installer/resources/proxy/protocol-header_fr.ht @@ -0,0 +1,21 @@ +HTTP/1.1 403 Protocole incorrect +Content-Type: text/html; charset=UTF-8 +Cache-control: no-cache +Connection: close +Proxy-Connection: close + +<html><head> +<title>Avertissement I2P: Protocole Non-HTTP</title> +<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico" > +<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css" > +</head> +<body> +<div class=logo> + <a href="http://127.0.0.1:7657/index.jsp" title="Console Routeur I2P"><img src="http://proxy.i2p/themes/console/images/i2plogo.png" alt="Console Routeur I2P" border="0"></a><hr> + <a href="http://127.0.0.1:7657/config.jsp">Configuration</a> <a href="http://127.0.0.1:7657/help.jsp">Aide</a> <a href="http://127.0.0.1:7657/susidns/">Carnet d'adresses</a> +</div> +<div class=warning id=warning> +<h3>Avertissement I2P: Protocole Non-HTTP</h3> +La requête a utilisé un protocole inadpté. +Le mandataire HTTP I2P prend en charge les requêtes http:// seulement. Les autre protocoles tels que https:// and ftp:// ne sont pas permis. +</div> diff --git a/installer/resources/readme/readme.html b/installer/resources/readme/readme.html index 00667aea28ec3266ca178f566ecc662dea0d0245..bf0f5d6a1919a57b4ce0e4dbdb7be61e4e0cb8c3 100644 --- a/installer/resources/readme/readme.html +++ b/installer/resources/readme/readme.html @@ -1,21 +1,8 @@ <div lang="en"> -<div align="right"> - <div class="langbox" align="right"> - <a href="/?lang=en"><img src="/flags.jsp?c=us" title="English" alt="English"></a> - <a href="/?lang=zh"><img src="/flags.jsp?c=cn" title="ä¸æ–‡" alt="ä¸æ–‡"></a> - <a href="/?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a> - <a href="/?lang=fr"><img src="/flags.jsp?c=fr" title="Français" alt="Français"></a> - <a href="/?lang=es"><img src="/flags.jsp?c=es" title="Español" alt="Español"></a> - <a href="/?lang=pt"><img src="/flags.jsp?c=pt" title="Português" alt="Português"></a> - <a href="/?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a> - <a href="/?lang=ru"><img src="/flags.jsp?c=ru" title="РуÑÑкий" alt="РуÑÑкий"></a> - <a href="/?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div> - </div> -</div><a name="top"></a> -<div class="welcome"><h2>Welcome to the Invisible Internet</h2></div> + <ul class="links"><li class="tidylist"><b>Starting Up…</b><br>If you've just started I2P, the number of <i>Active Peers</i> indicated under the <i>Peers</i> section in the side panel on the left should start to grow over the next few minutes and you'll also see a <i>Local Destination</i> named <i>Shared Clients</i> listed there, and possibly other clients and servers depending on how I2P is configured (if not, see the troubleshooting section <a href="#trouble">below</a>). These <i>Local Destinations</i> provide connections on different ports (and sometimes protocols) to the I2P network, enabling your bittorrent, e-mail, web proxy and other services to function. Your <a href="/netdb">Network Database</a> indicates all known peers on the network. Additionally, you can monitor existing <a href="/peers">Peer Connections</a>, and view existing <a href="/tunnels">Tunnels</a> and their status. More information is available on the <a href="/help">help page</a>.</li> -<li class="tidylist"><b>Network integration</b><br> The first time you start I2P it may take a few minutes to bootstrap (integrate) you into the network and find additional peers to optimize your integration, so please be patient. Once green stars are indicated next to your <i>Local Destinations</i>, there is a wide variety of things you can do with I2P, and below we introduce you to some of them.</li></ul> +<li class="tidylist"><b>Network integration</b><br> The first time you start I2P it may take a few minutes to bootstrap (integrate) you into the network and find additional peers to optimize your integration, so please be patient. When I2P starts up, and during normal operation, I2P's tunnel build readiness indicator (immediately above the <i>Local Destinations</i> section in the sidepanel) may tell you that I2P is "Rejecting Tunnels"; this is normal behavior and should be of no cause for concern! Once green stars are indicated next to your <i>Local Destinations</i>, there is a wide variety of things you can do with I2P, and below we introduce you to some of them.</li></ul> <h3>Services on I2P</h3> <ul class="links"> @@ -23,17 +10,27 @@ <li class="tidylist"><b>Invisible Internet & Public Web Browsing</b><br>On I2P you can access anonymous websites (eepsites) and other services (e.g. ssh over I2P, IRC, Jabber etc.) in addition to being able to host your own services. You can also access the normal web anonymously via I2P's built-in web proxy (outproxy). <a href="http://www.i2p2.de/htproxyports.html" target="_blank">Configure your browser</a> to use the HTTP proxy at <code>127.0.0.1 port 4444</code>, then browse to an eepsite or a normal, unencrypted <code>http://</code> address. For a pre-configured browser, you may wish to try <a href="http://echelon.i2p/i2pfox/">I2PFox</a>, a custom build of Firefox security hardened and tailored especially for I2P. If you wish to disable or change outproxy access to the normal internet, remove or modify the outproxy entry for <code>false.i2p</code> under the <i>Outproxies</i> option in the <a href="/i2ptunnel/edit?tunnel=0" target="_blank">I2P HTTP Proxy Tunnel Editor</a>. In the "Sites of Interest" section <a href="#eepsites">below</a>, we list a few of the sites hosted on I2P.</li> <li class="tidylist"><b>Anonymous E-Mail</b><br>Postman's I2P-based mail system can be accessed either via <a href="/susimail/susimail">I2P's built-in mail client</a> -(susimail) or using any mail client that supports smtp and pop3. -Accounts can send and receive mail from the normal internet. For an -account, visit <a href="http://hq.postman.i2p/" target="_blank">hq.postman.i2p</a>. Additionally, <a href="http://i2pbote.i2p/" target="_blank">I2P-Bote</a> is a new serverless, end-to-end encrypted e-mail system providing a web -interface and an integrated addressbook. It is developed by HungryHobo -and can be installed as a <a href="#plugins">plugin</a>.</li> - -<li class="tidylist"><b>Anonymous File Transfer</b><br><a href="/i2psnark/" target="_blank">I2PSnark</a> is integrated into I2P, providing anonymous, encrypted <a href="https://secure.wikimedia.org/wikipedia/en/wiki/BitTorrent_%28protocol%29" target="_blank">BitTorrent</a> transfers. In addition, Sponge develops a bittorrent client called <a href="http://bob.i2p/Robert.html">Robert</a> written in Python. There is also a port of <a href="http://www.emule-project.net/" target="_blank">eMule</a> to I2P called <a href="http://echelon.i2p/imule/">iMule</a> [Needs developers!], an anonymous, secure implementation of a <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Gnutella" target="_blank">Gnutella network</a>, accessible using <a href="http://echelon.i2p/i2phex/" target="_blank">I2Phex</a> [maintained by Complication, seeking new developers!], and additional facilities including browser-based file hosting.</li> - <li class="tidylist"><b>Anonymous Chat</b><br>Start your IRC client (e.g. Chatzilla, Pidgin, XChat) - and connect to the <a href="irc://127.0.0.1:6668/i2p">server</a> at <code>127.0.0.1 port 6668</code>. You do not need to configure a proxy in your IRC client; I2P provides you with a local IRC tunnel (configured in your IRC client as an IRC server or remote host). Your local I2P IRC tunnel on <code>localhost:6668</code> will direct you to one of two IRC servers hosted on I2P by Postman and Badger, but neither you nor they know where the other is, and your mom, ISP or government is unable to intercept your conversation! Once you're there, <code>#i2p-help</code>,<code>#i2p</code>,<code>#i2p-chat</code> and <code>#i2p-dev</code> are just a few of the available channels you may wish to /join. There's also an I2P-based <a href="http://echelon.i2p/qti2pmessenger/">Instant Messenger</a> for unmonitorable and uncensorable anonymous chat, as well as alternative IRC servers, Jabber servers, website-based chat, and more. And of course you're entirely free to run your own servers over I2P in whatever flavor you choose, or if you're a developer write your own <a href="http://www.i2p2.i2p/applications.html" target="_blank">I2P applications</a> (both <a href="https://secure.wikimedia.org/wikipedia/en/wiki/User_Datagram_Protocol" target="_blanK">UDP</a> and <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Transmission_Control_Protocol" target="_blank">TCP</a> protocols are <a href="http://www.i2p2.i2p/techintro.html#op.transport" target="_blank">provisioned</a>), and <a href="http://www.i2p2.i2p/streaming.html" target="_blank">realtime streaming</a> is also possible. We also provide full access to the <a href="http://docs.i2p2.de/javadoc/" target="_blank"> java-based api</a>.</li> - <li class="tidylist"><b>Forums & Blogging</b><br>If you're looking to run your own blog or forum, you might be interested in <a href="http://syndie.i2p2.de/" target="_blank">Syndie</a>, a distributed forum and blogging platform for I2P [Needs developers!]. There's also an I2P plugin port of the Java-based <a href="http://pebble.sourceforge.net/" target="_blank">pebble</a> blogging platform ported to I2P by zzz, available on <a href="http://i2plugins.i2p/" target="_blank">i2plugins.i2p</a>. And, of course, all normal blogging, forum and cms software will run over I2P, though you're advised to take extra precautions with security when setting up and to keep all associated software (e.g. Php, MySql, Python, Apache) up to date and locked-down! Also, there are quite a few community run forums on I2P in various languages; see <a href="#eepsites">below</a> for some suggestions.</li> - <a name="plugins"></a><li class="tidylist"><b>Plugins for I2P</b><br>Extend the usefulness of I2P by installing plugins… blogging, chatting, file sharing and other plugins have already been written or ported and await your <a href="http://i2plugins.i2p/plugins/" target="_blank">installation</a>! Browse the plugins and related info at <a href="http://i2plugins.i2p/" target="_blank">i2plugins.i2p</a>. If you're a <a href="http://i2plugins.i2p/developers/" target="_blank">developer</a>, a complete language-agnostic framework for writing your own plugins is provided with <a href="http://www.i2p2.i2p/plugins.html" target="_blank">documentation</a>; I2P plugins can be coded in any language.</li> + (susimail) or using any mail client that supports smtp and pop3. + Accounts can send and receive mail from the normal internet. For an + account, visit <a href="http://hq.postman.i2p/" target="_blank">hq.postman.i2p</a>. Additionally, <a href="http://i2pbote.i2p/" target="_blank">I2P-Bote</a> is a new I2P-internal serverless, secure (end-to-end encrypted) e-mail system with an integrated anonymous/pseudonymous remailer, providing a web interface and a built-in addressbook. It is developed by HungryHobo, and can be installed as a <a href="#plugins">plugin</a>.</li> + +<li class="tidylist"><b>Anonymous File Transfer</b><br><a href="/i2psnark/" target="_blank">I2PSnark</a> is integrated into I2P, providing anonymous, encrypted <a href="https://secure.wikimedia.org/wikipedia/en/wiki/BitTorrent_%28protocol%29" target="_blank">BitTorrent</a> transfers. + In addition, Sponge develops a bittorrent client called <a href="http://bob.i2p/Robert.html">Robert</a> written in Python. + There is also a port of <a href="http://www.emule-project.net/" target="_blank">eMule</a> to I2P called <a href="http://echelon.i2p/imule/">iMule</a> [Needs developers!], an anonymous, secure implementation of a <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Gnutella" target="_blank">Gnutella network</a>, accessible using <a href="http://echelon.i2p/i2phex/" target="_blank">I2Phex</a> [maintained by Complication, seeking new developers!], and additional facilities including browser-based file hosting.</li> +<li class="tidylist"><b>Anonymous Chat</b><br>Start your IRC client (e.g. Chatzilla, Pidgin, XChat) + and connect to the <a href="irc://127.0.0.1:6668/i2p-help">server</a> at <code>127.0.0.1 port 6668</code>. You do not need to configure a proxy in your IRC client; I2P provides you with a local IRC tunnel (configured in your IRC client as an IRC server or remote host). + Your local I2P IRC tunnel on <code>localhost:6668</code> will direct you to one of two IRC servers hosted on I2P by Postman and Badger, but neither you nor they know where the other is, and your mom, ISP or government is unable to intercept your conversation! + Once you're there, <code>#i2p-help</code>,<code>#i2p</code>,<code>#i2p-chat</code> and <code>#i2p-dev</code> are just a few of the available channels you may wish to /join. + There's also an I2P-based <a href="http://echelon.i2p/qti2pmessenger/">Instant Messenger</a> for unmonitorable and uncensorable anonymous chat, as well as alternative IRC servers, Jabber servers, website-based chat, and more. + And of course you're entirely free to run your own servers over I2P in whatever flavor you choose, or if you're a developer write your own <a href="http://www.i2p2.i2p/applications.html" target="_blank">I2P applications</a> (both <a href="https://secure.wikimedia.org/wikipedia/en/wiki/User_Datagram_Protocol" target="_blank">UDP</a> and <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Transmission_Control_Protocol" target="_blank">TCP</a> protocols are <a href="http://www.i2p2.i2p/techintro.html#op.transport" target="_blank">provisioned</a>), and <a href="http://www.i2p2.i2p/streaming.html" target="_blank">realtime streaming</a> is also possible. + We also provide full access to the <a href="http://docs.i2p2.de/javadoc/" target="_blank">Java API</a>.</li> +<li class="tidylist"><b>Forums & Blogging</b><br>If you're looking to run your own blog or forum, you might be interested in <a href="http://syndie.i2p2.de/" target="_blank">Syndie</a>, a distributed forum and blogging platform for I2P [Needs developers!]. + There's also an I2P plugin port of the Java-based <a href="http://pebble.sourceforge.net/" target="_blank">pebble</a> blogging platform ported to I2P by zzz, available on <a href="http://i2plugins.i2p/" target="_blank">i2plugins.i2p</a>. + And, of course, all normal blogging, forum and cms software will run over I2P, though you're advised to take extra precautions with security when setting up and to keep all associated software (e.g. Php, MySql, Python, Apache) up to date and locked-down! + Also, there are quite a few community run forums on I2P in various languages; see <a href="#eepsites">below</a> for some suggestions.</li> + <li class="tidylist"><a name="plugins"></a><b>Plugins for I2P</b><br>Extend the usefulness of I2P by installing plugins… blogging, chatting, file sharing and other plugins have already been written or ported and await your <a href="http://i2plugins.i2p/plugins/" target="_blank">installation</a>! + Browse the plugins and related info at <a href="http://i2plugins.i2p/" target="_blank">i2plugins.i2p</a>. + If you're a <a href="http://i2plugins.i2p/developers/" target="_blank">developer</a>, a complete language-agnostic framework for writing your own plugins is provided with <a href="http://www.i2p2.i2p/plugins.html" target="_blank">documentation</a>; I2P plugins can be coded in any language.</li> </ul> <h3>Anonymous Encrypted Web Hosting on I2P</h3> @@ -44,9 +41,9 @@ and can be installed as a <a href="#plugins">plugin</a>.</li> any standard JSP/Servlet .war files under <code>eepsite/webapps</code>, or standard CGI scripts under <code>eepsite/cgi-bin</code>) and they'll show up. You can also run any alternative web server platform over I2P and replace the built-in server, or run it on another tunnel.</li> - <li class="tidylist"><b>Start Your Tunnel</b><br> +<li class="tidylist"><b>Start Your Tunnel</b><br> After starting up, your pre-configured <a href="/i2ptunnel/" target="_blank">I2P Webserver Tunnel</a>, -your eepsite will be visible (but not discoverable) to others. Detailed instructions for starting + your eepsite will be visible (but not discoverable) to others. Detailed instructions for starting your eepsite, registering an .i2p domain and promoting your site to others are accessible via your own I2P webserver on <a href="http://127.0.0.1:7658/help/" target="_blank">http://127.0.0.1:7658/help/</a>.</li></ul> <a name="eepsites"></a> @@ -74,38 +71,56 @@ your eepsite will be visible (but not discoverable) to others. Detailed instruct <h2>Troubleshooting & Further Assistance</h2><a name="trouble"></a> - <ul class="links"> - <li class="tidylist"><b>Be Patient!</b><br>I2P may be slow to integrate into network the first time you run it as it bootstraps into the network and learns of additional peers. The longer your I2P router is running, the better it will perform, so try and keep your router on as long as you can, 24/7 if possible! If, after 30 minutes, your <i>Active: [connected/recent]</i> count still has less than 10 peers, or your total number of <i>Integrated</i> peers is less than 5, there are several things you can do to check for problems: + +<ul class="links"> + +<li class="tidylist"><b>Be Patient!</b><br>I2P may be slow to integrate into network the first time you run it as it bootstraps into the network and learns of additional peers. The longer your I2P router is running, the better it will perform, so try and keep your router on as long as you can, 24/7 if possible! If, after 30 minutes, your <i>Active: [connected/recent]</i> count still has less than 10 peers, or your total number of <i>Integrated</i> peers is less than 5, there are several things you can do to check for problems: </li> - <li class="tidylist"><b>Check your Configuration & Bandwidth Allocation</b><br>I2P functions best when you can accurately reflect the speed of your network connection in the <a href="/config">bandwidth configuration section</a>. By default I2P is configured with some fairly conservative values that will not suit many use cases, so please take time to review these settings and correct where necessary. The more bandwidth you allocate, <i>specifically</i> upstream bandwidth, the more you will benefit from the network. +<li class="tidylist"><b>Check your Configuration & Bandwidth Allocation</b><br>I2P functions best when you can accurately reflect the speed of your network connection in the <a href="/config">bandwidth configuration section</a>. By default I2P is configured with some fairly conservative values that will not suit many use cases, so please take time to review these settings and correct where necessary. The more bandwidth you allocate, <i>specifically</i> upstream bandwidth, the more you will benefit from the network. </li> - <li class="tidylist"><b>Firewalls, Modems & Routers</b><br>Where possible, please ensure I2P/Java is allowed bi-directional port access from the internet by configuring your modem/router/pc firewall accordingly. -If you're behind a prohibitive firewall but have unrestricted outbound access, I2P can still function; you can turn off inbound access and rely on <a href="http://www.i2p2.i2p/udp.html" target="_blank">SSU IP Address Detection</a> (<a href="https://secure.wikimedia.org/wikipedia/en/wiki/Hole_punching" target="_blank">firewall hole punching</a>) to connect you to the network, and your network status in the side panel will indicate "Network: Firewalled". For optimal performance, where possible please ensure I2P's <a href="/config">external port</a> is visible from the internet (see below for more information).</li> +<li class="tidylist"><b>Firewalls, Modems & Routers</b><br>Where possible, please ensure I2P/Java is allowed bi-directional port access from the internet by configuring your modem/router/pc firewall accordingly. + If you're behind a prohibitive firewall but have unrestricted outbound access, I2P can still function; you can turn off inbound access and rely on <a href="http://www.i2p2.i2p/udp.html" target="_blank">SSU IP Address Detection</a> (<a href="https://secure.wikimedia.org/wikipedia/en/wiki/Hole_punching" target="_blank">firewall hole punching</a>) to connect you to the network, and your network status in the side panel will indicate "Network: Firewalled". For optimal performance, where possible please ensure I2P's <a href="/config">external port</a> is visible from the internet (see below for more information). + </li> - <li class="tidylist"><b>Check Your Proxy Setttings</b><br>If +<li class="tidylist"><b>Check Your Proxy Setttings</b><br>If you cannot see any eepsites at all (not even <a href="http://www.i2p2.i2p/" target="_blank">www.i2p2.i2p</a>), - make sure your browser's proxy is set to access http traffic (<i>not</i> https, <i>not</i> socks) via <code>127.0.0.1 port 4444</code>. If you need some help, there's <a href="http://www.i2p2.i2p/htproxyports.html" target="_blank">a guide</a> to configuring your browser for I2P use, also <a href="http://www.i2p2.de/htproxyports.html" target="_blank">available</a> on the normal web. </li> + make sure your browser's proxy is set to access http traffic (<i>not</i> https, <i>not</i> socks) via <code>127.0.0.1 port 4444</code>. If you need some help, there's <a href="http://www.i2p2.i2p/htproxyports.html" target="_blank">a guide</a> to configuring your browser for I2P use, also <a href="http://www.i2p2.de/htproxyports.html" target="_blank">available</a> on the normal web. + </li> + +<li class="tidylist"><b>Check Your Logs</b><br><a href="/logs">Logs</a> may help resolve a problem. You may wish to paste excerpts in a <a href="http://forum.i2p/viewforum.php?f=10" target="_blank">forum</a> for help, or perhaps <a href="http://paste.i2p2.i2p/" target="_blank">paste</a> it instead and reference the link on IRC for help. + </li> + +<li class="tidylist"><b>Verify Java is Up to Date</b><br>Ensure your Java is up to date [version 1.6 recommended and required for some features]. Check the version of your JRE (<a href="https://secure.wikimedia.org/wikipedia/en/wiki/JRE" target="_blank">Java Runtime Environment</a>) + at the top of <a href="/logs">the logs page</a>. + If you're a developer, a <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Java_SDK" target="_blank">Java SDK</a> and <a href="http://ant.apache.org/" target="_blank">Apache Ant</a> are required to build from source. + </li> + +<li class="tidylist"><b>Problems running on Legacy Hardware</b><br>[Linux/Unix/Solaris] If you can't start the router with <code>i2p/i2prouter start</code> try the <code>runplain.sh</code> script in the same directory. Root privileges are usually not required to run I2P. If you need to compile the <a href="http://www.i2p2.i2p/jbigi.html" target="_blank">jBigi library</a> (which is necessary in rare cases), consult appropriate documentation, visit the forums, or come pay a visit to our <a href="irc://127.0.0.1:6668/i2p-dev">IRC developer channel</a>. + </li> - <li class="tidylist"><b>Check Your Logs</b><br><a href="/logs">Logs</a> may help resolve a problem. You may wish to paste excerpts in a <a href="http://forum.i2p/viewforum.php?f=10" target="_blank">forum</a> for help, or perhaps <a href="http://paste.i2p2.i2p/" target="_blank">paste</a> it instead and reference the link on IRC for help.</li> - <li class="tidylist"><b>Verify Java is Up to Date</b><br>Ensure your Java is up to date [version 1.6 recommended and required for some features]. If you don't have Java installed, you probably want some implementation of the JRE (<a href="https://secure.wikimedia.org/wikipedia/en/wiki/JRE" target="_blank">Java Runtime Engine</a>); if you're a developer, the <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Java_SDK" target="_blank">SDK</a> may also be of interest, and possibly <a href="http://ant.apache.org/" target="_blank">Apache Ant</a> which we use to build the I2P Java binaries. +<li class="tidylist"><b>Enable Universal Plug and Play (UPnP)</b><br>Your modem or router may support <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Universal_Plug_and_Play" target="_blank">Universal Plug & Play</a> (UPnP), which permits automatic port forwarding. Ensure UPnP support for I2P is enabled on the <a href="/config">config page</a>, then try to activate UPnP on your modem/router and possibly your computer also. Now try restarting the <a href="/">I2P router</a>. If successful, I2P should report "Network: OK" in the side panel once the I2P router completes initial connectivity tests. </li> - <li class="tidylist"><b>Problems running on Legacy Hardware</b><br>[Linux/Unix/Solaris] If you can't start the router with <code>i2p/i2prouter start</code> try the <code>runplain.sh</code> script in the same directory. Root privileges are usually not required to run I2P. If you need to compile the <a href="http://www.i2p2.i2p/jbigi.html" target="_blank">jBigi library</a> (which is necessary in rare cases), consult appropriate documentation, visit the forums, or come pay a visit to our <a href="irc://127.0.0.1:6668/i2p-dev">IRC developer channel</a>. +<li class="tidylist"><b>Port Forwarding</b><br>Open <a href="/config">I2P's port</a> on your modem, router and/or firewall(s) for better connectivity (ideally both UDP and TCP). More information on how to go about port forwarding can be found at <a href="http://portforward.com/" target="_blank">portforward.com</a>, in addition to our forums and IRC channels listed below. Note that I2P does not support connecting to the internet via an http or socks proxy [patches welcome!], though you can connect to proxies via I2P itself once connected to the network. + </li> - <li class="tidylist"><b>Enable Universal Plug and Play (UPnP)</b><br>Your modem or router may support <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Universal_Plug_and_Play" target="_blank">Universal Plug & Play</a> (UPnP), which permits automatic port forwarding. Ensure UPnP support for I2P is enabled on the <a href="/config">config page</a>, then try to activate UPnP on your modem/router and possibly your computer also. Now try restarting the <a href="/">I2P router</a>. If successful, I2P should report "Network: OK" in the side panel once the I2P router completes initial connectivity tests. - </li> - <li class="tidylist"><b>Port Forwarding</b><br>Open <a href="/config">I2P's port</a> on your modem, router and/or firewall(s) for better connectivity (ideally both UDP and TCP). More information on how to go about port forwarding can be found at <a href="http://portforward.com/" target="_blank">portforward.com</a>, in addition to our forums and IRC channels listed below. Note that I2P does not support connecting to the internet via an http or socks proxy [patches welcome!], though you can connect to proxies via I2P itself once connected to the network. - </li> - <li class="tidylist"><b>Getting Support Online</b><br>You may also want +<li class="tidylist"><b>Getting Support Online</b><br>You may also want to review the information on the <a href="http://www.i2p2.i2p/" target="_blank">I2P website</a>, - post messages to the <a href="http://forum.i2p2.i2p/" target="_blank">I2P discussion forum</a>, + post messages to the <a href="http://forum.i2p/" target="_blank">I2P discussion forum</a> (also reachable <a href="http://forum.i2p2.de/" target="_blank">on the internet</a>), or swing by - <a href="irc://127.0.0.1:6668/i2p-help">#i2p-help</a>, <a href="irc://127.0.0.1:6668/i2p">#i2p</a> or <a href="irc://127.0.0.1:6668/i2p-chat">#i2p-chat</a> on I2P's internal IRC network (<code>irc.postman.i2p</code> or <code>irc.freshcoffee.i2p</code>). These channels are also available outside of I2P's encrypted, anonymous network via <a href="irc://irc.freenode.net/i2p">Freenode IRC</a>.</li> + <a href="irc://127.0.0.1:6668/i2p-help">#i2p-help</a>, <a href="irc://127.0.0.1:6668/i2p">#i2p</a> or <a href="irc://127.0.0.1:6668/i2p-chat">#i2p-chat</a> on I2P's internal IRC network (<code>irc.postman.i2p</code> or <code>irc.freshcoffee.i2p</code>). These channels are also available outside of I2P's encrypted, anonymous network via <a href="irc://irc.freenode.net/i2p">Freenode IRC</a>. + </li> -<li class="tidylist"><b>Reporting Bugs</b><br>If you'd like to report a bug, please file a ticket on <a href="http://trac.i2p2.i2p/" target="_blank">trac.i2p2.i2p</a>. For developer-related discussions, please visit <a href="http://zzz.i2p/" target="_blank">zzz's developer forums</a> or come and visit the <a href="irc://127.0.0.1:6668/i2p-dev">developer channel</a> on I2P's IRC network. Developers can browse source at <a href="http://stats.i2p/cgi-bin/viewmtn/" target="_blank">zzz's mtn repository viewer</a>, <a href="http://i2host.i2p/cgi-bin/view/branch/changes/i2p.i2p" target="_blank">Sponge's instance</a>, or via <a href="http://trac.i2p2.i2p/browser" target="_blank">trac.i2p2.i2p</a>. We primarily use <a href="http://www.i2p2.i2p/monotone.html" target="_blank">monotone</a> to manage our source code.</li> +<li class="tidylist"><b>Reporting Bugs</b><br>If you'd like to report a bug, please file a ticket on <a href="http://trac.i2p2.i2p/" target="_blank">trac.i2p2.i2p</a>. For developer-related discussions, please visit <a href="http://zzz.i2p/" target="_blank">zzz's developer forums</a> or come and visit the <a href="irc://127.0.0.1:6668/i2p-dev">developer channel</a> on I2P's IRC network. Developers can browse source at <a href="http://stats.i2p/cgi-bin/viewmtn/" target="_blank">zzz's mtn repository viewer</a>, <a href="http://i2host.i2p/cgi-bin/view/branch/changes/i2p.i2p" target="_blank">Sponge's instance</a>, or via <a href="http://trac.i2p2.i2p/browser" target="_blank">trac.i2p2.i2p</a>. We primarily use <a href="http://www.i2p2.i2p/monotone.html" target="_blank">monotone</a> to manage our source code. + </li> + +<li class="tidylist"><b>Get Involved!</b><br>I2P is developed and maintained mostly through unfunded, voluntary participation by community members. We're happy to accept <a href="http://www.i2p2.i2p/donate.html" target="_blank">donations</a>, which go into essential hosting and administrative costs. We have <a href="http://www.i2p2.i2p/bounties.html" target="_blank">cash bounties</a> for aspects of I2P for developers looking for incentives to participate, and we're always looking for more <a href="http://www.i2p2.i2p/newdevelopers.html" target="_blank">Java coders</a>, <a href="http://www.i2p2.i2p/newtranslators.html" target="_blank">translators</a>, promoters and users to help I2P grow. The bigger the I2P network, the more everyone benefits, so simply telling all your friends about I2P (and lending a hand with the installation and setup where needed) is a big help. For further info on how you can participate, visit the <a href="http://www.i2p2.i2p/getinvolved.html" target="_blank">volunteers page</a> on the website. + </li> + +</ul> -<li class="tidylist"><b>Get Involved!</b><br>I2P is developed and maintained mostly through unfunded, voluntary participation by community members. We're happy to accept <a href="http://www.i2p2.i2p/donate.html" target="_blank">donations</a>, which go into essential hosting and administrative costs. We have <a href="http://www.i2p2.i2p/bounties.html" target="_blank">cash bounties</a> for aspects of I2P for developers looking for incentives to participate, and we're always looking for more <a href="http://www.i2p2.i2p/newdevelopers.html" target="_blank">Java coders</a>, <a href="http://www.i2p2.i2p/newtranslators.html" target="_blank">translators</a>, promoters and users to help I2P grow. The bigger the I2P network, the more everyone benefits, so simply telling all your friends about I2P (and lending a hand with the installation and setup where needed) is a big help. For further info on how you can participate, visit the <a href="http://www.i2p2.i2p/getinvolved.html" target="_blank">volunteers page</a> on the website.</li> -</ul><div class="topness"><a href="#top">[Return to Top]</a></div> -<div class="footnote"><hr>Document updated: December 2010.</div> +<div class="topness"><a href="#top">[Return to Top]</a></div> +<div class="footnote"><hr>Document updated: February 2011</div> +</div> diff --git a/installer/resources/readme/readme_ar.html b/installer/resources/readme/readme_ar.html new file mode 100644 index 0000000000000000000000000000000000000000..67ef0d0edf6c0497211761fc1bd99443059d21f5 --- /dev/null +++ b/installer/resources/readme/readme_ar.html @@ -0,0 +1,34 @@ +<div dir="rtl" lang="ar"> + +<p>عندما تقوم بتشغيل I2P ستبدأ الأرقام على يسار الشاشة ÙÙŠ الازدياد خلال الدقائق التالية وستظهر عبارة <i>Shared Clients</i> (ان <a href=#trouble>لم تظهر، انظر التعليمات اسÙله</a>). عندها يمكنك الØصول على عدة خدمات مثل تورنت، البريد الإلكتروني السري، وخدمات أخرى:</p> +<ul> + <li>يمكنك الوصول الى مواقع مجهولة (تسمى eepsites) Ùˆ خدمات أخرى ( ssh على I2P JabberØŒIRC الخ...) زيادة على امكانية استضاÙØ© ونشر موقعك الخاص : +لتصÙØ Ù…ÙˆØ§Ù‚Ø¹ (eepsites) على شبكة I2P عليك تغيير اعدادات المتصÙØ HTTP proxy الى عنوان 127.0.0.1 Ùˆ port الى 4444ØŒ ثم يمكنك تصÙØ Ù…ÙˆØ§Ù‚Ø¹ <br> + <ul class="links"> + <li><a href="http://forum.i2p/">forum.i2p</a>: وصلة آمنة ومجهولة الى منتدى <a href="http://forum.i2p2.de/">forum.i2p2.de</a></li> + <li><a href="http://www.i2p2.i2p/index_fr.html">www.i2p2.i2p</a> Ùˆ <a href="http://i2p-projekt.i2p/index_fr.html">i2p-projekt.i2p</a>: + هما موقع الرسمي للمشروع <a href="http://www.i2p2.de/index_fr.html">www.i2p2.de</a></li> + <li><a href="http://eepsites.i2p/">eepsites.i2p</a>Ù…Øرك بØØ«</li> + <li><a href="http://ugha.i2p/">ugha.i2p</a>ويكي Ù…ÙØªÙˆØ Ø§Ù„ØªÙŠ يستطيع الجميع تØريرها مع الكثير من المعلومات Øول الشبكة</li> + <li><a href="http://fproxy.tino.i2p">fproxy.tino.i2p</a>Freenet مدخل الى شبكة </li> + <li><a href="http://echelon.i2p">echelon.i2p</a>موقع لتØميل مجموعة من البرامج (I2PFox, iMule, I2P-Messenger, ...) <br></li> + </ul> + هناك العديد من eepsitesØŒ Ùقط اتبع هذه الروابط لإكتشا٠المزيد!</li> + + <li class="tidylist"><b>تØميل الملÙات</b> يمكن استعمال برنامج <a href="http://www.klomp.org/snark/">Snark</a> الموجود ضمن Øزمة برامج I2P لتØميل ملÙات <a href="http://www.bittorrent.com/">BitTorrent</a>.</li> + + <li class="tidylist"><b>البريد الالكتروني المجهول:</b> يمكن استعمال شبكة I2P لإرسال واستقبال البريد الالكتروني بطريقة متواÙقة مع بروتوكول (POP3 / SMTP) الشيء الذي يمكن من ارسال واستقبال البريد الالكتروني المجهول Ùˆ المشÙر داخل الشبكة وايضا عن طريق الإنترنت العادية. يمكن زيارة <a href="http://hq.postman.i2p/">hq.postman.i2p</a> للØصول على Øساب. . + + <li class="tidylist"><b>الدردشة بطريقة مجهولة</b> استعمل برنامج الدردشة IRC مثل (Chatzilla, Pidgin, XChat) واتصل بالسيرÙر على عنوان 127.0.0.1 وبورت 6668 ليتم الإتصال باØدى السيرÙرات IRC المجهولة والمشقرة بØيث لا يستطيع مزود الانترنت او الØكومة او أي شخص آخر التنصت على Ù…Øادثتك! ثم قم بالدخول الى اØدى الغر٠i2p-help,#i2p,#i2p-chat# او غر٠أخرى. + </ul> + +<h2>استضاÙØ© موقع مجهول ومشÙر على شبكة I2P</h2> + +<p>يمكنك استضاÙØ© موقعك على الشبكة بوضع ملÙاتك ÙÙŠ مجلد eepsite/docroot (كما يمكن وضع تطبيقات JSP/Servlet ايضا) او استعمال سكريبتات CGI ÙÙŠ eepsite/cgi-bin +</p> + +<h2><a name="trouble">المساعدة</a></h2> + +<p>يمكن ان يستغرق I2P بعض الوقت ÙÙŠ البداية لأنه يقوم بالبØØ« عن نظائر ليتم الإتضال بالشبكة. اذا استمر الوضع بعد 30 دقيقة، وعدد النظائر المتصلين أقل من 10ØŒ تأكد من ÙØªØ Ø¨ÙˆØ±Øª 8887 على برنامج الجدار الناري. +اذا لم تستطع الوصول الى اي موقع على الشيكة (مثل www.i2p2.i2p) تأكد من وجود البروكسي 127.0.0.1 وبوورت 4444 ÙÙŠ اعدادات متصÙØ.</p><hr /> +</div> diff --git a/installer/resources/readme/readme_de.html b/installer/resources/readme/readme_de.html index 02f35947e4b1080bd2a37d7e8936555da09dcf93..0edc7751e15fefbe29aae5e832c0cb574338377c 100644 --- a/installer/resources/readme/readme_de.html +++ b/installer/resources/readme/readme_de.html @@ -1,18 +1,5 @@ <div lang="de"> -<div align="right"> - <div class="langbox" align="right"> - <a href="/index.jsp?lang=en"><img src="/flags.jsp?c=us" title="English" alt="English"></a> - <a href="/index.jsp?lang=zh"><img src="/flags.jsp?c=cn" title="ä¸æ–‡" alt="ä¸æ–‡"></a> - <a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a> - <a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Français" alt="Français"></a> - <a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Español" alt="Español"></a> - <a href="/index.jsp?lang=pt"><img src="/flags.jsp?c=pt" title="Português" alt="Português"></a> - <a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a> - <a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="РуÑÑкий" alt="РуÑÑкий"></a> - <a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a> - </div> -</div></div> -<div class="welcome"><h2>Willkommen im I2P!</h2></div> + <p>Wenn Du I2P gerade gestartet hast, sollten die "Aktiv:"-Zahlen links in den nächsten Minuten anwachsen. Du siehst dann dort ein als "versch. Klienten" bezeichnetes lokales Ziel gelistet (falls nicht, <a href="#trouble">siehe unten</a>). Sobald dieses erscheint, kannst Du:</p> <ul> <li><b>"Eepseiten" besuchen</b> - In I2P gibt es anonym gehostete Websites: @@ -28,7 +15,7 @@ <li><a href="http://paste.i2p2.i2p">paste.i2p2.i2p</a>: anonymer Pastebin</li> </ul><br /> Es gibt viele andere Eepseiten - folge einfach den Links, die du findest, - setze Lesezeichen für Deine Favoriten, und besuche sie oft!</li><br /> + setze Lesezeichen für Deine Favoriten, und besuche sie oft!</li> <li class="tidylist"><b>Im Internet surfen</b> - Es gibt in I2P einen HTTP-"Outproxy". Um ihn zu nutzen, kannst du ebenfalls den HTTP-Proxy auf Port 4444 verwenden - Konfiguriere Deines Browsers Proxy-Einstellungen darauf (siehe oben) und besuche jede normale URL - Deine Anfrage wird dann anonym @@ -88,5 +75,5 @@ in <a href="irc://127.0.0.1:6668/i2p">#i2p</a> oder in <a href="irc://127.0.0.1:6668/i2p-chat">#i2p-chat</a> auf irc.postman.i2p - bzw. irc.freshcoffee.i2p chatten. (Beide unter <a href="irc://localhost:6668">irc://localhost:6668</a> erreichbar; die Server sind verbunden.) Wenn Du keinen Zugriff auf I2P hast, kannst du #i2p, #i2p-help und #i2p-de auch auf <a href="irc://irc.freenode.net/#i2p">irc.freenode.net</a> erreichen, dann allerdings nicht anonym.</p><hr /> + bzw. irc.freshcoffee.i2p chatten. (Beide unter <a href="irc://localhost:6668">irc://localhost:6668</a> erreichbar; die Server sind verbunden.) Wenn Du keinen Zugriff auf I2P hast, kannst du #i2p, #i2p-help und #i2p-de auch auf <a href="irc://irc.freenode.net/#i2p">irc.freenode.net</a> erreichen, dann allerdings nicht anonym.</p> </div> diff --git a/installer/resources/readme/readme_es.html b/installer/resources/readme/readme_es.html index b04baaf918ea30c70a45639c505ac1fa1cf08ae1..f6f2cd54423367c1f061f05d02827e2ce911f5a9 100644 --- a/installer/resources/readme/readme_es.html +++ b/installer/resources/readme/readme_es.html @@ -1,17 +1,5 @@ <div lang="es"> -<div align="right"> -<div class="langbox" align="right"> - <a href="/index.jsp?lang=en"><img src="/flags.jsp?c=us" title="English" alt="English"></a> - <a href="/index.jsp?lang=zh"><img src="/flags.jsp?c=cn" title="ä¸æ–‡" alt="ä¸æ–‡"></a> - <a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a> - <a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Français" alt="Français"></a> - <a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Español" alt="Español"></a> - <a href="/index.jsp?lang=pt"><img src="/flags.jsp?c=pt" title="Português" alt="Português"></a> - <a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a> - <a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="РуÑÑкий" alt="РуÑÑкий"></a> - <a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div> -</div></div> -<div class="welcome"><h2>¡Bienvenido a I2P!</h2></div> + <p>Si acabas de iniciar I2P, al observar el menú de la izquierda, deberÃas notar que los números al lado de "Activos:" subirán en los próximos minutos y luego verás allà un Destino llamado "clientes diferentes" (si no, <a href="#trouble">¡mira abajo!</a>) <br>Apenas aparezca esto, puedes:</p> <ul> <li><b>visitar páginas I2P ("Eepsites")</b> - En I2P hay páginas web anónimas: @@ -26,8 +14,7 @@ <li><a href="http://echelon.i2p">echelon.i2p</a>: archivo de software e informaciones sobre I2P (con aplicaciones de BitTorrent, iMule, I2PFox, I2P-Messenger, ...)</li> <li><a href="http://paste.i2p2.i2p">paste.i2p2.i2p</a>: pastebin anónimo</li> </ul><br /> - Hay muchas páginas I2P más - simplemente ¡sigue los enlaces que encuentres, pon marcadores para tus favoritos y visítalos frecuentemente!</ - li><br /> + Hay muchas páginas I2P más - simplemente ¡sigue los enlaces que encuentres, pon marcadores para tus favoritos y visítalos frecuentemente!</li> <li class="tidylist"><b>navegar en internet</b> - I2P cuenta con un HTTP-"Outproxy". Para poder usarlo, puedes también utilizar el proxy HTTP en el puerto 4444 - Si configuras tu navegador web para usar este proxy, puedes visitar las páginas web de forma anónima. El tráfico será enrutado através de la red I2P.</li> <li class="tidylist"><b>intercambiar datos</b> - Hay una <a href="i2psnark/">adaptación</a> para I2P de la aplicación <a href="http://www.bittorrent.com/">BitTorrent</a> <a href="http://www.klomp.org/snark/">Snark</a>.</li> @@ -75,5 +62,5 @@ , todos en los servidores irc.postman.i2p y irc.freshcoffee.i2p. (Puedes acceder a ambos bajo <a href="irc://localhost:6668">irc://localhost:6668</a>; los dos servidores están conectados.) Si aún no tienes acceso a I2P, también puedes entrar en #i2p y #i2p-help del servidor <a href="irc://irc.freenode.net/#i2p">irc.freenode.net</a> - - entonces de forma no anónima.</p><hr /> + entonces de forma no anónima.</p> </div> diff --git a/installer/resources/readme/readme_fr.html b/installer/resources/readme/readme_fr.html index dea15fa7e6e02d0f7f3b9736a8c79633f22563a3..9f2122dd9433efbe5cf1086525a2d32a67a0bbc2 100644 --- a/installer/resources/readme/readme_fr.html +++ b/installer/resources/readme/readme_fr.html @@ -1,55 +1,277 @@ <div lang="fr"> -<div align="right"> -<div class="langbox" align="right"> - <a href="/index.jsp?lang=en"><img src="/flags.jsp?c=us" title="English" alt="English"></a> - <a href="/index.jsp?lang=zh"><img src="/flags.jsp?c=cn" title="ä¸æ–‡" alt="ä¸æ–‡"></a> - <a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a> - <a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Français" alt="Français"></a> - <a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Español" alt="Español"></a> - <a href="/index.jsp?lang=pt"><img src="/flags.jsp?c=pt" title="Português" alt="Português"></a> - <a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a> - <a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="РуÑÑкий" alt="РуÑÑкий"></a> - <a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div> -</div></div> -<div class="welcome"><h2>Bienvenu sur I2P!</h2></div> -<p>Si vous venez juste de lancer I2P, les chiffres sur la gauche à coté de Active devraient commencer à augmenter dans les prochaines minutes et vous verrez un "Shared client" en destination locale listés sur la gauche (si non, <a href=#trouble>voir plus bas</a>). Une fois qu'ils apparaissent, vous pouvez:</p> -<ul> - <li><b>Parcourir les "eepsites"</b> - sur I2P il y a des sites web anonymes hébergés - dites à votre navigateur d'utiliser <b>le HTTP proxy a l'adresse 127.0.0.1 port 4444</b>, ensuite vous pouvez naviguer sur les eepsites:<br> - <ul class="links"> - <li><a href="http://forum.i2p/">forum.i2p</a>: une connection sécurisée et anonyme vers <a href="http://forum.i2p2.de/">forum.i2p2.de</a></li> - <li><a href="http://www.i2p2.i2p/index_fr.html">www.i2p2.i2p</a> et le miroir <a href="http://i2p-projekt.i2p/index_fr.html">i2p-projekt.i2p</a>: - connections sécurisées et anonyme vers <a href="http://www.i2p2.de/index_fr.html">www.i2p2.de</a></li> - <li><a href="http://eepsites.i2p/">eepsites.i2p</a>: un moteur de recherche d'eepsites</li> - <li><a href="http://ugha.i2p/">ugha.i2p</a>: l'eepsite d'ugha, un wiki que chaucun peut éditer ainsi que</li> - <li><a href="http://fproxy.tino.i2p">fproxy.tino.i2p</a>: un proxy Freenet 0.5</li> - <li><a href="http://echelon.i2p">echelon.i2p</a>: archive de software (I2PFox, iMule, I2P-Messenger, ...) et informations à propos de I2P<br></li> - <li><a href="http://paste.i2p2.i2p">paste.i2p2.i2p</a>: Pastebin anonyme</li> - <br> - </ul> - Il y a bien plus d'eepsites - suivez juste les liens au départ de ceux sur lesquels vous êtes, mettez-les dans vos favoris et visitez-les souvent!</li><br> - <li class="tidylist"><b>Parcourir le web</b> - Il y a pour l'instant un outproxy HTTP sur I2P attaché à votre propre proxy HTTP sur le port 4444 - vous devez simplement configurer le proxy de votre navigateur pour l'utiliser (comme expliqué ci-dessus) et aller sur n'importe quel URL normale - vos requêtes seront relayées par le réseau i2p.</li> - <li class="tidylist"><b>Transfer de fichiers</b> - Il y a un <a href="i2psnark/">port</a> intégré de <a href="http://www.klomp.org/snark/">Snark</a> le client <a href="http://www.bittorrent.com/">BitTorrent</a>.</li> - <li class="tidylist"><b>Utiliser le service de mail anonyme</b> - Postman a créé un sytème de mails compatible avec un client de messagerie normal (POP3 / SMTP) qui permet d'envoyer des emails autant au sein d'i2p que vers et à partir de l'internet normal! Créez-vous un compte à <a href="http://hq.postman.i2p/">hq.postman.i2p</a>. - Nous fournissons dans la version de base de i2p <a href="/susimail/susimail">susimail</a>, - un client web pop3/smtp orienté sur l'anonymat qui est configuré pour accéder aux services email de postman. - <br>Alternativement, vous pouvez essayer le nouveau système de courrier sans serveur et crypté de bout-en-bout - <a href="http://tjgidoycrw6s3guetge3kvrvynppqjmvqsosmtbmgqasa6vmsf6a.b32.i2p/">I2P-Bote</a> (avec une interface web), installable comme un plugin.<br></li> - <li class="tidylist"><b>Chatter de manière anonyme</b> - Activez votre client IRC et connectez-le sur le serveur <b>127.0.0.1 port 6668</b>. Ceci pointe vers l'un des deux serveur IRC anonyme, mais ni vous ni eux ne savent qui est l'autre</li> - <li class="tidylist"><b>Créez-vous un blog anonyme</b> - Renseignez-vous chez <a href="http://syndie.i2p2.de/">Syndie</a></li> - <li class="tidylist">Et bien d'autres</li> +(traduction de mars 2011 - cliquez sur le drapeau ci-dessus pour l'original en anglais) +<ul class="links"><li class="tidylist"><b>Démarrage…</b><br>Si vous venez juste de lancer I2P, le nombre de +<i>pairs actifs</i> indiqués dans la section <i>Pairs</i> du "Panneau de surveillance" sur la gauche devrait +commencer à augmenter dans les prochaines minutes et vous verrez alors en bas du panneau une <i>destination locale</i> +intitulée <i>Clients partagés</i>, avec d'éventuels autres clients et serveurs suivant la configuration initiale d'I2P +(sinon, voir plus bas la <a href=#trouble>section dépannage</a>). Ces <i>destinations locales</i> fournissent des +connexions sur différent ports (et parfois des protocoles) au réseau I2P, pour permettre le fonctionnement de votre +client BitTorrent, de votre messagerie, du mandataire Internet et autres services. Votre +<a href="/netdb">base de données réseau</a> indique tous les pairs que connaît votre routeur. Vous pouvez surveiller +les <a href="/peers">connexions de pairs</a> en cours et voir les <a href="/tunnels">tunnels</a> existants et leur +état. D'autres informations sont disponibles sur la page d'<a href="/help">aide</a>.</li> + +<li class="tidylist"><b>Intégration au réseau</b><br>La première fois que vous lancez I2P l'intégration au réseau peut +prendre quelques minutes, le temps que votre routeur soit connu et trouve d'autres pairs qui amélioreront alors son +intégration: soyez patient. Quand I2P démarre, et en fonctionnement établi, I2P affiche un indicateur d'état, (juste au +dessus de la section <i>destinations locales</i> dans le panneau de surveillance), qui peut vous signaler l'information +"Refus de tunnels"; ce comportement est normal et ne doit pas vous inquiéter! Une fois que les étoiles vertes +s'affichent en face des <i>destinations locales</i>, le monde d'I2P vous est ouvert. En voici un aperçu: +</li></ul> + +<h3>Les services sur I2P</h3> +<ul class="links"> + +<li class="tidylist"><b>Internet invisible & exploration anonyme du web public</b><br>Sur I2P vous pouvez accéder +à des sites anonymes (les sites eep) et à d'autres services (par exemple SSH sur I2P, IRC, Jabber, etc…), et +vous pouvez aussi héberger vos propres services anonyme. Vous avez également un accès anonyme au web normal via le +serveur mandataire sortant ("outproxy") I2P intégré. Pour ceci, +<a href="http://www.i2p2.de/htproxyports_fr.html" target="_blank">configurez votre navigateur</a> pour qu'il utilise le +mandataire <code>127.0.0.1 sur le port 4444</code>, puis promenez-vous sur les sites eep ou non cryptés normaux +(adresses <code>http://</code>. Vous trouverez sûrement un intérêt à utiliser un navigateur préconfiguré: essayez +<a href="http://echelon.i2p/i2pfox/">I2PFox</a>, une version de Firefox renforcée en termes de sécurité et spécialement +adaptée à i2P. Si vous voulez désactiver ou modifier l'accès mandaté à l'Internet normal, enlevez ou modifiez l'entrée +<code>false.i2p</code> dans les options de <i>mandataires</i> du <i>gestionnaire de tunnels</i> pour le +<a href="/i2ptunnel/edit?tunnel=0" target="_blank">mandataire HTTP I2P</a>. Dans la section "Sites intéressants" +<a href="#eepsites">ci-dessous</a>, vous trouverez notre petite sélection de sites hébergés sur I2P.</li> + +<li class="tidylist"><b>Messagerie anonyme</b><br>Le système de messagerie basé sur I2P de Postman est utilisable soit +par le <a href="/susimail/susimail">client de messagerie I2P intégré</a> dans la console du routeur (susimail), soit en +configurant n'importe quel logiciel client de messagerie compatible SMTP et POP3. Les comptes peuvent recevoir et +envoyer du courrier de/vers l'Internet normal. Créez au moins votre compte sur +<a href="http://hq.postman.i2p/" target="_blank">hq.postman.i2p</a>. En complément, +<a href="http://i2pbote.i2p/" target="_blank">I2P-Bote</a> est le nouveau système intra-I2P décentralisé, sécurisé +(crypté de bout en bout) et équipé d'un système de relayage anonymo-pseudonymique, ainsi que d'une interface web et d'un +carnet d'adresses intégré. Développé par HungryHobo, il s'installe en tant que <a href="#plugins">greffon</a>.</li> + + +<li class="tidylist"><b>Transfert de fichiers anonyme</b><br><a href="/i2psnark/" target="_blank">I2PSnark</a> est +intégré dans le router I2P. Il permet les transferts anonymes et cryptés +<a href="https://secure.wikimedia.org/wikipedia/fr/wiki/BitTorrent_%28protocole%29" target="_blank">BitTorrent</a>. +Sponge a développé en Python un autre client bittorrent appelé <a href="http://bob.i2p/Robert.html">Robert</a>. +Il y a aussi un portage d'<a href="http://www.emule-project.net/" target="_blank">eMule/aMule</a> sur I2P:… +<a href="http://echelon.i2p/imule/">iMule</a> [Cherche développeurs!], une implémentation anonyme et sécurisée d'un +<a href="https://secure.wikimedia.org/wikipedia/fr/wiki/Gnutella" target="_blank">réseau Gnutella</a> accessible par +<a href="http://echelon.i2p/i2phex/" target="_blank">I2Phex</a> [maintenu par Complication, mais on cherche de nouveaux +développeurs!], ainsi que d'autres utilitaires dont un hébergement de fichiers basé sur le navigateur.</li> +<li class="tidylist"><b>Claviotage anonyme (non ça n'est pas le nom de mon chat)</b><br>Lancez votre client IRC (p.e. +Chatzilla, Pidgin, XChat, etc…) et connectez-vous au <a href="irc://127.0.0.1:6668/i2p-help">serveur</a> sur +<code>127.0.0.1 port 6668</code>. Vous n'avez pas besoin de configurer un proxy dans votre client IRC: I2P vous fournit +un tunnel IRC local (configuré dans votre client IRC en tant qu'hôte serveur IRC distant). Votre tunnel IRC local +sur <code>localhost:6668</code> vous emmènera sur un des deux serveurs hébergés sur I2P par Postman and Badger, mais +ni vous ni eux ne sauront où se trouve l'autre, et ni ta maman ni ton gouvernement ne sera capable d'intercepter ta +conversation!… (sauf,… heu… regarde quand même dans ton dos!…ET dans le faux plafond ET dis +à ton correspondant d'en faire autant… ET coulez vos PC dans du béton). Une fois là , /join +<code>#i2p-help</code>, <code>#i2p-chat</code>, <code>#i2p</code>, <code>#i2p-chat</code> ou <code>#i2p-dev</code> +ne sont que quelques unes des possibilités pour mettre la tête dehors, même si ça va pas améliorer le bronzage de ta +couenne d'endive.</délire> Il y a aussi une +<a href="http://echelon.i2p/qti2pmessenger/">messagerie instantanée</a> à la sauce I2P pour le claviotage anonyme +(tiens, le rev'là ) non surveillable et non censurable, ainsi que d'autres serveurs IRC, Jabber, website-based chat, +and more. Et bien sûr vous avez l'entière liberté de faire tourner vos propres serveurs sur I2P, dans la version qui +vous émoustille les papilles, et si vous êtes un développeur, d'écrire vos propres +<a href="http://www.i2p2.i2p/applications.html" target="_blank">applications I2P</a> (les protocoles +<a href="https://secure.wikimedia.org/wikipedia/fr/wiki/User_Datagram_Protocol" target="_blank">UDP</a> et +<a href="https://secure.wikimedia.org/wikipedia/fr/wiki/Transmission_Control_Protocol" target="_blank">TCP</a> +sont tous deux <a href="http://www.i2p2.i2p/techintro_fr.html#op.transport" target="_blank">compatibles</a>), et +<a href="http://www.i2p2.i2p/streaming.html" target="_bla_nk">les flux en temps réel</a> sont aussi au menu. +Nous fournissons aussi un accès complet à l'<a href="http://docs.i2p2.de/javadoc/" target="_blank">API Java</a>.</li> +<li class="tidylist"><b>Forums & Blogs</b><br>Si vous cherchez à faire votre propre blog ou forum , vous pourriez +être intéressé par <a href="http://syndie.i2p2.de/" target="_blank">Syndie</a>, une plateforme décentralisée de +forum et blog pour I2P [Nids de développeurs! (prononcez à l'anglaise)]. +On trouve également en greffon I2P, un portage réalisé par zzz de la plateforme de blog Java +<a href="http://pebble.sourceforge.net/" target="_blank">pebble</a>. Il est disponible sur +<a href="http://i2plugins.i2p/" target="_blank">i2plugins.i2p</a>. Bien entendu, tous les logiciels de blog, forum et +cms fonctionnent sur I2P, bien qu'il vous soit conseillé de faire très attention à la sécurité quand vous les +configurez et de tenir tous les logiciels associés (p.e. Php, MySql, Python, Apache) bien à jour et verrouillés! +Vous trouverez aussi un petit nombre de forums I2P dans diverses langues: voir <a href="#eepsites">plus bas</a> +d'autres suggestions.</li> + <li class="tidylist"><a name="plugins"></a><b>Greffons pour I2P</b><br>Étendez l'usage et la portée d'I2P en +installant des greffons… blog, chat, partage de fichiers et autres sont déjà écrits ou portés, et n'attendent +autre chose que vous les <a href="http://i2plugins.i2p/plugins/" target="_blank">installiez</a>! +Consultez la carte (et les secrets du chef) sur <a href="http://i2plugins.i2p/" target="_blank">i2plugins.i2p</a>. +Si vous êtes <a href="http://i2plugins.i2p/developers/" target="_blank">développeur</a>, vous disposez d'un +environnement d'écriture de greffons indépendant de tout langage dans la +<a href="http://www.i2p2.i2p/plugins_fr.html" target="_blank">documentation</a>; les greffons I2P peuvent être codés dans +n'importe quel langage.</li> </ul> -<h2>Vous voulez votre propre eepsite?</h2> +<h3>Hébergement crypté anonyme sur I2P</h3> +<ul class="links"> + +<li class="tidylist"><b>Prêt à servir!</b><br>I2P arrive avec un serveur intégré, prêt à servir votre propre site web +anonyme (eepsite) sur le réseau I2P: une instance <a href="http://jetty.mortbay.org/" target="_blank">Jetty</a> qui +écoute sur <a href="http://127.0.0.1:7658/" target="_blank">http://127.0.0.1:7658/</a>. Pour héberger votre propre +contenu, placez tout bêtement vos fichiers dans le répertoire <code>eepsite/docroot/</code> (ou déposez n'importe quel +fichier JSP/Servlet standard .war dans <code>eepsite/webapps</code>, ou des scripts CGI standards dans +<code>eepsite/cgi-bin</code>) et ils s'afficheront. Vous gardez tout loisir de choisir le serveur web qui vous convient +pour fonctionner sur I2P et remplacer le serveur intégré, ou exécuter celui-ci sur un autre tunnel.</li> +<li class="tidylist"><b>Démarrez votre tunnel</b><br> + Après le démarrage de votre <a href="/i2ptunnel/" target="_blank">Tunnel serveurWeb I2P</a>, votre eepsite sera +visible (mais pas encore découvrable) par les I2P'nautes. Les instructions détaillées de démarrage de votre eepsite, +d'enregistrement d'un domaine .i2p et de promotion de votre site sont accessibles via votre propre serveur à +l'adresse <a href="http://127.0.0.1:7658/help/" target="_blank">http://127.0.0.1:7658/help/</a>.</li></ul> + +<a name="eepsites"></a> + <h3>Sites I2P intéressants</h3> + <ul class="links"> + <li class="tidylist"><b>Le site officiel de l'Invisible Internet Project (I2P)</b><br> +<a href="http://www.i2p2.i2p/" target="_blank">www.i2p2.i2p</a> et son miroir +<a href="http://i2p-projekt.i2p/" target="_blank">i2p-projekt.i2p</a> sont les adresses de connexions sécurisées et +anonymes des sites classiques <a href="http://www.i2p2.de/" target="_blank">www.i2p2.de</a> et +<a href="http://geti2p.net/" target="_blank">geti2p.net</a>. Si vous êtes curieux du fonctionnement d'I2P et de la +façon d'y contribuer, vous venez de trouver la porte d'entrée.</li> + <li class="tidylist"><b>Les fora de la communauté</b><br> +<a href="http://forum.i2p/" target="_blank">forum.i2p</a>: la version anonyme et sécurisée de +<a href="http://forum.i2p2.de/" target="_blank">forum.i2p2.de</a>, le forum sur lequel les développeurs et les +utilisateurs aiment discuter de problèmes et d'idées relatifs à I2P et aux sujets apparentés, et le +<a href="http://zzz.i2p/" target="_blank">forum des développeurs de zzz</a> également ouvert aux utilisateurs.</li> + <li class="tidylist"><b>Pastebin anonyme I2P</b><br> +<a href="http://paste.i2p2.i2p/" target="_blank">paste.i2p2.i2p</a>: service de collage sécurisé et anonyme pour le +partage de texte et de code au format textuel sur I2P.</li> + <li class="tidylist"><b>Les ressources i2P d'Echelon</b> +<br><a href="http://echelon.i2p/" target="_blank">echelon.i2p</a>: dépôt de logiciels I2P (I2PFox, iMule, +I2P-Messenger…) avec leurs code sources (quand c'est permis), informations sur I2P, dont le +<a href="http://echelon.i2p/I2Pguide/index.html" target="_blank">guide du débutant</a> et pour les plus téméraires, +les pré-versions d'I2P à essayer.</li> + <li class="tidylist"><b>Le Wiki d'Ugha</b><br><a href="http://ugha.i2p/" target="_blank">ugha.i2p</a>: un wiki +ouvert et anonyme sur lequel chacun peut modifier toute sorte d'informations sur I2P, l'aide pour les débutants, +des liens supplémentaires dans le réseau, etc…</li> + <li class="tidylist"><b>Proxy I2P-vers-Freenet</b><br> +<a href="http://fproxy.tino.i2p/" target="_blank">fproxy.tino.i2p</a>: une fenêtre sur le monde du réseau +<a href="http://freenetproject.org/" target="_blank">Freenet</a> grâce au mandataire I2P-vers-Freenet de Tino.</li> + <li class="tidylist"><b>The Planet (sur I2P)</b><br><a href="http://planet.i2p/" target="_blank">planet.i2p</a>: +un site agrégateur RSS qui collecte les nouvelles et évènements concernant I2P et les publie toutes regroupée en un +seul endroit. Un bon aperçu de la communauté au travail!</li> + <li class="tidylist"><b>Moteur de recherches eepsites</b><br> +<a href="http://eepsites.i2p/" target="_blank">eepsites.i2p</a>: moteur de recherches sur les contenus I2P hébergé +anonymement.</li> + <li class="tidylist"><b>Météo du réseau I2P</b><br> +<a href="http://stats.i2p/cgi-bin/dashboard.cgi" target="_blank">stats.i2p</a>: vérifiez divers aspects des +performances du réseau I2P avec ce site superviseur maintenu par zzz.</li> + <li class="tidylist"><b>Découvrez I2P</b><br>Il y a plein d'autres eepsites: suivez simplement les liens que vous +rencontrez, marquez-les en favoris, et retournez-y souvent!<br></li> + </ul> + + +<h2><a name="trouble"></a>Résolution de problèmes & assistance supplémentaire</h2> -<p>Nous fournissons de base quelques logiciels pour vous permettre de créer votre propre eepsite - une instance -<a href="http://jetty.mortbay.org/">Jetty</a>, qui écoute sur -<a href="http://127.0.0.1:7658/">http://127.0.0.1:7658/</a>. Placer simplement vos fichiers dans le répertoire <code>eepsite/docroot/</code> (ou placez n'importe quel fichier JSP/Servlet standard <code>.war</code>) dans eepsite/webapps, ou script CGI standard dans <code>eepsite/cgi-bin</code>) et ils apparaitront. Après avoir démarré un <a href="/i2ptunnel/">tunnel pour votre eepsite</a> (le tunnel doit pointer sur l'adresse locale du eepsite), votre eepsite sera visible pour les autes. Des instructions plus détaillées pour créer un eepsite se trouvent sur <a href="http://127.0.0.1:7658/">Votre eepsite temporaire</a>. -</p> +<ul class="links"> -<h2><a name="trouble">Dépannage</a></h2> +<li class="tidylist"><b>Soyez patient!</b><br>I2P peut être long à s'intégrer au réseau la première fois que vous le +lancez car il s'amorce en découvrant des pairs supplémentaires. Plus il tourne longtemps, mieux il fonctionnera, donc +essayez de le laisser marcher le plus longtemps que vous pouvez, 24h/24 7j/7 si possible! Si après 30mn le nombre +<i>Actifs: [connectés/récents]</i> montre moins de 10 pairs, ou que le nombre de pairs <i>bien intégrés</i> est +inférieur à 5, voici ce que vous pouvez faire pour trouver l'origine du problème: + </li> + +<li class="tidylist"><b>Vérifiez votre configuration & allocation de bande passante</b><br>I2P fonctionne au mieux +quand vous reflétez correctement la vitesse de votre connexion Internet dans la section +<a href="/config">Gestionnaire de bande passante</a>. +I2P est configuré par défaut avec des valeurs volontairement faibles qui ne conviennent généralement pas. Merci de +prendre le temps d'adapter ces valeurs à votre cas particulier. Plus vous allouez de bande passante, <i>en particulier +la bande passante sortante</i>, plus vous obtiendrez de bonnes performances.</li> + +<li class="tidylist"><b>Pare-feux, Modems & Routeurs</b><br>Si possible, assurez-vous que I2P/Java dispose d'un +accès bidirectionnel à un port accessible depuis Internet en configurant votre modem-routeur(box x-DSL) et le pare-feu +logiciel de votre PC en conséquence. Si vous êtes derrière un pare-feu hors de votre contrôle mais avec un accès +sortant non restrictif, I2P peut quand même fonctionner: vous pouvez désactiver les accès entrants et vous reposer sur +la <a href="http://www.i2p2.i2p/udp.html" target="_blank">détection d'adresse IP par SSU</a> +(<a href="https://secure.wikimedia.org/wikipedia/en/wiki/Hole_punching" target="_blank">firewall hole punching</a>) +pour vous connecter au réseau, et le panneau de surveillance indiquera alors l'état "Réseau: Bloqué par un pare-feu". +Pour obtenir des performances optimales, préférez si possible de donnez accès à I2P l'accès à un +<b><a href="/config">port externe</a> visible depuis Internet</b>.<br /> +Pendant l'installation, I2P choisit aléatoirement ce port <a href="http://127.0.0.1:7657/config">modifiable ici</a>. +Vous pouvez laisser ce port ou en choisir un autre, et quel que soit votre choix régler vos pare-feux en conséquence. +<br /> +Voir plus bas pour d'autres solutions. + </li> + +<li class="tidylist"><b>Vérifiez vos réglages de mandataire</b><br>Si vous n'avez accès à aucun site eep (même pas +à <a href="http://www.i2p2.i2p/" target="_blank">www.i2p2.i2p</a>), assurez-vous que le mandataire de votre navigateur +est réglé pour le trafic HTTP (<i>pas</i> https, <i>ni</i> socks) via <code>127.0.0.1 port 4444</code>. Si vous avez +besoin d'aide, voici le +<a href="http://www.i2p2.i2p/htproxyports_fr.html" target="_blank">guide</a> de configuration du navigateur pour +l'utilisation avec I2P, également +<a href="http://www.i2p2.de/htproxyports_fr.html" target="_blank">disponible sur le web normal</a>. + </li> + +<li class="tidylist"><b>Vérifiez vos historiques</b><br>Les <a href="/logs">historiques</a> peuvent aider à +diagnostiquer un problème. Vous pouvez en coller un extrait sur un +<a href="http://forum.i2p/viewforum.php?f=10" target="_blank">forum</a> pour obtenir de l'aide, ou plutôt le +<a href="http://paste.i2p2.i2p/" target="_blank">coller ici</a> et faire référence au lien sur le canal IRC #i2p-fr +(Freenode). + </li> + +<li class="tidylist"><b>Vérifiez que Java est à jour</b><br>Assurez-vous que vous avez la dernière version de Java +[vers. 1.6 ou plus récente recommandée, et impérative pour certaines fonctionnalités]. Vérifez la version de votre JRE + (<a href="https://secure.wikimedia.org/wikipedia/fr/wiki/Environnement_d%27ex%C3%A9cution_Java" target="_blank"> +Java Runtime Environment</a>) en haut de page de vos <a href="/logs">historiques</a>. Si vous êtes un développeur, +un <a href="https://secure.wikimedia.org/wikipedia/fr/wiki/Java_Development_Kit" target="_blank">SDK Java</a> et +<a href="http://ant.apache.org/" target="_blank">Apache Ant</a> sont nécessaires à la compilation des sources. + </li> + +<li class="tidylist"><b>Problèmes avec des matériels anciens</b><br>[Linux/Unix/Solaris] Si vous ne pouvez pas +démarrer le routeur avec <code>i2p/i2prouter start</code> essayez le script <code>runplain.sh</code> dans le même +répertoire. L'accès root n'est normalement pas requis pour exécuter I2P. Si vous devez compiler la +<a href="http://www.i2p2.i2p/jbigi.html" target="_blank">bibliothèque jBigi</a> (ce est nécessaire dans de rares cas), +consultez la documentation appropriée, visitez les forums, ou venez faire un tour sur notre +<a href="irc://127.0.0.1:6668/i2p-dev">canal des développeur</a>. + </li> + +<li class="tidylist"><b>Activez Universal Plug and Play (UPnP)</b><br>Votre modem-routeur est peut-être compatible avec +<a href="https://secure.wikimedia.org/wikipedia/en/wiki/Universal_Plug_and_Play" target="_blank">Universal Plug +& Play</a> (UPnP) qui permet le transfert de ports automatique. Vérifiez que le support UPnP pour I2P est activé +dans la page de <a href="/config">configuration</a>, puis essayez d'activer UPnP dans votre modem-routeur et +éventuellement dans votre ordinateur. Maintenant, <a href="/">redémarrez le routeur I2P</a>. Si ça marche, le panneau +de surveillance devrait alors indiquer "Réseau: OK" une fois que le routeur I2P aura terminé ses tests de connectivité. +</li> + +<li class="tidylist"><b>Redirection de ports</b><br>Ouvrez le <a href="/config">port d'I2P</a> sur votre modem, routeur +et/ou pare-feu(x) logiciels pour améliorer la connectivité (idéalement, pour UDP et TCP). Plus d'informations sur la +façon de s'y prendre pour divers matériels est accessible sur +<a href="http://portforward.com/" target="_blank">portforward.com</a>, avec nos forums et canaux IRC listés ci-dessous. +Notez qu'I2P ne prend pas en charge la connexion à Internet via des mandataires (proxies) http ou socks [correctifs +bienvenus!], bien qui vous puissiez vous connecter à des mandataires via I2P lui-même quand il connecté au réseau</li> + +<li class="tidylist"><b>Aide en ligne</b><br>Vous pouvez trouver de l'information à parcourir sur le +<a href="http://www.i2p2.i2p/" target="_blank">site web I2P</a>, poster des messages sur le +<a href="http://forum.i2p/" target="_blank">forum de discussion I2P</a> +(accessible <a href="http://forum.i2p2.de/" target="_blank">ici</a> sur l'Internet classique), ou louvoyer sur les +canaux IRC +<a href="irc://127.0.0.1:6668/i2p-help">#i2p-help</a>, <a href="irc://127.0.0.1:6668/i2p">#i2p</a> ou encore +<a href="irc://127.0.0.1:6668/i2p-chat">#i2p-chat</a> dans le réseau interne I2P (<code>irc.postman.i2p</code> ou +<code>irc.freshcoffee.i2p</code>). Ces canaux sont aussi accessibles de façon non cryptée en dehors du réseau anonyme +via le serveur IRC <a href="irc://irc.freenode.net/i2p">Freenode</a>. + </li> + +<li class="tidylist"><b>Rapports de bogues</b><br>Si vous voulez rapporter un bogue, merci d'enregistrer un ticket sur +<a href="http://trac.i2p2.i2p/" target="_blank">trac.i2p2.i2p</a>. Les développeurs discutent sur les +<a href="http://zzz.i2p/" target="_blank">fora de développeurs de zzz</a> ou sur le +<a href="irc://127.0.0.1:6668/i2p-dev">canal des développeurs</a>. Les développeurs peuvent consulter les sources sur +<a href="http://stats.i2p/cgi-bin/viewmtn/" target="_blank">l'explorateur du dépôt de zzz</a>, +<a href="http://i2host.i2p/cgi-bin/view/branch/changes/i2p.i2p" target="_blank">l'instance de Sponge</a>, ou par +<a href="http://trac.i2p2.i2p/browser" target="_blank">trac.i2p2.i2p</a>. Nous utilisons +<a href="http://www.i2p2.i2p/monotone.html" target="_blank">monotone</a> pour gérer les sources du code. + </li> + +<li class="tidylist"><b>Impliquez-vous!</b><br>I2P est principalement développé et maintenu bénévolement par les +membres dévoués d'une équipe de développeurs. Nous acceptons les +<a href="http://www.i2p2.i2p/donate_fr.html" target="_blank">dons</a>. Ils sont essentiellement affectés aux coûts +administratifs et d'hébergements. Nous avons un système de +<a href="http://www.i2p2.i2p/bounties.html" target="_blank">primes</a> pour certains aspects d'I2P à l'intention de +développeurs qui rechercheraient des incitations, et nous sommes en recherche permanente de plus de +<a href="http://www.i2p2.i2p/newdevelopers_fr.html" target="_blank">codeurs Java</a>, de +<a href="http://www.i2p2.i2p/newtranslators_fr.html" target="_blank">traducteurs</a>, de prescripteurs et +d'utilisateurs pour accélérer la diffusion d'I2P. Plus grand sera le réseau I2P, plus tout le monde en profitera, +alors en parler simplement à l'apéro avec vos amis au lieu de vous étriper pour savoir si le PSG est plus tafiole +que l'OM n'est tarlouze, (et tendre la main à votre pire ennemi pour l'installation et les réglages chaque fois que +le besoin s'en fait sentir) sera une belle participation! Pour en savoir plus sur les façons de participer, venez +visiter le zoo sur la page "<a href="http://www.i2p2.i2p/getinvolved_fr.html" target="_blank">Engagez-vous!</a>" du +site web. + </li> + +</ul> -<p>Soyez patient - i2p peut s'avérer lent à démarrer la première fois car il recherche des pairs. Si, après 30 minutes, votre Actives: connecté/récent compte moins de 10 pairs connectés, vous devez ouvrir le port 8887 sur votre pare-feu pour avoir une meilleure connection. Si vous ne pouvez accéder à aucun eepsite (même <a href="http://www.i2p2.i2p/index_fr.html">www.i2p2.i2p</a>), soyez sûr que votre navigateur utilise bien le proxy 127.0.0.1 sur le port 4444. Vous pouvez aussi faire part de votre démarche sur le <a href="http://www.i2p2.i2p/index_fr.html">site web I2P</a>, poster des message sur le <a href="http://forum.i2p/">forum de discussion</a>, - ou passer par - <a href="irc://127.0.0.1:6668/i2p-help">#i2p-help</a>, <a href="irc://127.0.0.1:6668/i2p-fr">#i2p-fr</a>, <a href="irc://127.0.0.1:6668/i2p">#i2p</a> ou <a href="irc://127.0.0.1:6668/i2p-chat">#i2p-chat</a> - sur IRC sur le serveur <a href="irc://irc.freenode.net/#i2p">irc.freenode.net</a>, irc.postman.i2p ou irc.freshcoffee.i2p (ils sont liés).</p><hr /> +<div class="topness"><a href="#top">[Haut de page]</a></div> +<div class="footnote"><hr>Document mis à jour en février 2011</div> </div> diff --git a/installer/resources/readme/readme_nl.html b/installer/resources/readme/readme_nl.html index bd5938ef27ac358c45ae0006ebb322c9dcb2d013..beb580c929a8b5f385c257a04844cf18a3c6dbdc 100644 --- a/installer/resources/readme/readme_nl.html +++ b/installer/resources/readme/readme_nl.html @@ -1,71 +1,94 @@ <div lang="nl"> -<div align="right"> -<div class="langbox" align="right"> - <a href="/index.jsp?lang=en"><img src="/flags.jsp?c=us" title="English" alt="English"></a> - <a href="/index.jsp?lang=zh"><img src="/flags.jsp?c=cn" title="ä¸æ–‡" alt="ä¸æ–‡"></a> - <a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a> - <a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Français" alt="Français"></a> - <a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Español" alt="Español"></a> - <a href="/index.jsp?lang=pt"><img src="/flags.jsp?c=pt" title="Português" alt="Português"></a> - <a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a> - <a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="РуÑÑкий" alt="РуÑÑкий"></a> - <a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div> -</div></div> -<div class="welcome"><h2>Welkom bij I2P!</h2></div> -<p>Als je net I2P opgestart hebt, zullen de 'Active:' (Actieve) getallen aan de linkerkant in de komende minuten stijgen, en je zal een "Shared clients" (Gedeelde clients) lokale bestemming zien staan aan de linkerkant (indien niet, <a href=#trouble>zie hieronder</a>). Eenmaal je deze bestemming ziet, kan je:</p> -<ul> - <li><b>surfen naar "eepsites"</b> - op I2P zijn er anonieme websites - stel je browser in om de <b>HTTP proxy op 127.0.0.1, poort 4444</b> te gebruiken, en surf vervolgens naar een eepsite:<br> - <ul class="links"> - <li><a href="http://forum.i2p/">forum.i2p</a>: een beveiligde en anonieme verbinding naar <a href="http://forum.i2p2.de/">forum.i2p2.de</a></li> - <li><a href="http://www.i2p2.i2p/">www.i2p2.i2p</a> en de kopie <a href="http://i2p-projekt.i2p">i2p-projekt.i2p</a>: - beveiligde en anonieme verbindingen naar <a href="http://www.i2p2.de/">www.i2p2.de</a></li> - <li><a href="http://eepsites.i2p/">eepsites.i2p</a>: een anoniem gehoste zoekmachine voor eepsites</li> - <li><a href="http://ugha.i2p/">ugha.i2p</a>: ugha's eepsite, een wiki die door iedereen aangepast kan worden, met veel links</li> - <li><a href="http://fproxy.tino.i2p">fproxy.tino.i2p</a>: proxy naar het Freenet-netwerk</li> - <li><a href="http://echelon.i2p">echelon.i2p</a>: software - archive and information for I2P</li> - <li><a href="http://paste.i2p2.i2p">paste.i2p2.i2p</a>: anonieme Pastebin</li> - </ul><br> - Er zijn nog veel meer eepsites - volg gewoon de links vanaf diegene die je ziet. Voeg de beste toe aan je favorieten, en bezoek ze regelmatig!</li> -<ul><li class="tidylist"><b>surfen op het web</b> - er is momenteel een HTTP "outproxy" in I2P, vastgehaakt aan je eigen HTTP proxy op poort 4444 - stel eenvoudigweg de proxy van je browser in om deze te gebruiken (zoals hierboven voor eepsites) en ga naar een willekeurige normale URL - je verzoeken voor websites worden rondgestuurd via het I2P-network.</li> - <li class="tidylist"><b>bestanden versturen</b> - er is een geintegreerde <a href="i2psnark/">aangepaste versie</a> van de - <a href="http://www.klomp.org/snark/">Snark</a> <a href="http://www.bittorrent.com/">BitTorrent</a> - client.</li> - <li class="tidylist"><b>anonieme e-mail gebruiken</b> - postman heeft een e-mailsysteem gecreerd, compatibel met normale e-mail - clients (POP3 / SMTP) dat toelaat e-mail binnen I2P evenals e-mail van en naar het gewone internet te versturen. - Maak je eigen account op <a href="http://hq.postman.i2p/">hq.postman.i2p</a>. - In i2p zit een gebundelde <a href="/susimail/susimail">susimail</a>, - een webgebaseerde anonimiteits-georienteerde pop3/smtp-client ingesteld om postman zijn e-mailservices te gebruiken.</li> - <li class="tidylist"><b>anoniem chatten</b> - start je eigen IRC-client op en verbind met - de server op <b>127.0.0.1 poort 6668</b>. Dit wijst naar een of twee anoniem gehoste - IRC servers, maar zowel jij als zei weten niet waar de andere is.</li> - <li class="tidylist"><b>anoniem bloggen</b> - neem een kijkje bij <a href="http://syndie.i2p2.de/">Syndie</a></li> - <li class="tidylist">en veel meer</li> + +<ul class="links"><li class="tidylist"><b>Opstarten…</b><br>Als je zojuist I2P gestart hebt zal het nummer van <i>Actieve Peers</i> onder de <i>Peers</i> sectie in het linker zijpaneel toenemen binnen de komende minuten, tevens zal je een <i>Lokale bestemming</i> genaamd <i>Gedeelde Clients</i> zien, en mogelijk andere clients en servers, afhankelijk van de I2P configuratie (als dit niet het geval is, zie 'problemen oplossen' <a href="#trouble">hier onder</a>). Deze <i>Lokale bestemmingen</i> bieden verbindingen aan op verschillende poorten (en soms protocollen) naar het I2P netwerk waardoor diensten als BitTorrent, email, webproxy en andere diensten zullen werken. De <a href="/netdb">Netwerk Database</a> geeft een indicatie van alle bekende peers op het netwerk. Daarnaast kunnen bestaande <a href="/peers">Peer Connecties</a> gemonitord worden en bestaande <a href="/tunnels">Tunnels</a> en hun status worden bekeken. Meer informatie is beschikbaar op de <a href="/help">hulp pagina</a>.</li> + +<li class="tidylist"><b>Netwerk integratie</b><br> De eerste keer dat I2P start duurt het mogelijk enkele minuten om de router te integreren in het netwerk en meerdere peers te vinden om de verbinding te optimaliseren. Als I2P opstart, bij een normale werking, geeft de tunnel gereedheid indicator (direct boven het <i>Lokale bestemmingen</i> gedeelte in het zijpaneel) mogelijk de melding "Tunnels Geweigerd"; dit is normaal en is geen reden voor zorgen. Zodra de <i>Lokale bestemmingen</i> eenmaal aangegeven worden met groene sterren zijn er veel mogelijkheden voor het gebruik van I2P, hieronder worden enkele voorbeelden geïntroduceerd.</li></ul> + +<h3>Diensten op I2P</h3> +<ul class="links"> + +<li class="tidylist"><b>Invisible Internet & Public Web Browsing</b><br>Op I2P kan je toegang verkrijgen tot anonieme websites (eepsites) en andere diensten (zoals; SSH over I2P, IRC, Jabber etc.), daarnaast heb je ook de mogelijkheid om je eigen dienst aan te bieden. Je kan ook anoniem toegang krijgen tot het normale Internet via de ingebouwde web proxy (outproxy). <a href="http://www.i2p2.de/htproxyports.html" target="_blank">Configureer je browser</a> voor het gebruik van de HTTP proxy op <code>127.0.0.1 poort 4444</code>, waarna je naar zowel eepsites als normale, onversleutelde <code>http://</code> websites kan surfen. Voor een vooraf ingestelde browser kan je <a href="http://echelon.i2p/i2pfox/">I2PFox</a> proberen, dit is een speciaal ontworpen versie van Firefox met extra veiligheid en speciaal ontworpen voor gebruik met I2P. Als je een aanpassing wilt maken aan de outproxy of deze wilt uitschakelen kan je de 'client tunnel' voor <code>false.i2p</code> onder het <i>Outproxies</i> gedeelte in de <a href="/i2ptunnel/edit?tunnel=0" target="_blank">I2P HTTP Proxy Tunnel Editor</a>. In het "Interessante websites" gedeelte <a href="#eepsites">hier onder</a> staat een lijst met een paar van de bekende sites die op I2P gehost worden.</li> + +<li class="tidylist"><b>Anonieme E-Mail</b><br>Postman's I2P email systeem kan worden benaderd via <a href="/susimail/susimail">de ingebouwde email client</a> +(susimail) of door het gebruik van elke andere normale email client die ondersteuning biedt voor SMTP en POP3. +Deze accounts kunnen tevens email versturen en ontvangen naar en van het normale Internet. Voor een account, bezoek <a href="http://hq.postman.i2p/" target="_blank">hq.postman.i2p</a>. Daarnaast is er <a href="http://i2pbote.i2p/" target="_blank">I2P-Bote</a>, dit is een nieuw end-to-end versleuteld email systeem zonder centrale servers welke een webinterface en geïntegreerd adressen boek bied. Het is ontwikkeld door HungryHobo en kan worden geïnstalleerd als <a href="#plugins">plugin</a>.</li> + +<li class="tidylist"><b>Anonieme Bestands Overdracht</b><br><a href="/i2psnark/" target="_blank">I2PSnark</a> is geïntegreerd in I2P en biedt anonieme en versleutelde <a href="https://secure.wikimedia.org/wikipedia/en/wiki/BitTorrent_%28protocol%29" target="_blank">BitTorrent</a> overdracht aan. Tevens is er een bittorrent client door Sponge ontwikkeld genaamd <a href="http://bob.i2p/Robert.html">Robert</a>, geschreven in Python. Er is ook een port van <a href="http://www.emule-project.net/" target="_blank">eMule</a> voor I2P genaamd <a href="http://echelon.i2p/imule/">iMule</a> [Ontwikkelaars gezocht!], dit is een anonieme en veilige implementatie van een <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Gnutella" target="_blank">Gnutella netwerk</a>, toegankelijk op <a href="http://echelon.i2p/i2phex/" target="_blank">I2Phex</a> [onderhouden door Complication, ontwikkelaars gezocht!], daarnaast zijn er nog faciliteiten voor het aanbieden van bestanden via de browser.</li> + +<li class="tidylist"><b>Anonieme Chat</b><br>Start je IRC Client (bijv. mIRC, Chatzilla, Pidgin, XChat) +en maak verbinding met de <a href="irc://127.0.0.1:6668/i2p">server</a> op <code>127.0.0.1 port 6668</code>. Je hoeft geen proxy in te stellen in je IRC client; I2P bied een lokale IRC tunnel aan (geconfigureerd in je IRC client als IRC server of host op afstand. Je lokale I2P IRC tunnel op <code>localhost:6668</code> zal je verbinden met een van de twee IRC servers die gehost worden op I2P door Postman en Badger, geen van beide partijen weet echter wat de identiteit of IP van de ander is, en je moeder, Internet Provider of overheid kan deze gesprekken niet onderscheppen! Eenmaal verbonden zijn <code>#i2p-help</code>,<code>#i2p</code>,<code>#i2p-chat</code> en <code>#i2p-dev</code> onder meer een aantal kanalen die je mogelijk zou willen bezoeken (/join). Er is ook een <a href="http://echelon.i2p/qti2pmessenger/">Instant Messenger</a> gebaseerd op I2P voor ongecensureerde en onaftapbare anonieme chat, alsmede alternatieve IRC servers, Jabber servers, website-based chat, en meer. En, je bent natuurlijk vrij om je eigen servers op I2P te draaien in welke variant dan ook, of als ontwikkelaar zijnde je eigen <a href="http://www.i2p2.i2p/applications.html" target="_blank">I2P applicaties</a> (zowel <a href="https://secure.wikimedia.org/wikipedia/en/wiki/User_Datagram_Protocol" target="_blanK">UDP</a> en <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Transmission_Control_Protocol" target="_blank">TCP</a> protocollen worden <a href="http://www.i2p2.i2p/techintro.html#op.transport" target="_blank">ondersteund</a>), en <a href="http://www.i2p2.i2p/streaming.html" target="_blank">realtime streaming</a> behoort ook tot de mogelijkheden. Ook bieden we volledige toegang tot de <a href="http://docs.i2p2.de/javadoc/" target="_blank">op Java gebaseerde API</a>.</li> + +<li class="tidylist"><b>Forums & Blogging</b><br>Als je opzoek bent om je eigen blog of forum te draaien ben je misschien geïnteresseerd in <a href="http://syndie.i2p2.de/" target="_blank">Syndie</a>, een distributed forum en blogging platform voor I2P [Ontwikkelaars gezocht!]. Er is ook een I2P plugin van het op Java gebaseerde <a href="http://pebble.sourceforge.net/" target="_blank">pebble</a> blogging platform geport naar I2P door zzz, beschikbaar op <a href="http://i2plugins.i2p/" target="_blank">i2plugins.i2p</a>. En, natuurlijk zullen alle normale blogging, forum en CMS software werken op I2P, wel word je geadviseerd extra veiligheidsmaatregelen te nemen bij het opzetten en alle gerelateerde software (bijv. PHP, MySQL, Python, Apache) up-to-date te houden en goed beveiligd! Ook zijn er reeds een aantal forums op I2P in verschillende talen; zie <a href="#eepsites">hier onder</a> voor enkele suggesties.</li> + +<li class="tidylist"><a name="plugins"></a><b>Plugins voor I2P</b><br>Breid de gebruiks mogelijkheden van I2P uit door het installeren van plugins … blogging, chatting, file sharing en andere plugins zijn al geschreven of geport en wachten op <a href="http://i2plugins.i2p/plugins/" target="_blank">installatie</a>! Surf naar de plugins en gerelateerde info op <a href="http://i2plugins.i2p/" target="_blank">i2plugins.i2p</a>. Als je een <a href="http://i2plugins.i2p/developers/" target="_blank">ontwikkelaar</a> bent is er een compleet taal-agnostisch framework beschikbaar voor het schrijven van eigen plugins, geleverd met <a href="http://www.i2p2.i2p/plugins.html" target="_blank">documentatie</a>; I2P plugins kunnen geprogrammeerd worden in elke taal.</li> </ul> -<h2>Wil je je eigen eepsite?</h2> - -<p>We hebben aan I2P software toegevoegd om je je eigen eepsite te laten hosten - een -<a href="http://jetty.mortbay.org/">Jetty</a> webserver, die luistert op -<a href="http://127.0.0.1:7658/">http://127.0.0.1:7658/</a>. Plaats gewoonweg je bestanden in -de <code>eepsite/docroot/</code> map (of plaats standaard JSP/Servlet <code>.war</code> -bestanden onder <code>eepsite/webapps</code>, of standaard CGI scripts onder <code>eepsite/cgi-bin</code>) -en ze zullen verschijnen. Na een <a href="/i2ptunnel/">eepsite tunnel</a> opgestart te hebben die er naar wijst, -zal je eepsite zichtbaar zijn voor anderen. -Gedetailleerde instructies voor het starten van je eepsite staan op -<a href="http://127.0.0.1:7658/">je tijdelijke eepsite-pagina</a>. -</p> - -<h2><a name="trouble">Problemen</a></h2> - -<p>Wees geduldig - I2P kan wat langzaam zijn bij het opstarten, omdat het nog andere gebruikers zoekt. -Als, na 30 minuten, je Active: (Actieve) verbonden/recent verbonden aantallen lager zijn dan 10 verbonden gebruikers, -zou je best poort 8887 op je firewall openen voor een betere verbinding. -Als je in het geheel geen eepsites kan zien (zelfs <a href="http://www.i2p2.i2p/">www.i2p2.i2p</a> niet), -controleer dan nog eens of de proxy van je browser op 127.0.0.1 poort 4444 staat. -Je zou best ook de informatie controleren op de -<a href="http://www.i2p2.i2p/">I2P website</a>, of plaats een bericht op het -<a href="http://forum.i2p/">I2P discussie forum</a>, of kom langs bij - <a href="irc://127.0.0.1:6668/i2p-help">#i2p-help</a>, <a href="irc://127.0.0.1:6668/i2p-nl">#i2p-nl</a>, <a href="irc://127.0.0.1:6668/i2p">#i2p</a> of <a href="irc://127.0.0.1:6668/i2p-chat">#i2p-chat</a> - op IRC bij de kanalen <a href="irc://irc.freenode.net/#i2p">irc.freenode.net</a>, irc.postman.i2p of irc.freshcoffee.i2p (ze linken allemaal door naar elkaar).</p><hr /> +<h3>Anoniem en versleutelde Web Hosting op I2P</h3> +<ul class="links"> + +<li class="tidylist"><b>Ready to Roll!</b><br> I2P komt met een ingebouwde, ready-to-go web server voor het hosten van je eigen anonieme website (eepsite) op het I2P netwerk: een <a href="http://jetty.mortbay.org/" target="_blank">Jetty</a> server die luistert op <a href="http://127.0.0.1:7658/" target="_blank">http://127.0.0.1:7658/</a>. Om je eigen inhoud te hosten plaats je simpelweg alle bestanden in de <code>eepsite/docroot/</code> directory (of plaats elke standaard JSP/Servlet .war bestanden onder <code>eepsite/webapps</code>, + of standaard CGI scripts onder <code>eepsite/cgi-bin</code>) en ze zullen zichtbaar zijn. + Je kan ook een alternatief webserver platform voor I2P gebruiken om de ingebouwde server te vervangen of te draaien op een andere tunnel.</li> +<li class="tidylist"><b>Start je Tunnel</b><br> + Na het starten van de vooraf ingestelde <a href="/i2ptunnel/" target="_blank">I2P Webserver Tunnel</a>, + zal je eepsite zichtbaar zijn (maar niet vindbaar) voor anderen. Gedetaïlleerde instructies voor het starten van je eepsite, het registreren van een.i2p domein en promotie van je website aan anderen zijn toegankelijk via je eigen I2P webserver op <a href="http://127.0.0.1:7658/help/" target="_blank">http://127.0.0.1:7658/help/</a>.</li></ul> + +<a name="eepsites"></a> + <h3>I2P-Hosted Sites of Interest</h3> + <ul class="links"> + <li class="tidylist"><b>Invisible Internet Project (I2P) Officiële Website</b><br><a href="http://www.i2p2.i2p/" target="_blank">www.i2p2.i2p</a> en + de mirror <a href="http://i2p-projekt.i2p/" target="_blank">i2p-projekt.i2p</a>: Veilige en + anonieme verbindingen naar <a href="http://www.i2p2.de/" target="_blank">www.i2p2.de</a>. Er is ook een officiële mirror actief op <a href="http://geti2p.net/" target="_blank">geti2p.net</a>. Als je meer wilt weten over hoe I2P werkt of hoe je mee kan doen is dit de website waar je terecht kan!</li> + <li class="tidylist"><b>I2P Community Forums</b><br><a href="http://forum.i2p/" target="_blank">forum.i2p</a>: Een veilige + en anonieme verbinding naar <a href="http://forum.i2p2.de/" target="_blank">forum.i2p2.de</a>, een online forum waar ontwikkelaars en gebruikers problemen bespreken en ideëen uitwisselen gerelateerd aan I2P en geassocieerde onderwerpen, en <a href="http://zzz.i2p/" target="_blank">zzz's developer forums</a> voor zowel ontwikkelaars als eindgebruikers.</li> + <li class="tidylist"><b>I2P Anonieme Pastebin</b><br><a href="http://paste.i2p2.i2p/" target="_blank">paste.i2p2.i2p</a>: Veilige en + anonieme paste dienst die het anoniem delen van tekst en tekst-based code over I2P.</li> + <li class="tidylist"><b>Echelon's I2P Resources</b><br><a href="http://echelon.i2p/" target="_blank">echelon.i2p</a>: I2P software + archief met broncode (waar toegestaan), informatie over I2P, inclusief een <a href="http://echelon.i2p/I2Pguide/index.html" target="_blank">beginner's guide</a> en pre-release ontwikkelaars versies van I2P voor de avonturiers om te proberen.</li> + <li class="tidylist"><b>Ugha's Wiki</b><br><a href="http://ugha.i2p/" target="_blank">ugha.i2p</a>: Een open wiki die iedereen kan bewerken met veel informatie over I2P, help voor beginners en meer links voor het I2P netwerk en meer.</li> + <li class="tidylist"><b>I2P-to-Freenet Proxy</b><br><a href="http://fproxy.tino.i2p/" target="_blank">fproxy.tino.i2p</a>: + Neem een kijkje in de wereld van het <a href="http://freenetproject.org/" target="_blank">Freenet</a> netwerk met Tino's I2P-to-Freenet proxy.</li> + <li class="tidylist"><b>The Planet (on I2P)</b><br><a href="http://planet.i2p/" target="_blank">planet.i2p</a>: Een RSS aggregator site die nieuwswaardigheden en evenementen rondom I2P verzamelt en publiceerd in één plek. Een goede site om te bezoeken om de community aan het werk te zien!</li> + <li class="tidylist"><b>Eepsite Search Engine</b><br><a href="http://eepsites.i2p/" target="_blank">eepsites.i2p</a>: Een + anonieme zoek machine.</li> + <li class="tidylist"><b>I2P Network Health</b><br><a href="http://stats.i2p/cgi-bin/dashboard.cgi" target="_blank">stats.i2p</a>: Bekijk verschillende aspecten van het netwerk en de prestaties met deze I2P netwerk monitor site, gedraaid door zzz.</li> + <li class="tidylist"><b>Discover I2P</b><br>Er zijn nog vele andere eepsites, volg eenvoudig de links van diegene die je ziet en sla je favorieten op en bezoek ze regelmatig!<br></li> + </ul> + +<h2>Problemen oplossen & Verdere hulp</h2><a name="trouble"></a> + <ul class="links"> + <li class="tidylist"><b>Wees geduldig!</b><br>I2P is mogelijk langzaam met het integreren in het netwerk als je deze de eerste keer start, de router probeert nu meerdere peers te vinden. Hoe langer de I2P router actief is, hoe beter de prestaties zullen worden, probeer dus de router zo lang mogelijk aan te laten, 24 uur per dag indien mogelijk! Als, na 30 minuten, je <i>Actieve: [connected/recent]</i> teller nogsteeds minder dan 10 peers heeft, of het totaal nummer van <i>Geintegreerde</i> peers minder is dan 5, zijn er verschillende dingen die je kan controleren op problemen: + </li> + + <li class="tidylist"><b>Controleer je configuratie & Bandbreedte toewijzing</b><br>I2P functioneert het beste als je nauwkeurig de snelheid van je netwerk in het <a href="/config">bandbreedte configuratie gedeelte</a>. Standaard is I2P ingesteld op redelijk conservatieve waarden die veelal niet representatief zijn voor de meeste verbindingen, dus neem de tijd om deze instellingen juist aan te passen waar nodig. Hoe meer bandbreedte je toewijst, <i>specifiek</i> upstream bandbreedte, hoe meer je voordeel zult behalen van het netwerk. + </li> + + <li class="tidylist"><b>Firewalls, Modems & Routers</b><br>Waar mogelijk, controleer dat I2P/Java toegestaan is wederzijds poort toegang van het Internet heeft door het correct instellen van de modem/router/firewall. +Als je achter een verbiedende firewall zit maar wel onbeperkt uitgaande toegang, kan I2P alsnog functioneren; je kan inbound toegang uit zetten en vertrouwen op <a href="http://www.i2p2.i2p/udp.html" target="_blank">SSU IP Address Detection</a> (<a href="https://secure.wikimedia.org/wikipedia/en/wiki/Hole_punching" target="_blank">firewall hole punching</a>) om verbinding te maken naar het netwerk, je netwerk status in het zijpaneel zal nu aangeven "Netwerk: Firewalled". Voor optimale prestaties, zorg er voor dat I2P's <a href="/config">extere poort</a> zichtbaar is vanaf het Internet (zie hier onder voor meer informatie).</li> + + <li class="tidylist"><b>Controleer je proxy instellingen</b><br>Als + je helemaal geen eepsites kan zien (zelfs niet <a href="http://www.i2p2.i2p/" target="_blank">www.i2p2.i2p</a>), + zorg er dan voor dat je browser's proxy is ingesteld op http proxy (<i>niet</i> https, <i>niet</i> socks) via <code>127.0.0.1 poort 4444</code>. Als je hulp nodig hebt is er een <a href="http://www.i2p2.i2p/htproxyports.html" target="_blank">handleiding</a> voor het configureren van je browser voor gebruik met I2P, ook <a href="http://www.i2p2.de/htproxyports.html" target="_blank">beschikbaar</a> op het normale Internet. </li> + + <li class="tidylist"><b>Controleer je Logs</b><br><a href="/logs">Logs</a> kunnen je helpen met problemen oplossen. Je kan mogelijk fragmenten in een <a href="http://forum.i2p/viewforum.php?f=10" target="_blank">forum</a> posten voor hulp, of misschien <a href="http://paste.i2p2.i2p/" target="_blank">plakken</a> en als referentie link laten zien op IRC voor hulp.</li> + <li class="tidylist"><b>Verifieer dat Java up-to-date is</b><br>Zorg er voor dat Java up-to-date is [versie 1.6 aanbevolen en vereist voor sommige functies]. Als je geen Java geinstalleerd hebt wil je waarschijnlijk een implementatie van de JRE (<a href="https://secure.wikimedia.org/wikipedia/en/wiki/JRE" target="_blank">Java Runtime Environment</a>); als je een ontwikkelaar bent is de <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Java_SDK" target="_blank">SDK</a> mogelijk ook interessant, en misschien <a href="http://ant.apache.org/" target="_blank">Apache Ant</a> die we gebruiken om de I2P Java binaries te compileren. + </li> + + <li class="tidylist"><b>Problemen met draaien op verouderde hardware</b><br>[Linux/Unix/Solaris] Als je de router niet kan starten met <code>i2p/i2prouter start</code> probeer het <code>runplain.sh</code> script in de zelfde directory. Root rechten zijn normaliter niet vereist voor het draaien van I2P. Als je de <a href="http://www.i2p2.i2p/jbigi.html" target="_blank">jBigi library</a> moet compileren (welke in zeldzame gevallen nodig is), raadpleeg de bijhorende documentatie, bezoek het forum of kom eens langs op ons <a href="irc://127.0.0.1:6668/i2p-dev">IRC developer kanaal</a>. + + <li class="tidylist"><b>Inschakelen Universal Plug and Play (UPnP)</b><br>Mogelijk ondersteunt je modem of router <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Universal_Plug_and_Play" target="_blank">Universal Plug & Play</a> (UPnP), welke automatische port-forwarding verzorgt. Zorg er voor dat UPnP ondersteuning voor I2P is aangezet op de <a href="/config">configuratie pagina</a>, probeer daarna ook UPnP op je modem/router in te schakelen en eventueel ook op de computer. Herstart nu de <a href="/">I2P router</a>. Als dit succesvol lukt zal I2P de status "Network: OK" weergeven in het zijpaneel als de eerste verbindings tests gelukt zijn. + </li> + <li class="tidylist"><b>Port Forwarding</b><br>Open <a href="/config">I2P's poort</a> op je modem, router en/of firewall(s) voor betere connectiviteit (bij voorkeur zowel UDP als TCP). Meer informatie over portforwarding kan gevonden worden op <a href="http://portforward.com/" target="_blank">portforward.com</a>, in toevoeging tot ons forum en IRC kanalen hier onder vermeld. Merk op dat I2P geen ondersteuning bied voor Internet toegang via http en socks proxy [patches welkom!]. + </li> + <li class="tidylist"><b>Online support</b><br>Mogelijk wil je ook + de informatie bekijken op de <a href="http://www.i2p2.i2p/" target="_blank">I2P website</a>, + berichten plaatsen op het <a href="http://forum.i2p2.i2p/" target="_blank">I2P discussion forum</a>, + of langs komen in + <a href="irc://127.0.0.1:6668/i2p-help">#i2p-help</a>, <a href="irc://127.0.0.1:6668/i2p">#i2p</a> or <a href="irc://127.0.0.1:6668/i2p-chat">#i2p-chat</a> op I2P's Internet IRC netwerk (<code>irc.postman.i2p</code> or <code>irc.freshcoffee.i2p</code>). Deze kanalen zijn tevens beschikbaar buiten I2P's anonieme versleutelde netwerk via <a href="irc://irc.freenode.net/i2p">Freenode IRC</a>.</li> + +<li class="tidylist"><b>Bugs melden</b><br>Als je een bug wil melden, maak een ticket aan op <a href="http://trac.i2p2.i2p/" target="_blank">trac.i2p2.i2p</a>. Voor ontwikkelaar-gerelateerde discussies, bezoek <a href="http://zzz.i2p/" target="_blank">zzz's developer forums</a> of bezoek het <a href="irc://127.0.0.1:6668/i2p-dev">developer kanaal</a> op I2P's IRC netwerk. Ontwikkelaars kunnen de broncode doorbladeren op <a href="http://stats.i2p/cgi-bin/viewmtn/" target="_blank">zzz's mtn repository viewer</a>, <a href="http://i2host.i2p/cgi-bin/view/branch/changes/i2p.i2p" target="_blank">Sponge's instance</a>, of via <a href="http://trac.i2p2.i2p/browser" target="_blank">trac.i2p2.i2p</a>. We gebruiken hoofdzakelijk <a href="http://www.i2p2.i2p/monotone.html" target="_blank">monotone</a> om de broncode bij te beheren.</li> + +<li class="tidylist"><b>Raak betrokken!</b><br>I2P word ontwikkeld en onderhouden door hoofdzakelijk ongefinancierde en vrijwillige community leden. We accepteren graag <a href="http://www.i2p2.i2p/donate.html" target="_blank">donaties</a>, welke zullen besteed aan essentiele hosting en administratie kosten. We hebben <a href="http://www.i2p2.i2p/bounties.html" target="_blank">contante beloningen</a> voor aspecten van I2P voor ontwikkelaars welke graag mee willen ontwikkelen, we zijn altijd opzoek naar meer <a href="http://www.i2p2.i2p/newdevelopers.html" target="_blank">Java coders</a>, <a href="http://www.i2p2.i2p/newtranslators.html" target="_blank">vertalers</a>, promoters en gebruikers om I2P te helpen groeien. Hoe groter het I2P netwerk, hoe meer iedereen van de voordelen profiteert, simpelweg al je vrienden vertellen over I2P en ze helpen het te installeren is al een grote hulp. Voor meer informatie over hoe je betrokken kan raken, bezoek de <a href="http://www.i2p2.i2p/getinvolved.html" target="_blank">vrijwilligers pagina</a> op de website.</li> +</ul><div class="topness"><a href="#top">[Naar Boven]</a></div> +<div class="footnote"><hr>Document geupdate: December 2010</div> </div> diff --git a/installer/resources/readme/readme_pt.html b/installer/resources/readme/readme_pt.html index 333ae6ba4cb0a3201e593cec209323b615110486..6522ea8a94a225188ec5a077313e2cb7e1e84866 100644 --- a/installer/resources/readme/readme_pt.html +++ b/installer/resources/readme/readme_pt.html @@ -1,17 +1,5 @@ <div lang="pt"> -<div align="right"> -<div class="langbox" align="right"> - <a href="/index.jsp?lang=en"><img src="/flags.jsp?c=us" title="English" alt="English"></a> - <a href="/index.jsp?lang=zh"><img src="/flags.jsp?c=cn" title="ä¸æ–‡" alt="ä¸æ–‡"></a> - <a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a> - <a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Français" alt="Français"></a> - <a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Español" alt="Español"></a> - <a href="/index.jsp?lang=pt"><img src="/flags.jsp?c=pt" title="Português" alt="Português"></a> - <a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a> - <a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="РуÑÑкий" alt="РуÑÑкий"></a> - <a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div> -</div></div> -<div class="welcome"><h2>Bem-vindo a I2P!</h2></div> + <p>Se você acaba de iniciar I2P, os números à esquerda ao lado de "Active:" deberiam subir nos seguintes minutos e logo lá verá uma Destinação chamada "shared clients". (se não, <a href="#trouble">veija embaixo!</a>) <br>Assim que apareça isto, você pode:</p> <ul> <li><b>visitar páginas I2P ("Eepsites")</b> - Na rede I2P tem páginas web anônimas: @@ -26,8 +14,7 @@ <li><a href="http://echelon.i2p">echelon.i2p</a>: arquivo de software e informações sobre I2P (com aplicações de BitTorrent, iMule, I2PFox, I2P-Messenger, ...)</li> <li><a href="http://paste.i2p2.i2p">paste.i2p2.i2p</a>: pastebin anônimo</li> </ul><br /> - Ha muitas mais páginas I2P - simplesmente segue os links que encontre, ponhe marcadores para os seus favoritos e visíte-los freqüentemente!</ - li><br /> + Ha muitas mais páginas I2P - simplesmente segue os links que encontre, ponhe marcadores para os seus favoritos e visíte-los freqüentemente!</li> <li class="tidylist"><b>navegar na internet</b> - I2P dispõe de um "outproxy" http - para usâ-lo, também pode empregar o proxy http no porto 4444 - Se configurar o seu navegador web para usar este proxy, pode visitar as páginas web de maneira anônima e o trânsito será roteado atravez da rede I2P.</li> <li class="tidylist"><b>trocar dados</b> - Ha uma <a href="i2psnark/">adaptação</a> para I2P da aplicação <a href="http://www.bittorrent.com/">BitTorrent</a> <a href="http://www.klomp.org/snark/">Snark</a>.</li> @@ -75,5 +62,5 @@ todos nos servidores irc.postman.i2p e irc.freshcoffee.i2p. (A ambos pode acessar baixo <a href="irc://localhost:6668">irc://localhost:6668</a>; os dois servidores estão conectados.) Se você ainda não tem acesso a I2P, também pode entrar em #i2p e #i2p-help do servidor <a href="irc://irc.freenode.net/#i2p">irc.freenode.net</a> - - mas então de forma não anônima.</p><hr /> + mas então de forma não anônima.</p> </div> diff --git a/installer/resources/readme/readme_ru.html b/installer/resources/readme/readme_ru.html index ffa8c435e4531d672ddf661e56bfc26cfb929fc7..85ebd6ca16d2d205a8611585ee590a272ea7bfc0 100644 --- a/installer/resources/readme/readme_ru.html +++ b/installer/resources/readme/readme_ru.html @@ -1,21 +1,7 @@ <div lang="ru"> -<div align="right"> - <div class="langbox" align="right"> - <a href="/index.jsp?lang=en"><img src="/flags.jsp?c=us" title="English" alt="English"></a> - <a href="/index.jsp?lang=zh"><img src="/flags.jsp?c=cn" title="ä¸æ–‡" alt="ä¸æ–‡"></a> - <a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a> - <a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Français" alt="Français"></a> - <a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Español" alt="Español"></a> - <a href="/index.jsp?lang=pt"><img src="/flags.jsp?c=pt" title="Português" alt="Português"></a> - <a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a> - <a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="РуÑÑкий" alt="РуÑÑкий"></a> - <a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div> - </div> -</div><a name="top"></a> -<div class="welcome"><h2>Добро пожаловать в Ðевидимый Интернет</h2></div> -<ul class="links"><li class="tidylist"><b>Ðачало…</b><br>ЕÑли вы только что запуÑтили I2P, чиÑло <i>Ðктивных пиров</i>, отображаемых под Ñекцией <i>Пиры</i> на боковой панели должно начать увеличиватьÑÑ Ñ‡ÐµÑ€ÐµÐ· неÑколько минут, и вы так же увидите <i>Локальный туннель</i> Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ <i>Коллективные Клиенты</i>, и, возможно, другие клиентÑкие и Ñерверные туннели в завиÑимоÑти от того, как наÑтроен I2P (еÑли нет, Ñмотрите Ñекцию по разрешению проблем <a href="#trouble">ниже</a>). Ðти <i>Локальные туннели</i> предоÑтавлÑÑŽÑ‚ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð½Ð° разных портах (и иногда разные протоколы) Ð´Ð»Ñ Ñети I2P, позволÑÑ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ вашим torrent, e-mail, прокÑи и другим ÑервиÑам. Ваша <a href="/netdb">База данных Ñети I2P</a> показывает вÑех извеÑтных роутеру пиров в Ñети. Больше информации доÑтупно на <a href="/help">Ñтранице помощи</a>.</li> -<li class="tidylist"><b>Ð¡ÐµÑ‚ÐµÐ²Ð°Ñ Ð¸Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ð¸Ñ</b><br> Когда вы впервые запуÑкаете I2P, Ñто может занÑÑ‚ÑŒ неÑколько минут, Ñ‚.к. роутер выполнÑет процедуру начальной загрузки (bootstrap) Ð´Ð»Ñ Ð¸Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ð¸Ð¸ в Ñеть и поиÑка пиров Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ð¸ интегрированноÑти. Будте терпеливы. Когда возле ваших <i>Локальных туннелей</i> загорÑÑ‚ÑÑ Ð·ÐµÐ»Ñ‘Ð½Ñ‹Ðµ звёздочки, вы Ñможете делать Ñ I2P разнообразные вещи, и ниже мы предÑтавим вам некоторые из них. </li></ul> +<ul class="links"><li class="tidylist"><b>Ðачало…</b><br>ЕÑли вы только что запуÑтили I2P, чиÑло <i>Ðктивных пиров</i>, отображаемых под Ñекцией <i>Пиры</i> на боковой панели должно начать увеличиватьÑÑ Ñ‡ÐµÑ€ÐµÐ· неÑколько минут, и вы так же увидите <i>Локальный туннель</i> Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ <i>Коллективные Клиенты</i>, и, возможно, другие клиентÑкие и Ñерверные туннели в завиÑимоÑти от того, как наÑтроен I2P (еÑли нет, Ñмотрите Ñекцию по разрешению проблем <a href="#trouble">ниже</a>). Ðти <i>Локальные туннели</i> предоÑтавлÑÑŽÑ‚ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð½Ð° разных портах (и иногда разные протоколы) Ð´Ð»Ñ Ñети I2P, позволÑÑ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ вашим torrent, e-mail, прокÑи и другим ÑервиÑам. Ваша <a href="/netdb">База данных Ñети I2P</a> показывает вÑех извеÑтных роутеру пиров в Ñети. Больше информации доÑтупно на <a href="/help">Ñтранице помощи</a>.</li> +<li class="tidylist"><b>Ð¡ÐµÑ‚ÐµÐ²Ð°Ñ Ð¸Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ð¸Ñ</b><br> Когда вы впервые запуÑкаете I2P, Ñто может занÑÑ‚ÑŒ неÑколько минут, Ñ‚.к. роутер выполнÑет процедуру начальной загрузки (bootstrap) Ð´Ð»Ñ Ð¸Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ð¸Ð¸ в Ñеть и поиÑка пиров Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ð¸ интегрированноÑти. Будте терпеливы. Когда I2P запуÑкаетÑÑ, и во Ð²Ñ€ÐµÐ¼Ñ Ð½Ð¾Ñ€Ð¼Ð°Ð»ÑŒÐ½Ð¾Ð¹ работы, индикатор готовноÑти к поÑтроению туннелей (прÑмо над Ñекцией <i>Локальные туннели</i> на боковой панели) может показывать "Ðе принимаем туннели"; Ñто нормальное поведение и не Ñтоит Ñлишком беÑпокоитьÑÑ. Когда возле ваших <i>Локальных туннелей</i> загорÑÑ‚ÑÑ Ð·ÐµÐ»Ñ‘Ð½Ñ‹Ðµ звёздочки, вы Ñможете делать Ñ I2P разнообразные вещи, и ниже мы предÑтавим вам некоторые из них. </li></ul> <h3>СервиÑÑ‹ в I2P</h3> <ul class="links"> @@ -25,7 +11,7 @@ <li class="tidylist"><b>ÐÐ½Ð¾Ð½Ð¸Ð¼Ð½Ð°Ñ ÑÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð°</b><br>ÐŸÐ¾Ñ‡Ñ‚Ð¾Ð²Ð°Ñ ÑиÑтема Postman-а, раÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð½Ð°Ñ Ð² I2P, доÑтупна через <a href="../../../../../../susimail/">вÑтроенный почтовый клиент Ñ Ð²ÐµÐ±-интерфейÑом</a> (susimail), либо через любой почтовый клиент, поддерживающий smtp и pop3. Пользователи ÑервиÑа могут отправлÑÑ‚ÑŒ и получать почту из обычного интернета. Ð”Ð»Ñ -Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð°ÐºÐºÐ°ÑƒÐ½Ñ‚Ð°, поÑетите <a href="http://hq.postman.i2p/" target="_blank">hq.postman.i2p</a>. Так же, доÑтупна <a href="http://i2pbote.i2p/" target="_blank">I2P-Bote</a> - Ð½Ð¾Ð²Ð°Ñ Ð±ÐµÐ·ÑÐµÑ€Ð²ÐµÑ€Ð½Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð¾Ð²Ð°Ñ ÑиÑтема Ñо Ñквозным шифрованием Ñ Ð²ÐµÐ±-интерфейÑом и вÑтроенной адреÑной книгой. Она разрабатываетÑÑ HungryHobo и может быть уÑтановлена как <a href="readme.html#plugins">плагин</a>.</li> +Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð°ÐºÐºÐ°ÑƒÐ½Ñ‚Ð°, поÑетите <a href="http://hq.postman.i2p/" target="_blank">hq.postman.i2p</a>. Так же, доÑтупна <a href="http://i2pbote.i2p/" target="_blank">I2P-Bote</a> - Ð½Ð¾Ð²Ð°Ñ Ð±ÐµÐ·ÑÐµÑ€Ð²ÐµÑ€Ð½Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð¾Ð²Ð°Ñ ÑиÑтема Ñо Ñквозным шифрованием Ñ Ð²ÐµÐ±-интерфейÑом и вÑтроенной адреÑной книгой. Она разрабатываетÑÑ HungryHobo и может быть уÑтановлена как <a href="#plugins">плагин</a>.</li> <li class="tidylist"><b>ÐÐ½Ð¾Ð½Ð¸Ð¼Ð½Ð°Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð° файлов</b><br><a href="/i2psnark" target="_blank">I2PSnark</a> - интегрированный в I2P <a href="https://secure.wikimedia.org/wikipedia/en/wiki/BitTorrent_%28protocol%29" target="_blank">торрент</a>-клиент, обеÑпечивающий анонимную и шифрованную передачу файлов. Помимо Ñтого, Sponge разрабатывает битторрент-клиент <a href="http://bob.i2p/Robert.html">Robert</a>, напиÑанный на Python. Так же имеетÑÑ Ð¿Ð¾Ñ€Ñ‚ <a href="http://www.emule-project.net/" target="_blank">eMule</a> Ð´Ð»Ñ I2P, именуемый <a href="http://echelon.i2p/imule">iMule</a> [нуждаетÑÑ Ð² разработчиках!]; Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½Ð°Ñ Ð¸ безопаÑÐ½Ð°Ñ Ñ€ÐµÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Gnutella" target="_blank">Gnutella network</a>, доÑÑ‚ÑƒÐ¿Ð½Ð°Ñ Ñ‡ÐµÑ€ÐµÐ· <a href="http://echelon.i2p/i2phex/" target="_blank">I2Phex</a> [поддерживаетÑÑ Complication-ом, ищутÑÑ Ñ€Ð°Ð·Ñ€Ð°Ð±Ð¾Ñ‚Ñ‡Ð¸ÐºÐ¸!], и прочие возможноÑти, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð²ÐµÐ±-обменники, Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼Ð¸ доÑтаточно только браузера.</li> @@ -34,7 +20,7 @@ <li class="tidylist"><b>Форумы и блоги</b><br>ЕÑли вы намереваетеÑÑŒ запуÑтить ÑобÑтвенный блог или форум, возможно вы заинтереÑуетеÑÑŒ <a href="http://syndie.i2p2.de/" target="_blank">Syndie</a>, раÑпределённой платформой Ð´Ð»Ñ Ñ„Ð¾Ñ€ÑƒÐ¼Ð° или Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð±Ð»Ð¾Ð³Ð° в I2P [нужны разработчики!]. Ещё еÑÑ‚ÑŒ порт <a href="http://pebble.sourceforge.net/" target="_blank">pebble</a> - напиÑанной на Java блоггинг-платформы, выполненный zzz в виде плагина Ð´Ð»Ñ I2P, доÑтупен на <a href="http://i2plugins.i2p" target="_blank">i2plugins.i2p</a>. И, конечно, вÑе обычные блоги, форумы и CMS будут работать через I2P, но будте аккуратны при их наÑтройке, уделите должное внимание безопаÑноÑти, в том чиÑле и ÑвÑзанному Ñофту (php, MySQL, Python, Apache и Ñ‚.д.). Так же, в I2P еÑÑ‚ÑŒ неÑколько форумов на разных Ñзыках, поддерживаемых ÑообщеÑтвом; <a href="#eepsites">ниже</a> имеетÑÑ Ð½ÐµÑколько ÑÑылок.</li> - <a name="plugins"></a><li class="tidylist"><b>Плагины Ð´Ð»Ñ I2P</b><br>ПовыÑьте полезноÑÑ‚ÑŒ I2P уÑтановив плагины… блоггинг, чат, обмен файлами и другие плагины уже были напиÑаны или портированы и ждут когда вы их <a href="http://i2plugins.i2p/plugins/" target="_blank">уÑтановите</a>! Смотрите плагины и ÑопутÑтвующую информацию на <a href="http://i2plugins.i2p" target="_blank">i2plugins.i2p</a>. ЕÑли вы <a href="http://i2plugins.i2p/developers/" target="_blank">программиÑÑ‚</a>, полный ÑзыконезавиÑимый фреймворк Ð´Ð»Ñ Ð½Ð°Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð¾Ð² доÑтупен и <a href="http://www.i2p2.i2p/plugins.html" target="_blank">документирован</a>; I2P плагины могут быть напиÑаны на любом Ñзыке.</li> + <li class="tidylist"><a name="plugins"></a><b>Плагины Ð´Ð»Ñ I2P</b><br>ПовыÑьте полезноÑÑ‚ÑŒ I2P уÑтановив плагины… блоггинг, чат, обмен файлами и другие плагины уже были напиÑаны или портированы и ждут когда вы их <a href="http://i2plugins.i2p/plugins/" target="_blank">уÑтановите</a>! Смотрите плагины и ÑопутÑтвующую информацию на <a href="http://i2plugins.i2p" target="_blank">i2plugins.i2p</a>. ЕÑли вы <a href="http://i2plugins.i2p/developers/" target="_blank">программиÑÑ‚</a>, полный ÑзыконезавиÑимый фреймворк Ð´Ð»Ñ Ð½Ð°Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð¾Ð² доÑтупен и <a href="http://www.i2p2.i2p/plugins.html" target="_blank">документирован</a>; I2P плагины могут быть напиÑаны на любом Ñзыке.</li> </ul> <h3>Ðнонимный шифрованный веб-хоÑтинг в I2P</h3> @@ -89,7 +75,7 @@ <li class="tidylist"><b>Проверьте логи</b><br><a href="/logs">Логи</a> могут помочь решить проблему. У Ð²Ð°Ñ Ð¼Ð¾Ð¶ÐµÑ‚ возникнуть желание запоÑтить чаÑÑ‚ÑŒ логов на <a href="http://forum.i2p/viewforum.php?f=10" target="_blank">форум</a>, чтобы получить помощь, или, может быть, на <a href="http://paste.i2p2.i2p" target="_blank">pastebin</a>, чтобы дать ÑÑылку на IRC.</li> - <li class="tidylist"><b>Проверьте ÑвежеÑÑ‚ÑŒ Java</b><br>УбедитеÑÑŒ, что у Ð²Ð°Ñ Ð´Ð¾Ñтаточно ÑÐ²ÐµÐ¶Ð°Ñ Java [верÑÐ¸Ñ 1.6 рекомендуетÑÑ Ð¸ необходима Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… возможноÑтей]. ЕÑли у Ð²Ð°Ñ Ð½Ðµ уÑтановлена Java, Ñкорее вÑего, вам требуетÑÑ ÐºÐ°ÐºÐ°Ñ-нибудь Ñ€ÐµÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ JRE (<a href="https://secure.wikimedia.org/wikipedia/en/wiki/JRE" target="_blank">Java Runtime Engine</a>); еÑли вы программиÑÑ‚, <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Java_SDK" target="_blank">SDK</a> так же может быть интереÑен, и, возможно, <a href="http://ant.apache.org/" target="_blank">Apache Ant</a>, который мы иÑпользуем Ð´Ð»Ñ Ñборки бинарников I2P. + <li class="tidylist"><b>Проверьте ÑвежеÑÑ‚ÑŒ Java</b><br>УбедитеÑÑŒ, что у Ð²Ð°Ñ Ð´Ð¾Ñтаточно ÑÐ²ÐµÐ¶Ð°Ñ Java [верÑÐ¸Ñ 1.6 рекомендуетÑÑ Ð¸ необходима Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… возможноÑтей]. ЕÑли у Ð²Ð°Ñ Ð½Ðµ уÑтановлена Java, Ñкорее вÑего, вам требуетÑÑ ÐºÐ°ÐºÐ°Ñ-нибудь Ñ€ÐµÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ JRE (<a href="https://secure.wikimedia.org/wikipedia/en/wiki/JRE" target="_blank">Java Runtime Environment</a>); еÑли вы программиÑÑ‚, <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Java_SDK" target="_blank">SDK</a> так же может быть интереÑен, и, возможно, <a href="http://ant.apache.org/" target="_blank">Apache Ant</a>, который мы иÑпользуем Ð´Ð»Ñ Ñборки бинарников I2P. </li> <li class="tidylist"><b>Проблемы иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð° уÑтаревшем железе</b><br>[Linux/Unix/Solaris] ЕÑли вы не можете запуÑтить роутер Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ <code>i2p/i2prouter start</code>, попробуйте воÑпользоватьÑÑ Ñкриптом <code>runplain.sh</code>, который находитÑÑ Ð² той же директории. Root-привилегии обычно не требуютÑÑ Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка I2P. ЕÑли вам нужно Ñкомпилировать <a href="http://www.i2p2.i2p/jbigi.html" target="_blank">библиотеку jBigi</a> (что необходимо в редких ÑлучаÑÑ…), изучите ÑоответÑтвующую документацию, поÑетите форумы, или приходите на наш <a href="irc://127.0.0.1:6668/i2p-dev">IRC-канал Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€Ð°Ð±Ð¾Ñ‚Ñ‡Ð¸ÐºÐ¾Ð²</a>. @@ -109,3 +95,4 @@ <li class="tidylist"><b>ВовлекайтеÑÑŒ!</b><br>I2P разрабатываетÑÑ Ð¸ ÑопровождаетÑÑ Ð² оÑновном за Ñчёт неоплачиваемого, добровольного учаÑÑ‚Ð¸Ñ Ñ‡Ð»ÐµÐ½Ð¾Ð² ÑообщеÑтва. Мы рады принимать <a href="http://www.i2p2.i2p/donate.html" target="_blank">пожертвованиÑ</a>, которые идут на необходимые админиÑтративные затраты и хоÑтинг. Ð”Ð»Ñ Ñ€Ð°Ð·Ñ€Ð°Ð±Ð¾Ñ‚Ñ‡Ð¸ÐºÐ¾Ð², ищущих материальные Ñтимулы, у Ð½Ð°Ñ ÐµÑÑ‚ÑŒ <a href="http://www.i2p2.i2p/bounties.html" target="_blank">денежные премии</a> за работу над некоторыми аÑпектами I2P, и мы вÑегда ищем <a href="http://www.i2p2.i2p/newdevelopers.html" target="_blank">Java программиÑтов</a>, <a href="http://www.i2p2.i2p/newtranslators.html" target="_blank">переводчиков</a>, популÑризаторов и пользователей, помогающих I2P раÑширÑÑ‚ÑŒÑÑ. Чем больше I2P-Ñеть, тем больше Ð¾Ð±Ñ‰Ð°Ñ Ð²Ñ‹Ð³Ð¾Ð´Ð°, поÑтому проÑтой раÑÑказ об I2P Ñвоим друзьÑм (и помощь Ñ ÑƒÑтановкой и наÑтройкой еÑли нужно) - уже Ð±Ð¾Ð»ÑŒÑˆÐ°Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒ. Ð”Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð´Ð°Ð»ÑŒÐ½ÐµÐ¹ÑˆÐµÐ¹ информации о том, как вы можете принÑÑ‚ÑŒ учаÑтие, поÑетите <a href="http://www.i2p2.i2p/getinvolved.html" target="_blank">Ñтраницу Ð´Ð»Ñ Ð´Ð¾Ð±Ñ€Ð¾Ð²Ð¾Ð»ÑŒÑ†ÐµÐ²</a> на официальном Ñайте.</li> </ul><div class="topness"><a href="#top">[Ðаверх]</a></div> <div class="footnote"><hr>Документ обновлён: декабрь 2010.</div> +</div> diff --git a/installer/resources/readme/readme_sv.html b/installer/resources/readme/readme_sv.html index e5c3b9ecdd72b2dd4fc42c7cdf301ec3a4c44fc6..64beb5882618a600976b379ae58d176178d26555 100644 --- a/installer/resources/readme/readme_sv.html +++ b/installer/resources/readme/readme_sv.html @@ -1,17 +1,5 @@ <div lang="sv"> -<div align="right"> -<div class="langbox" align="right"> - <a href="/index.jsp?lang=en"><img src="/flags.jsp?c=us" title="English" alt="English"></a> - <a href="/index.jsp?lang=zh"><img src="/flags.jsp?c=cn" title="ä¸æ–‡" alt="ä¸æ–‡"></a> - <a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a> - <a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Français" alt="Français"></a> - <a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Español" alt="Español"></a> - <a href="/index.jsp?lang=pt"><img src="/flags.jsp?c=pt" title="Português" alt="Português"></a> - <a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a> - <a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="РуÑÑкий" alt="РуÑÑкий"></a> - <a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div> -</div></div> -<div class="welcome"><h2>Welcome to I2P!</h2></div> + <p>Om du just har startat I2P kommer de "Aktiva: #/#" börja öka inom några få minuter och du kommer se en destination kallad "delade klienter" på den vänstra listan (om inte <a href="#trouble">se @@ -38,7 +26,7 @@ Freenet proxy</li> <li><a href="http://paste.i2p2.i2p">paste.i2p2.i2p</a>: anonym och säker pastebin</li> </ul><br> Det finns många fler eepsidor - följ bara länkarna från dom du ser, - spara dina favoriter och besök dom ofta!</li><br> + spara dina favoriter och besök dom ofta!</li> <li><b>surfa på nätet</b> - det finns för närvarande en "utproxy" i I2P som är ansluten till din egen HTTP proxt på port 4444 - ställ helt enkelt in din @@ -105,5 +93,5 @@ förbi <a href="irc://127.0.0.1:6668/i2p-help">#i2p-help</a>, <a href="irc://127.0.0.1:6668/i2p">#i2p</a> eller <a href="irc://127.0.0.1:6668/i2p-chat">#i2p-chat</a> på IRC pÃ¥ <a href="irc://irc.freenode.net/#i2p">irc.freenode.net</a>, irc.postman.i2p -eller irc.freshcoffee.i2p (de är alla sammankopplade).</p><hr /> +eller irc.freshcoffee.i2p (de är alla sammankopplade).</p> </div> diff --git a/installer/resources/readme/readme_zh.html b/installer/resources/readme/readme_zh.html index 8e2d7968fa0e7e07b90c84fb795005425c57a771..bc083dc8179af053492eff100f712b8c5ef517bd 100644 --- a/installer/resources/readme/readme_zh.html +++ b/installer/resources/readme/readme_zh.html @@ -1,15 +1,5 @@ <div lang="zh"> -<div align="right"> - <div class="langbox" align="right"><a href="/index.jsp?lang=en"><img src="/flags.jsp?c=us" title="English" alt="English"></a> - <a href="/index.jsp?lang=zh"><img src="/flags.jsp?c=cn" title="ä¸æ–‡" alt="ä¸æ–‡"></a> - <a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a> - <a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Français" alt="Français"></a> - <a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Español" alt="Español"></a> - <a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a> - <a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="РуÑÑкий" alt="РуÑÑкий"></a> - <a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div> -</div></div> -<div class="welcome"><h2>欢迎使用 I2P!</h2></div> + <p>I2P è¿è¡ŒåŽçš„å‡ åˆ†é’Ÿé‡ŒæŽ§åˆ¶å°å·¦ä¾§çš„ã€æ´»åŠ¨èŠ‚点】数é‡ä¼šé€æ¸å¢žåŠ , <b>在ã€æœ¬åœ°ç›®æ ‡ã€‘ä¸å‡ºçŽ°ã€å…±äº«å®¢æˆ·ç«¯ã€‘åŽï¼Œè¡¨ç¤ºI2P已建立连接</b>(æ²¡æœ‰å‡ºçŽ°ï¼Ÿè§ <a href="#trouble">疑难解ç”</a>)。 然åŽæ‚¨å¯ä»¥ï¼š</p> @@ -23,7 +13,7 @@ <li><a href="http://echelon.i2p/">echelon.i2p</a>:软件å˜æ¡£åŠæœ‰å…³I2P的相关文档 (例如 I2P Messenger 基于I2P的匿åèŠå¤©å·¥å…·ç‰) </li> <li><a href="http://paste.i2p2.i2p/">paste.i2p2.i2p</a>:安全匿å的公共剪贴æ¿</li> </ul> <br> - I2P网络ä¸è¿˜æœ‰å¾ˆå¤šå…¶ä»–站点 - 访问上é¢çš„ç½‘ç«™ä½ ä¼šæ‰¾åˆ°æ›´å¤šï¼Œåˆ«å¿˜äº†æ”¶è—ä½ å–œçˆ±çš„ I2P 网站方便访问。</li><br> + I2P网络ä¸è¿˜æœ‰å¾ˆå¤šå…¶ä»–站点 - 访问上é¢çš„ç½‘ç«™ä½ ä¼šæ‰¾åˆ°æ›´å¤šï¼Œåˆ«å¿˜äº†æ”¶è—ä½ å–œçˆ±çš„ I2P 网站方便访问。<br> <li><b>æµè§ˆ Web 网页</b> - ç›®å‰ IP2 网络ä¸çš„出å£ä»£ç†("Outproxy")åªæœ‰ä¸€ä¸ªï¼Œå®ƒçš„HTTP代ç†æ˜ 射在本机的4444端å£ä¸Šã€‚- å°†æµè§ˆå™¨çš„代ç†è®¾ç½®æŒ‡å‘为上述地å€(127.0.0.1:4444)åŽï¼Œè®¿é—®ä»»ä½•æ™®é€šé“¾æŽ¥å³å¯ - 您的HTTP请求将在 I2P ç½‘ç»œå†…éƒ¨ä¼ é€’ã€‚</li> <li><b>文件交æ¢</b> - I2Pçš„å…¶ä¸ä¸€ä¸ªæœ¬åœ° <a href="/i2psnark">端å£</a> 用于内置的 <a href="http://www.klomp.org/snark/">Snark</a> <a href="http://www.bittorrent.com/">BitTorrent</a> 客户端。</li> <li><b>匿å电邮</b> - ç”±POSTMAN维护的邮件系统支æŒæ™®é€šé‚®ä»¶å®¢æˆ·ç«¯(POP3 / SMTP),这个系统å¯ä»¥åœ¨ I2P ç½‘ç»œå†…éƒ¨æ”¶å‘ Email 也å¯ä»¥æ”¶å‘æ¥è‡ªå¤–部 Internet 的邮件ï¼å»ºç«‹I2P邮件å¸æˆ·è¯·åˆ° <a href="http://hq.postman.i2p/">hq.postman.i2p</a> 申请。I2Pä¸é›†æˆæœ‰Webç•Œé¢çš„pop3/stmp邮件客户端 <a href="/susimail/susimail">SUSIMail</a>,并é…置为使用POSTMAN 的邮件æœåŠ¡ã€‚</li> @@ -42,5 +32,5 @@ <a href="irc://127.0.0.1:6668/i2p-help">#i2p-help</a>, <a href="irc://127.0.0.1:6668/i2p">#i2p</a> 或 <a href="irc://127.0.0.1:6668/i2p-chat">#i2p-chat</a> -这两个 IRC 频é“上询问。 (这些æœåŠ¡å™¨ä¸Šçš„这两个频é“是相通的)。</p><hr> +这两个 IRC 频é“上询问。 (这些æœåŠ¡å™¨ä¸Šçš„这两个频é“是相通的)。</p> </div> diff --git a/installer/resources/set_config_dir_for_nt_service.bat b/installer/resources/set_config_dir_for_nt_service.bat new file mode 100644 index 0000000000000000000000000000000000000000..adbabdad7d87f53bb4328271b0f477bd6879c09f --- /dev/null +++ b/installer/resources/set_config_dir_for_nt_service.bat @@ -0,0 +1,4 @@ +@echo off +cd /d %~dp0 +echo. +echo wrapper.java.additional.5=-Di2p.dir.config="%APPDATA%\i2p">>wrapper.config diff --git a/installer/resources/themes/console/classic/console.css b/installer/resources/themes/console/classic/console.css index 0d301a879f4f5843f828a720f8c7c551cfa1e7e1..d7484ad14c6f7dccfeb13d055aa488cd71ee9a09 100644 --- a/installer/resources/themes/console/classic/console.css +++ b/installer/resources/themes/console/classic/console.css @@ -258,16 +258,6 @@ div.tunnels table{ margin-right: -2px; } -div.routersummary form { - margin-top: -6px !important; - margin-bottom: -4px !important; -} - -div.routersummary form:last-child { - padding-top: 3px !important; - margin-bottom: -10px !important; -} - div.refresh { margin-top: 10px !important; margin-bottom: 10px !important; @@ -303,7 +293,7 @@ div.main { border-top: 0; text-align: left; color: #001; - min-width: 500px; + min-width: 510px; -moz-border-radius: 0 0 3px 0; -khtml-border-radius: 0 0 3px 0; border-radius: 0 0 3px 0; @@ -408,7 +398,19 @@ div.news li { } div.news h3 { - text-align: left !important; + background: none !important; + text-align: left; + border: none !important; + border-bottom: 1px dotted !important; + -moz-box-shadow: none; + -hktml-box-shadow: none; + box-shadow: none; + font-size: 10pt !important; + letter-spacing: 0.05em; + text-transform: capitalize !important; + text-shadow: none !important; + padding: 5px 10px 3px; + margin: 10px 10px -7px !important; } div.news p { @@ -514,11 +516,11 @@ div.messages li, div.messages ul { margin: -10px 0 0 0; } -div.messages span.error { +div.error { color: #d00000; } -div.messages span.notice { +div.notice { font-style: italic; } @@ -744,7 +746,7 @@ p { } .langbox { - margin: 18px -20px 0px 5px; + margin: 5px -20px 0px 5px; color: #001; font-size: 7pt; width: 280px; diff --git a/installer/resources/themes/console/classic/ieshim.css b/installer/resources/themes/console/classic/ieshim.css index 5bc3cb86be7e933818f642556a5cfee622bbd626..add6dae6ede10e6882ee4b2ae806d6450f9f4a97 100644 --- a/installer/resources/themes/console/classic/ieshim.css +++ b/installer/resources/themes/console/classic/ieshim.css @@ -232,7 +232,7 @@ div.warning { } .langbox { - margin: 20px -18px 0px 5px; + margin: 7px -18px 0px 5px; } td { @@ -299,4 +299,4 @@ h1, h2, h3 { } .routersummary h2, .routersummary h3 { - background: #fff url(images/tinytitle.png) center right tile-x !important; \ No newline at end of file + background: #fff url(images/tinytitle.png) center right tile-x !important; diff --git a/installer/resources/themes/console/dark/console.css b/installer/resources/themes/console/dark/console.css index 8921b88c985b3a5c77f7a4a6baeba5255fa75a8a..b1af23e74b79c880e480ad11b893bb60bc8c23c9 100644 --- a/installer/resources/themes/console/dark/console.css +++ b/installer/resources/themes/console/dark/console.css @@ -1,1083 +1,1072 @@ -/* I2P Theme: Camo aka Dark */ -/* Description: Military Grade. */ -/* Comment: Thanks to Florian Kuhlmann for the hatface images. [ http://www.flickr.com/photos/floriankuhlmann/] -/* Author: dr|z3d */ - -body { - margin: 5px 0px 0 0px; - padding: 0; - text-align: center; - background: #010 url('images/camotile.png') center bottom; - color: #EE9; - font: 9pt/130% "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; - -} - -.hide { - display: none; -} - -img { - border: none; -} - -pre { - width: 98%; - overflow-x: scroll; - text-align: left; - font: 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; - color: #EE9; -} - -div.logo { - float: left; - padding: 10px; - text-align: center; - font-color: #EE9; - margin: 0 20px 0 20px; - border: 1px solid #494; - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - border-radius: 4px; - background: #000; /*url("images/camotile2.png");*/ - width: 185px; - -moz-box-shadow: inset 0px 0px 1px 0px #009; - -khtml-box-shadow: inset 0px 0px 1px 0px #009; - box-shadow: inset 0px 0px 1px 0px #009; -} - -div.logo hr { - color: #494; - background: #494; - height: 1px; - border: 0px solid #494; - margin: 10px 0 5px; -} - -div.toolbar { - margin: 0; - padding: 10px; - font-weight: bold; - background: #000; - border: 1px solid #000; - display: none; -} - -div.toolbar a:link { - border: 1px outset #ddddc0; - padding: 0px 5px 1px 5px; - background: #bbf; - text-decoration: none; - border-radius: 4px; - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - color: #000; -} - -div.toolbar a:visited { - background: #ddf; -} - -div.toolbar a:hover, button:hover{ - border: 1px solid #f60; - background: #030; - color: #f60; -} - -a:active{ - color: #900; -} - -div.routersummaryouter { - float: left; - width: 200px; - margin: 0 0 10px 5px; - padding: 0; - border: 0; - clear: left;/* fixes a bug in Opera */ - text-align: center; - display: block; -} - -div.routersummary { - width: 173px; - padding: 10px; - text-align: center; - border: 1px solid #494; - background: #000 url(images/camotile2.png); - color: #EE9; - font-size: 8pt; - clear: left;/* fixes a bug in Opera */ - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - border-radius: 4px; - float: left; - -moz-box-shadow: 0 1px 5px #000; - -khtml-box-shadow: 0 1px 5px #000; - box-shadow: 0 1px 5px #000; -} - -div.routersummary input[type=text] { - text-align: right !important; - -moz-box-shadow: inset 1px 1px 1px 0px #000; - -khtml-box-shadow: inset 1px 1px 1px 0px #000; - box-shadow: inset 1px 1px 1px 0px #000; -} - -div.routersummary hr { - color: #494; - background: #494; - height: 2px; - border-bottom: 1px solid #494; - margin: 8px -10px 7px -10px; - -moz-box-shadow: inset 0px 1px 1px 1px #000; - -khtml-box-shadow: inset 0px 1px 1px 1px #000; - box-shadow: inset 0px 1px 1px 1px #000; -} - -div.routersummary h3 { - border: 0; - font-size: 9.5pt; - letter-spacing: 0.04em; - margin: -7px -10px -8px -10px; - padding: 3px 0 4px 0 !important; - text-transform: uppercase; - -moz-border-radius: 0; - -khtml-border-radius: 0; - border-radius: 0; - background: #000 url('images/header.png') center center ; - background-image: -moz-linear-gradient(top, bottom, from(#050), to(#030), color-stop(7%, #000), color-stop(100%, #050)); -} - -div.routersummary h4 { - border: 0; - border-bottom: 0 !important; - font-size: 8.5pt; - letter-spacing: 0.02em; - margin: -7px -9px -10px -9px !important; - padding: 6px 3px 9px 3px; - background: #000; - text-transform: capitalize; - text-decoration: none !important; - color: #2b2; - background-image: -moz-linear-gradient(top, bottom, from(#000), to(#050), color-stop(10%, #050), color-stop(100%, #004)); - line-height: 100%; -} - -div.routersummary table { - border: 0; - text-align: center !important; - margin: -5px -7px -5px -8px !important; - width: 188px !important; - overflow: hidden; - font-size: 8pt; - padding: 0 -10px; - background-image: none !important; - background-color: transparent !important; -} - -div.routersummary tr { - background-image: none !important; - background-color: transparent !important; - border: 0 !important; -} - -div.routersummary form { - margin: -6px 0 -7px; -} - -div.routersummary form:first-child { - margin: 6px 0 -4px 0 !important; -} - -div.routersummary p { - padding: 0; -} - -div.refresh { - margin-top: -10px !important; - margin-bottom: -4px !important; - padding: 2px 0 0px 0 !important; -} - -div.routersummary a:link, div.routersummary a:visited { - text-shadow: 1px 1px 1px rgba(0, 16, 0, 0.8); - text-shadow: 0px 0px 2px #101 !important; -} - -div.routersummary a:hover { - text-shadow: 0px 0px 1px rgba(255, 96, 0, 0.7); - color: #f60; -} - -div.routersummary td { - padding: 0px 2px 0px 2px; - background-image: none !important; - border: 0 !important; -} - -div routersummary hr:last-child { - margin-top: 5px; - margin-bottom: -5px !important; -} - -div.tunnels { - padding-top: 3px !important; - margin-left: -4px; - text-align: center; -} - -div.tunnels table { - margin: -5px 0 -5px -3px !important; -} - -div.tunnels td { - padding: 1px 0px 1px 0px; -} - -div.tunnels td:first-child { - width: 16px; - text-align: left; - padding-right: 2px; -} - -div.tunnels td:last-child { - text-align: right; - padding-right: 1px; -} - -div.tunnels tr { -/* border: 1px solid #494 !important;*/ -} - -div.warning { - margin: 20px 20px 20px 245px; - padding: 5px 25px 20px 75px; - background: #000; - border: 1px solid #494; - text-align: left; - color: #EE9; - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - border-radius: 4px; - text-align: justify; - background-image:url("../images/itoopie_sm.png"); - background-position:10px center; - background-repeat:no-repeat; - -moz-box-shadow: inset 0px 0px 0px 1px #f00; - -khtml-box-shadow: inset 0px 0px 0px 1px #f00; - box-shadow: inset 0px 0px 0px 1px #f00; - word-wrap: break-word; -} - -/* console error messages */ - -div.sorry { - margin: -1px 5px 10px 205px; - padding: 20px 20px 20px 75px; - background: #020; - border: 1px solid #494; - -moz-border-radius: 0 0 4px 4px; - -khtml-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; - text-align: justify; - background-image:url("images/errortriangle.png"); - background-position:15px center; - background-repeat:no-repeat; - -moz-box-shadow: inset 0px 0px 0px 1px #d00; - word-wrap: break-word; - font-weight: bold; - color: #EE9; -} - -div.sorry hr { - color: #EE9; - background: #EE9; - height: 1px; - border: 1px solid #EE9; - margin: 10px 0; -} - -div.main { - margin: -1px 5px 5px 205px; - padding: 0 15px 15px 15px; - text-align: left; - color: #EE9; - width: auto; -/* overflow-x: scroll; */ - border: 1px solid #494; - -moz-border-radius: 0 0 4px 4px; - -khtml-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; - background: #000 url(images/scarface.jpg) right bottom no-repeat !important; - min-width: 620px; - -moz-box-shadow: 0 1px 5px #000; -} - -div.main textarea { - background: #000; - color: #EE9; - font: 8pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; -} - -div.news { - margin: -1px 5px 0px 205px; - padding: 5px 30px 5px 30px; - border: 1px solid #494; - background: #000; - background: #000 url("images/news.png")no-repeat scroll bottom right; - color: #7b7; -/* border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - -khtml-border-radius: 4px 4px 0 0;*/ - font-size: 7.5pt; - text-align: right; - -moz-box-shadow: 0 1px 5px #000; - -khtml-box-shadow: 0 1px 5px #000; - box-shadow: 0 1px 5px #000; - min-width: 580px; -/* height: 164px; - overflow-y: auto;*/ -} - -div.news li { - text-align: justify; - list-style: url('images/info_dark.png'); - list-style: none; - margin: 0; - padding: 5px 5px 5px 0; - vertical-align: middle; - word-wrap: break-word; - color: #494; - font-weight: bold; - font-size: 9.5pt; - border-bottom: 1px dotted #494; - margin-bottom: 5px; - text-transform: capitalize; -} - -div.news h3 { - text-align: left !important; -} - -div.news h4 { - border-bottom: 1px; - border-bottom-style: dotted; - border-bottom-color: #494; - padding: 0 0 0px 0; - margin: 5px 0 10px 0; - font-size: 10pt; - opacity: 1; - text-transform: capitalize; -} - -div.news h4:first-child { - background: url('../images/itoopbullet.png'); - background-repeat: no-repeat; - background-position: right; -} - -div.news p { - margin-top: -5px; - font-size: 8.5pt; - color: #EE9; - margin-bottom: 0; -} - -div.news p:nth-child(n+1) { - margin-top: 5px; -} - -div.news hr { - margin: 8px 0 3px 0; -} - -div.confignav { - padding: 15px 10px !important; - margin: 15px 0; - background: #000 url('images/header.png') center center repeat-x ; - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - border-radius: 4px; - border: 1px solid #494; - font-size: 9.5pt !important; - font-weight: bold !important; - line-height: 160% !important; - -} - -div.configure { -/* padding: 5px 15px 0 15px; - margin: 10px 0px; - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - border-radius: 4px; - border: 1px solid #494; */ - background: none;/* url(images/camotile2.png);*/ -} - -div.messages { - padding: 10px; - margin: 10px 0 15px 0; - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - border-radius: 4px; - border: 1px solid #494; - background: #000 /*url('images/infotile.png') center left no-repeat;*/ - font-weight: bold; - font-size: 9pt; - color: #4f4; -} - -div.messages span.error { - color: #d90; -} - -div.messages span.notice { - font-style: italic; -} - -div.messages li { - text-align: justify !important; - font-weight: bold; - list-style: url(images/warning_dark.png) !important; - margin: 0 5px 0 50px !important; - padding: 0 10px 0 0 !important; - border: 0px !important; -} - -div.graphspanel { - padding: 0; - margin: 15px 0px -15px 0; - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - border-radius: 4px; -/* border: 1px solid #494;*/ - background: none;/* url(images/camotile.png);*/ - text-align: center; -} - -div.widepanel h3 { - text-align: left !important; -} - -div.graphspanel form { - text-align: left; - padding: 0 15px 0px 15px; -} - -div.graphspanel hr { - margin: 10px -15px 10px -15px; -} - -div.graphspanel img { - border: 1px solid #494; - padding: 3px; - margin: 5px; - text-align: center !important; - background: #000; - - opacity: 0.8; -} - -div.graphspanel img:hover { - border: 1px solid #000; - padding: 3px; - margin: 5px; - text-align: center !important; - background: #000; - -moz-box-shadow: inset 0px 0px 1px 1px #f60; - -khtml-box-shadow: inset 0px 0px 1px 1px #f60; - box-shadow: inset 0px 0px 1px 1px #f60; - opacity: 1; -} - -table { - border-collapse: collapse; - width: 100%; - border: 1px solid #494; - cell-padding: 1px; - font-size: 7pt; - background: #030; - margin: 1px 0; -} - -table hr { - padding: 0px 0; - color: #494; - background: #494; - border: 0px solid #494; - margin: 0px 0px; - height: 1px; - display: none; -} - -th { - padding: 6px 2px; - color: #EE9; - text-align: center; - font-size: 9pt; - background: #000; /*url('images/tabletitledark.png') repeat-x;*/ - background: #000 url('images/header.png') center center repeat-x ; - border-top: 1px solid #494; - border-bottom: 1px solid #494 !important; - line-height: 110%; -} - -tr { - vertical-align: middle; -} - -tr:nth-child(even) { - background: #010;/* url('images/darkerbluetile.png') !important;*/ - vertical-align: middle; -} - -tr:nth-child(odd) { - background: #000800;/* url('images/darkbluetile.png') !important;*/ - vertical-align: middle; -} -/* -tr:last-child { - background: #004 url('images/lightbluetile.png') !important; - font-weight: bold; - border: 1px solid #494 !important; -} -*/ -td { - padding: 4px 6px; - color: #EE9; - vertical-align: middle; - border-top: 1px inset #494; - border-bottom: 1px outset #494; -} - -td img { - padding: 0 1px 0 2px; -} - -tt { - font: bold 8pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; - color: #FF0; - padding: 0 5px 2px 0; -} - -div.main li { - text-align: left; - list-style: square; - margin: 2px 0px 2px 30px; - padding: 2px 20px 2px 0px; -/* line-height: 150%;*/ - word-wrap: break-word; -} - - -div.main li b { - color: #b70 !important; - letter-spacing: 0.07em; - font-size: 9pt; - text-shadow: 0 1px 1px #700; -} - -.tidylist { - text-align: justify !important; - line-height: 150%; -} - -.tidylist:first-child { -/* padding-top: 5px;*/ -} - -.tidylist:last-child { - padding-bottom: 10px; -} - -.tidylist code { - text-align: left; - font: 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; - color: #dd0; - padding: 1px 2px; - background: #030; - margin: 0 2px; -} - -ol { - display: inline; - margin: 1px 0 0 0; - padding: 1px 0 0 20px; -} - -ul { -/* display: inline; */ - margin: 0; - padding: 0; -} - -code { - text-align: left; - font: 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; - color: #dd0; - padding: 1px 2px; -} - -a:link, h2 a:link{ - color: #494; - text-decoration: none; - font-weight: bold; - word-wrap: break-word; -} - -a:visited{ - color: #7b7; - text-decoration: none; - font-weight: bold; - word-wrap: break-word; -} - -a:hover{ - color: #f60; - text-decoration: underline; - font-weight: bold; - word-wrap: break-word; -} - -.links { - padding-bottom: -2px; - text-align: justify; - margin-top: 10px; - margin-bottom: -10px; -} - -.links li { - list-style-image: url("images/link.png") !important; -} - -.links b{ - color: #b70 !important; - letter-spacing: 0.07em; - font-size: 9.5pt; - line-height: 165%; - text-shadow: 0 1px 1px #700; -} - -p { - text-align: justify; - line-height: 160%; -} - -h1 { - text-align: left; - color: #EE9; - padding: 15px 15px 14px; - margin: 0 5px 0px 205px !important; - font-size: 17pt; - font-weight: bold; - font-style: normal; - text-transform: uppercase; - letter-spacing: 0.15em; - text-shadow: 0px 0px 2px #010; - white-space: normal; - background: #000 url("images/scope.png")no-repeat scroll right top; - background: #000 url("images/bg2.png")no-repeat scroll top right; - background: #000 url('images/header.png') center center; - background-image: -moz-linear-gradient(top, bottom, from(#000), to(#030), color-stop(30%, #000), color-stop(100%, #000)); - border: 1px solid #494; - border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - -khtml-border-radius: 4px 4px 0 0; - line-height: 120%; - min-width: 620px; - -moz-box-shadow: 0 1px 5px #000; - -khtml-box-shadow: 0 1px 5px #000; - box-shadow: 0 1px 5px #000; -} - -h2 { - font-size: 12pt; - color: #EE9; - text-shadow: 0px 0px 2px #010; - letter-spacing: 0.05em; - background: #000 url(images/camotile2.png); - background-image: -moz-linear-gradient(top, bottom, from(#000), to(#030), color-stop(30%, #000), color-stop(100%, #000)); - background: #000 url('images/header.png') center center ; - padding: 10px; - wordwrap: none; - border: 1px solid #494; - border-radius: 4px; - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - vertical-align: middle; - margin: 15px 0 12px 0 !important; - text-transform: uppercase; - word-wrap: break-word; -} - -h2 a:visited { - color: #191; -} - -h2 a:hover { - color: #f60; - text-shadow: 0px 0px 1px rgba(255, 64, 0, 0.7); -} - -h3 { - border: 1px solid #494; - border-left: 5px solid #494; - padding: 5px 6px; - margin: 12px 0 10px 0; - border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - -khtml-border-radius: 0 4px 4px 0; - background: #000 url(images/camotile.png); - background: #000 url('images/header.png') center center ; - text-transform: uppercase; - text-shadow: 0px 0px 2px #010; -} - -h4 { - border-bottom: 1px; - border-bottom-style: solid; - border-bottom-color: #494; - padding: 0 0 10px 0; - margin: 5px 0 10px 0; - font-size: 11pt; -} - -button, button:visited { - font: bold 9pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; - border: 1px outset #191; - padding: 1px 3px; - text-decoration: none; - border-radius: 4px; - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - font-size: 8pt; - font-weight: bold; - margin: 2px 3px; - text-align: center; - vertical-align: middle; - min-width: 76px; - -moz-box-shadow: inset 0px 1px 1px 0px #494; - -khtml-box-shadow: inset 0px 1px 1px 0px #191; - box-shadow: inset 0px 1px 1px 0px #191; - background: #000; - color: #494; -} - -button:hover { - border: 1px solid #f60; - -moz-box-shadow: inset 0px 1px 1px 0px #EE9; - -khtml-box-shadow: inset 0px 1px 1px 0px #EE9; - box-shadow: inset 0px 1px 1px 0px #EE9; - background: #000; - color: #f60; -} - -button:active { - border: 1px inset #f60; - background: #f60; - color: #EE9; - -moz-box-shadow: inset 0px 0px 0px 0px #f60; - -khtml-box-shadow: inset 0px 0px 0px 0px #f60; - box-shadow: inset 0px 0px 0px 0px #f60; -} - -.underline { - border-bottom: 1px solid #eeeeff; - padding: 5px 0px 5px 0px; - margin: 0px 0px 10px 0px; -} - -.langbox { - margin: 21px 2px 2px 5px; - padding: 7px 10px 5px 10px; - color: #EE9; - font-size: 7pt; - width: 220px; - text-align: right; - float: right; - vertical-align: middle; -} - -.langbox img { - opacity: 0.5; - -moz-box-shadow: 0 0 1px #000; -} - -.langbox img:hover { - opacity: 1; - -moz-box-shadow: 0 0 1px #f60; -} - -hr { - color: #494; - background: #494; - height: 1px; - border: 0px solid #494; - margin: 20px 0 10px; -} - -hr:last-child { - margin-top: 20px; - margin-bottom: 20px; -} - -sidebarlogo { - text-align: center; -} - -input { - border: 1px outset #5f5; - -moz-box-shadow: inset 0px 1px 1px 0px #373; - -khtml-box-shadow: inset 0px 1px 1px 0px #373; - box-shadow: inset 0px 1px 1px 0px #373; - background: #000; - color: #494; - 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; -} - -input:hover { - background: #000; - color: #f60; - border: 1px solid #f60; - -moz-box-shadow: inset 0px 1px 1px 0px #9e9; - -khtml-box-shadow: inset 0px 1px 1px 0px #9e9; - box-shadow: inset 0px 1px 1px 0px #9e9; -} - -input:active { - background: #000; - color: #f30; - border: 1px solid #f30; -} - -input:active { - border: 1px inset #f60; - background: #f60; - color: #EE9; -} - -input[type=text], input[type=password] { - background: #000; - color: #EE9; - margin: 5px 10px; - padding: 4px 2px; - font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; - border: 1px solid #494 !important; - text-decoration: none; - border-radius: 4px; - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - -moz-box-shadow: inset 1px 1px 1px 0px #000; - -khtml-box-shadow: inset 1px 1px 1px 0px #000; - box-shadow: inset 1px 1px 1px 0px #000; -} - -input[type=text]:active, input[type=text]:hover, input[type=password]:active, input[type=password]:hover { - background: #000; -} - -fieldset { -overflow: hidden; -position: relative; -} - -select { - background: #000; - color: #EE9; - margin: 5px 10px; - border: 1px solid #494; - border-radius: 4px; - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - min-width: 110px; - font: 9pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; - padding: 2px; -} - -textarea { - background: #000; - color: #EE9; - padding: 5px; - margin: 10px; - border-radius: 4px; - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - font: 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; - min-height: 100px; - min-width: 97%; - text-align: left; - border: 1px solid #494; -} - -form {} - -.proxyfooter { - margin: 0 20px 10px 240px; - padding: 20px 25px 20px 75px; - font-color: #f00; - font-size: 7pt; - text-align: right !important; - border-radius: 4px; - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - border: 1px solid #000; - display: none; -} - -.statusnotes { - font-style: italic; - font-size: 8pt; - color: #EE9; - text-align: center; - border: 1px solid #494 !important; -/* border-top: 0px !important;*/ - margin: -3px 0 5px 0; - padding: 7px; - background: #010; - -moz-box-shadow: inset 0px 0px 0px 1px #090; - -khtml-box-shadow: inset 0px 0px 0px 1px #090; - box-shadow: inset 0px 0px 0px 1px #090; -/* background: #000 url('images/header.png') repeat-x center center !important;*/ -} - -div.joblog { -/* margin: 15px 0 15px 0; - padding: 5px 20px 10px 20px !important; - border: 1px solid #494; - background-color: #000; - background: #000; url("images/camotile.png");*/ -/* color: #dfd;*/ - border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - -khtml-border-radius: 4px 4px 0 0; - text-align: justify !important; - overflow-x: auto; /* Opera fix */ - } - -div.main li { - text-align: left; - list-style: square; - margin: 2px 0px 2px 30px; - padding: 2px 20px 2px 0px; -/* line-height: 150%;*/ - word-wrap: break-word; -} - -div.joblog li { - word-wrap: break-word !important; - text-align: justify !important; - line-height: 120% !important; - margin: 2px 0px 2px 30px; - padding: 2px 20px 2px 0px; -} - -div.joblog ul { - word-wrap: break-word !important; - text-align: justify; - margin: 0px 0 10px; -} - -div.joblog li:first-child { - margin-top: 0px; -} - -div.joblog li:last-child { -/* margin-bottom: -25px;*/ -} - -div.joblog form:first-child { - margin-top: 10px; -} - -div.joblog table { - margin-top: 15px; -} - -div.joblog p { - line-height: 130%; -} - -.smallhead { - font-size: 7pt -} - -.mediumtags { - font-size: 9pt; -} - -.optbox { - min-width: 16px !important; - max-width: 16px !important; - width: 16px !important; - min-height: 16px; - max-height: 16px; - height: 16px; - opacity: 1.0; - border: 0; - margin: 5px 5px 5px 10px; - padding: 2px; - overflow: hidden; - position: relative; -} - -.optbox:hover { - min-width: 16px !important; - max-width: 16px !important; - width: 16px !important; - min-height: 16px; - max-height: 16px; - height: 16px; - opacity: 1.0; - border: 0; - margin: 5px 5px 5px 10px; - padding: 2px; -} - -.cells { - border: 1px inset #494; - border-left: 1px outset #494; -} - -.tablefooter tr, .tablefooter td { - background: #000 url('images/header.png') repeat-x center center !important; - border-top: 1px solid #494; - border-bottom: 1px solid #494 !important; - font-size: 7pt; - line-height: 110%; -} - -.formaction { - text-align: right; -} - -div.footnote { - text-align: right; - color: #494; - font-size: 7pt; - margin-bottom: -8px !important; -} - -div.footnote hr{ - margin: 10px 0 5px 0 !important; - color: #494; - background: #494; - height: 1px; - border: 0px solid #494; -} - -.topness { - font-size: 7.5pt; - text-align: right; - margin-top: -5px; - margin-bottom: -5px; - margin-right: 5px; -} +/* I2P Theme: Camo aka Dark */ +/* Description: Military Grade. */ +/* Comment: Thanks to Florian Kuhlmann for the hatface images. [ http://www.flickr.com/photos/floriankuhlmann/] +/* Author: dr|z3d */ + +body { + margin: 5px 0px 0 0px; + padding: 0; + text-align: center; + background: #010 url('images/camotile.png') center bottom; + color: #EE9; + font: 9pt/130% "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; + +} + +.hide { + display: none; +} + +img { + border: none; +} + +pre { + width: 98%; + overflow-x: scroll; + text-align: left; + font: 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; + color: #EE9; +} + +div.logo { + float: left; + padding: 10px; + text-align: center; + font-color: #EE9; + margin: 0 20px 0 20px; + border: 1px solid #494; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + background: #000; /*url("images/camotile2.png");*/ + width: 185px; + -moz-box-shadow: inset 0px 0px 1px 0px #009; + -khtml-box-shadow: inset 0px 0px 1px 0px #009; + box-shadow: inset 0px 0px 1px 0px #009; +} + +div.logo hr { + color: #494; + background: #494; + height: 1px; + border: 0px solid #494; + margin: 10px 0 5px; +} + +div.toolbar { + margin: 0; + padding: 10px; + font-weight: bold; + background: #000; + border: 1px solid #000; + display: none; +} + +div.toolbar a:link { + border: 1px outset #ddddc0; + padding: 0px 5px 1px 5px; + background: #bbf; + text-decoration: none; + border-radius: 4px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + color: #000; +} + +div.toolbar a:visited { + background: #ddf; +} + +div.toolbar a:hover, button:hover{ + border: 1px solid #f60; + background: #030; + color: #f60; +} + +a:active{ + color: #900; +} + +div.routersummaryouter { + float: left; + width: 200px; + margin: 0 0 10px 5px; + padding: 0; + border: 0; + clear: left;/* fixes a bug in Opera */ + text-align: center; + display: block; +} + +div.routersummary { + width: 173px; + padding: 10px; + text-align: center; + border: 1px solid #494; + background: #000 url(images/camotile2.png); + color: #EE9; + font-size: 8pt; + clear: left;/* fixes a bug in Opera */ + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + float: left; + -moz-box-shadow: 0 1px 5px #000; + -khtml-box-shadow: 0 1px 5px #000; + box-shadow: 0 1px 5px #000; +} + +div.routersummary input[type=text] { + text-align: right !important; + -moz-box-shadow: inset 1px 1px 1px 0px #000; + -khtml-box-shadow: inset 1px 1px 1px 0px #000; + box-shadow: inset 1px 1px 1px 0px #000; +} + +div.routersummary hr { + color: #494; + background: #494; + height: 2px; + border-bottom: 1px solid #494; + margin: 8px -10px 7px -10px; + -moz-box-shadow: inset 0px 1px 1px 1px #000; + -khtml-box-shadow: inset 0px 1px 1px 1px #000; + box-shadow: inset 0px 1px 1px 1px #000; +} + +div.routersummary h3 { + border: 0; + font-size: 9.5pt; + letter-spacing: 0.04em; + margin: -7px -10px -8px -10px; + padding: 3px 0 4px 0 !important; + text-transform: uppercase; + -moz-border-radius: 0; + -khtml-border-radius: 0; + border-radius: 0; + background: #000 url('images/header.png') center center ; + background-image: -moz-linear-gradient(top, bottom, from(#050), to(#030), color-stop(7%, #000), color-stop(100%, #050)); +} + +div.routersummary h4 { + border: 0; + border-bottom: 0 !important; + font-size: 8.5pt; + letter-spacing: 0.02em; + margin: -7px -9px -10px -9px !important; + padding: 6px 3px 9px 3px; + background: #000; + text-transform: capitalize; + text-decoration: none !important; + color: #2b2; + background-image: -moz-linear-gradient(top, bottom, from(#000), to(#050), color-stop(10%, #050), color-stop(100%, #004)); + line-height: 100%; +} + +div.routersummary table { + border: 0; + text-align: center !important; + margin: -5px -7px -5px -8px !important; + width: 188px !important; + overflow: hidden; + font-size: 8pt; + padding: 0 -10px; + background-image: none !important; + background-color: transparent !important; +} + +div.routersummary tr { + background-image: none !important; + background-color: transparent !important; + border: 0 !important; +} + +div.routersummary p { + padding: 0; +} + +div.refresh { + margin-top: 10px !important; + margin-bottom: 10px !important; + padding: 2px 0 !important; +} + +div.routersummary a:link, div.routersummary a:visited { + text-shadow: 1px 1px 1px rgba(0, 16, 0, 0.8); + text-shadow: 0px 0px 2px #101 !important; +} + +div.routersummary a:hover { + text-shadow: 0px 0px 1px rgba(255, 96, 0, 0.7); + color: #f60; +} + +div.routersummary td { + padding: 0px 2px 0px 2px; + background-image: none !important; + border: 0 !important; +} + +div routersummary hr:last-child { + margin-top: 5px; + margin-bottom: -5px !important; +} + +div.tunnels { + padding-top: 3px !important; + margin-left: -4px; + text-align: center; +} + +div.tunnels table { + margin: -5px 0 -5px -3px !important; +} + +div.tunnels td { + padding: 1px 0px 1px 0px; +} + +div.tunnels td:first-child { + width: 16px; + text-align: left; + padding-right: 2px; +} + +div.tunnels td:last-child { + text-align: right; + padding-right: 1px; +} + +div.tunnels tr { +/* border: 1px solid #494 !important;*/ +} + +div.warning { + margin: 20px 20px 20px 245px; + padding: 5px 25px 20px 75px; + background: #000; + border: 1px solid #494; + text-align: left; + color: #EE9; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + text-align: justify; + background-image:url("../images/itoopie_sm.png"); + background-position:10px center; + background-repeat:no-repeat; + -moz-box-shadow: inset 0px 0px 0px 1px #f00; + -khtml-box-shadow: inset 0px 0px 0px 1px #f00; + box-shadow: inset 0px 0px 0px 1px #f00; + word-wrap: break-word; +} + +/* console error messages */ + +div.sorry { + margin: -1px 5px 10px 205px; + padding: 20px 20px 20px 75px; + background: #020; + border: 1px solid #494; + -moz-border-radius: 0 0 4px 4px; + -khtml-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; + text-align: justify; + background-image:url("images/errortriangle.png"); + background-position:15px center; + background-repeat:no-repeat; + -moz-box-shadow: inset 0px 0px 0px 1px #d00; + word-wrap: break-word; + font-weight: bold; + color: #EE9; +} + +div.sorry hr { + color: #EE9; + background: #EE9; + height: 1px; + border: 1px solid #EE9; + margin: 10px 0; +} + +div.main { + margin: -1px 5px 5px 205px; + padding: 0 15px 15px 15px; + text-align: left; + color: #EE9; + width: auto; +/* overflow-x: scroll; */ + border: 1px solid #494; + -moz-border-radius: 0 0 4px 4px; + -khtml-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; + background: #000 url(images/scarface.jpg) right bottom no-repeat !important; + min-width: 620px; + -moz-box-shadow: 0 1px 5px #000; +} + +div.main textarea { + background: #000; + color: #EE9; + font: 8pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; +} + +div.news { + margin: -1px 5px 0px 205px; + padding: 5px 30px 5px 30px; + border: 1px solid #494; + background: #000; + background: #000 url("images/news.png")no-repeat scroll bottom right; + color: #7b7; + font-size: 7.5pt; + text-align: right; + -moz-box-shadow: 0 1px 5px #000; + -khtml-box-shadow: 0 1px 5px #000; + box-shadow: 0 1px 5px #000; + min-width: 590px; +} + +div.news li { + text-align: justify; + list-style: url('images/info_dark.png'); + list-style: none; + margin: 0; + padding: 5px 5px 5px 0; + vertical-align: middle; + word-wrap: break-word; + color: #494; + font-weight: bold; + font-size: 9.5pt; + border-bottom: 1px dotted #494; + margin-bottom: 5px; + text-transform: capitalize; +} + +div.news h3 { + background: none; + text-align: left; + border: none; + padding-left: 0; + padding-top: 2px; + border-bottom: 1px dotted; +} + +div.news h4 { + border-bottom: 1px; + border-bottom-style: dotted; + border-bottom-color: #494; + padding: 0 0 0px 0; + margin: 5px 0 10px 0; + font-size: 10pt; + opacity: 1; + text-transform: capitalize; +} + +div.news h4:first-child { + background: url('../images/itoopbullet.png'); + background-repeat: no-repeat; + background-position: right; +} + +div.news p { + margin-top: -5px; + font-size: 8.5pt; + color: #EE9; + margin-bottom: 0; +} + +div.news p:nth-child(n+1) { + margin-top: 5px; +} + +div.news hr { + margin: 8px 0 3px 0; +} + +div.confignav { + padding: 15px 10px !important; + margin: 15px 0; + background: #000 url('images/header.png') center center repeat-x ; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + border: 1px solid #494; + font-size: 9.5pt !important; + font-weight: bold !important; + line-height: 160% !important; + +} + +div.configure { +/* padding: 5px 15px 0 15px; + margin: 10px 0px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + border: 1px solid #494; */ + background: none;/* url(images/camotile2.png);*/ +} + +div.messages { + padding: 10px; + margin: 10px 0 15px 0; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + border: 1px solid #494; + background: #000 /*url('images/infotile.png') center left no-repeat;*/ + font-weight: bold; + font-size: 9pt; + color: #4f4; +} + +div.error { + color: #d90; +} + +div.notice { + font-style: italic; +} + +div.messages li { + text-align: justify !important; + font-weight: bold; + list-style: url(images/warning_dark.png) !important; + margin: 0 5px 0 50px !important; + padding: 0 10px 0 0 !important; + border: 0px !important; +} + +div.graphspanel { + padding: 0; + margin: 15px 0px -15px 0; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; +/* border: 1px solid #494;*/ + background: none;/* url(images/camotile.png);*/ + text-align: center; +} + +div.widepanel h3 { + text-align: left !important; +} + +div.graphspanel form { + text-align: left; + padding: 0 15px 0px 15px; +} + +div.graphspanel hr { + margin: 10px -15px 10px -15px; +} + +div.graphspanel img { + border: 1px solid #494; + padding: 3px; + margin: 5px; + text-align: center !important; + background: #000; + + opacity: 0.8; +} + +div.graphspanel img:hover { + border: 1px solid #000; + padding: 3px; + margin: 5px; + text-align: center !important; + background: #000; + -moz-box-shadow: inset 0px 0px 1px 1px #f60; + -khtml-box-shadow: inset 0px 0px 1px 1px #f60; + box-shadow: inset 0px 0px 1px 1px #f60; + opacity: 1; +} + +table { + border-collapse: collapse; + width: 100%; + border: 1px solid #494; + cell-padding: 1px; + font-size: 7pt; + background: #030; + margin: 1px 0; +} + +table hr { + padding: 0px 0; + color: #494; + background: #494; + border: 0px solid #494; + margin: 0px 0px; + height: 1px; + display: none; +} + +th { + padding: 6px 2px; + color: #EE9; + text-align: center; + font-size: 9pt; + background: #000; /*url('images/tabletitledark.png') repeat-x;*/ + background: #000 url('images/header.png') center center repeat-x ; + border-top: 1px solid #494; + border-bottom: 1px solid #494 !important; + line-height: 110%; +} + +tr { + vertical-align: middle; +} + +tr:nth-child(even) { + background: #010;/* url('images/darkerbluetile.png') !important;*/ + vertical-align: middle; +} + +tr:nth-child(odd) { + background: #000800;/* url('images/darkbluetile.png') !important;*/ + vertical-align: middle; +} +/* +tr:last-child { + background: #004 url('images/lightbluetile.png') !important; + font-weight: bold; + border: 1px solid #494 !important; +} +*/ +td { + padding: 4px 6px; + color: #EE9; + vertical-align: middle; + border-top: 1px inset #494; + border-bottom: 1px outset #494; +} + +td img { + padding: 0 1px 0 2px; +} + +tt { + font: bold 8pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; + color: #FF0; + padding: 0 5px 2px 0; +} + +div.main li { + text-align: left; + list-style: square; + margin: 2px 0px 2px 30px; + padding: 2px 20px 2px 0px; +/* line-height: 150%;*/ + word-wrap: break-word; +} + + +div.main li b { + color: #b70 !important; + letter-spacing: 0.07em; + font-size: 9pt; + text-shadow: 0 1px 1px #700; +} + +.tidylist { + text-align: justify !important; + line-height: 150%; +} + +.tidylist:first-child { +/* padding-top: 5px;*/ +} + +.tidylist:last-child { + padding-bottom: 10px; +} + +.tidylist code { + text-align: left; + font: 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; + color: #dd0; + padding: 1px 2px; + background: #030; + margin: 0 2px; +} + +ol { + display: inline; + margin: 1px 0 0 0; + padding: 1px 0 0 20px; +} + +ul { +/* display: inline; */ + margin: 0; + padding: 0; +} + +code { + text-align: left; + font: 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; + color: #dd0; +/* padding: 1px 2px;*/ +} + +a:link, h2 a:link{ + color: #494; + text-decoration: none; + font-weight: bold; + word-wrap: break-word; +} + +a:visited{ + color: #7b7; + text-decoration: none; + font-weight: bold; + word-wrap: break-word; +} + +a:hover{ + color: #f60; + text-decoration: underline; + font-weight: bold; + word-wrap: break-word; +} + +.links { + padding-bottom: -2px; + text-align: justify; + margin-top: 10px; + margin-bottom: -10px; +} + +.links li { + list-style-image: url("images/link.png") !important; +} + +.links b{ + color: #b70 !important; + letter-spacing: 0.07em; + font-size: 9.5pt; + line-height: 165%; + text-shadow: 0 1px 1px #700; +} + +p { + text-align: justify; + line-height: 160%; +} + +h1 { + text-align: left; + color: #EE9; + padding: 15px 15px 14px; + margin: 0 5px 0px 205px !important; + font-size: 17pt; + font-weight: bold; + font-style: normal; + text-transform: uppercase; + letter-spacing: 0.15em; + text-shadow: 0px 0px 2px #010; + white-space: normal; + background: #000 url("images/scope.png")no-repeat scroll right top; + background: #000 url("images/bg2.png")no-repeat scroll top right; + background: #000 url('images/header.png') center center; + background-image: -moz-linear-gradient(top, bottom, from(#000), to(#030), color-stop(30%, #000), color-stop(100%, #000)); + border: 1px solid #494; + border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + -khtml-border-radius: 4px 4px 0 0; + line-height: 120%; + min-width: 620px; + -moz-box-shadow: 0 1px 5px #000; + -khtml-box-shadow: 0 1px 5px #000; + box-shadow: 0 1px 5px #000; +} + +h2 { + font-size: 12pt; + color: #EE9; + text-shadow: 0px 0px 2px #010; + letter-spacing: 0.05em; + background: #000 url(images/camotile2.png); + background-image: -moz-linear-gradient(top, bottom, from(#000), to(#030), color-stop(30%, #000), color-stop(100%, #000)); + background: #000 url('images/header.png') center center ; + padding: 10px; + wordwrap: none; + border: 1px solid #494; + border-radius: 4px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + vertical-align: middle; + margin: 15px 0 12px 0 !important; + text-transform: uppercase; + word-wrap: break-word; +} + +h2 a:visited { + color: #191; +} + +h2 a:hover { + color: #f60; + text-shadow: 0px 0px 1px rgba(255, 64, 0, 0.7); +} + +h3 { + border: 1px solid #494; + border-left: 5px solid #494; + padding: 5px 6px; + margin: 12px 0 10px 0; + border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + -khtml-border-radius: 0 4px 4px 0; + background: #000 url(images/camotile.png); + background: #000 url('images/header.png') center center ; + text-transform: uppercase; + text-shadow: 0px 0px 2px #010; +} + +h4 { + border-bottom: 1px; + border-bottom-style: solid; + border-bottom-color: #494; + padding: 0 0 10px 0; + margin: 5px 0 10px 0; + font-size: 11pt; +} + +button, button:visited { + font: bold 9pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; + border: 1px outset #191; + padding: 1px 3px; + text-decoration: none; + border-radius: 4px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + font-size: 8pt; + font-weight: bold; + margin: 2px 3px; + text-align: center; + vertical-align: middle; + min-width: 76px; + -moz-box-shadow: inset 0px 1px 1px 0px #494; + -khtml-box-shadow: inset 0px 1px 1px 0px #191; + box-shadow: inset 0px 1px 1px 0px #191; + background: #000; + color: #494; +} + +button:hover { + border: 1px solid #f60; + -moz-box-shadow: inset 0px 1px 1px 0px #EE9; + -khtml-box-shadow: inset 0px 1px 1px 0px #EE9; + box-shadow: inset 0px 1px 1px 0px #EE9; + background: #000; + color: #f60; +} + +button:active { + border: 1px inset #f60; + background: #f60; + color: #EE9; + -moz-box-shadow: inset 0px 0px 0px 0px #f60; + -khtml-box-shadow: inset 0px 0px 0px 0px #f60; + box-shadow: inset 0px 0px 0px 0px #f60; +} + +.underline { + border-bottom: 1px solid #eeeeff; + padding: 5px 0px 5px 0px; + margin: 0px 0px 10px 0px; +} + +.langbox { + margin: 8px 2px 2px 5px; + padding: 7px 10px 5px 10px; + color: #EE9; + font-size: 7pt; + width: 220px; + text-align: right; + float: right; + vertical-align: middle; +} + +.langbox img { + opacity: 0.5; + -moz-box-shadow: 0 0 1px #000; +} + +.langbox img:hover { + opacity: 1; + -moz-box-shadow: 0 0 1px #f60; +} + +hr { + color: #494; + background: #494; + height: 1px; + border: 0px solid #494; + margin: 20px 0 10px; +} + +hr:last-child { + margin-top: 20px; + margin-bottom: 20px; +} + +sidebarlogo { + text-align: center; +} + +input { + border: 1px outset #5f5; + -moz-box-shadow: inset 0px 1px 1px 0px #373; + -khtml-box-shadow: inset 0px 1px 1px 0px #373; + box-shadow: inset 0px 1px 1px 0px #373; + background: #000; + color: #494; + margin: 5px; + font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; + padding: 1px 2px; + text-decoration: none; + border-radius: 4px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; +} + +input:hover { + background: #000; + color: #f60; + border: 1px solid #f60; + -moz-box-shadow: inset 0px 1px 1px 0px #9e9; + -khtml-box-shadow: inset 0px 1px 1px 0px #9e9; + box-shadow: inset 0px 1px 1px 0px #9e9; +} + +input:active { + background: #000; + color: #f30; + border: 1px solid #f30; +} + +input:active { + border: 1px inset #f60; + background: #f60; + color: #EE9; +} + +input[type=text], input[type=password] { + background: #000; + color: #EE9; + margin: 5px 10px; + padding: 4px 2px; + font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; + border: 1px solid #494 !important; + text-decoration: none; + border-radius: 4px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + -moz-box-shadow: inset 1px 1px 1px 0px #000; + -khtml-box-shadow: inset 1px 1px 1px 0px #000; + box-shadow: inset 1px 1px 1px 0px #000; +} + +input[type=text]:active, input[type=text]:hover, input[type=password]:active, input[type=password]:hover { + background: #000; +} + +fieldset { +overflow: hidden; +position: relative; +} + +select { + background: #000; + color: #EE9; + margin: 5px 10px; + border: 1px solid #494; + border-radius: 4px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + min-width: 110px; + font: 9pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; + padding: 2px; +} + +textarea { + background: #000; + color: #EE9; + padding: 5px; + margin: 10px; + border-radius: 4px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + font: 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; + min-height: 100px; + min-width: 97%; + text-align: left; + border: 1px solid #494; +} + +.proxyfooter { + margin: 0 20px 10px 240px; + padding: 20px 25px 20px 75px; + font-color: #f00; + font-size: 7pt; + text-align: right !important; + border-radius: 4px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border: 1px solid #000; + display: none; +} + +.statusnotes { + font-style: italic; + font-size: 8pt; + color: #EE9; + text-align: center; + border: 1px solid #494 !important; +/* border-top: 0px !important;*/ + margin: -3px 0 5px 0; + padding: 7px; + background: #010; + -moz-box-shadow: inset 0px 0px 0px 1px #090; + -khtml-box-shadow: inset 0px 0px 0px 1px #090; + box-shadow: inset 0px 0px 0px 1px #090; +/* background: #000 url('images/header.png') repeat-x center center !important;*/ +} + +div.joblog { +/* margin: 15px 0 15px 0; + padding: 5px 20px 10px 20px !important; + border: 1px solid #494; + background-color: #000; + background: #000; url("images/camotile.png");*/ +/* color: #dfd;*/ + border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + -khtml-border-radius: 4px 4px 0 0; + text-align: justify !important; + overflow-x: auto; /* Opera fix */ + } + +div.main li { + text-align: left; + list-style: square; + margin: 2px 0px 2px 30px; + padding: 2px 20px 2px 0px; +/* line-height: 150%;*/ + word-wrap: break-word; +} + +div.joblog li { + word-wrap: break-word !important; + text-align: justify !important; + line-height: 120% !important; + margin: 2px 0px 2px 30px; + padding: 2px 20px 2px 0px; +} + +div.joblog ul { + word-wrap: break-word !important; + text-align: justify; + margin: 0px 0 10px; +} + +div.joblog li:first-child { + margin-top: 0px; +} + +div.joblog li:last-child { +/* margin-bottom: -25px;*/ +} + +div.joblog form:first-child { + margin-top: 10px; +} + +div.joblog table { + margin-top: 15px; +} + +div.joblog p { + line-height: 130%; +} + +.smallhead { + font-size: 7pt +} + +.mediumtags { + font-size: 9pt; +} + +.optbox { + min-width: 16px !important; + max-width: 16px !important; + width: 16px !important; + min-height: 16px; + max-height: 16px; + height: 16px; + opacity: 1.0; + border: 0; + margin: 5px 5px 5px 10px; + padding: 2px; + overflow: hidden; + position: relative; +} + +.optbox:hover { + min-width: 16px !important; + max-width: 16px !important; + width: 16px !important; + min-height: 16px; + max-height: 16px; + height: 16px; + opacity: 1.0; + border: 0; + margin: 5px 5px 5px 10px; + padding: 2px; +} + +.cells { + border: 1px inset #494; + border-left: 1px outset #494; +} + +.tablefooter tr, .tablefooter td { + background: #000 url('images/header.png') repeat-x center center !important; + border-top: 1px solid #494; + border-bottom: 1px solid #494 !important; + font-size: 7pt; + line-height: 110%; +} + +.formaction { + text-align: right; +} + +div.footnote { + text-align: right; + color: #494; + font-size: 7pt; + margin-bottom: -8px !important; +} + +div.footnote hr{ + margin: 10px 0 5px 0 !important; + color: #494; + background: #494; + height: 1px; + border: 0px solid #494; +} + +.topness { + font-size: 7.5pt; + text-align: right; + margin-top: -5px; + margin-bottom: -5px; + margin-right: 5px; +} diff --git a/installer/resources/themes/console/light/console.css b/installer/resources/themes/console/light/console.css index fe8b61cb23db257ceb3c616278f8232a5ed88008..426086518d222e25116362ad2c0bdcb605fc61e3 100644 --- a/installer/resources/themes/console/light/console.css +++ b/installer/resources/themes/console/light/console.css @@ -38,7 +38,7 @@ div.logo { -moz-border-radius: 4px; -khtml-border-radius: 4px; border-radius: 4px; - background: #ffe; /*url('images/lightbluetile.png')*/ + background: #ffe; width: 185px; -moz-box-shadow: inset 0px 0px 1px 1px #bbf; } @@ -90,7 +90,6 @@ div.routersummaryouter { } div.routersummary { -/* margin: 0px 20px 20px 0px; */ width: 180px; padding: 8px 8px 10px 8px; text-align: center !important; @@ -101,10 +100,10 @@ div.routersummary { -moz-border-radius: 4px; -khtml-border-radius: 4px; border-radius: 4px; - background: #ffe url('images/magic.png') center bottom;/* - float: left; -*/ + background: #ffe url('images/magic.png') center bottom; -moz-box-shadow: inset 0px 0px 1px 1px #bbf; + -khtml-box-shadow: inset 0px 0px 1px 1px #bbf; + box-shadow: inset 0px 0px 1px 1px #bbf; } div.routersummary input[type=text] { @@ -118,7 +117,7 @@ div.routersummary hr { border-bottom: 1px solid #99f; margin: 8px -7px 8px -7px; -moz-box-shadow: inset 0px 1px 1px 1px #fff; - -khtml-box-shadow: inset 0px 0px 1px #fff; + -khtml-box-shadow: inset 0px 1px 0px #fff; box-shadow: inset 0px 1px 1px 1px #fff; } @@ -139,6 +138,9 @@ div.routersummary h3 { -khtml-border-radius: 3px; border-radius: 3px; -moz-box-shadow: 0px 1px 5px #bbf; + -moz-box-shadow: outset 0px 0px 2px 1px #bbf; + -khtml-box-shadow: outset 0px 0px 2px 1px #bbf; + box-shadow: outset 0px 0px 2px 1px #bbf; } div.routersummary h3 a { @@ -148,6 +150,9 @@ div.routersummary h3 a { div.routersummary h3:hover { background: #ffa url('images/header.png') center center repeat-x !important; text-shadow: 0 0 0; + -moz-box-shadow: inset 0px 0px 2px 1px #ffa; + -khtml-box-shadow: inset 0px 0px 2px 1px #ffa; + box-shadow: inset 0px 0px 2px 1px #ffa; } div.routersummary h4 { @@ -155,14 +160,16 @@ div.routersummary h4 { border-bottom: 0 !important; font-size: 8.5pt; letter-spacing: 0.02em; - margin: -5px -7px -5px -7px !important; + margin: -6px -6px -7px !important; padding: 3px 3px 5px 3px; - background: #eed url(images/magic.png); + background: #ddf url(images/magic.png); text-transform: capitalize; text-decoration: none !important; color: #2b2; line-height: 105%; -/* text-shadow: 0px 1px 1px #99f;*/ + -moz-box-shadow: inset 0px 0px 1px 30px #dfd; + -khtml-box-shadow: 0px 0px 1px 1px #dfd; + box-shadow: 0px 0px 1px 1px #fdf; } div.routersummary table { @@ -243,22 +250,13 @@ div.tunnels td, div.tunnels img:first-child { padding: 4px 0 !important; } -div.routersummary form { - margin: -6px 0 -5px 0; -} - -div.routersummary form:last-child { - margin: 6px 0 0 0 !important; - padding: 0; -} - div.routersummary p { padding: 0; } div.refresh { - margin-top: -6px !important; - margin-bottom: 0px !important; + margin-top: 10px !important; + margin-bottom: 10px !important; padding: 2px 0 0px 0 !important; } @@ -324,6 +322,8 @@ div.main { -khtml-border-radius: 4px; border-radius: 4px; -moz-box-shadow: inset 0px 0px 1px 1px #bbf; + -khtml-box-shadow: inset 0px 0px 1px 1px #bbf; + box-shadow: inset 0px 0px 1px 1px #bbf; background: #ffe url('images/magic.png') center bottom;} div.main hr, hr { @@ -355,9 +355,11 @@ div.news { text-align: right !important; font-size: 7.5pt; line-height: 140%; - -moz-box-shadow: inset 0px 0px 1px 0px #410; + -moz-box-shadow: inset 0px 0px 1px 1px #bbf; + -khtml-box-shadow: inset 0px 0px 1px 1px #bbf; + box-shadow: inset 0px 0px 1px 1px #bbf; background: #ffe url('images/magic.png') center bottom; - min-width: 480px; + min-width: 490px; } div.news p { @@ -368,37 +370,12 @@ div.news p { padding: 0 15px; } -div.news h3 { - text-align: left !important; -} - -/* -div.news a:link{ - color: #a30; - text-decoration: none; -} - -div.news a:visited{ - color: #930; -} - -div.news a:hover{ - color: #d20; - text-decoration: underline; -} - -div.news a:active{ - color: #c30; -} -*/ - div.news hr{ color: #225; background: #225; height: 1px; border: 0px dotted #225; margin: 10px 0 5px; -/* -moz-box-shadow: 0px -1px 1px 1px #ffe;*/ opacity: 0.6; } @@ -426,12 +403,25 @@ div.news li:first-child { margin-top: 10px !important; } -/* -div.news h4 a{ - color: #910 !important; - opacity: 1 !important; +div.news h3 { + background: none !important; + text-align: left; + border: none !important; + padding-left: 0; + padding-top: 0px; + border-bottom: 1px dotted #225 !important; + -moz-box-shadow: none; + -khtml-box-shadow: none; + box-shadow: none; + font-size: 10pt !important; + letter-spacing: 0.05em; + text-transform: capitalize !important; + text-shadow: 0px 0px 0px #77f; +} + +div.news i { + font-style: normal; } -*/ div.news h4 { border-bottom: 0px; @@ -443,34 +433,29 @@ div.news h4 { div.confignav { padding: 15px 10px !important; margin: 15px 0 15px 0; - background: #ffe url('images/header.png') center center repeat-x; + background: url('images/header.png') center center repeat-x; -moz-border-radius: 4px; -khtml-border-radius: 4px; border-radius: 4px; - border: 1px solid #113; + border: 1px solid #115; font-size: 9.5pt !important; font-weight: bold !important; line-height: 160% !important; - -moz-box-shadow: inset 0px 0px 1px 1px #bbf; + -moz-box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4); + -khtml-box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4); + box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4); + opacity: 1; min-width: 400px; } div.configure { -/* padding: 5px 15px 0px 15px !important; - margin: 0px 0px 15px 0; - background: #ffe; url('images/lightbluetile.png') - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - border-radius: 4px; - border: 1px solid #447; - -moz-box-shadow: inset 0px 0px 1px 1px #bbf;*/ min-width: 400px; margin-bottom: 0px; } div.configure h3, div.graphspanel h3 { - border: 1px solid #113; - border-left: 5px solid #113; + border: 1px solid #115; + border-left: 5px solid #115; padding: 5px; margin: 15px 0 15px 0; border-radius: 0 4px 4px 0; @@ -481,14 +466,6 @@ div.configure h3, div.graphspanel h3 { } div.graphspanel { -/* padding: 12px; - margin: 10px 0px 25px 0; - background: #ffe url('images/lightbluetile.png'); - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - border-radius: 4px; - border: 1px solid #447; - -moz-box-shadow: inset 0px 0px 1px 1px #bbf;*/ text-align: center !important; margin: 15px 0px -15px; } @@ -520,21 +497,22 @@ div.graphspanel form { div.messages { padding: 10px; margin: 10px 0 15px 0; - background: #ffe; -moz-border-radius: 4px; -khtml-border-radius: 4px; border-radius: 4px; border: 1px solid #447; - background: #ffe url('images/magic.png'); + background: #fff url('images/magic.png'); font-weight: bold; - -moz-box-shadow: inset 0px 0px 1px 1px #bbf; + -moz-box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4); + -khtml-box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4); + box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4); } -div.messages span.error { +div.error { color: #d00000; } -div.messages span.notice { +div.notice { font-style: italic; } @@ -591,13 +569,7 @@ tr:nth-child(even) { tr:nth-child(odd) { background: #fff url(images/magic.png); } -/* -tr:last-child { - background: #bbf url('images/tabletilelighter.png') !important; - font-weight: bold; - border: 1px solid #002 !important; -} -*/ + td { padding: 5px 3px; color: #000; @@ -631,7 +603,8 @@ div.main li { } div.main li b { - color: #514!important; + color: #514 !important; + color: #003 !important; letter-spacing: 0.01em; font-size: 9.5pt; line-height: 170%; @@ -657,9 +630,7 @@ div.main li:first-child { font: 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; color: #910; padding: 2px 3px; - background: #fff; font-weight: bold; - background: #ffb url('images/magic.png') center bottom; } ol { @@ -684,7 +655,6 @@ code { text-align: left; font: 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; color: #390; - padding: 2px 3px; font-weight: bold; } @@ -740,16 +710,17 @@ p { h1 { text-align: left; - color: #000; + color: #115; padding: 10px 15px; margin: 0 10px 10px 207px; font: normal bold 16pt/120% "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; letter-spacing: 0.15em; text-transform: uppercase; - text-shadow: 0px 0px 1px #77f; -moz-box-shadow: inset 0px 0px 1px 1px #bbf; + -khtml-box-shadow: inset 0px 0px 1px 1px #bbf; + box-shadow: inset 0px 0px 1px 1px #bbf; white-space: normal; - background: #ffe url('images/header.png') center center repeat-x; + background: #ffe url('images/magic.png') center center repeat; border: 1px solid #447; border-radius: 4px; -moz-border-radius: 4px; @@ -759,22 +730,36 @@ h1 { h2 { font-size: 13pt; - color: #000; - letter-spacing: 0.05em; - background: #ffe url('images/header.png') center center repeat-x; - text-shadow: 0px 0px 1px rgba(0, 0, 64, 0.5); - padding: 10px 10px; + color: #115; + letter-spacing: 0.07em; + background: url('images/header.png') center center repeat-x; + padding: 10px; wordwrap: none; - border: 1px solid #113; + border: 1px solid #115; border-radius: 4px; -moz-border-radius: 4px; -khtml-border-radius: 4px; margin: 15px 0px 15px 0 !important; - -moz-box-shadow: 0 1px 1px 1px rgba(176, 176, 216, 0.4); + -moz-box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4); + -khtml-box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4); + box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4); word-wrap: break-word; opacity: 1; } +h2 a, h3 a { + text-transform: capitalize; + letter-spacing: 0.03em; +} + +h2 a:hover, h3 a:hover { + text-shadow: none; +} + +.routersummary h3 a{ + text-transform: uppercase; +} + h2 a:hover { text-shadow: 0px 0px 1px rgba(255, 255, 72, 0.9); border-bottom: 1px #ff6600; @@ -786,18 +771,21 @@ h2 img { } h3 { - border: 1px solid #113; - border-left: 5px solid #113; - padding: 5px 5px 5px 5px; + border: 1px solid #115; + border-left: 5px solid #115; + padding: 5px 5px 5px 8px; margin: 12px 0 15px 0; border-radius: 0 4px 4px 0; -moz-border-radius: 0 4px 4px 0; -khtml-border-radius: 0 4px 4px 0; - background: #ffe url('images/header.png') center center repeat-x !important; + background: url('images/header.png') center center repeat-x !important; font-size: 11pt; - color: #000; - -moz-box-shadow: 0 1px 1px 1px rgba(176, 176, 216, 0.4); + color: #115; + -moz-box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4); + -khtml-box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4); + box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4); opacity: 1; + letter-spacing: 0.07em; } h4 { @@ -811,7 +799,7 @@ h4 { button, button:visited{ font: bold 9pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; - border: 1px outset #999; + border: 1px outset #66a; padding: 1px 3px; background: #ffe !important; text-decoration: none; @@ -823,7 +811,7 @@ button, button:visited{ margin: 0 1px; text-align: center; min-width: 80px; - -moz-box-shadow: inset 0px 2px 8px 0px #fff; + -moz-box-shadow: inset 0px 0px 2px 1px #fff; -khtml-box-shadow: inset 0px 2px 8px 0px #fff; box-shadow: inset 0px 2px 8px 0px #fff; color: #316; @@ -854,36 +842,23 @@ button:active{ } .langbox { - margin: 20px 10px 4px 5px; + margin: 7px 10px 4px 5px; padding: 8px 5px; color: #001; font-size: 7pt; width: 260px; text-align: right; float: right; - valign: middle; + vertical-align: middle; opacity: 1 !important; } .langbox img { opacity: 0.8 !important; - -moz-box-shadow: 0 0 1px #447; } .langbox img:hover { opacity: 1 !important; - -moz-box-shadow: 0 0 1px #f60; -} - -input { - background: #ffe; - color: #316; - margin: 5px 10px 5px 10px; - padding: 4px 2px; - font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; - border: 1px solid #447; - text-decoration: none; - min-width: 110px; } input, input:visited { @@ -894,7 +869,6 @@ input, input:visited { 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; @@ -919,6 +893,8 @@ input:active { border: 1px solid #f60; opacity: 1.0; -moz-box-shadow: inset 0px 0px 0px 1px #f60; + -khtml-box-shadow: inset 0px 0px 0px 1px #f60; + box-shadow: inset 0px 0px 0px 1px #f60; } input[type=text], input[type=password] { @@ -960,6 +936,12 @@ select { text-align: left !important; } +select:active { + -moz-box-shadow: inset 0px 0px 0px 1px #f60; + -khtml-box-shadow: inset 0px 0px 0px 1px #f60; + box-shadow: inset 0px 0px 0px 1px #f60; +} + textarea { padding: 5px; margin: 5px 15px 5px 10px; @@ -974,7 +956,11 @@ textarea { border: 1px solid #447; } -form {} +textarea:active { + -moz-box-shadow: inset 0px 0px 0px 1px #f60; + -khtml-box-shadow: inset 0px 0px 0px 1px #f60; + box-shadow: inset 0px 0px 0px 1px #f60; +} .proxyfooter { margin: 0 20px 10px 240px; @@ -990,59 +976,19 @@ form {} } .statusnotes { - font-style: italic; + font-style: normal; font-size: 8pt; - font-color: #001 !important; + font-color: #225 !important; text-align: center; border: 1px solid #447 !important; border-top: 0 !important; margin: -5px 0 5px 0; padding: 7px; - background: #ffe url('images/magic.png') center bottom; - -moz-box-shadow: inset 0px 0px 2px 1px #ffe; -} - -/* -.joblog { - margin: 15px 0; - padding: 10px 20px !important; - border: 1px solid #447; - background-color: #004; - background: #ffe url('images/lightbluetile.png'); - color: #001; - border-radius: 4px; - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - text-align: justify; - -moz-box-shadow: inset 0px 0px 1px 1px #bbf; - overflow: auto; - } - - div.joblog:li { - word-wrap: break-word !important; -} - - .joblog:ul { - word-wrap: break-word !important; + background: url("images/header.png") repeat scroll center center #eef; + letter-spacing: 0em !important; } -.joblog table { - margin-top: 10px; -} -*/ - div.joblog { -/* margin: 15px 0; - padding: 10px 20px !important; - border: 1px solid #447; - background-color: #004; - background: #ffe; /*url('images/lightbluetile.png') - color: #001; - border-radius: 4px; - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - text-align: justify; - -moz-box-shadow: inset 0px 0px 1px 1px #bbf;*/ overflow: auto; border: 0; margin-top: 5px; diff --git a/installer/resources/themes/console/light/console_big.css b/installer/resources/themes/console/light/console_big.css index ebc83a598741b8285af1195290f65e1c19f4ea58..8f3e3a3463be0e3db20912519003ba6b17520431 100644 --- a/installer/resources/themes/console/light/console_big.css +++ b/installer/resources/themes/console/light/console_big.css @@ -15,18 +15,19 @@ div.routersummary h3, div.routersummary h4, div.routersummary p, div.routersumma } -div.routersummary h4 { - font-size: 11pt; +div.routersummary h4, div.routersummary h4 a { + font-size: 11pt !important; letter-spacing: 0.1em; + -moz-box-shadow: inset 0px 0px 1px 15px #dfd; } div.routersummary b { - font-size: 9pt; + font-size: 9.5pt; font-weight: normal !important; } div.routersummary a { - word-spacing: 0.2em !important; - letter-spacing: 0.1em !important; + word-spacing: 0.1em !important; + letter-spacing: 0.05em !important; font-size: 10.5pt; line-height: 150%; } @@ -48,7 +49,7 @@ button, button:visited { } b { - color: #505; + color: #152 !important; } div.news { @@ -65,4 +66,28 @@ input, input:visited { table { font: 8.5pt/130% Verdana, "Bitstream Vera Sans", Tahoma, Helvetica, sans-serif; +} + +td { + font-size: 9pt; +} + +.statusnotes { + font-size: 10pt; + letter-spacing: 0.2em !important; + text-shadow: none !important; +} + +.tablefooter tr, .tablefooter td { + font-size: 10pt !important; +} + +div.tunnels a { + font-size: 9.5pt !important; + letter-spacing: 0 !important; + word-spacing: 0 !important; +} + +code, tt { + font-size: 10pt !important; } \ No newline at end of file diff --git a/installer/resources/themes/console/light/default.css b/installer/resources/themes/console/light/default.css index cbe675c2b63fc6381ab44ca15a504b1c43366b96..0c125086363993d30f7bea5cfa37e3d99e79e4e9 100644 --- a/installer/resources/themes/console/light/default.css +++ b/installer/resources/themes/console/light/default.css @@ -1,3 +1,7 @@ +/* I2P Tunnel Manager Theme: Light */ +/* Description: Light blue highlights. */ +/* Author: dr|z3d */ + body { margin: 0px; padding: 0px; @@ -39,19 +43,21 @@ label { } h4 { - font-size: 14px; + font-size: 11pt; font-weight: bold !important; - color: #001; - text-align: center; - border: 1px solid #225; + color: #115; + text-align: left; + border: 1px solid #115; margin: 5px 0 15px 0; padding: 5px 10px; - background: #eef url(images/header.png) repeat-x center center; - letter-spacing: 0.08em; - -moz-box-shadow: inset 0px 0px 4px 0px #bbf; + background: url(images/header.png) repeat-x center center; + letter-spacing: 0.07em; -moz-border-radius: 4px; -khtml-border-radius: 4px; border-radius: 4px; + -moz-box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4); + -khtml-box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4); + box-shadow: 0 2px 1px 1px rgba(176, 176, 216, 0.4); } a { @@ -65,7 +71,7 @@ form { textarea, input, select, button, a { -moz-box-sizing: border-box; box-sizing: border-box; - font-size: 9pt; + font-size: 8.5pt; float: left; vertical-align: middle; } @@ -76,10 +82,18 @@ button { } textarea { - border: 1px solid #9999ff; - color: #001; - background: #ddf; - border: 1px solid #44d; + color: #003; + background: #fff; + border: 1px solid #447; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; +} + +textarea:active { + -moz-box-shadow: inset 0px 0px 0px 1px #f60; + -khtml-box-shadow: inset 0px 0px 0px 1px #f60; + box-shadow: inset 0px 0px 0px 1px #f60; } br { @@ -126,36 +140,42 @@ hr { .separator, .subdivider { clear: both; height: 1px; - margin: 1px 0px 1px 0px; - border-bottom: 1px solid #225; + margin: 10px 0px 10px 0px; + border-bottom: 1px dotted #447; /* display: none; */ } .subdivider { - border-bottom: 1px solid #225; - padding: 5px 0px 0px 0px; + border-bottom: 1px dotted #447; + padding: 5px 0; } .freetext { width: 150px; height: 24px; - border: 1px solid #44d; + border: 1px solid #447; padding: 2px; margin: 4px 0 2px 0px; - font: 10pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; + font: 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; font-weight: bold; - background: #ddf; - color: #001; - -moz-border-radius: 0 4px 4px 0; - -khtml-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; + background: #fff; + color: #003; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; /* -moz-box-shadow: inset 0px -1px 1px 0px #fff; */ } +.freetext:active { + -moz-box-shadow: inset 0px 0px 0px 1px #f60; + -khtml-box-shadow: inset 0px 0px 0px 1px #f60; + box-shadow: inset 0px 0px 0px 1px #f60; +} + .control, control:link, control:visited { margin: 4px 0 0 4px !important; padding: 2px; @@ -164,7 +184,7 @@ hr { font-weight: bold; background: #ffe; color: #001; - border: 1px outset #ddddc0; + border: 1px outset #66a; text-align: center; white-space: nowrap; -moz-border-radius: 4px; @@ -182,11 +202,17 @@ hr { text-decoration: none; } */ + .control:hover, control:visited:hover { - border: 1px solid #eef; background-color: #f60; color: #fff !important; text-decoration: none; + border: 1px solid #f60 !important; + background: #f60 !important; + color: #fff; + -moz-box-shadow: inset 0px 0px 0px 1px #fff !important; + -khtml-box-shadow: inset 0px 0px 0px 1px #fff !important; + box-shadow: inset 0px 0px 0px 1px #fff !important; } .control:link, control:visited { @@ -196,7 +222,7 @@ hr { min-width: 60px; font-weight: bold; color: #001; - border: 1px outset #ddddc0; + border: 1px outset #66a; text-align: center; white-space: nowrap; -moz-border-radius: 4px; @@ -220,7 +246,9 @@ hr { border-radius: 4px; border: 1px solid #002; padding: 10px 20px; - -moz-box-shadow: inset 0px 0px 1px 0px #002; + -moz-box-shadow: inset 0px 0px 1px 1px #bbf; + -khtml-box-shadow: inset 0px 0px 1px 1px #bbf; + box-shadow: inset 0px 0px 1px 1px #bbf; background: none repeat scroll 0 0 #EEEEFF; background: #fff url(images/magic.png); border: 1px solid #444477; @@ -239,7 +267,7 @@ hr { .rowItem { width: 750px; float: left; - margin: 0px; + margin: 2px 0; } .comment { @@ -255,7 +283,7 @@ hr { padding: 0 0 0 2px; float: left; margin: 0; - font-size: 9pt !important; + font-size: 8.5pt !important; font-weight: bold; } @@ -267,17 +295,17 @@ hr { background-color: #fff; border: 1px solid #003; padding: 5px 20px 11px 10px; - -moz-box-shadow: inset 0px 0px 0px 1px #f00; -moz-box-shadow: inset 0px 0px 1px 0px #f60; background: #fff url(images/magic.png); border: 1px solid #444477; color: #613; - } #globalOperationsPanel .control { min-width: 120px; + font-family: "Lucida Sans Unicode", Verdana, Tahoma, Helvetica, sans-serif; + font-weight: bold; } #globalOperationsPanel .control:link { @@ -346,27 +374,36 @@ globalOperationsPanel .control:hover { } select { - background-color: #eef; - color: #001; + background-color: #fff; + color: #003; margin: 4px; font-family: "Lucida Sans Unicode", Verdana, Tahoma, Helvetica, sans-serif; font-weight: bold; - border: 1px solid #001; - padding: 2px; + border: 1px solid #447; + padding: 3px 3px 3px 0; min-width: 270px; font-size: 8pt; max-height: 24px; + -moz-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; +} + +select:active { + -moz-box-shadow: inset 0px 0px 0px 1px #f60; + -khtml-box-shadow: inset 0px 0px 0px 1px #f60; + box-shadow: inset 0px 0px 0px 1px #f60; } a:link{ - color: #613; + color: #359; text-decoration: none; font-weight: bold; word-wrap: break-word; } a:visited{ - color: #606; + color: #218; text-decoration: none; font-weight: bold; } diff --git a/installer/resources/themes/console/light/i2ptunnel.css b/installer/resources/themes/console/light/i2ptunnel.css index f54cacfcab0dcafcfbeb64555d67e06e8ad4e539..050c7b28ac9d6b50fd82d053009c6788a73c7c54 100644 --- a/installer/resources/themes/console/light/i2ptunnel.css +++ b/installer/resources/themes/console/light/i2ptunnel.css @@ -82,19 +82,30 @@ width: 100%; height: 100px; padding: 4px; - margin: 2px 0 3px 0; + margin: 2px 0 12px 0; background-color: #005; - color: #030; + color: #292; font-family: "Lucida Console", "DejaVu Sans Mono", "Andale Mono", "Courier New", Courier, mono; - border: 1px inset #002; - font-size: 9pt !important; + border: 1px solid #225; + font-size: 8pt !important; font-weight: bold; text-align: justify !important; - background: #ddf; /*url(images/tabletile.png);*/ + background: #efe url(images/magic.png); + -moz-box-shadow: 0 0 0px 1px #7f7; + -khtml-box-shadow: 0 0 0px 1px #7f7; + box-shadow: 0 0 0px 1px #7f7; + opacity: 0.9; } #tunnelListPage .footer .control { margin-left: 2px; + font-family: "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; + font-weight: bold; + color: #001 !important; +} + +#tunnelListPage .footer .control:hover { + color: white !important; } #tunnelListPage .footer label { @@ -140,6 +151,6 @@ #tunnelListPage .descriptionField label, #tunnelListPage .destinationField label { text-align: right; width: 150px; - height: 24px; + height: 28px; float: left; -} +} \ No newline at end of file diff --git a/installer/resources/themes/console/midnight/console.css b/installer/resources/themes/console/midnight/console.css index fbb7006f15470aacf9a7c235b6f7b9dc070b0f49..def9fad6dfe51c6fdb1d03b57d4d2cacf375ea81 100644 --- a/installer/resources/themes/console/midnight/console.css +++ b/installer/resources/themes/console/midnight/console.css @@ -169,10 +169,7 @@ div.routersummary { font-size: 9pt; word-wrap: break-word; font: 9pt/125%; - -moz-box-shadow: inset 0px 0px 0px 1px #00000A; -/* -moz-border-radius: 3px; - -khtml-border-radius: 3px; - border-radius: 3px;*/ + -moz-box-shadow: inset 0px 0px 0px 1px #00000A; } div.routersummary input[type=text] { @@ -283,16 +280,6 @@ div.tunnels table{ padding-right: 0; } -div.routersummary form { - margin-top: -8px !important; - margin-bottom: -8px !important; -} - -div.routersummary form:last-child { - padding-top: 3px !important; - margin-bottom: -10px !important; -} - div.refresh { margin-top: 10px !important; margin-bottom: 10px !important; @@ -329,10 +316,7 @@ div.main { border-top: 0; text-align: left; color: #eef; - min-width: 570px; -/* -moz-border-radius: 0 0 3px 3px; - -khtml-border-radius: 0 0 3px 3px; - border-radius: 0 0 3px 3px;*/ + min-width: 590px; background: #000 url(images/scarface.jpg) right bottom no-repeat !important; } @@ -432,24 +416,29 @@ div.news li { } div.news h3 { - text-align: left !important; + background: none !important; + text-align: left; + border: none !important; + padding-left: 0; + padding-top: 0px; + border-bottom: 1px dotted !important; + -moz-box-shadow: none; + -hktml-box-shadow: none; + box-shadow: none; + font-size: 10pt !important; + letter-spacing: 0.05em; + text-transform: uppercase !important; + margin: 15px 10px -5px; + padding: 5px 0 5px; } div.news p { color: #eef; font-size: 9pt; margin-bottom: -10px; -} -/* -div.news p:first-child { - padding-top: 15px !important; + margin-top: 10px; } - -div.news p:nth-child(2n) { - padding-top: 15px !important; -} -*/ div.news p:last-child { margin-bottom: 10px; } @@ -544,11 +533,11 @@ div.main li b{ font-size: 9.5pt; } -div.messages span.error { +div.error { color: #d00000; } -div.messages span.notice { +div.notice { font-style: italic; } @@ -566,9 +555,6 @@ h1 { min-width: 600px; line-height: 100%; color: #fff; -/* -moz-border-radius: 3px 3px 0 0; - -khtml-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; */ } h2 { @@ -578,12 +564,8 @@ h2 { border-top: 1px solid #99f; border-left: 1px solid #99f; background: #000008; -/* font-variant: small-caps; */ text-transform: uppercase; letter-spacing: 0.07em; -/* -moz-border-radius: 0 3px 0 0; - -khtml-border-radius: 0 3px 0 0; - border-radius: 0 3px 0 0;*/ } h3 { @@ -596,9 +578,6 @@ h3 { margin-bottom: 10px; font-weight: bold !important; text-transform: uppercase; -/* -moz-border-radius: 0 3px 0 0; - -khtml-border-radius: 0 3px 0 0; - border-radius: 0 3px 0 0;*/ } h3 a { @@ -772,7 +751,7 @@ input[type=text], input[type=password] select { } submit { margin: 3px 5px 3px 5px; - padding 2px 0; + padding: 2px 0; font: 8pt/140% "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; } @@ -787,13 +766,13 @@ p { } .langbox { - margin: 17px 0px 0px 5px; + margin: 4px 0px 0px 5px; color: #eef; font-size: 7pt; width: 240px; text-align: center; float: right; - valign: middle; + vertical-align: middle; } .langbox img { @@ -940,7 +919,7 @@ code { text-align: left; font: 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; color: #0d0; - padding: 0 2px; +/* padding: 0 2px;*/ } div.footnote { diff --git a/installer/resources/themes/console/midnight/ieshim.css b/installer/resources/themes/console/midnight/ieshim.css index aa9f29f9fe7d6e8a1a222a630342a45e32391eab..55c8c8f17d1b4f56e2be506b576146e7e18cac88 100644 --- a/installer/resources/themes/console/midnight/ieshim.css +++ b/installer/resources/themes/console/midnight/ieshim.css @@ -195,7 +195,7 @@ div.warning { } .langbox { - margin: 22px -20px 0px 5px; + margin: 9px -20px 0px 5px; } td { @@ -224,4 +224,4 @@ div.graphspanel img { div.graphspanel hr { margin: 20px 0; -} \ No newline at end of file +} diff --git a/installer/resources/uninstall_i2p_service_winnt.bat b/installer/resources/uninstall_i2p_service_winnt.bat index e36af92a19b3fe2d03d8c2877887af95b465268b..6dfee7474815de499fc3e9c3f98b286618a38542 100644 --- a/installer/resources/uninstall_i2p_service_winnt.bat +++ b/installer/resources/uninstall_i2p_service_winnt.bat @@ -31,5 +31,6 @@ rem :startup "%_WRAPPER_EXE%" -r %_WRAPPER_CONF% if not errorlevel 1 goto :eof +if "%2"=="--nopause" goto :eof pause diff --git a/router/doc/net.png b/router/doc/net.png deleted file mode 100644 index 6eac3784245e13c794795634b797ec2ea0a2eab1..0000000000000000000000000000000000000000 Binary files a/router/doc/net.png and /dev/null differ diff --git a/router/doc/techintro.html b/router/doc/techintro.html deleted file mode 100644 index 1574f5fa29186fa1b7946b86c1b96f10fd4fbc20..0000000000000000000000000000000000000000 --- a/router/doc/techintro.html +++ /dev/null @@ -1,994 +0,0 @@ -<html> -<head> - <title>Introducing I2P - a scalable framework for anonymous communication</title> -<style> -p { font-size: 10; text-align: left; font-family: sans-serif } -h1 { font-size: 12; font-family: sans-serif } -h2 { font-size: 10; font-family: sans-serif } -h3 { font-size: 10; font-family: sans-serif } -blockquote { font-size: 10; font-family: monospace, sans-serif } -pre { font-size: 10; font-family: sans-serif } -.title { font-size: 14; font-family: sans-serif } -.subtitle { font-size: 12; font-family: sans-serif } -</style> -</head> -<body> - -<center> -<b class="title">Introducing I2P</b><br /> -<span class="subtitle">a scalable framework for anonymous communication</span><br /> -<i style="font-size: 8">$Id: techintro.html,v 1.8.2.1 2006/02/13 07:13:35 jrandom Exp $</i> -<br /> -<br /> - -<table border="0" width="50%"> -<tr><td valign="top" align="left"> -<pre> -* <a href="#intro">Introduction</a> -* <a href="#op">Operation</a> - * <a href="#op.overview">Overview</a> - * <a href="#op.tunnels">Tunnels</a> - * <a href="#op.netdb">Network Database</a> - * <a href="#op.transport">Transport protocols</a> - * <a href="#op.crypto">Cryptography</a> -</pre> -</td> -<td valign="top" align="left"> -<pre> -* <a href="#future">Future</a> - * <a href="#future.restricted">Restricted routes</a> - * <a href="#future.variablelatency">Variable latency</a> - * <a href="#future.open">Open questions</a> -</pre> -</td> -<td valign="top" align="left"> -<pre> -* <a href="#similar">Similar systems</a> - * <a href="#similar.tor">Tor</a> - * <a href="#similar.freenet">Freenet</a> -* <a href="#app">Appendix A: Application layer</a> -</pre> -</td> -</tr></table> -</center> - -<hr /> - -<h1 id="intro">Introduction</h1> -<p> -I2P is a scalable, self organizing, resilient packet switched anonymous network layer, -upon which any number of different anonymity or security conscious applications -can operate. Each of these applications may make their own anonymity, latency, and -throughput tradeoffs without worrying about the proper implementation of a free -route mixnet, allowing them to blend their activity with the larger anonymity set of -users already running on top of I2P. Applications available already provide the full -range of typical Internet activities - anonymous web browsing, anonymous web hosting, -anonymous blogging and content syndication (with <a href="#app.syndie">Syndie</a>), -anonymous chat (via IRC or Jabber), anonymous swarming file transfers (with <a -href="#app.i2pbt">i2p-bt</a>, <a href="#app.i2psnark">I2PSnark</a>, and -<a href="#app.azneti2p">Azureus</a>), anonymous file sharing (with -<a href="#app.i2phex">I2Phex</a>), anonymous email (with <a href="#app.i2pmail">I2Pmail</a> -and <a href="#app.i2pmail">susimail</a>), anonymous newsgroups, as well as several -other applications under development. Unlike web sites hosted within content -distribution networks like <a href="#similar.freenet">Freenet</a> or -<a href="http://www.ovmj.org/GNUnet/">GNUnet</a>, the services hosted on I2P are fully -interactive - there are traditional web-style search engines, bulletin boards, blogs -you can comment on, database driven sites, and bridges to query static systems like -Freenet without needing to install it locally. -</p> - -<p> -With all of these anonymity enabled applications, I2P takes on the role of the message -oriented middleware - applications say that they want to send some data to a cryptographic -identifier (a "destination") and I2P takes care of making sure it gets there securely -and anonymously. I2P also bundles a simple <a href="#app.streaming">streaming</a> library -to allow I2P's anonymous best-effort messages to transfer as reliable, in-order streams, -transparently offering a TCP based congestion control algorithm tuned for the high -bandwidth delay product of the network. While there have been several simple SOCKS -proxies available to tie existing applications into the network, their value has been -limited as nearly every application routinely exposes what, in an anonymous context, -is sensitive information. The only safe way to go is to fully audit an application to -ensure proper operation, and to assist in that we provide a series of APIs in various -languages which can be used to make the most out of the network. -</p> - -<!-- commented out because "The details [...] are " *NOT* " given later" --> -<!-- -<p> -The scope of I2P's anonymity protections varies upon the applications running on -top of them, as well as the choices that each user makes. The aim is to provide -the options necessary so that a sufficient level of anonymity can be achieved while -exposing the functionality that people facing up to state level adversaries require. -At the same time, those facing less powerful adversaries are able to improve their -throughput and latency while reducing the resources required to provide the necessary -level of cover. The details of the techniques available for facing adversaries who -are internal or external, passive or active, local, national, or global, are given -later. -</p> ---> - -<p> -I2P is not a research project - academic, commercial, or governmental, but is instead -an engineering effort aimed at doing whatever is necessary to provide a sufficient -level of anonymity to those who need it. It has been in active development since -early 2003 with one full time developer and a dedicated group of part time contributors -from all over the world. All of the work done on I2P is open source and -freely available on the <a href="http://www.i2p.net/">website</a>, with the majority -of the code released outright into the public domain, though making use of a few -cryptographic routines under BSD-style licenses. The people working on I2P do not -control what people release client applications under, and there are several GPL'ed -applications available (<a href="#app.i2ptunnel">I2PTunnel</a>, -<a href="#app.i2pmail">susimail</a>, <a href="#app.i2psnark">I2PSnark</a>, <a href="#app.azneti2p">Azureus</a>, -<a href="#app.i2phex">I2Phex</a>). <a href="http://www.i2p.net/halloffame">Funding</a> -for I2P comes entirely from donations, and does not receive any tax breaks in any -jurisdiction at this time, as many of the developers are themselves anonymous. -</p> - -<h1 id="op">Operation</h1> -<h2 id="op.overview">Overview</h2> - -<p> -To understand I2P's operation, it is essential to understand a few key concepts. -First, I2P makes a strict separation between the software participating -in the network (a "router") and the anonymous endpoints ("destinations") associated -with individual applications. The fact that someone is running I2P is not usually -a secret. What is hidden is information on what the user is doing, if anything at -all, as well as what router a particular destination is connected to. End users -will typically have several local destinations on their router - for instance, one -proxying in to IRC servers, another supporting the user's anonymous webserver ("eepsite"), -another for an I2Phex instance, another for torrents, etc. -</p> - -<p> -Another critical concept to understand is the "tunnel" - a directed path through -an explicitly selected set of routers, making use of layered encryption so that -the messages sent in the tunnel's "gateway" appear entirely random at each hop -along the path until it reaches the tunnel's "endpoint". These unidirectional -tunnels can be seen as either "inbound" tunnels or "outbound" tunnels, referring -to whether they are bringing messages to the tunnel's creator or away from them, -respectively. The gateway of an inbound tunnel can receive messages from any -peer and will forward them down through the tunnel until it reaches the (anonymous) -endpoint (the creator). On the other hand, the gateway of an outbound tunnel is -the tunnel's creator, and messages sent through that tunnel are encoded so that -when they reach the outbound tunnel's endpoint, that router has the instructions -necessary to forward the message on to the appropriate location. -</p> - -<p> -A third critical concept to understand is I2P's "network database" (or "netDb") -- a pair of algorithms used to share network metadata. The two types of metadata -carried are "routerInfo" and "leaseSets" - the routerInfo gives routers the data -necessary for contacting a particular router (their public keys, transport -addresses, etc), while the leaseSet gives routers the information necessary for -contacting a particular destination. Within each leaseSet, there are any number -of "leases", each of which specifies the gateway for one of that destination's -inbound tunnels as well as when that tunnel will expire. The leaseSet also -contains a pair of public keys which can be used for layered garlic encryption. -</p> - -<!-- -<p> -I2P's operation can be understood by putting those three concepts together: -</p> - -<p><img src="net.png"></p> -!--> - -<p> -When Alice wants to send a message to Bob, she first does a lookup in the -netDb to find Bob's leaseSet, giving her his current inbound tunnel gateways. -She then picks one of her outbound tunnels and sends the message -down it with instructions for the outbound tunnel's endpoint to forward the -message on to one of Bob's inbound tunnel gateways. When the outbound -tunnel endpoint receives those instructions, it forwards the message as -requested, and when Bob's inbound tunnel gateway receives it, it is -forwarded down the tunnel to Bob's router. If Alice wants Bob to be able -to reply to the message, she needs to transmit her own destination explicitly -as part of the message itself (taken care of transparently in the -<a href="#app.streaming">streaming</a> library). Alice may also cut down on -the response time by bundling her most recent leaseSet with the message so -that Bob doesn't need to do a netDb lookup for it when he wants to reply, but this -is optional. -</p> - -<p> -While the tunnels themselves have layered encryption to prevent unauthorized -disclosure to peers inside the network (as the transport layer itself does to -prevent unauthorized disclosure to peers outside the network), it is necessary -to add an additional end to end layer of encryption to hide the message from the -outbound tunnel endpoint and the inbound tunnel gateway. This -"<a href="#op.garlic">garlic encryption</a>" lets Alice's router wrap up multiple -messages into a single "garlic message", encrypted to a particular public key -so that intermediary peers cannot determine either how many messages are within -the garlic, what those messages say, or where those individual cloves are -destined. For typical end to end communication between Alice and Bob, the -garlic will be encrypted to the public key published in Bob's leaseSet, -allowing the message to be encrypted without giving out the public key to Bob's -own router. -</p> - -<p> -Another important fact to keep in mind is that I2P is entirely message based -and that some messages may be lost along the way. Applications using I2P -can use the message oriented interfaces and take care of their own congestion -control and reliability needs, but most would be best served by reusing the -provided <a href="#app.streaming">streaming</a> library to view I2P as a streams -based network. -</p> - -<h2 id="op.tunnels">Tunnels</h2> - -<p> -Both inbound and outbound tunnels work along similar principles - the tunnel -gateway accumulates a number of tunnel messages, eventually preprocessing them -into something for tunnel delivery. Next, the gateway encrypts that preprocessed -data and forwards it to the first hop. That peer and subsequent tunnel -participants add on a layer of encryption after verifying that it isn't a -duplicate before forward it on to the next peer. Eventually, the -message arrives at the endpoint where the messages are split out again and -forwarded on as requested. The difference arises in what -the tunnel's creator does - for inbound tunnels, the creator is the endpoint -and they simply decrypt all of the layers added, while for outbound tunnels, -the creator is the gateway and they pre-decrypt all of the layers so that after -all of the layers of per-hop encryption are added, the message arrives in the -clear at the tunnel endpoint. -</p> - -<p> -The choice of specific peers to pass on messages as well as their particular -ordering is important to understanding both I2P's anonymity and performance -characteristics. While the network database (below) has its own criteria for -picking what peers to query and store entries on, tunnels may use any peers in -the network in any order (and even any number of times) in a single tunnel. If -perfect latency and capacity data were globally known, selection and ordering -would be driven by the particular needs of the client in tandem with their threat -model. Unfortunately, latency and capacity data is not trivial to gather -anonymously, and depending upon untrusted peers to provide this information has -its own serious anonymity implications. -</p> - -<p> -From an anonymity perspective, the simplest technique would be to pick peers -randomly from the entire network, order them randomly, and use those peers -in that order for all eternity. From a performance perspective, the simplest -technique would be to pick the fastest peers with the necessary spare capacity, -spreading the load across different peers to handle transparent failover, and -to rebuild the tunnel whenever capacity information changes. While the former -is both brittle and inefficient, the later requires inaccessible information -and offers insufficient anonymity. I2P is instead working on offering a range -of peer selection strategies, coupled with anonymity aware measurement code to -organize the peers by their profiles. -</p> - -<p> -As a base, I2P is constantly profiling the peers with which it interacts with -by measuring their indirect behavior - for instance, when a peer responds to -a netDb lookup in 1.3 seconds, that round trip latency is recorded in the -profiles for all of the routers involved in the two tunnels (inbound and -outbound) through which the request and response passed, as well as the queried -peer's profile. Direct measurement, such as transport layer latency or -congestion, is not used as part of the profile, as it can be manipulated and -associated with the measuring router, exposing them to trivial attacks. While -gathering these profiles, a series of calculations are run on each to summarize -its performance - its latency, capacity to handle lots of activity, whether they -are currently overloaded, and how well integrated into the network they seem to -be. These calculations are then compared for active peers to organize the routers -into four tiers - fast and high capacity, high capacity, not failing, and failing. -The thresholds for those tiers are determined dynamically, and while they -currently use fairly simple algorithms, alternatives exist. -</p> - -<p> -Using this profile data, the simplest reasonable peer selection strategy is to -pick peers randomly from the top tier (fast and high capacity), and this is -currently deployed for client tunnels. Exploratory tunnels (used for netDb -and tunnel management) pick peers randomly from the not failing tier (which -includes routers in 'better' tiers as well), allowing the peer to sample -routers more widely, in effect optimizing the peer selection through randomized -hill climbing. These strategies alone do however leak information regarding the -peers in the router's tip tier through predecessor and netDb harvesting attacks. -In turn, several alternatives exist which, while not balancing the load as evenly, -will address the attacks mounted by particular classes of adversaries. -</p> - -<p> -By picking a random key and ordering the peers according to their XOR distance -from it, the information leaked is reduced in predecessor and harvesting attacks -according to the peers' failure rate and the tier's churn. Another simple strategy -for dealing with netDb harvesting attacks is to simply fix the inbound tunnel -gateway(s) yet randomize the peers further on in the tunnels. To deal with -predecessor attacks for adversaries which the client contacts, the outbound tunnel -endpoints would also remain fixed. The selection of which peer to fix on the most -exposed point would of course need to have a limit to the duration, as all peers -fail eventually, so it could either be reactively adjusted or proactively avoided -to mimic a measured mean time between failures of other routers. These two strategies -can in turn be combined, using a fixed exposed peer and an XOR based ordering within -the tunnels themselves. A more rigid strategy would fix the exact peers and ordering -of a potential tunnel, only using individual peers if all of them agree to participate -in the same way each time. This varies from the XOR based ordering in that the -predecessor and successor of each peer is always the same, while the XOR only makes -sure their order doesn't change. -</p> - -<p> -As mentioned before, I2P currently (release 0.6.1.1) includes the tiered random -strategy above, but the others are planned for the 0.6.2 release. A more detailed -discussion of the mechanics involved in tunnel operation, management, and peer -selection can be found in the -<a href="http://dev.i2p.net/cgi-bin/cvsweb.cgi/i2p/router/doc/tunnel-alt.html?rev=HEAD">tunnel spec</a>. -</p> - -<h2 id="op.netdb">Network Database</h2> - -<p> -As mentioned earlier, I2P's netDb works to share the network's metadata. Two -algorithms are used to accomplish this - primarily, a small set of routers are -designated as "floodfill peers", while the rest of the routers participate in -the <a href="http://en.wikipedia.org/wiki/Kademlia">Kademlia </a> derived -distributed hash table for redundancy. To integrate the two algorithms, each -router always uses the Kademlia style store and fetch, but acts as if the -floodfill peers are 'closest' to the key in question. Additionally, when a -peer publishes a key into the netDb, after a brief delay they query another -random floodfill peer, asking them for the key, and if that peer does not have -it, they move on and republish the key again. Behind the scenes, when one of -the floodfill peers receives a new valid key, they republish it to the other -floodfill peers who then cache it locally. -</p> - -<p> -Each piece of data in the netDb is self authenticating - signed by the -appropriate party and verified by anyone who uses or stores it. In addition, -the data has liveliness information within it, allowing irrelevant entries to be -dropped, newer entries to replace older ones, and, for the paranoid, protection -against certain classes of attack. This is also why I2P bundles the necessary -code for maintaining the correct time, occasionally querying some SNTP servers -(the <a href="http://www.pool.ntp.org/">pool.ntp.org</a> round robin by default) -and detecting skew between routers at the transport layer. -</p> - -<p> -The routerInfo structure itself contains all of the information that one router -needs to know to securely send messages to another router. This includes their -identity (made up of a 2048bit ElGamal public key, a 1024bit DSA public key, and -a certificate), the transport addresses which they can be reached on, such as -an IP address and port, when the structure was published, and a set of arbitrary -uninterpreted text options. In addition, there is a signature against all of -that data as generated by the included DSA public key. The key for this routerInfo -structure in the netDb is the SHA256 hash of the router's identity. The options -published are often filled with information helpful in debugging I2P's operation, -but when I2P reaches the 1.0 release, the options will be disabled and kept blank. -</p> - -<p> -The leaseSet structure is similar, in that it includes the I2P destination -(comprised of a 2048bit ElGamal public key, a 1024bit DSA public key, and a -certificate), a list of "leases", and a pair of public keys for garlic encrypting -messages to the destination. Each of the leases specify one of the destination's -inbound tunnel gateways by including the SHA256 of the gateway's identity, a 4 -byte tunnel id on that gateway, and when that tunnel will expire. The key for -the leaseSet in the netDb is the SHA256 of the destination itself. -</p> - -<p> -As the router currently automatically bundles the leaseSet for the sender inside -a garlic message to the recipient, the leaseSet for destinations which will not -receive unsolicited messages do not need to be published in the netDb at all. If -the destination itself is sensitive, the leaseSet could instead be transmitted -through other means without ever going into the netDb. -</p> - -<p> -Bootstrapping the netDb itself is simple - once a router has at least one routerInfo -of a reachable peer, they query that router for references to other routers in the -network with the Kademlia healing algorithm. Each routerInfo reference is stored in -an individual file in the router's netDb subdirectory, allowing people to easily -share their references to bootstrap new users. -</p> - -<p> -Unlike traditional DHTs, the very act of conducting a search distributes the data -as well, since rather passing Kademlia's standard IP+port pairs, references are given -to the routers that the peer should query next (namely, the SHA256 of those routers' -identities). As such, iteratively searching for a particular destination's leaseSet -or router's routerInfo will also provide you with the routerInfo of the peers along -the way. In addition, due to the time sensitivity of the data published, the information -doesn't often need to migrate between peers - since a tunnel is only valid for 10 -minutes, the leaseSet can be dropped after that time has passed. To take into -account Sybil attacks on the netDb, the Kademlia routing location used for any given -key varies over time. For instance, rather than storing a routerInfo on the peers -closest to SHA256(routerInfo.identity), they are stored on the peers closest to -SHA256(routerInfo.identity + YYYYMMDD), requiring an adversary to remount the attack -again daily so as to maintain their closeness to the current routing key. As the -very fact that a router is making a lookup for a given key may expose sensitive data -(and the fact that a router is <i>publishing</i> a given key even more so), all netDb -messages are transmitted through the router's exploratory tunnels. -</p> - -<p> -The netDb plays a very specific role in the I2P network, and the algorithms have -been tuned towards our needs. This also means that it hasn't been tuned to address the -needs we have yet to run into. As the network grows, the primary floodfill algorithm -will need to be refined to exploit the capacity available, or perhaps replaced with -another technique for securely distributing the network metadata. -</p> - -<h2 id="op.transport">Transport protocols</h2> - -<p> -Communication between routers needs to provide confidentiality and integrity -against external adversaries while authenticating that the router contacted -is the one who should receive a given message. The particulars of how routers -communicate with other routers aren't critical - three separate protocols have -been used at different points to provide those bare necessities. To accommodate -the need for high degree communication (as a number of routers will end up -speaking with many others), I2P moved from a TCP based transport -to a UDP based one - "Secure Semireliable UDP", or "SSU". As described in the -<a href="http://dev.i2p.net/cgi-bin/cvsweb.cgi/i2p/router/doc/udp.html?rev=HEAD">SSU spec</a>:</p> - -<blockquote> -The goal of this protocol is to provide secure, authenticated, -semireliable, and unordered message delivery, exposing only a minimal amount of -data easily discernible to third parties. It should support high degree -communication as well as TCP-friendly congestion control, and may include -PMTU detection. It should be capable of efficiently moving bulk data at rates -sufficient for home users. In addition, it should support techniques for -addressing network obstacles, like most NATs or firewalls. -</blockquote> - -<h2 id="op.crypto">Cryptography</h2> - -<p> -A bare minimum set of cryptographic primitives are combined together to provide I2P's -layered defenses against a variety of adversaries. At the lowest level, interrouter -communication is protected by the transport layer security - SSU -encrypts each packet with AES256/CBC with both an explicit IV and MAC (HMAC-MD5-128) -after agreeing upon an ephemeral session key through a 2048bit Diffie-Hellman exchange, -station-to-station authentication with the other router's DSA key, plus each network -message has their own hash for local integrity checking. -<a href="#op.tunnels">Tunnel</a> messages passed over the transports have their own -layered AES256/CBC encryption with an explicit IV and verified at the tunnel endpoint -with an additional SHA256 hash. Various other messages are passed along inside -"garlic messages", which are encrypted with ElGamal/AES+SessionTags (explained below). -</p> - -<h3 id="op.garlic">Garlic messages</h3> - -<p> -Garlic messages are an extension of "onion" layered encryption, allowing the contents -of a single message to contain multiple "cloves" - fully formed messages alongside -their own instructions for delivery. Messages are wrapped into a garlic message whenever -the message would otherwise be passing in cleartext through a peer who should not have -access to the information - for instance, when a router wants to ask another router to -participate in a tunnel, they wrap the request inside a garlic, encrypt that garlic to -the receiving router's 2048bit ElGamal public key, and forward it through a tunnel. -Another example is when a client wants to send a message to a destination - the sender's -router will wrap up that data message (alongside some other messages) into a garlic, -encrypt that garlic to the 2048bit ElGamal public key published in the recipient's -leaseSet, and forward it through the appropriate tunnels. -</p> - -<p> -The "instructions" attached to each clove inside the encryption layer includes the -ability to request that the clove be forwarded locally, to a remote router, or to a -remote tunnel on a remote router. There are fields in those instructions allowing a -peer to request that the delivery be delayed until a certain time or condition has -been met, though they won't be honored until the -<a href="#future.variablelatency">nontrivial delays</a> are deployed. It is possible to -explicitly route garlic messages any number of hops without building tunnels, or even -to reroute tunnel messages by wrapping them in garlic messages and forwarding them a -number of hops prior to delivering them to the next hop in the tunnel, but those -techniques are not currently used in the existing implementation. -</p> - -<h3 id="op.sessiontags">Session tags</h3> - -<p> -As an unreliable, unordered, message based system, I2P uses a simple combination of -asymmetric and symmetric encryption algorithms to provide data confidentiality and -integrity to garlic messages. As a whole, the combination is referred to as -ElGamal/AES+SessionTags, but that is an excessively verbose way to describe the simple -use of 2048bit ElGamal, AES256, SHA256, and 32 byte nonces. -</p> - -<p> -The first time a router wants to encrypt a garlic message to another router, they encrypt -the keying material for an AES256 session key with ElGamal and append the AES256/CBC -encrypted payload after that encrypted ElGamal block. In addition to the encrypted -payload, the AES encrypted section contains the payload length, the SHA256 hash of the -unencrypted payload, as well as a number of "session tags" - random 32 byte nonces. The -next time the sender wants to encrypt a garlic message to another router, rather than -ElGamal encrypt a new session key they simply pick one of the previously delivered session -tags and AES encrypt the payload like before, using the session key used with that -session tag, prepended with the session tag itself. When a router receives a garlic encrypted -message, they check the first 32 bytes to see if it matches an available session tag - if -it does, they simply AES decrypt the message, but if it does not, they ElGamal decrypt the -first block. -</p> - -<p> -Each session tag can be used only once so as to prevent internal adversaries from unnecessarily -correlating different messages as being between the same routers. The sender of an -ElGamal/AES+SessionTag encrypted message chooses when and how many tags to deliver, -prestocking the recipient with enough tags to cover a volley of messages. Garlic messages -may detect the successful tag delivery by bundling a small additional message as a clove (a -"delivery status message") - when the garlic message arrives at the intended recipient and -is decrypted successfully, this small delivery status message is one of the cloves exposed and -has instructions for the recipient to send the clove back to the original sender (through an -inbound tunnel, of course). When the original sender receives this delivery status message, -they know that the session tags bundled in the garlic message were successfully delivered. -</p> - -<p> -Session tags themselves have a very short lifetime, after which they are discarded -if not used. In addition, the quantity stored for each key is limited, as are the -number of keys themselves - if too many arrive, either new or old messages may be -dropped. The sender keeps track whether messages using session tags are getting -through, and if there isn't sufficient communication it may drop the ones previously -assumed to be properly delivered, reverting back to the full expensive ElGamal -encryption. -</p> - -<p> -One alternative is to transmit only a single session tag, and from that, seed a -deterministic PRNG for determining what tags to use or expect. By keeping this -PRNG roughly synchronized between the sender and recipient (the recipient precomputes a -window of the next e.g. 50 tags), the overhead of periodically bundling a large number -of tags is removed, allowing more options in the space/time tradeoff, and perhaps -reducing the number of ElGamal encryptions necessary. However, it would depend -upon the strength of the PRNG to provide the necessary cover against internal -adversaries, though perhaps by limiting the amount of times each PRNG is used, any -weaknesses can be minimized. At the moment, there are no immediate plans to move -towards these synchronized PRNGs. -</p> - -<h1 id="future">Future</h1> -<p> -While I2P is currently functional and sufficient for many scenarios, there are -several areas which require further improvement to meet the needs of those -facing more powerful adversaries as well as substantial user experience optimization. -</p> - -<h2 id="future.restricted">Restricted route operation</h2> - -<p> -I2P is an overlay network designed to be run on top of a functional packet switched -network, exploiting the end to end principle to offer anonymity and security. -While the Internet no longer fully embraces the end to end principle, I2P does require a -substantial portion of the network to be reachable - there may be a number of peers -along the edges running using restricted routes, but I2P does not include an -appropriate routing algorithm for the degenerate case where most peers are -unreachable. It would, however work on top of a network employing such an -algorithm. -</p> - -<p> -Restricted route operation, where there are limits to what peers are -reachable directly, has several different functional and anonymity -implications, dependent upon how the restricted routes are handled. At the most -basic level, restricted routes exist when a peer is behind a NAT or firewall which -does not allow inbound connections. This was largely addressed in I2P 0.6.0.6 by -integrating distributed hole punching into the transport layer, allowing people -behind most NATs and firewalls to receive unsolicited connections without any -configuration. However, this does not limit the exposure of the peer's IP address to -routers inside the network, as they can simply get introduced to the peer through -the published introducer. -</p> - -<p> -Beyond the functional handling of restricted routes, there are two levels of -restricted operation that can be used to limit the exposure of one's IP address - -using router-specific tunnels for communication, and offering 'client routers'. For -the former, routers can either build a new pool of tunnels or reuse their exploratory -pool, publishing the inbound gateways to some of them as part of their routerInfo in -place of their transport addresses. When a peer wants to get in touch with them, -they see those tunnel gateways in the netDb and simply send the relevant message to -them through one of the published tunnels. If the peer behind the restricted route -wants to reply, it may do so either directly (if they are willing to expose their IP -to the peer) or indirectly through their outbound tunnels. When the routers that the -peer has direct connections to want to reach it (to forward tunnel messages, for -instance), they simply prioritize their direct connection over the published tunnel -gateway. The concept of 'client routers' simply extends the restricted route by not -publishing any router addresses. Such a router would not even need to publish their -routerInfo in the netDb, merely providing their self signed routerInfo to the peers -that it contacts (necessary to pass the router's public keys). Both levels of -restricted route operation are planned for I2P 2.0. -</p> - -<p> -There are tradeoffs for those behind restricted routes, as they would likely -participate in other people's tunnels less frequently, and the routers which -they are connected to would be able to infer traffic patterns that would not -otherwise be exposed. On the other hand, if the cost of that exposure is less -than the cost of an IP being made available, it may be worthwhile. This, of course, -assumes that the peers that the router behind a restricted route contacts are not -hostile - either the network is large enough that the probability of using a hostile -peer to get connected is small enough, or trusted (and perhaps temporary) peers are -used instead. -</p> - -<h2 id="future.variablelatency">Variable latency</h2> - -<p> -Even though the bulk of I2P's initial efforts have been on low latency communication, -it was designed with variable latency services in mind from the beginning. At the -most basic level, applications running on top of I2P can offer the anonymity of -medium and high latency communication while still blending their traffic patterns -in with low latency traffic. Internally though, I2P can offer its own medium and -high latency communication through the garlic encryption - specifying that the -message should be sent after a certain delay, at a certain time, after a certain -number of messages have passed, or another mix strategy. With the layered encryption, -only the router that the clove exposed the delay request would know that the message -requires high latency, allowing the traffic to blend in further with the low latency -traffic. Once the transmission precondition is met, the router holding on to the -clove (which itself would likely be a garlic message) simply forwards it as -requested - to a router, to a tunnel, or, most likely, to a remote client destination. -</p> - -<p> -There are a substantial number of ways to exploit this capacity for high latency -comm in I2P, but for the moment, doing so has been scheduled for the I2P 3.0 release. -In the meantime, those requiring the anonymity that high latency comm can offer should -look towards the application layer to provide it. -</p> - -<h2 id="future.open">Open questions</h2> -<pre> -How to get rid of the timing constraint? -Can we deal with the sessionTags more efficiently? -What, if any, batching/mixing strategies should be made available on the tunnels? -What other tunnel peer selection and ordering strategies should be available? -</pre> - -<h1 id="similar">Similar systems</h1> -<p> -I2P's architecture builds on the concepts of message oriented middleware, the topology -of DHTs, the anonymity and cryptography of free route mixnets, and the adaptability of -packet switched networking. The value comes not from novel concepts of algorithms -though, but from careful engineering combining the research results of existing -systems and papers. While there are a few similar efforts worth reviewing, both for -technical and functional comparisons, two in particular are pulled out here - Tor -and Freenet. -</p> - -<h2 id="similar.tor">Tor</h2> -<p><i><a href="http://tor.eff.org/">website</a></i></p> - -<p> -At first glance, Tor and I2P have many functional and anonymity related similarities. -While I2P's development began before we were aware of the early stage efforts on Tor, -many of the lessons of the original onion routing and ZKS efforts were integrated into -I2P's design. Rather than building an essentially trusted, centralized system with -directory servers, I2P has a self organizing network database with each peer taking on -the responsibility of profiling other routers to determine how best to exploit available -resources. Another key difference is that while both I2P and Tor use layered and -ordered paths (tunnels and circuits/streams), I2P is fundamentally a packet switched -network, while Tor is fundamentally a circuit switched one, allowing I2P to -transparently route around congestion or other network failures, operate redundant -pathways, and load balance the data across available resources. While Tor offers -the useful outproxy functionality by offering integrated outproxy discovery and -selection, I2P leaves such application layer decisions up to applications running on -top of I2P - in fact, I2P has even externalized the TCP-like streaming library itself -to the application layer, allowing developers to experiment with different strategies, -exploiting their domain specific knowledge to offer better performance. -</p> - -<p> -From an anonymity perspective, there is much similarity when the core networks are -compared. However, there are a few key differences. When dealing with an internal -adversary or most external adversaries, I2P's simplex tunnels expose half as much -traffic data than would be exposed with Tor's duplex circuits by simply looking at -the flows themselves - an HTTP request and response would follow the same path in -Tor, while in I2P the packets making up the request would go out through one or -more outbound tunnels and the packets making up the response would come back through -one or more different inbound tunnels. While I2P's peer selection and ordering -strategies should sufficiently address predecessor attacks, I2P can trivially -mimic Tor's non-redundant duplex tunnels by simply building an inbound and -outbound tunnel along the same routers.</p> - -<p> -Another anonymity issue comes up in Tor's use of telescopic tunnel creation, as -simple packet counting and timing measurements as the cells in a circuit pass -through an adversary's node exposes statistical information regarding where the -adversary is within the circuit. I2P's unidirectional tunnel creation with a -single message so that this data is not exposed. Protecting the position in a -tunnel is important, as an adversary would otherwise be able to mounting a -series of powerful predecessor, intersection, and traffic confirmation attacks. -</p> - -<p> -Tor's support for a second tier of "onion proxies" does offer a nontrivial degree -of anonymity while requiring a low cost of entry, while I2P will not offer this -topology until <a href="#future.restricted">2.0</a>. -</p> - -<p> -On the whole, Tor and I2P complement each other in their focus - Tor works towards -offering high speed anonymous Internet outproxying, while I2P works towards offering -a decentralized resilient network in itself. In theory, both can be used to achieve -both purposes, but given limited development resources, they both have their -strengths and weaknesses. The I2P developers have considered the steps necessary to -modify Tor to take advantage of I2P's design, but concerns of Tor's viability under -resource scarcity suggest that I2P's packet switching architecture will be able to -exploit scarce resources more effectively. -</p> - -<h2 id="similar.freenet">Freenet</h2> -<p><i><a href="http://www.freenetproject.org/">website</a></i></p> - -<p> -Freenet played a large part in the initial stages of I2P's design - giving proof to -the viability of a vibrant pseudonymous community completely contained within the -network, demonstrating that the dangers inherent in outproxies could be avoided. -The first seed of I2P began as a replacement communication layer for Freenet, -attempting to factor out the complexities of a scalable, anonymous and secure point -to point communication from the complexities of a censorship resistant distributed -data store. Over time however, some of the anonymity and scalability issues -inherent in Freenet's algorithms made it clear that I2P's focus should stay strictly -on providing a generic anonymous communication layer, rather than as a component of -Freenet. Over the years, the Freenet developers have come to see the weaknesses -in the older design, prompting them to suggest that they will require a "premix" -layer to offer substantial anonymity. In other words, Freenet needs to run on top -of a mixnet such as I2P or Tor, with "client nodes" requesting and publishing data -through the mixnet to the "server nodes" which then fetch and store the data according -to Freenet's heuristic distributed data storage algorithms. -</p> - -<p> -Freenet's functionality is very complementary to I2P's, as Freenet natively provides -many of the tools for operating medium and high latency systems, while I2P natively -provides the low latency mix network suitable for offering adequate anonymity. The -logic of separating the mixnet from the censorship resistant distributed data store -still seems self evident from an engineering, anonymity, security, and resource -allocation perspective, so hopefully the Freenet team will pursue efforts in that -direction, if not simply reusing (or helping to improve, as necessary) existing -mixnets like I2P or Tor. -</p> - -<p> -It is worth mentioning that there has recently been discussion and work by the -Freenet developers on a "globally scalable darknet" using restricted routes between -peers of various trust. While insufficient information has been made publicly -available regarding how such a system would operate for a full review, from what -has been said the anonymity and scalability claims seem highly dubious. In -particular, the appropriateness for use in hostile regimes against state level -adversaries has been tremendously overstated, and any analysis on the implications -of resource scarcity upon the scalability of the network has seemingly been avoided. -Further questions regarding susceptibility to traffic analysis, trust, and other topics -do exist, but a more in-depth review of this "globally scalable darknet" will have -to wait until the Freenet team makes more information available. -</p> - -<h1 id="app">Appendix A: Application layer</h1> - -<p> -I2P itself doesn't really do much - it simply sends messages to remote destinations -and receives messages targeting local destinations - most of the interesting work -goes on at the layers above it. By itself, I2P could be seen as an anonymous and -secure IP layer, and the bundled <a href="#app.streaming">streaming library</a> as -an implementation of an anonymous and secure TCP layer on top of it. Beyond that, -<a href="#app.i2ptunnel">I2PTunnel</a> exposes a generic TCP proxying system for -either getting into or out of the I2P network, plus a variety of network -applications provide further functionality for end users. -</p> - -<h2 id="app.streaming">Streaming library</h2> - -<p> -The streaming library has grown organically for I2P - first mihi implemented the -"mini streaming library" as part of I2PTunnel, which was limited to a window -size of 1 message (requiring an ACK before sending the next one), and then it was -refactored out into a generic streaming interface (mirroring TCP sockets) and the -full streaming implementation was deployed with a sliding window protocol and -optimizations to take into account the high bandwidth x delay product. Individual -streams may adjust the maximum packet size and other options, though the default -of 4KB compressed seems a reasonable tradeoff between the bandwidth costs of -retransmitting lost messages and the latency of multiple messages. -</p> - -<p> -In addition, in consideration of the relatively high cost of subsequent messages, -the streaming library's protocol for scheduling and delivering messages has been optimized to -allow individual messages passed to contain as much information as is available. -For instance, a small HTTP transaction proxied through the streaming library can -be completed in a single round trip - the first message bundles a SYN, FIN, and -the small payload (an HTTP request typically fits) and the reply bundles the SYN, -FIN, ACK, and the small payload (many HTTP responses fit). While an additional -ACK must be transmitted to tell the HTTP server that the SYN/FIN/ACK has been -received, the local HTTP proxy can deliver the full response to the browser -immediately. -</p> - -<p> -On the whole, however, the streaming library bears much resemblance to an -abstraction of TCP, with its sliding windows, congestion control algorithms -(both slow start and congestion avoidance), and general packet behavior (ACK, -SYN, FIN, RST, rto calculation, etc). -</p> - -<h2 id="app.naming">Naming library and addressbook</h2> -<p><i>Developed by: mihi, Ragnarok</i></p> - -<p> -Naming within I2P has been an oft-debated topic since the very beginning with -advocates across the spectrum of possibilities. However, given I2P's inherent -demand for secure communication and decentralized operation, the traditional -DNS-style naming system is clearly out, as are "majority rules" voting systems. -Instead, I2P ships with a generic naming library and a base implementation -designed to work off a local name to destination mapping, as well as an optional -add-on application called the "addressbook". The addressbook is a web-of-trust -driven secure, distributed, and human readable naming system, sacrificing only -the call for all human readable names to be globally unique by mandating only -local uniqueness. While all messages in I2P are cryptographically addressed -by their destination, different people can have local addressbook entries for -"Alice" which refer to different destinations. People can still discover new -names by importing published addressbooks of peers specified in their web of trust, -by adding in the entries provided through a third party, or (if some people organize -a series of published addressbooks using a first come first serve registration -system) people can choose to treat these addressbooks as name servers, emulating -traditional DNS. -</p> - -<p> -I2P does not promote the use of DNS-like services though, as the damage done -by hijacking a site can be tremendous - and insecure destinations have no -value. DNSsec itself still falls back on registrars and certificate authorities, -while with I2P, requests sent to a destination cannot be intercepted or the reply -spoofed, as they are encrypted to the destination's public keys, and a destination -itself is just a pair of public keys and a certificate. DNS-style systems on the -other hand allow any of the name servers on the lookup path to mount simple denial -of service and spoofing attacks. Adding on a certificate authenticating the -responses as signed by some centralized certificate authority would address many of -the hostile nameserver issues but would leave open replay attacks as well as -hostile certificate authority attacks. -</p> - -<p> -Voting style naming is dangerous as well, especially given the effectiveness of -Sybil attacks in anonymous systems - the attacker can simply create an arbitrarily -high number of peers and "vote" with each to take over a given name. Proof-of-work -methods can be used to make identity non-free, but as the network grows the load -required to contact everyone to conduct online voting is implausible, or if the -full network is not queried, different sets of answers may be reachable. -</p> - -<p> -As with the Internet however, I2P is keeping the design and operation of a -naming system out of the (IP-like) communication layer. The bundled naming library -includes a simple service provider interface which alternate naming systems can -plug into, allowing end users to drive what sort of naming tradeoffs they prefer. -</p> - -<h2 id="app.syndie">Syndie</h2> - -<p> -Syndie is a safe, anonymous blogging / content publication / content aggregation system. -It lets you create information, share it with others, and read posts from those you're -interested in, all while taking into consideration your needs for security and anonymity. -Rather than building its own content distribution network, Syndie is designed to run on -top of existing networks, syndicating content through eepsites, Tor hidden services, -Freenet freesites, normal websites, usenet newgroups, email lists, RSS feeds, etc. Data -published with Syndie is done so as to offer pseudonymous authentication to anyone -reading or archiving it. -</p> - -<h2 id="app.i2ptunnel">I2PTunnel</h2> -<p><i>Developed by: mihi</i></p> - -<p> -I2PTunnel is probably I2P's most popular and versatile client application, allowing -generic proxying both into and out of the I2P network. I2PTunnel can be viewed as -four separate proxying applications - a "client" which receives inbound TCP connections -and forwards them to a given I2P destination, an "httpclient" (aka "eepproxy") which -acts like an HTTP proxy and forwards the requests to the appropriate I2P destination -(after querying the naming service if necessary), a "server" which receives inbound I2P -streaming connections on a destination and forwards them to a given TCP host+port, -and an "httpserver" which extends the "server" by parsing the HTTP request and -responses to allow safer operation. There is an additional "socksclient" application, -but its use is not encouraged for reasons previously mentioned. -</p> - -<p> -I2P itself is not an outproxy network - the anonymity and security concerns inherent -in a mix net which forwards data into and out of the mix have kept I2P's design focused -on providing an anonymous network which capable of meeting the user's needs without -requiring external resources. However, the I2PTunnel "httpclient" application offers -a hook for outproxying - if the hostname requested doesn't end in ".i2p", it picks a -random destination from a user-provided set of outproxies and forwards the request to -them. These destinations are simply I2PTunnel "server" instances run by volunteers -who have explicitly chosen to run outproxies - no one is an outproxy by default, and -running an outproxy doesn't automatically tell other people to proxy through you. -While outproxies do have inherent weaknesses, they offer a simple proof of concept for -using I2P and provide some functionality under a threat model which may be sufficient -for some users. -</p> - -<p> -I2PTunnel enables most of the applications in use. An "httpserver" pointing at a -webserver lets anyone run their own anonymous website (or "eepsite") - a webserver -is bundled with I2P for this purpose, but any webserver can be used. Anyone may -run a "client" pointing at one of the anonymously hosted IRC servers, each of which -are running a "server" pointing at their local IRCd and communicating between IRCds -over their own "client" tunnels. End users also have "client" tunnels pointing at -<a href="#app.i2pmail">I2Pmail's</a> POP3 and SMTP destinations (which in turn are -simply "server" instances pointing at POP3 and SMTP servers), as well as "client" -tunnels pointing at I2P's CVS server, allowing anonymous development. At times people have -even run "client" proxies to access the "server" instances pointing at an NNTP server. -</p> - -<h2 id="app.i2pbt">i2p-bt</h2> -<p><i>Developed by: duck, et al</i></p> - -<p> -i2p-bt is a port of the mainline python BitTorrent client to run both the tracker and -peer communication over I2P. Tracker requests are forwarded through the eepproxy to -eepsites specified in the torrent file while tracker responses refer to peers by their -destination explicitly, allowing i2p-bt to open up a -<a href="#app.streaming">streaming lib</a> connection to query them for blocks. -</p> - -<p> -In addition to i2p-bt, a port of bytemonsoon has been made to I2P, making a few -modifications as necessary to strip any anonymity-compromising information from the -application and to take into consideration the fact that IPs cannot be used for -identifying peers. -</p> - -<h2 id="app.i2psnark">I2PSnark</h2> -<p><i>I2PSnark developed: jrandom, et al, ported from <a -href="http://www.klomp.org/mark/">mjw</a>'s <a -href="http://www.klomp.org/snark/">Snark</a> client</i></p> - -<p> -Bundled with the I2P install, I2PSnark offers a simple anonymous bittorrent -client with multitorrent capabilities, exposing all of the functionality through -a plain HTML web interface. -</p> - -<h2 id="app.azneti2p">Azureus/azneti2p</h2> -<p><i>Developed by: parg, et al</i></p> - -<p> -The developers of the <a href="http://azureus.sf.net/">Azureus</a> BitTorrent client -have created an "azneti2p" plugin, allowing Azureus users to participate in anonymous -swarms over I2P, or simply to access anonymously hosted trackers while contacting -each peer directly. In addition, Azureus' built in tracker lets people run their -own anonymous trackers without running bytemonsoon (which has substantial prerequisites) -or i2p-bt's tracker. The plugin is currently (July 2005) fully functional, but is in early -beta and has a fairly complicated configuration process, though it is hopefully going -to be streamlined further. -</p> - -<h2 id="app.i2phex">I2Phex</h2> -<p><i>Developed by: sirup</i></p> - -<p> -I2Phex is a fairly direct port of the Phex Gnutella filesharing client to run -entirely on top of I2P. While it has disabled some of Phex's functionality, -such as integration with Gnutella webcaches, the basic file sharing and chatting -system is fully functional. -</p> - -<h2 id="app.i2pmail">I2Pmail/susimail</h2> -<p><i>Developed by: postman, susi23, mastiejaner</i></p> - -<p> -I2Pmail is more a service than an application - postman offers both internal and -external email with POP3 and SMTP service through I2PTunnel instances accessing a -series of components developed with mastiejaner, allowing people to use their -preferred mail clients to send and receive mail pseudonymously. However, as most -mail clients expose substantial identifying information, I2P bundles susi23's -web based susimail client which has been built specifically with I2P's anonymity -needs in mind. The I2Pmail/mail.i2p service offers transparent virus filtering as -well as denial of service prevention with hashcash augmented quotas. -In addition, each user has control of their batching strategy prior to delivery -through the mail.i2p outproxies, which are separate from the mail.i2p SMTP and -POP3 servers - both the outproxies and inproxies communicate with the mail.i2p -SMTP and POP3 servers through I2P itself, so compromising those non-anonymous -locations does not give access to the mail accounts or activity patterns of the -user. At the moment the developers work on a decentralized mailsystem, called -"v2mail". More information can be found on the eepsite -<a href="http://hq.postman.i2p/">hq.postman.i2p</a>. -</p> - -</body> -</html> diff --git a/router/doc/tunnel-alt-creation.html b/router/doc/tunnel-alt-creation.html deleted file mode 100644 index 0eb4a5d901c1e88f18786d9ea8981356d6d5d6d4..0000000000000000000000000000000000000000 --- a/router/doc/tunnel-alt-creation.html +++ /dev/null @@ -1,163 +0,0 @@ -<code>$Id: tunnel-alt-creation.html,v 1.1.2.1 2006/02/01 20:28:34 jrandom Exp $</code> -<pre> -1) <a href="#tunnelCreate.overview">Tunnel creation</a> -1.1) <a href="#tunnelCreate.requestRecord">Tunnel creation request record</a> -1.2) <a href="#tunnelCreate.hopProcessing">Hop processing</a> -1.3) <a href="#tunnelCreate.replyRecord">Tunnel creation reply record</a> -1.4) <a href="#tunnelCreate.requestPreparation">Request preparation</a> -1.5) <a href="#tunnelCreate.requestDelivery">Request delivery</a> -1.6) <a href="#tunnelCreate.endpointHandling">Endpoint handling</a> -1.7) <a href="#tunnelCreate.replyProcessing">Reply processing</a> -2) <a href="#tunnelCreate.notes">Notes</a> -</pre> - -<h2 id="tunnelCreate.overview">1) Tunnel creation encryption:</h2> - -<p>The tunnel creation is accomplished by a single message passed along -the path of peers in the tunnel, rewritten in place, and transmitted -back to the tunnel creator. This single tunnel message is made up -of a fixed number of records (8) - one for each potential peer in -the tunnel. Individual records are asymmetrically encrypted to be -read only by a specific peer along the path, while an additional -symmetric layer of encryption is added at each hop so as to expose -the asymmetrically encrypted record only at the appropriate time.</p> - -<h3 id="tunnelCreate.requestRecord">1.1) Tunnel creation request record</h3> - -<p>Cleartext of the record, visible only to the hop being asked:</p><pre> - bytes 0-3: tunnel ID to receive messages as - bytes 4-35: local router identity hash - bytes 36-39: next tunnel ID - bytes 40-71: next router identity hash - bytes 72-103: AES-256 tunnel layer key - bytes 104-135: AES-256 tunnel IV key - bytes 136-167: AES-256 reply key - bytes 168-183: reply IV - byte 184: flags - bytes 185-188: request time (in hours since the epoch) - bytes 189-192: next message ID - bytes 193-222: uninterpreted / random padding</pre> - -<p>The next tunnel ID and next router identity hash fields are used to -specify the next hop in the tunnel, though for an outbound tunnel -endpoint, they specify where the rewritten tunnel creation reply -message should be sent. In addition, the next message ID specifies the -message ID that the message (or reply) should use.</p> - -<p>The flags field currently has two bits defined:</p><pre> - bit 0: if set, allow messages from anyone - bit 1: if set, allow messages to anyone, and send the reply to the - specified next hop in a tunnel message</pre> - -<p>That cleartext record is ElGamal 2048 encrypted with the hop's -public encryption key and formatted into a 528 byte record:</p><pre> - bytes 0-15: SHA-256-128 of the current hop's router identity - bytes 16-527: ElGamal-2048 encrypted request record</pre> - -<p>Since the cleartext uses the full field, there is no need for -additional padding beyond <code>SHA256(cleartext) + cleartext</code>.</p> - -<h3 id="tunnelCreate.hopProcessing">1.2) Hop processing</h3> - -<p>When a hop receives a TunnelBuildMessage, it looks through the 8 -records contained within it for one starting with their own identity -hash (trimmed to 8 bytes). It then decryptes the ElGamal block from -that record and retrieves the protected cleartext. At that point, -they make sure the tunnel request is not a duplicate by feeding the -AES-256 reply key into a bloom filter and making sure the request -time is within an hour of current. Duplicates or invalid requests -are dropped.</p> - -<p>After deciding whether they will agree to participate in the tunnel -or not, they replace the record that had contained the request with -an encrypted reply block. All other records are AES-256/CBC -encrypted with the included reply key and IV (though each is -encrypted separately, rather than chained across records).</p> - -<h3 id="tunnelCreate.replyRecord">1.3) Tunnel creation reply record</h3> - -<p>After the current hop reads their record, they replace it with a -reply record stating whether or not they agree to participate in the -tunnel, and if they do not, they classify their reason for -rejection. This is simply a 1 byte value, with 0x0 meaning they -agree to participate in the tunnel, and higher values meaning higher -levels of rejection. The reply is encrypted with the AES session -key delivered to it in the encrypted block, padded with random data -until it reaches the full record size:</p><pre> - AES-256-CBC(SHA-256(padding+status) + padding + status, key, IV)</pre> - -<h3 id="tunnelCreate.requestPreparation">1.4) Request preparation</h3> - -<p>When building a new request, all of the records must first be -built and asymmetrically encrypted. Each record should then be -decrypted with the reply keys and IVs of the hops earlier in the -path. That decryption should be run in reverse order so that the -asymmetrically encrypted data will show up in the clear at the -right hop after their predecessor encrypts it.</p> - -<p>The excess records not needed for individual requests are simply -filled with random data by the creator.</p> - -<h3 id="tunnelCreate.requestDelivery">1.5) Request delivery</h3> - -<p>For outbound tunnels, the delivery is done directly from the tunnel -creator to the first hop, packaging up the TunnelBuildMessage as if -the creator was just another hop in the tunnel. For inbound -tunnels, the delivery is done through an existing outbound tunnel -(and during startup, when no outbound tunnel exists yet, a fake 0 -hop outbound tunnel is used).</p> - -<h3 id="tunnelCreate.endpointHandling">1.6) Endpoint handling</h3> - -<p>When the request reaches an outbound endpoint (as determined by the -'allow messages to anyone' flag), the hop is processed as usual, -encrypting a reply in place of the record and encrypting all of the -other records, but since there is no 'next hop' to forward the -TunnelBuildMessage on to, it instead places the encrypted reply -records into a TunnelBuildReplyMessage and delivers it to the -reply tunnel specified within the request record. That reply tunnel -forwards the reply records down to the tunnel creator for -processing, as below.</p> - -<p>When the request reaches the inbound endpoint (also known as the -tunnel creator), the router processes each of the replies, as below.</p> - -<h3 id="tunnelCreate.replyProcessing">1.7) Reply processing</h3> - -<p>To process the reply records, the creator simply has to AES decrypt -each record individually, using the reply key and IV of each hop in -the tunnel after the peer (in reverse order). This then exposes the -reply specifying whether they agree to participate in the tunnel or -why they refuse. If they all agree, the tunnel is considered -created and may be used immediately, but if anyone refuses, the -tunnel is discarded.</p> - -<h2 id="tunnelCreate.notes">2) Notes</h2> -<ul> -<li>This does not prevent two hostile peers within a tunnel from -tagging one or more request or reply records to detect that they are -within the same tunnel, but doing so can be detected by the tunnel -creator when reading the reply, causing the tunnel to be marked as -invalid.</li> -<li>This does not include a proof of work on the asymmetrically -encrypted section, though the 16 byte identity hash could be cut in -half with the later replaced by a hashcash function of up to 2^64 -cost. This will not immediately be pursued, however.</li> -<li>This alone does not prevent two hostile peers within a tunnel from -using timing information to determine whether they are in the same -tunnel. The use of batched and synchronized request delivery -could help (batching up requests and sending them off on the -(ntp-synchronized) minute). However, doing so lets peers 'tag' the -requests by delaying them and detecting the delay later in the -tunnel, though perhaps dropping requests not delivered in a small -window would work (though doing that would require a high degree of -clock synchronization). Alternately, perhaps individual hops could -inject a random delay before forwarding on the request?</li> -<li>Are there any nonfatal methods of tagging the request?</li> -<li>This strategy came about during a discussion on the I2P mailing list - between Michael Rogers, Matthew Toseland (toad), and jrandom regarding - the predecessor attack. See: <ul> - <li><a href="http://dev.i2p.net/pipermail/i2p/2005-October/001073.html">Summary</a></li> - <li><a href="http://dev.i2p.net/pipermail/i2p/2005-October/001064.html">Reasoning</a></li> - </ul></li> -</ul> diff --git a/router/doc/tunnel-alt.html b/router/doc/tunnel-alt.html deleted file mode 100644 index 2d5f2be2ffe9e375322a9fcad0968ab53280e9f2..0000000000000000000000000000000000000000 --- a/router/doc/tunnel-alt.html +++ /dev/null @@ -1,467 +0,0 @@ -<code>$Id: tunnel-alt.html,v 1.9 2005/07/27 14:04:07 jrandom Exp $</code> -<pre> -1) <a href="#tunnel.overview">Tunnel overview</a> -2) <a href="#tunnel.operation">Tunnel operation</a> -2.1) <a href="#tunnel.preprocessing">Message preprocessing</a> -2.2) <a href="#tunnel.gateway">Gateway processing</a> -2.3) <a href="#tunnel.participant">Participant processing</a> -2.4) <a href="#tunnel.endpoint">Endpoint processing</a> -2.5) <a href="#tunnel.padding">Padding</a> -2.6) <a href="#tunnel.fragmentation">Tunnel fragmentation</a> -2.7) <a href="#tunnel.alternatives">Alternatives</a> -2.7.1) <a href="#tunnel.reroute">Adjust tunnel processing midstream</a> -2.7.2) <a href="#tunnel.bidirectional">Use bidirectional tunnels</a> -2.7.3) <a href="#tunnel.backchannel">Backchannel communication</a> -2.7.4) <a href="#tunnel.variablesize">Variable size tunnel messages</a> -3) <a href="#tunnel.building">Tunnel building</a> -3.1) <a href="#tunnel.peerselection">Peer selection</a> -3.1.1) <a href="#tunnel.selection.exploratory">Exploratory tunnel peer selection</a> -3.1.2) <a href="#tunnel.selection.client">Client tunnel peer selection</a> -3.2) <a href="#tunnel.request">Request delivery</a> -3.3) <a href="#tunnel.pooling">Pooling</a> -3.4) <a href="#tunnel.building.alternatives">Alternatives</a> -3.4.1) <a href="#tunnel.building.telescoping">Telescopic building</a> -3.4.2) <a href="#tunnel.building.nonexploratory">Non-exploratory tunnels for management</a> -4) <a href="#tunnel.throttling">Tunnel throttling</a> -5) <a href="#tunnel.mixing">Mixing/batching</a> -</pre> - -<h2>1) <a name="tunnel.overview">Tunnel overview</a></h2> - -<p>Within I2P, messages are passed in one direction through a virtual -tunnel of peers, using whatever means are available to pass the -message on to the next hop. Messages arrive at the tunnel's -gateway, get bundled up and/or fragmented into fixed sizes tunnel messages, -and are forwarded on to the next hop in the tunnel, which processes and verifies -the validity of the message and sends it on to the next hop, and so on, until -it reaches the tunnel endpoint. That endpoint takes the messages -bundled up by the gateway and forwards them as instructed - either -to another router, to another tunnel on another router, or locally.</p> - -<p>Tunnels all work the same, but can be segmented into two different -groups - inbound tunnels and outbound tunnels. The inbound tunnels -have an untrusted gateway which passes messages down towards the -tunnel creator, which serves as the tunnel endpoint. For outbound -tunnels, the tunnel creator serves as the gateway, passing messages -out to the remote endpoint.</p> - -<p>The tunnel's creator selects exactly which peers will participate -in the tunnel, and provides each with the necessary configuration -data. They may have any number of hops, but may be constrained with various -proof-of-work requests to add on additional steps. It is the intent to make -it hard for either participants or third parties to determine the length of -a tunnel, or even for colluding participants to determine whether they are a -part of the same tunnel at all (barring the situation where colluding peers are -next to each other in the tunnel).</p> - -<p>Beyond their length, there are additional configurable parameters -for each tunnel that can be used, such as a throttle on the frequency of -messages delivered, how padding should be used, how long a tunnel should be -in operation, whether to inject chaff messages, and what, if any, batching -strategies should be employed.</p> - -<p>In practice, a series of tunnel pools are used for different -purposes - each local client destination has its own set of inbound -tunnels and outbound tunnels, configured to meet its anonymity and -performance needs. In addition, the router itself maintains a series -of pools for participating in the network database and for managing -the tunnels themselves.</p> - -<p>I2P is an inherently packet switched network, even with these -tunnels, allowing it to take advantage of multiple tunnels running -in parallel, increasing resilience and balancing load. Outside of -the core I2P layer, there is an optional end to end streaming library -available for client applications, exposing TCP-esque operation, -including message reordering, retransmission, congestion control, etc.</p> - -<h2>2) <a name="tunnel.operation">Tunnel operation</a></h2> - -<p>Tunnel operation has four distinct processes, taken on by various -peers in the tunnel. First, the tunnel gateway accumulates a number -of tunnel messages and preprocesses them into something for tunnel -delivery. Next, that gateway encrypts that preprocessed data, then -forwards it to the first hop. That peer, and subsequent tunnel -participants, unwrap a layer of the encryption, verifying that it isn't -a duplicate, then forward it on to the next peer. -Eventually, the message arrives at the endpoint where the messages -bundled by the gateway are split out again and forwarded on as -requested.</p> - -<p>Tunnel IDs are 4 byte numbers used at each hop - participants know what -tunnel ID to listen for messages with and what tunnel ID they should be forwarded -on as to the next hop, and each hop chooses the tunnel ID which they receive messages -on. Tunnels themselves are short lived (10 minutes at the -moment), and even if subsequent tunnels are built using the same sequence of -peers, each hop's tunnel ID will change.</p> - -<h3>2.1) <a name="tunnel.preprocessing">Message preprocessing</a></h3> - -<p>When the gateway wants to deliver data through the tunnel, it first -gathers zero or more I2NP messages, selects how much padding will be used, -fragments it across the necessary number of 1KB tunnel messages, and decides how -each I2NP message should be handled by the tunnel endpoint, encoding that -data into the raw tunnel payload:</p> -<ul> -<li>the first 4 bytes of the SHA256 of the remaining preprocessed data concatenated - with the IV, using the IV as will be seen on the tunnel endpoint (for - outbound tunnels) or the IV as was seen on the tunnel gateway (for inbound - tunnels) (see below for IV processing).</li> -<li>0 or more bytes containing random nonzero integers</li> -<li>1 byte containing 0x00</li> -<li>a series of zero or more { instructions, message } pairs</li> -</ul> - -<p>The instructions are encoded with a single control byte, followed by any -necessary additional information. The first bit in that control byte determines -how the remainder of the header is interpreted - if it is not set, the message -is either not fragmented or this is the first fragment in the message. If it is -set, this is a follow on fragment.</p> - -<p>With the first bit being 0, the instructions are:</p> -<ul> -<li>1 byte control byte:<pre> - bit 0: is follow on fragment? (1 = true, 0 = false, must be 0) - bits 1-2: delivery type - (0x0 = LOCAL, 0x01 = TUNNEL, 0x02 = ROUTER) - bit 3: delay included? (1 = true, 0 = false) - bit 4: fragmented? (1 = true, 0 = false) - bit 5: extended options? (1 = true, 0 = false) - bits 6-7: reserved</pre></li> -<li>if the delivery type was TUNNEL, a 4 byte tunnel ID</li> -<li>if the delivery type was TUNNEL or ROUTER, a 32 byte router hash</li> -<li>if the delay included flag is true, a 1 byte value:<pre> - bit 0: type (0 = strict, 1 = randomized) - bits 1-7: delay exponent (2^value minutes)</pre></li> -<li>if the fragmented flag is true, a 4 byte message ID</li> -<li>if the extended options flag is true:<pre> - = a 1 byte option size (in bytes) - = that many bytes</pre></li> -<li>2 byte size of the I2NP message or this fragment</li> -</ul> - -<p>If the first bit being 1, the instructions are:</p> -<ul> -<li>1 byte control byte:<pre> - bit 0: is follow on fragment? (1 = true, 0 = false, must be 1) - bits 1-6: fragment number - bit 7: is last? (1 = true, 0 = false)</pre></li> -<li>4 byte message ID (same one defined in the first fragment)</li> -<li>2 byte size of this fragment</li> -</ul> - -<p>The I2NP message is encoded in its standard form, and the -preprocessed payload must be padded to a multiple of 16 bytes.</p> - -<h3>2.2) <a name="tunnel.gateway">Gateway processing</a></h3> - -<p>After the preprocessing of messages into a padded payload, the gateway builds -a random 16 byte IV value, iteratively encrypting it and the tunnel message as -necessary, and forwards the tuple {tunnelID, IV, encrypted tunnel message} to the next hop.</p> - -<p>How encryption at the gateway is done depends on whether the tunnel is an -inbound or an outbound tunnel. For inbound tunnels, they simply select a random -IV, postprocessing and updating it to generate the IV for the gateway and using -that IV along side their own layer key to encrypt the preprocessed data. For outbound -tunnels they must iteratively decrypt the (unencrypted) IV and preprocessed -data with the IV and layer keys for all hops in the tunnel. The result of the outbound -tunnel encryption is that when each peer encrypts it, the endpoint will recover -the initial preprocessed data.</p> - -<h3>2.3) <a name="tunnel.participant">Participant processing</a></h3> - -<p>When a peer receives a tunnel message, it checks that the message came from -the same previous hop as before (initialized when the first message comes through -the tunnel). If the previous peer is a different router, or if the message has -already been seen, the message is dropped. The participant then encrypts the -received IV with AES256/ECB using their IV key to determine the current IV, uses -that IV with the participant's layer key to encrypt the data, encrypts the -current IV with AES256/ECB using their IV key again, then forwards the tuple -{nextTunnelId, nextIV, encryptedData} to the next hop. This double encryption -of the IV (both before and after use) help address a certain class of -confirmation attacks.</p> - -<p>Duplicate message detection is handled by a decaying Bloom filter on message -IVs. Each router maintains a single Bloom filter to contain the XOR of the IV and -the first block of the message received for all of the tunnels it is participating -in, modified to drop seen entries after 10-20 minutes (when the tunnels will have -expired). The size of the bloom filter and the parameters used are sufficient to -more than saturate the router's network connection with a negligible chance of -false positive. The unique value fed into the Bloom filter is the XOR of the IV -and the first block so as to prevent nonsequential colluding peers in the tunnel -from tagging a message by resending it with the IV and first block switched.</p> - -<h3>2.4) <a name="tunnel.endpoint">Endpoint processing</a></h3> - -<p>After receiving and validating a tunnel message at the last hop in the tunnel, -how the endpoint recovers the data encoded by the gateway depends upon whether -the tunnel is an inbound or an outbound tunnel. For outbound tunnels, the -endpoint encrypts the message with its layer key just like any other participant, -exposing the preprocessed data. For inbound tunnels, the endpoint is also the -tunnel creator so they can merely iteratively decrypt the IV and message, using the -layer and IV keys of each step in reverse order.</p> - -<p>At this point, the tunnel endpoint has the preprocessed data sent by the gateway, -which it may then parse out into the included I2NP messages and forwards them as -requested in their delivery instructions.</p> - -<h3>2.5) <a name="tunnel.padding">Padding</a></h3> - -<p>Several tunnel padding strategies are possible, each with their own merits:</p> - -<ul> -<li>No padding</li> -<li>Padding to a random size</li> -<li>Padding to a fixed size</li> -<li>Padding to the closest KB</li> -<li>Padding to the closest exponential size (2^n bytes)</li> -</ul> - -<p>These padding strategies can be used on a variety of levels, addressing the -exposure of message size information to different adversaries. After gathering -and reviewing some <a href="http://dev.i2p.net/~jrandom/messageSizes/">statistics</a> -from the 0.4 network, as well as exploring the anonymity tradeoffs, we're starting -with a fixed tunnel message size of 1024 bytes. Within this however, the fragmented -messages themselves are not padded by the tunnel at all (though for end to end -messages, they may be padded as part of the garlic wrapping).</p> - -<h3>2.6) <a name="tunnel.fragmentation">Tunnel fragmentation</a></h3> - -<p>To prevent adversaries from tagging the messages along the path by adjusting -the message size, all tunnel messages are a fixed 1024 bytes in size. To accommodate -larger I2NP messages as well as to support smaller ones more efficiently, the -gateway splits up the larger I2NP messages into fragments contained within each -tunnel message. The endpoint will attempt to rebuild the I2NP message from the -fragments for a short period of time, but will discard them as necessary.</p> - -<p>Routers have a lot of leeway as to how the fragments are arranged, whether -they are stuffed inefficiently as discrete units, batched for a brief period to -fit more payload into the 1024 byte tunnel messages, or opportunistically padded -with other messages that the gateway wanted to send out.</p> - -<h3>2.7) <a name="tunnel.alternatives">Alternatives</a></h3> - -<h4>2.7.1) <a name="tunnel.reroute">Adjust tunnel processing midstream</a></h4> - -<p>While the simple tunnel routing algorithm should be sufficient for most cases, -there are three alternatives that can be explored:</p> -<ul> -<li>Have a peer other than the endpoint temporarily act as the termination -point for a tunnel by adjusting the encryption used at the gateway to give them -the plaintext of the preprocessed I2NP messages. Each peer could check to see -whether they had the plaintext, processing the message when received as if they -did.</li> -<li>Allow routers participating in a tunnel to remix the message before -forwarding it on - bouncing it through one of that peer's own outbound tunnels, -bearing instructions for delivery to the next hop.</li> -<li>Implement code for the tunnel creator to redefine a peer's "next hop" in -the tunnel, allowing further dynamic redirection.</li> -</ul> - -<h4>2.7.2) <a name="tunnel.bidirectional">Use bidirectional tunnels</a></h4> - -<p>The current strategy of using two separate tunnels for inbound and outbound -communication is not the only technique available, and it does have anonymity -implications. On the positive side, by using separate tunnels it lessens the -traffic data exposed for analysis to participants in a tunnel - for instance, -peers in an outbound tunnel from a web browser would only see the traffic of -an HTTP GET, while the peers in an inbound tunnel would see the payload -delivered along the tunnel. With bidirectional tunnels, all participants would -have access to the fact that e.g. 1KB was sent in one direction, then 100KB -in the other. On the negative side, using unidirectional tunnels means that -there are two sets of peers which need to be profiled and accounted for, and -additional care must be taken to address the increased speed of predecessor -attacks. The tunnel pooling and building process outlined below should -minimize the worries of the predecessor attack, though if it were desired, -it wouldn't be much trouble to build both the inbound and outbound tunnels -along the same peers.</p> - -<h4>2.7.3) <a name="tunnel.backchannel">Backchannel communication</a></h4> - -<p>At the moment, the IV values used are random values. However, it is -possible for that 16 byte value to be used to send control messages from the -gateway to the endpoint, or on outbound tunnels, from the gateway to any of the -peers. The inbound gateway could encode certain values in the IV once, which -the endpoint would be able to recover (since it knows the endpoint is also the -creator). For outbound tunnels, the creator could deliver certain values to the -participants during the tunnel creation (e.g. "if you see 0x0 as the IV, that -means X", "0x1 means Y", etc). Since the gateway on the outbound tunnel is also -the creator, they can build a IV so that any of the peers will receive the -correct value. The tunnel creator could even give the inbound tunnel gateway -a series of IV values which that gateway could use to communicate with -individual participants exactly one time (though this would have issues regarding -collusion detection)</p> - -<p>This technique could later be used deliver message mid stream, or to allow the -inbound gateway to tell the endpoint that it is being DoS'ed or otherwise soon -to fail. At the moment, there are no plans to exploit this backchannel.</p> - -<h4>2.7.4) <a name="tunnel.variablesize">Variable size tunnel messages</a></h4> - -<p>While the transport layer may have its own fixed or variable message size, -using its own fragmentation, the tunnel layer may instead use variable size -tunnel messages. The difference is an issue of threat models - a fixed size -at the transport layer helps reduce the information exposed to external -adversaries (though overall flow analysis still works), but for internal -adversaries (aka tunnel participants) the message size is exposed. Fixed size -tunnel messages help reduce the information exposed to tunnel participants, but -does not hide the information exposed to tunnel endpoints and gateways. Fixed -size end to end messages hide the information exposed to all peers in the -network.</p> - -<p>As always, its a question of who I2P is trying to protect against. Variable -sized tunnel messages are dangerous, as they allow participants to use the -message size itself as a backchannel to other participants - e.g. if you see a -1337 byte message, you're on the same tunnel as another colluding peer. Even -with a fixed set of allowable sizes (1024, 2048, 4096, etc), that backchannel -still exists as peers could use the frequency of each size as the carrier (e.g. -two 1024 byte messages followed by an 8192). Smaller messages do incur the -overhead of the headers (IV, tunnel ID, hash portion, etc), but larger fixed size -messages either increase latency (due to batching) or dramatically increase -overhead (due to padding). Fragmentation helps ammortize the overhead, at the -cost of potential message loss due to lost fragments.</p> - -<p>Timing attacks are also relevent when reviewing the effectiveness of fixed -size messages, though they require a substantial view of network activity -patterns to be effective. Excessive artificial delays in the tunnel will be -detected by the tunnel's creator, due to periodic testing, causing that entire -tunnel to be scrapped and the profiles for peers within it to be adjusted.</p> - -<h2>3) <a name="tunnel.building">Tunnel building</a></h2> - -<p>When building a tunnel, the creator must send a request with the necessary -configuration data to each of the hops and wait for all of them to agree before -enabling the tunnel. The requests are encrypted so that only the peers who need -to know a piece of information (such as the tunnel layer or IV key) has that -data. In addition, only the tunnel creator will have access to the peer's -reply. There are three important dimensions to keep in mind when producing -the tunnels: what peers are used (and where), how the requests are sent (and -replies received), and how they are maintained.</p> - -<h3>3.1) <a name="tunnel.peerselection">Peer selection</a></h3> - -<p>Beyond the two types of tunnels - inbound and outbound - there are two styles -of peer selection used for different tunnels - exploratory and client. -Exploratory tunnels are used for both network database maintenance and tunnel -maintenance, while client tunnels are used for end to end client messages. </p> - -<h4>3.1.1) <a name="tunnel.selection.exploratory">Exploratory tunnel peer selection</a></h4> - -<p>Exploratory tunnels are built out of a random selection of peers from a subset -of the network. The particular subset varies on the local router and on what their -tunnel routing needs are. In general, the exploratory tunnels are built out of -randomly selected peers who are in the peer's "not failing but active" profile -category. The secondary purpose of the tunnels, beyond merely tunnel routing, -is to find underutilized high capacity peers so that they can be promoted for -use in client tunnels.</p> - -<h4>3.1.2) <a name="tunnel.selection.client">Client tunnel peer selection</a></h4> - -<p>Client tunnels are built with a more stringent set of requirements - the local -router will select peers out of its "fast and high capacity" profile category so -that performance and reliability will meet the needs of the client application. -However, there are several important details beyond that basic selection that -should be adhered to, depending upon the client's anonymity needs.</p> - -<p>For some clients who are worried about adversaries mounting a predecessor -attack, the tunnel selection can keep the peers selected in a strict order - -if A, B, and C are in a tunnel, the hop after A is always B, and the hop after -B is always C. A less strict ordering is also possible, assuring that while -the hop after A may be B, B may never be before A. Other configuration options -include the ability for just the inbound tunnel gateways and outbound tunnel -endpoints to be fixed, or rotated on an MTBF rate.</p> - -<p>In the initial implementation, only random ordering has been implemented, -though more strict ordering will be developed and deployed over time, as well -as controls for the user to select which strategy to use for individual clients.</p> - -<h3>3.2) <a name="tunnel.request">Request delivery</a></h3> - -<p>A new tunnel request preparation, delivery, and response method has been -<a href="tunnel-alt-creation.html">devised</a>, which reduces the number of -predecessors exposed, cuts the number of messages transmitted, verifies proper -connectivity, and avoids the message counting attack of traditional telescopic -tunnel creation. The old technique is listed below as an <a -href="#tunnel.building.exploratory">alternative</a>.</p> - -<p>Peers may reject tunnel creation requests for a variety of reasons, though -a series of four increasingly severe rejections are known: probabalistic rejection -(due to approaching the router's capacity, or in response to a flood of requests), -transient overload, bandwidth overload, and critical failure. When received, -those four are interpreted by the tunnel creator to help adjust their profile of -the router in question.</p> - -<h3>3.3) <a name="tunnel.pooling">Pooling</a></h3> - -<p>To allow efficient operation, the router maintains a series of tunnel pools, -each managing a group of tunnels used for a specific purpose with their own -configuration. When a tunnel is needed for that purpose, the router selects one -out of the appropriate pool at random. Overall, there are two exploratory tunnel -pools - one inbound and one outbound - each using the router's exploration -defaults. In addition, there is a pair of pools for each local destination - -one inbound and one outbound tunnel. Those pools use the configuration specified -when the local destination connected to the router, or the router's defaults if -not specified.</p> - -<p>Each pool has within its configuration a few key settings, defining how many -tunnels to keep active, how many backup tunnels to maintain in case of failure, -how frequently to test the tunnels, how long the tunnels should be, whether those -lengths should be randomized, how often replacement tunnels should be built, as -well as any of the other settings allowed when configuring individual tunnels.</p> - -<h3>3.4) <a name="tunnel.building.alternatives">Alternatives</a></h3> - -<h4>3.4.1) <a name="tunnel.building.telescoping">Telescopic building</a></h4> - -<p>One question that may arise regarding the use of the exploratory tunnels for -sending and receiving tunnel creation messages is how that impacts the tunnel's -vulnerability to predecessor attacks. While the endpoints and gateways of -those tunnels will be randomly distributed across the network (perhaps even -including the tunnel creator in that set), another alternative is to use the -tunnel pathways themselves to pass along the request and response, as is done -in <a href="http://tor.eff.org/">TOR</a>. This, however, may lead to leaks -during tunnel creation, allowing peers to discover how many hops there are later -on in the tunnel by monitoring the timing or <a -href="http://dev.i2p.net/pipermail/2005-October/001057.html">packet count</a> as -the tunnel is built.</p> - -<h4>3.4.2) <a name="tunnel.building.nonexploratory">Non-exploratory tunnels for management</a></h4> - -<p>A second alternative to the tunnel building process is to give the router -an additional set of non-exploratory inbound and outbound pools, using those for -the tunnel request and response. Assuming the router has a well integrated view -of the network, this should not be necessary, but if the router was partitioned -in some way, using non-exploratory pools for tunnel management would reduce the -leakage of information about what peers are in the router's partition.</p> - -<h4>3.4.3) <a name="tunnel.building.exploratory">Exploratory request delivery</a></h4> - -<p>A third alternative, used until I2P 0.6.2, garlic encrypts individual tunnel -request messages and delivers them to the hops individually, transmitting them -through exploratory tunnels with their reply coming back in a separate -exploratory tunnel. This strategy has been dropped in favor of the one outlined -above.</p> - -<h2>4) <a name="tunnel.throttling">Tunnel throttling</a></h2> - -<p>Even though the tunnels within I2P bear a resemblance to a circuit switched -network, everything within I2P is strictly message based - tunnels are merely -accounting tricks to help organize the delivery of messages. No assumptions are -made regarding reliability or ordering of messages, and retransmissions are left -to higher levels (e.g. I2P's client layer streaming library). This allows I2P -to take advantage of throttling techniques available to both packet switched and -circuit switched networks. For instance, each router may keep track of the -moving average of how much data each tunnel is using, combine that with all of -the averages used by other tunnels the router is participating in, and be able -to accept or reject additional tunnel participation requests based on its -capacity and utilization. On the other hand, each router can simply drop -messages that are beyond its capacity, exploiting the research used on the -normal internet.</p> - -<h2>5) <a name="tunnel.mixing">Mixing/batching</a></h2> - -<p>What strategies should be used at the gateway and at each hop for delaying, -reordering, rerouting, or padding messages? To what extent should this be done -automatically, how much should be configured as a per tunnel or per hop setting, -and how should the tunnel's creator (and in turn, user) control this operation? -All of this is left as unknown, to be worked out for -<a href="http://www.i2p.net/roadmap#3.0">I2P 3.0</a></p> diff --git a/router/doc/tunnel.html b/router/doc/tunnel.html deleted file mode 100644 index a15d19c12f85f74908bdc7c253a68175ee279188..0000000000000000000000000000000000000000 --- a/router/doc/tunnel.html +++ /dev/null @@ -1,529 +0,0 @@ -<b>Note: NOT used! see tunnel-alt.html</b> - -<code>$Id: tunnel.html,v 1.10 2005/01/16 01:07:07 jrandom Exp $</code> -<pre> -1) <a href="#tunnel.overview">Tunnel overview</a> -2) <a href="#tunnel.operation">Tunnel operation</a> -2.1) <a href="#tunnel.preprocessing">Message preprocessing</a> -2.2) <a href="#tunnel.gateway">Gateway processing</a> -2.3) <a href="#tunnel.participant">Participant processing</a> -2.4) <a href="#tunnel.endpoint">Endpoint processing</a> -2.5) <a href="#tunnel.padding">Padding</a> -2.6) <a href="#tunnel.fragmentation">Tunnel fragmentation</a> -2.7) <a href="#tunnel.alternatives">Alternatives</a> -2.7.1) <a href="#tunnel.nochecksum">Don't use a checksum block</a> -2.7.2) <a href="#tunnel.reroute">Adjust tunnel processing midstream</a> -2.7.3) <a href="#tunnel.bidirectional">Use bidirectional tunnels</a> -2.7.4) <a href="#tunnel.smallerhashes">Use smaller hashes</a> -3) <a href="#tunnel.building">Tunnel building</a> -3.1) <a href="#tunnel.peerselection">Peer selection</a> -3.1.1) <a href="#tunnel.selection.exploratory">Exploratory tunnel peer selection</a> -3.1.2) <a href="#tunnel.selection.client">Client tunnel peer selection</a> -3.2) <a href="#tunnel.request">Request delivery</a> -3.3) <a href="#tunnel.pooling">Pooling</a> -3.4) <a href="#tunnel.building.alternatives">Alternatives</a> -3.4.1) <a href="#tunnel.building.telescoping">Telescopic building</a> -3.4.2) <a href="#tunnel.building.nonexploratory">Non-exploratory tunnels for management</a> -4) <a href="#tunnel.throttling">Tunnel throttling</a> -5) <a href="#tunnel.mixing">Mixing/batching</a> -</pre> - -<h2>1) <a name="tunnel.overview">Tunnel overview</a></h2> - -<p>Within I2P, messages are passed in one direction through a virtual -tunnel of peers, using whatever means are available to pass the -message on to the next hop. Messages arrive at the tunnel's -gateway, get bundled up for the path, and are forwarded on to the -next hop in the tunnel, which processes and verifies the validity -of the message and sends it on to the next hop, and so on, until -it reaches the tunnel endpoint. That endpoint takes the messages -bundled up by the gateway and forwards them as instructed - either -to another router, to another tunnel on another router, or locally.</p> - -<p>Tunnels all work the same, but can be segmented into two different -groups - inbound tunnels and outbound tunnels. The inbound tunnels -have an untrusted gateway which passes messages down towards the -tunnel creator, which serves as the tunnel endpoint. For outbound -tunnels, the tunnel creator serves as the gateway, passing messages -out to the remote endpoint.</p> - -<p>The tunnel's creator selects exactly which peers will participate -in the tunnel, and provides each with the necessary confiruration -data. They may vary in length from 0 hops (where the gateway -is also the endpoint) to 8 hops (where there are 6 peers after -the gateway and before the endpoint). It is the intent to make -it hard for either participants or third parties to determine -the length of a tunnel, or even for colluding participants to -determine whether they are a part of the same tunnel at all -(barring the situation where colluding peers are next to each other -in the tunnel). Messages that have been corrupted are also dropped -as soon as possible, reducing network load.</p> - -<p>Beyond their length, there are additional configurable parameters -for each tunnel that can be used, such as a throttle on the size or -frequency of messages delivered, how padding should be used, how -long a tunnel should be in operation, whether to inject chaff -messages, whether to use fragmentation, and what, if any, batching -strategies should be employed.</p> - -<p>In practice, a series of tunnel pools are used for different -purposes - each local client destination has its own set of inbound -tunnels and outbound tunnels, configured to meet its anonymity and -performance needs. In addition, the router itself maintains a series -of pools for participating in the network database and for managing -the tunnels themselves.</p> - -<p>I2P is an inherently packet switched network, even with these -tunnels, allowing it to take advantage of multiple tunnels running -in parallel, increasing resiliance and balancing load. Outside of -the core I2P layer, there is an optional end to end streaming library -available for client applications, exposing TCP-esque operation, -including message reordering, retransmission, congestion control, etc.</p> - -<h2>2) <a name="tunnel.operation">Tunnel operation</a></h2> - -<p>Tunnel operation has four distinct processes, taken on by various -peers in the tunnel. First, the tunnel gateway accumulates a number -of tunnel messages and preprocesses them into something for tunnel -delivery. Next, that gateway encrypts that preprocessed data, then -forwards it to the first hop. That peer, and subsequent tunnel -participants, unwrap a layer of the encryption, verifying the -integrity of the message, then forward it on to the next peer. -Eventually, the message arrives at the endpoint where the messages -bundled by the gateway are split out again and forwarded on as -requested.</p> - -<p>Tunnel IDs are 4 byte numbers used at each hop - participants know what -tunnel ID to listen for messages with and what tunnel ID they should be forwarded -on as to the next hop. Tunnels themselves are short lived (10 minutes at the -moment), but depending upon the tunnel's purpose, and though subsequent tunnels -may be built using the same sequence of peers, each hop's tunnel ID will change.</p> - -<h3>2.1) <a name="tunnel.preprocessing">Message preprocessing</a></h3> - -<p>When the gateway wants to deliver data through the tunnel, it first -gathers zero or more I2NP messages (no more than 32KB worth), -selects how much padding will be used, and decides how each I2NP -message should be handled by the tunnel endpoint, encoding that -data into the raw tunnel payload:</p> -<ul> -<li>2 byte unsigned integer specifying the # of padding bytes</li> -<li>that many random bytes</li> -<li>a series of zero or more { instructions, message } pairs</li> -</ul> - -<p>The instructions are encoded as follows:</p> -<ul> -<li>1 byte value:<pre> - bits 0-1: delivery type - (0x0 = LOCAL, 0x01 = TUNNEL, 0x02 = ROUTER) - bit 2: delay included? (1 = true, 0 = false) - bit 3: fragmented? (1 = true, 0 = false) - bit 4: extended options? (1 = true, 0 = false) - bits 5-7: reserved</pre></li> -<li>if the delivery type was TUNNEL, a 4 byte tunnel ID</li> -<li>if the delivery type was TUNNEL or ROUTER, a 32 byte router hash</li> -<li>if the delay included flag is true, a 1 byte value:<pre> - bit 0: type (0 = strict, 1 = randomized) - bits 1-7: delay exponent (2^value minutes)</pre></li> -<li>if the fragmented flag is true, a 4 byte message ID, and a 1 byte value:<pre> - bits 0-6: fragment number - bit 7: is last? (1 = true, 0 = false)</pre></li> -<li>if the extended options flag is true:<pre> - = a 1 byte option size (in bytes) - = that many bytes</pre></li> -<li>2 byte size of the I2NP message</li> -</ul> - -<p>The I2NP message is encoded in its standard form, and the -preprocessed payload must be padded to a multiple of 16 bytes.</p> - -<h3>2.2) <a name="tunnel.gateway">Gateway processing</a></h3> - -<p>After the preprocessing of messages into a padded payload, the gateway -encrypts the payload with the eight keys, building a checksum block so -that each peer can verify the integrity of the payload at any time, as -well as an end to end verification block for the tunnel endpoint to -verify the integrity of the checksum block. The specific details follow.</p> - -<p>The encryption used is such that decryption -merely requires running over the data with AES in CBC mode, calculating the -SHA256 of a certain fixed portion of the message (bytes 16 through $size-144), -and searching for the first 16 bytes of that hash in the checksum block. There is a fixed number -of hops defined (8 peers) so that we can verify the message -without either leaking the position in the tunnel or having the message -continually "shrink" as layers are peeled off. For tunnels shorter than 8 -hops, the tunnel creator will take the place of the excess hops, decrypting -with their keys (for outbound tunnels, this is done at the beginning, and for -inbound tunnels, the end).</p> - -<p>The hard part in the encryption is building that entangled checksum block, -which requires essentially finding out what the hash of the payload will look -like at each step, randomly ordering those hashes, then building a matrix of -what each of those randomly ordered hashes will look like at each step. The -gateway itself must pretend that it is one of the peers within the checksum -block so that the first hop cannot tell that the previous hop was the gateway. -To visualize this a bit:</p> - -<table border="1"> - <tr><td colspan="2"></td> - <td><b>IV</b></td><td><b>Payload</b></td> - <td><b>eH[0]</b></td><td><b>eH[1]</b></td> - <td><b>eH[2]</b></td><td><b>eH[3]</b></td> - <td><b>eH[4]</b></td><td><b>eH[5]</b></td> - <td><b>eH[6]</b></td><td><b>eH[7]</b></td> - <td><b>V</b></td> - </tr> - <tr><td rowspan="2"><b>peer0</b><br /><font size="-2">key=K[0]</font></td><td><b>recv</b></td> - <td colspan="11"><hr /></td> - </tr> - <tr><td><b>send</b></td> - <td rowspan="2">IV[0]</td><td rowspan="2">P[0]</td> - <td rowspan="2"></td><td rowspan="2"></td><td rowspan="2"></td><td rowspan="2">H(P[0])</td> - <td rowspan="2"></td><td rowspan="2"></td><td rowspan="2"></td><td rowspan="2"></td> - <td rowspan="2">V[0]</td> - </tr> - <tr><td rowspan="2"><b>peer1</b><br /><font size="-2">key=K[1]</font></td><td><b>recv</b></td> - </tr> - <tr><td><b>send</b></td> - <td rowspan="2">IV[1]</td><td rowspan="2">P[1]</td> - <td rowspan="2"></td><td rowspan="2"></td><td rowspan="2"></td><td rowspan="2"></td> - <td rowspan="2"></td><td rowspan="2"></td><td rowspan="2">H(P[1])</td><td rowspan="2"></td> - <td rowspan="2">V[1]</td> - </tr> - <tr><td rowspan="2"><b>peer2</b><br /><font size="-2">key=K[2]</font></td><td><b>recv</b></td> - </tr> - <tr><td><b>send</b></td> - <td rowspan="2">IV[2]</td><td rowspan="2">P[2]</td> - <td rowspan="2"></td><td rowspan="2"></td><td rowspan="2"></td><td rowspan="2"></td> - <td rowspan="2"></td><td rowspan="2"></td><td rowspan="2"></td><td rowspan="2">H(P[2])</td> - <td rowspan="2">V[2]</td> - </tr> - <tr><td rowspan="2"><b>peer3</b><br /><font size="-2">key=K[3]</font></td><td><b>recv</b></td> - </tr> - <tr><td><b>send</b></td> - <td rowspan="2">IV[3]</td><td rowspan="2">P[3]</td> - <td rowspan="2">H(P[3])</td><td rowspan="2"></td><td rowspan="2"></td><td rowspan="2"></td> - <td rowspan="2"></td><td rowspan="2"></td><td rowspan="2"></td><td rowspan="2"></td> - <td rowspan="2">V[3]</td> - </tr> - <tr><td rowspan="2"><b>peer4</b><br /><font size="-2">key=K[4]</font></td><td><b>recv</b></td> - </tr> - <tr><td><b>send</b></td> - <td rowspan="2">IV[4]</td><td rowspan="2">P[4]</td> - <td rowspan="2"></td><td rowspan="2"></td><td rowspan="2">H(P[4])</td><td rowspan="2"></td> - <td rowspan="2"></td><td rowspan="2"></td><td rowspan="2"></td><td rowspan="2"></td> - <td rowspan="2">V[4]</td> - </tr> - <tr><td rowspan="2"><b>peer5</b><br /><font size="-2">key=K[5]</font></td><td><b>recv</b></td> - </tr> - <tr><td><b>send</b></td> - <td rowspan="2">IV[5]</td><td rowspan="2">P[5]</td> - <td rowspan="2"></td><td rowspan="2">H(P[5])</td><td rowspan="2"></td><td rowspan="2"></td> - <td rowspan="2"></td><td rowspan="2"></td><td rowspan="2"></td><td rowspan="2"></td> - <td rowspan="2">V[5]</td> - </tr> - <tr><td rowspan="2"><b>peer6</b><br /><font size="-2">key=K[6]</font></td><td><b>recv</b></td> - </tr> - <tr><td><b>send</b></td> - <td rowspan="2">IV[6]</td><td rowspan="2">P[6]</td> - <td rowspan="2"></td><td rowspan="2"></td><td rowspan="2"></td><td rowspan="2"></td> - <td rowspan="2"></td><td rowspan="2">H(P[6])</td><td rowspan="2"></td><td rowspan="2"></td> - <td rowspan="2">V[6]</td> - </tr> - <tr><td rowspan="2"><b>peer7</b><br /><font size="-2">key=K[7]</font></td><td><b>recv</b></td> - </tr> - <tr><td><b>send</b></td> - <td>IV[7]</td><td>P[7]</td> - <td></td><td></td><td></td><td></td><td>H(P[7])</td><td></td><td></td><td></td> - <td>V[7]</td> - </tr> -</table> - -<p>In the above, P[7] is the same as the original data being passed through the -tunnel (the preprocessed messages), and V[7] is the first 16 bytes of the SHA256 of eH[0-7] as seen on -peer7 after decryption. For -cells in the matrix "higher up" than the hash, their value is derived by encrypting -the cell below it with the key for the peer below it, using the end of the column -to the left of it as the IV. For cells in the matrix "lower down" than the hash, -they're equal to the cell above them, decrypted by the current peer's key, using -the end of the previous encrypted block on that row.</p> - -<p>With this randomized matrix of checksum blocks, each peer will be able to find -the hash of the payload, or if it is not there, know that the message is corrupt. -The entanglement by using CBC mode increases the difficulty in tagging the -checksum blocks themselves, but it is still possible for that tagging to go -briefly undetected if the columns after the tagged data have already been used -to check the payload at a peer. In any case, the tunnel endpoint (peer 7) knows -for certain whether any of the checksum blocks have been tagged, as that would -corrupt the verification block (V[7]).</p> - -<p>The IV[0] is a random 16 byte value, and IV[i] is the first 16 bytes of -H(D(IV[i-1], K[i-1]) xor IV_WHITENER). We don't use the same IV along the path, as that would -allow trivial collusion, and we use the hash of the decrypted value to propogate -the IV so as to hamper key leakage. IV_WHITENER is a fixed 16 byte value.</p> - -<p>When the gateway wants to send the message, they export the right row for the -peer who is the first hop (usually the peer1.recv row) and forward that entirely.</p> - -<h3>2.3) <a name="tunnel.participant">Participant processing</a></h3> - -<p>When a participant in a tunnel receives a message, they decrypt a layer with their -tunnel key using AES256 in CBC mode with the first 16 bytes as the IV. They then -calculate the hash of what they see as the payload (bytes 16 through $size-144) and -search for that first 16 bytes of that hash within the decrypted checksum block. If no match is found, the -message is discarded. Otherwise, the IV is updated by decrypting it, XORing that value -with the IV_WHITENER, and replacing it with the first 16 bytes of its hash. The -resulting message is then forwarded on to the next peer for processing.</p> - -<p>To prevent replay attacks at the tunnel level, each participant keeps track of -the IVs received during the tunnel's lifetime, rejecting duplicates. The memory -usage required should be minor, as each tunnel has only a very short lifespan (10m -at the moment). A constant 100KBps through a tunnel with full 32KB messages would -give 1875 messages, requiring less than 30KB of memory. Gateways and endpoints -handle replay by tracking the message IDs and expirations on the I2NP messages -contained in the tunnel.</p> - -<h3>2.4) <a name="tunnel.endpoint">Endpoint processing</a></h3> - -<p>When a message reaches the tunnel endpoint, they decrypts and verifies it like -a normal participant. If the checksum block has a valid match, the endpoint then -computes the hash of the checksum block itself (as seen after decryption) and compares -that to the decrypted verification hash (the last 16 bytes). If that verification -hash does not match, the endpoint takes note of the tagging attempt by one of the -tunnel participants and perhaps discards the message.</p> - -<p>At this point, the tunnel endpoint has the preprocessed data sent by the gateway, -which it may then parse out into the included I2NP messages and forwards them as -requested in their delivery instructions.</p> - -<h3>2.5) <a name="tunnel.padding">Padding</a></h3> - -<p>Several tunnel padding strategies are possible, each with their own merits:</p> - -<ul> -<li>No padding</li> -<li>Padding to a random size</li> -<li>Padding to a fixed size</li> -<li>Padding to the closest KB</li> -<li>Padding to the closest exponential size (2^n bytes)</li> -</ul> - -<p><i>Which to use? no padding is most efficient, random padding is what -we have now, fixed size would either be an extreme waste or force us to -implement fragmentation. Padding to the closest exponential size (ala freenet) -seems promising. Perhaps we should gather some stats on the net as to what size -messages are, then see what costs and benefits would arise from different -strategies?</i></p> - -<h3>2.6) <a name="tunnel.fragmentation">Tunnel fragmentation</a></h3> - -<p>For various padding and mixing schemes, it may be useful from an anonymity -perspective to fragment a single I2NP message into multiple parts, each delivered -seperately through different tunnel messages. The endpoint may or may not -support that fragmentation (discarding or hanging on to fragments as needed), -and handling fragmentation will not immediately be implemented.</p> - -<h3>2.7) <a name="tunnel.alternatives">Alternatives</a></h3> - -<h4>2.7.1) <a name="tunnel.nochecksum">Don't use a checksum block</a></h4> - -<p>One alternative to the above process is to remove the checksum block -completely and replace the verification hash with a plain hash of the payload. -This would simplify processing at the tunnel gateway and save 144 bytes of -bandwidth at each hop. On the other hand, attackers within the tunnel could -trivially adjust the message size to one which is easily traceable by -colluding external observers in addition to later tunnel participants. The -corruption would also incur the waste of the entire bandwidth necessary to -pass on the message. Without the per-hop validation, it would also be possible -to consume excess network resources by building extremely long tunnels, or by -building loops into the tunnel.</p> - -<h4>2.7.2) <a name="tunnel.reroute">Adjust tunnel processing midstream</a></h4> - -<p>While the simple tunnel routing algorithm should be sufficient for most cases, -there are three alternatives that can be explored:</p> -<ul> -<li>Delay a message within a tunnel at an arbitrary hop for either a specified -amount of time or a randomized period. This could be achieved by replacing the -hash in the checksum block with e.g. the first 8 bytes of the hash, followed by -some delay instructions. Alternately, the instructions could tell the -participant to actually interpret the raw payload as it is, and either discard -the message or continue to forward it down the path (where it would be -interpreted by the endpoint as a chaff message). The later part of this would -require the gateway to adjust its encryption algorithm to produce the cleartext -payload on a different hop, but it shouldn't be much trouble.</li> -<li>Allow routers participating in a tunnel to remix the message before -forwarding it on - bouncing it through one of that peer's own outbound tunnels, -bearing instructions for delivery to the next hop. This could be used in either -a controlled manner (with en-route instructions like the delays above) or -probabalistically.</li> -<li>Implement code for the tunnel creator to redefine a peer's "next hop" in -the tunnel, allowing further dynamic redirection.</li> -</ul> - -<h4>2.7.3) <a name="tunnel.bidirectional">Use bidirectional tunnels</a></h4> - -<p>The current strategy of using two seperate tunnels for inbound and outbound -communication is not the only technique available, and it does have anonymity -implications. On the positive side, by using separate tunnels it lessens the -traffic data exposed for analysis to participants in a tunnel - for instance, -peers in an outbound tunnel from a web browser would only see the traffic of -an HTTP GET, while the peers in an inbound tunnel would see the payload -delivered along the tunnel. With bidirectional tunnels, all participants would -have access to the fact that e.g. 1KB was sent in one direction, then 100KB -in the other. On the negative side, using unidirectional tunnels means that -there are two sets of peers which need to be profiled and accounted for, and -additional care must be taken to address the increased speed of predecessor -attacks. The tunnel pooling and building process outlined below should -minimize the worries of the predecessor attack, though if it were desired, -it wouldn't be much trouble to build both the inbound and outbound tunnels -along the same peers.</p> - -<h4>2.7.4) <a name="tunnel.smallerhashes">Use smaller blocksize</a></h4> - -<p>At the moment, our use of AES limits our block size to 16 bytes, which -in turn provides the minimum size for each of the checksum block columns. -If another algorithm was used with a smaller block size, or could otherwise -allow the safe building of the checksum block with smaller portions of the -hash, it might be worth exploring. The 16 bytes used now at each hop should -be more than sufficient.</p> - -<h2>3) <a name="tunnel.building">Tunnel building</a></h2> - -<p>When building a tunnel, the creator must send a request with the necessary -configuration data to each of the hops, then wait for the potential participant -to reply stating that they either agree or do not agree. These tunnel request -messages and their replies are garlic wrapped so that only the router who knows -the key can decrypt it, and the path taken in both directions is tunnel routed -as well. There are three important dimensions to keep in mind when producing -the tunnels: what peers are used (and where), how the requests are sent (and -replies received), and how they are maintained.</p> - -<h3>3.1) <a name="tunnel.peerselection">Peer selection</a></h3> - -<p>Beyond the two types of tunnels - inbound and outbound - there are two styles -of peer selection used for different tunnels - exploratory and client. -Exploratory tunnels are used for both network database maintenance and tunnel -maintenance, while client tunnels are used for end to end client messages. </p> - -<h4>3.1.1) <a name="tunnel.selection.exploratory">Exploratory tunnel peer selection</a></h4> - -<p>Exploratory tunnels are built out of a random selection of peers from a subset -of the network. The particular subset varies on the local router and on what their -tunnel routing needs are. In general, the exploratory tunnels are built out of -randomly selected peers who are in the peer's "not failing but active" profile -category. The secondary purpose of the tunnels, beyond merely tunnel routing, -is to find underutilized high capacity peers so that they can be promoted for -use in client tunnels.</p> - -<h4>3.1.2) <a name="tunnel.selection.client">Client tunnel peer selection</a></h4> - -<p>Client tunnels are built with a more stringent set of requirements - the local -router will select peers out of its "fast and high capacity" profile category so -that performance and reliability will meet the needs of the client application. -However, there are several important details beyond that basic selection that -should be adhered to, depending upon the client's anonymity needs.</p> - -<p>For some clients who are worried about adversaries mounting a predecessor -attack, the tunnel selection can keep the peers selected in a strict order - -if A, B, and C are in a tunnel, the hop after A is always B, and the hop after -B is always C. A less strict ordering is also possible, assuring that while -the hop after A may be B, B may never be before A. Other configuration options -include the ability for just the inbound tunnel gateways and outbound tunnel -endpoints to be fixed, or rotated on an MTBF rate.</p> - -<h3>3.2) <a name="tunnel.request">Request delivery</a></h3> - -<p>As mentioned above, once the tunnel creator knows what peers should go into -a tunnel and in what order, the creator builds a series of tunnel request -messages, each containing the necessary information for that peer. For instance, -participating tunnels will be given the 4 byte tunnel ID on which they are to -receive messages, the 4 byte tunnel ID on which they are to send out the messages, -the 32 byte hash of the next hop's identity, and the 32 byte layer key used to -remove a layer from the tunnel. Of course, outbound tunnel endpoints are not -given any "next hop" or "next tunnel ID" information. Inbound tunnel gateways -are however given the 8 layer keys in the order they should be encrypted (as -described above). To allow replies, the request contains a random session tag -and a random session key with which the peer may garlic encrypt their decision, -as well as the tunnel to which that garlic should be sent. In addition to the -above information, various client specific options may be included, such as -what throttling to place on the tunnel, what padding or batch strategies to use, -etc.</p> - -<p>After building all of the request messages, they are garlic wrapped for the -target router and sent out an exploratory tunnel. Upon receipt, that peer -determines whether they can or will participate, creating a reply message and -both garlic wrapping and tunnel routing the response with the supplied -information. Upon receipt of the reply at the tunnel creator, the tunnel is -considered valid on that hop (if accepted). Once all peers have accepted, the -tunnel is active.</p> - -<h3>3.3) <a name="tunnel.pooling">Pooling</a></h3> - -<p>To allow efficient operation, the router maintains a series of tunnel pools, -each managing a group of tunnels used for a specific purpose with their own -configuration. When a tunnel is needed for that purpose, the router selects one -out of the appropriate pool at random. Overall, there are two exploratory tunnel -pools - one inbound and one outbound - each using the router's exploration -defaults. In addition, there is a pair of pools for each local destination - -one inbound and one outbound tunnel. Those pools use the configuration specified -when the local destination connected to the router, or the router's defaults if -not specified.</p> - -<p>Each pool has within its configuration a few key settings, defining how many -tunnels to keep active, how many backup tunnels to maintain in case of failure, -how frequently to test the tunnels, how long the tunnels should be, whether those -lengths should be randomized, how often replacement tunnels should be built, as -well as any of the other settings allowed when configuring individual tunnels.</p> - -<h3>3.4) <a name="tunnel.building.alternatives">Alternatives</a></h3> - -<h4>3.4.1) <a name="tunnel.building.telescoping">Telescopic building</a></h4> - -<p>One question that may arise regarding the use of the exploratory tunnels for -sending and receiving tunnel creation messages is how that impacts the tunnel's -vulnerability to predecessor attacks. While the endpoints and gateways of -those tunnels will be randomly distributed across the network (perhaps even -including the tunnel creator in that set), another alternative is to use the -tunnel pathways themselves to pass along the request and response, as is done -in <a href="http://tor.eff.org/">TOR</a>. This, however, may lead to leaks -during tunnel creation, allowing peers to discover how many hops there are later -on in the tunnel by monitoring the timing or packet count as the tunnel is -built. Techniques could be used to minimize this issue, such as using each of -the hops as endpoints (per <a href="#tunnel.reroute">2.7.2</a>) for a random -number of messages before continuing on to build the next hop.</p> - -<h4>3.4.2) <a name="tunnel.building.nonexploratory">Non-exploratory tunnels for management</a></h4> - -<p>A second alternative to the tunnel building process is to give the router -an additional set of non-exploratory inbound and outbound pools, using those for -the tunnel request and response. Assuming the router has a well integrated view -of the network, this should not be necessary, but if the router was partitioned -in some way, using non-exploratory pools for tunnel management would reduce the -leakage of information about what peers are in the router's partition.</p> - -<h2>4) <a name="tunnel.throttling">Tunnel throttling</a></h2> - -<p>Even though the tunnels within I2P bear a resemblence to a circuit switched -network, everything within I2P is strictly message based - tunnels are merely -accounting tricks to help organize the delivery of messages. No assumptions are -made regarding reliability or ordering of messages, and retransmissions are left -to higher levels (e.g. I2P's client layer streaming library). This allows I2P -to take advantage of throttling techniques available to both packet switched and -circuit switched networks. For instance, each router may keep track of the -moving average of how much data each tunnel is using, combine that with all of -the averages used by other tunnels the router is participating in, and be able -to accept or reject additional tunnel participation requests based on its -capacity and utilization. On the other hand, each router can simply drop -messages that are beyond its capacity, exploiting the research used on the -normal internet.</p> - -<h2>5) <a name="tunnel.mixing">Mixing/batching</a></h2> - -<p>What strategies should be used at the gateway and at each hop for delaying, -reordering, rerouting, or padding messages? To what extent should this be done -automatically, how much should be configured as a per tunnel or per hop setting, -and how should the tunnel's creator (and in turn, user) control this operation? -All of this is left as unknown, to be worked out for -<a href="http://www.i2p.net/roadmap#3.0">I2P 3.0</a></p> diff --git a/router/doc/udp.html b/router/doc/udp.html deleted file mode 100644 index 4a855ece99cef2eb4650ed2c7d73296ba223e4b5..0000000000000000000000000000000000000000 --- a/router/doc/udp.html +++ /dev/null @@ -1,759 +0,0 @@ -<code>$Id: udp.html,v 1.19 2006/02/15 00:33:32 jrandom Exp $</code> - -<h1>Secure Semireliable UDP (SSU)</h1> -<b>DRAFT</b> - -<p> -The goal of this protocol is to provide secure, authenticated, -semireliable, and unordered message delivery, exposing only a minimal -amount of data easily discernible to third parties. It should -support high degree communication as well as TCP-friendly congestion -control, and may include PMTU detection. It should be capable of -efficiently moving bulk data at rates sufficient for home users. -In addition, it should support techniques for addressing network -obstacles, like most NATs or firewalls.</p> - -<h2><a name="addressing">Addressing and introduction</a></h2> - -<p>To contact an SSU peer, one of two sets of information is necessary: -a direct address, for when the peer is publicly reachable, or an -indirect address, for using a third party to introduce the peer. -There is no restriction on the number of addresses a peer may have.</p> - -<pre> - Direct: ssu://host:port/introKey[?opts=[A-Z]*] - Indirect: ssu://tag@relayhost:port/relayIntroKey/targetIntroKey[?opts=[A-Z]*] -</pre> - -<p>These introduction keys are delivered through an external channel -and must be used when establishing a session key. For the indirect -address, the peer must first contact the relayhost and ask them for -an introduction to the peer known at that relayhost under the given -tag. If possible, the relayhost sends a message to the addressed -peer telling them to contact the requesting peer, and also gives -the requesting peer the IP and port on which the addressed peer is -located. In addition, the peer establishing the connection must -already know the public keys of the peer they are connecting to (but -not necessary to any intermediary relay peer).</p> - -<p>Each of the addresses may also expose a series of options - special -capabilities of that particular peer. For a list of available -capabilities, see <a href="#capabilities">below</a>.</p> - -<h2><a name="header">Header</a></h2> - -<p>All UDP datagrams begin with a MAC and an IV, followed by a variable -size payload encrypted with the appropriate key. The MAC used is -HMAC-MD5, truncated to 16 bytes, while the key is a full AES256 -key. The specific construct of the MAC is the first 16 bytes from:</p> -<pre> - HMAC-MD5(payload || IV || (payloadLength ^ protocolVersion), macKey) -</pre> - -<p>The payload itself is AES256/CBC encrypted with the IV and the -sessionKey, with replay prevention addressed within its body, -explained below. The payloadLength in the MAC is a 2 byte unsigned -integer in 2s complement.</p> - -<p>The protocolVersion is a 2 byte unsigned integer in 2s complement, -and currently set to 0. Peers using a different protocol version will -not be able to communicate with this peer, though earlier versions not -using this flag are.</p> - -<h2><a name="payload">Payload</a></h2> - -<p>Within the AES encrypted payload, there is a minimal common structure -to the various messages - a one byte flag and a four byte sending -timestamp (*seconds* since the unix epoch). The flag byte contains -the following bitfields:</p> -<pre> - bits 0-3: payload type - bit 4: rekey? - bit 5: extended options included - bits 6-7: reserved -</pre> - -<p>If the rekey flag is set, 64 bytes of keying material follow the -timestamp. If the extended options flag is set, a one byte option -size value is appended to, followed by that many extended option -bytes, which are currently uninterpreted.</p> - -<p>When rekeying, the first 32 bytes of the keying material is fed -into a SHA256 to produce the new MAC key, and the next 32 bytes are -fed into a SHA256 to produce the new session key, though the keys are -not immediately used. The other side should also reply with the -rekey flag set and that same keying material. Once both sides have -sent and received those values, the new keys should be used and the -previous keys discarded. It may be useful to keep the old keys -around briefly, to address packet loss and reordering.</p> - -<pre> - Header: 37+ bytes - +----+----+----+----+----+----+----+----+ - | MAC | - | | - +----+----+----+----+----+----+----+----+ - | IV | - | | - +----+----+----+----+----+----+----+----+ - |flag| time | (optionally | - +----+----+----+----+----+ | - | this may have 64 byte keying material | - | and/or a one+N byte extended options) | - +---------------------------------------| -</pre> - -<h2><a name="messages">Messages</a></h2> - -<h3><a name="sessionRequest">SessionRequest (type 0)</a></h3> -<table border="1"> -<tr><td align="right" valign="top"><b>Peer:</b></td> - <td>Alice to Bob</td></tr> -<tr><td align="right" valign="top"><b>Data:</b></td> - <td><ul> - <li>256 byte X, to begin the DH agreement</li> - <li>1 byte IP address size</li> - <li>that many byte representation of Bob's IP address</li> - <li>N bytes, currently uninterpreted (later, for challenges)</li> - </ul></td></tr> -<tr><td align="right" valign="top"><b>Key used:</b></td> - <td>introKey</td></tr> -</table> - -<pre> - +----+----+----+----+----+----+----+----+ - | X, as calculated from DH | - | | - . . . - | | - +----+----+----+----+----+----+----+----+ - |size| that many byte IP address (4-16) | - +----+----+----+----+----+----+----+----+ - | arbitrary amount | - | of uninterpreted data | - . . . - | | - +----+----+----+----+----+----+----+----+ -</pre> - -<h3><a name="sessionCreated">SessionCreated (type 1)</a></h3> -<table border="1"> -<tr><td align="right" valign="top"><b>Peer:</b></td> - <td>Bob to Alice</td></tr> -<tr><td align="right" valign="top"><b>Data:</b></td> - <td><ul> - <li>256 byte Y, to complete the DH agreement</li> - <li>1 byte IP address size</li> - <li>that many byte representation of Alice's IP address</li> - <li>2 byte port number (unsigned, big endian 2s complement)</li> - <li>4 byte relay tag which Alice can publish (else 0x0)</li> - <li>4 byte timestamp (seconds from the epoch) for use in the DSA - signature</li> - <li>40 byte DSA signature of the critical exchanged data - (X + Y + Alice's IP + Alice's port + Bob's IP + Bob's port + Alice's - new relay tag + Bob's signed on time), encrypted with another - layer of encryption using the negotiated sessionKey. The IV - is reused here.</li> - <li>8 bytes padding, encrypted with an additional layer of encryption - using the negotiated session key as part of the DSA block</li> - <li>N bytes, currently uninterpreted (later, for challenges)</li> - </ul></td></tr> -<tr><td align="right" valign="top"><b>Key used:</b></td> - <td>introKey, with an additional layer of encryption over the 40 byte - signature and the following 8 bytes padding.</td></tr> -</table> - -<pre> - +----+----+----+----+----+----+----+----+ - | Y, as calculated from DH | - | | - . . . - | | - +----+----+----+----+----+----+----+----+ - |size| that many byte IP address (4-16) | - +----+----+----+----+----+----+----+----+ - | Port (A)| public relay tag | signed - +----+----+----+----+----+----+----+----+ - on time | | - +----+----+ | - | DSA signature | - | | - | | - | | - | +----+----+----+----+----+----+ - | | (8 bytes of padding) - +----+----+----+----+----+----+----+----+ - | | - +----+----+ | - | arbitrary amount | - | of uninterpreted data | - . . . - | | - +----+----+----+----+----+----+----+----+ -</pre> - -<h3><a name="sessionConfirmed">SessionConfirmed (type 2)</a></h3> -<table border="1"> -<tr><td align="right" valign="top"><b>Peer:</b></td> - <td>Alice to Bob</td></tr> -<tr><td align="right" valign="top"><b>Data:</b></td> - <td><ul> - <li>1 byte identity fragment info:<pre> -bits 0-3: current identity fragment # -bits 4-7: total identity fragments</pre></li> - <li>2 byte size of the current identity fragment</li> - <li>that many byte fragment of Alice's identity.</li> - <li>on the last identity fragment, the signed on time is - included after the identity fragment, and the last 40 - bytes contain the DSA signature of the critical exchanged - data (X + Y + Alice's IP + Alice's port + Bob's IP + Bob's port - + Alice's new relay key + Alice's signed on time)</li> - </ul></td></tr> -<tr><td align="right" valign="top"><b>Key used:</b></td> - <td>sessionKey</td></tr> -</table> - -<pre> - <b>Fragment 1 through N-1</b> - +----+----+----+----+----+----+----+----+ - |info| cursize | | - +----+----+----+ | - | fragment of Alice's full | - | identity keys | - . . . - | | - +----+----+----+----+----+----+----+----+ - - <b>Fragment N:</b> - +----+----+----+----+----+----+----+----+ - |info| cursize | | - +----+----+----+ | - | fragment of Alice's full | - | identity keys | - . . . - | | - +----+----+----+----+----+----+----+----+ - | signed on time | | - +----+----+----+----+ | - | arbitrary amount of uninterpreted | - | data, up from the end of the | - | identity key to 40 bytes prior to | - | end of the current packet | - +----+----+----+----+----+----+----+----+ - | DSA signature | - | | - | | - | | - | | - +----+----+----+----+----+----+----+----+ -</pre> - -<h3><a name="relayRequest">RelayRequest (type 3)</a></h3> -<table border="1"> -<tr><td align="right" valign="top"><b>Peer:</b></td> - <td>Alice to Bob</td></tr> -<tr><td align="right" valign="top"><b>Data:</b></td> - <td><ul> - <li>4 byte relay tag</li> - <li>1 byte IP address size</li> - <li>that many byte representation of Alice's IP address</li> - <li>2 byte port number (of Alice)</li> - <li>1 byte challenge size</li> - <li>that many bytes to be relayed to Charlie in the intro</li> - <li>Alice's intro key (so Bob can reply with Charlie's info)</li> - <li>4 byte nonce of alice's relay request</li> - <li>N bytes, currently uninterpreted</li> - </ul></td></tr> -<tr><td align="right" valign="top"><b>Key used:</b></td> - <td>introKey (or sessionKey, if Alice/Bob is established)</td></tr> -</table> - -<pre> - +----+----+----+----+----+----+----+----+ - | relay tag |size| that many | - +----+----+----+----+----+ +----| - | bytes for Alice's IP address |port - +----+----+----+----+----+----+----+----+ - (A) |size| that many challenge bytes | - +----+----+ | - | to be delivered to Charlie | - +----+----+----+----+----+----+----+----+ - | Alice's intro key | - | | - | | - | | - +----+----+----+----+----+----+----+----+ - | nonce | | - +----+----+----+----+ | - | arbitrary amount of uninterpreted data| - +----+----+----+----+----+----+----+----+ -</pre> - -<h3><a name="relayResponse">RelayResponse (type 4)</a></h3> -<table border="1"> -<tr><td align="right" valign="top"><b>Peer:</b></td> - <td>Bob to Alice</td></tr> -<tr><td align="right" valign="top"><b>Data:</b></td> - <td><ul> - <li>1 byte IP address size</li> - <li>that many byte representation of Charlie's IP address</li> - <li>2 byte port number</li> - <li>1 byte IP address size</li> - <li>that many byte representation of Alice's IP address</li> - <li>2 byte port number</li> - <li>4 byte nonce sent by Alice</li> - <li>N bytes, currently uninterpreted</li> - </ul></td></tr> -<tr><td align="right" valign="top"><b>Key used:</b></td> - <td>introKey (or sessionKey, if Alice/Bob is established)</td></tr> -</table> - -<pre> - +----+----+----+----+----+----+----+----+ - |size| that many bytes making up | - +----+ +----+----+ - | Charlie's IP address | Port (C)| - +----+----+----+----+----+----+----+----+ - |size| that many bytes making up | - +----+ +----+----+ - | Alice's IP address | Port (A)| - +----+----+----+----+----+----+----+----+ - | nonce | | - +----+----+----+----+ | - | arbitrary amount of uninterpreted data| - +----+----+----+----+----+----+----+----+ -</pre> - -<h3><a name="relayIntro">RelayIntro (type 5)</a></h3> -<table border="1"> -<tr><td align="right" valign="top"><b>Peer:</b></td> - <td>Bob to Charlie</td></tr> -<tr><td align="right" valign="top"><b>Data:</b></td> - <td><ul> - <li>1 byte IP address size</li> - <li>that many byte representation of Alice's IP address</li> - <li>2 byte port number (of Alice)</li> - <li>1 byte challenge size</li> - <li>that many bytes relayed from Alice</li> - <li>N bytes, currently uninterpreted</li> - </ul></td></tr> -<tr><td align="right" valign="top"><b>Key used:</b></td> - <td>sessionKey</td></tr> -</table> - -<pre> - +----+----+----+----+----+----+----+----+ - |size| that many bytes making up | - +----+ +----+----+ - | Alice's IP address | Port (A)| - +----+----+----+----+----+----+----+----+ - |size| that many bytes of challenge | - +----+ | - | data relayed from Alice | - +----+----+----+----+----+----+----+----+ - | arbitrary amount of uninterpreted data| - +----+----+----+----+----+----+----+----+ -</pre> - -<h3><a name="data">Data (type 6)</a></h3> -<table border="1"> -<tr><td align="right" valign="top"><b>Peer:</b></td> - <td>Any</td></tr> -<tr><td align="right" valign="top"><b>Data:</b></td> - <td><ul> - <li>1 byte flags:<pre> - bit 0: explicit ACKs included - bit 1: ACK bitfields included - bit 2: reserved - bit 3: explicit congestion notification - bit 4: request previous ACKs - bit 5: want reply - bit 6: extended data included - bit 7: reserved</pre></li> - <li>if explicit ACKs are included:<ul> - <li>a 1 byte number of ACKs</li> - <li>that many 4 byte MessageIds being fully ACKed</li> - </ul></li> - <li>if ACK bitfields are included:<ul> - <li>a 1 byte number of ACK bitfields</li> - <li>that many 4 byte MessageIds + a 1 or more byte ACK bitfield. - The bitfield uses the 7 low bits of each byte, with the high - bit specifying whether an additional bitfield byte follows it - (1 = true, 0 = the current bitfield byte is the last). These - sequence of 7 bit arrays represent whether a fragment has been - received - if a bit is 1, the fragment has been received. To - clarify, assuming fragments 0, 2, 5, and 9 have been received, - the bitfield bytes would be as follows:<pre> -byte 0 - bit 0: 1 (further bitfield bytes follow) - bit 1: 1 (fragment 0 received) - bit 2: 0 (fragment 1 not received) - bit 3: 1 (fragment 2 received) - bit 4: 0 (fragment 3 not received) - bit 5: 0 (fragment 4 not received) - bit 6: 1 (fragment 5 received) - bit 7: 0 (fragment 6 not received) -byte 1 - bit 0: 0 (no further bitfield bytes) - bit 1: 0 (fragment 7 not received) - bit 1: 0 (fragment 8 not received) - bit 1: 1 (fragment 9 received) - bit 1: 0 (fragment 10 not received) - bit 1: 0 (fragment 11 not received) - bit 1: 0 (fragment 12 not received) - bit 1: 0 (fragment 13 not received)</pre></li> - </ul></li> - <li>If extended data included:<ul> - <li>1 byte data size</li> - <li>that many bytes of extended data (currently uninterpreted)</li</ul></li> - <li>1 byte number of fragments</li> - <li>that many message fragments:<ul> - <li>4 byte messageId</li> - <li>3 byte fragment info:<pre> - bits 0-6: fragment # - bit 7: isLast (1 = true) - bits 8-9: unused -bits 10-23: fragment size</pre></li> - <li>that many bytes</li></ul> - <li>N bytes padding, uninterpreted</li> - </ul></td></tr> -<tr><td align="right" valign="top"><b>Key used:</b></td> - <td>sessionKey</td></tr> -</table> - -<pre> - +----+----+----+----+----+----+----+----+ - |flag| (additional headers, determined | - +----+ | - | by the flags, such as ACKs or | - | bitfields | - +----+----+----+----+----+----+----+----+ - |#frg| messageId | frag info | - +----+----+----+----+----+----+----+----+ - | that many bytes of fragment data | - . . . - | | - +----+----+----+----+----+----+----+----+ - | messageId | frag info | | - +----+----+----+----+----+----+----+ | - | that many bytes of fragment data | - . . . - | | - +----+----+----+----+----+----+----+----+ - | messageId | frag info | | - +----+----+----+----+----+----+----+ | - | that many bytes of fragment data | - . . . - | | - +----+----+----+----+----+----+----+----+ - | arbitrary amount of uninterpreted data| - +----+----+----+----+----+----+----+----+ -</pre> - -<h3><a name="peerTest">PeerTest (type 7)</a></h3> -<table border="1"> -<tr><td align="right" valign="top"><b>Peer:</b></td> - <td><a href="#peerTesting">Any</a></td></tr> -<tr><td align="right" valign="top"><b>Data:</b></td> - <td><ul> - <li>4 byte nonce</li> - <li>1 byte IP address size</li> - <li>that many byte representation of Alice's IP address</li> - <li>2 byte port number</li> - <li>Alice's introduction key</li> - <li>N bytes, currently uninterpreted</li> - </ul></td></tr> -<tr><td align="right" valign="top"><b>Key used:</b></td> - <td>introKey (or sessionKey if the connection has already been established)</td></tr> -</table> - -<pre> - +----+----+----+----+----+----+----+----+ - | test nonce |size| that many | - +----+----+----+----+----+ | - |bytes making up Alice's IP address | - |----+----+----+----+----+----+----+----+ - | Port (A)| Alice or Charlie's | - +----+----+ | - | introduction key (Alice's is sent to | - | Bob and Charlie, while Charlie's is | | - | sent to Alice) | - | +----+----+----+----+----+----+ - | | arbitrary amount of | - |----+----+ | - | uninterpreted data | - +----+----+----+----+----+----+----+----+ -</pre> - -<h2><a name="congestioncontrol">Congestion control</a></h2> - -<p>SSU's need for only semireliable delivery, TCP-friendly operation, -and the capacity for high throughput allows a great deal of latitude in -congestion control. The congestion control algorithm outlined below is -meant to be both efficient in bandwidth as well as simple to implement.</p> - -<p>Packets are scheduled according to the the router's policy, taking care -not to exceed the router's outbound capacity or to exceed the measured -capacity of the remote peer. The measured capacity should operate along the -lines of TCP's slow start and congestion avoidance, with additive increases -to the sending capacity and multiplicative decreases in face of congestion. -Veering away from TCP, however, routers may give up on some messages after -a given period or number of retransmissions while continuing to transmit -other messages.</p> - -<p>The congestion detection techniques vary from TCP as well, since each -message has its own unique and nonsequential identifier, and each message -has a limited size - at most, 32KB. To efficiently transmit this feedback -to the sender, the receiver periodically includes a list of fully ACKed -message identifiers and may also include bitfields for partially received -messages, where each bit represents the reception of a fragment. If -duplicate fragments arrive, the message should be ACKed again, or if the -message has still not been fully received, the bitfield should be -retransmitted with any new updates.</p> - -<p>The simplest possible implementation does not need to pad the packets to -any particular size, but instead just places a single message fragment into -a packet and sends it off (careful not to exceed the MTU). A more efficient -strategy would be to bundle multiple message fragments into the same packet, -so long as it doesn't exceed the MTU, but this is not necessary. Eventually, -a set of fixed packet sizes may be appropriate to further hide the data -fragmentation to external adversaries, but the tunnel, garlic, and end to -end padding should be sufficient for most needs until then.</p> - -<h2><a name="keys">Keys</a></h2> - -<p>All encryption used is AES256/CBC with 32 byte keys and 16 byte IVs. -The MAC and session keys are negotiated as part of the DH exchange, used -for the HMAC and encryption, respectively. Prior to the DH exchange, -the publicly knowable introKey is used for the MAC and encryption.</p> - -<p>When using the introKey, both the initial message and any subsequent -reply use the introKey of the responder (Bob) - the responder does -not need to know the introKey of the requestor (Alice). The DSA -signing key used by Bob should already be known to Alice when she -contacts him, though Alice's DSA key may not already be known by -Bob.</p> - -<p>Upon receiving a message, the receiver checks the from IP address -with any established sessions - if there is one or more matches, -those session's MAC keys are tested sequentially in the HMAC. If none -of those verify or if there are no matching IP addresses, the -receiver tries their introKey in the MAC. If that does not verify, -the packet is dropped. If it does verify, it is interpreted -according to the message type, though if the receiver is overloaded, -it may be dropped anyway.</p> - -<p>If Alice and Bob have an established session, but Alice loses the -keys for some reason and she wants to contact Bob, she may at any -time simply establish a new session through the SessionRequest and -related messages. If Bob has lost the key but Alice does not know -that, she will first attempt to prod him to reply, by sending a -DataMessage with the wantReply flag set, and if Bob continually -fails to reply, she will assume the key is lost and reestablish a -new one.</p> - -<p>For the DH key agreement, -<a href="http://www.faqs.org/rfcs/rfc3526.html">RFC3526</a> 2048bit -MODP group (#14) is used:</p> -<pre> - p = 2^2048 - 2^1984 - 1 + 2^64 * { [2^1918 pi] + 124476 } - g = 2 -</pre> - -<p>The DSA p, q, and g are shared according to the scope of the -identity which created them.</p> - -<h2><a name="replay">Replay prevention</a></h2> - -<p>Replay prevention at the SSU layer occurs by rejecting packets -with exceedingly old timestamps or those which reuse an IV. To -detect duplicate IVs, a sequence of Bloom filters are employed to -"decay" periodically so that only recently added IVs are detected.</p> - -<p>The messageIds used in DataMessages are defined at layers above -the SSU transport and are passed through transparently. These IDs -are not in any particular order - in fact, they are likely to be -entirely random. The SSU layer makes no attempt at messageId -replay prevention - higher layers should take that into account.</p> - -<h2><a name="introduction">Introduction</a></h2> - -<p>Indirect session establishment by means of a third party introduction -is necessary for efficient NAT traversal. Charlie, a router behind a -NAT or firewall which does not allow unsolicited inbound UDP packets, -first contacts a few peers, choosing some to serve as introducers. Each -of these peers (Bob, Bill, Betty, etc) provide Charlie with an introduction -tag - a 4 byte random number - which he then makes available to the public -as methods of contacting him. Alice, a router who has Charlie's published -contact methods, first sends a RelayRequest packet to one or more of the -introducers, asking each to introduce her to Charlie (offering the -introduction tag to identify Charlie). Bob then forwards a RelayIntro -packet to Charlie including Alice's public IP and port number, then sends -Alice back a RelayResponse packet containing Charlie's public IP and port -number. When Charlie receives the RelayIntro packet, he sends off a small -random packet to Alice's IP and port (poking a hole in his NAT/firewall), -and when Alice receive's Bob's RelayResponse packet, she begins a new -full direction session establishment with the specified IP and port.</p> - -<!-- - should Bob wait for Charlie to ack the RelayIntro packet to avoid - situations where that packet is lost yet Alice gets Charlie's IP with - Charlie not yet punching a hole in his NAT for her to get through? - Perhaps Alice should send to multiple Bobs at once, hoping that at - least one of them gets through ---> - -<h2><a name="peerTesting">Peer testing</a></h2> - -<p>The automation of collaborative reachability testing for peers is -enabled by a sequence of PeerTest messages. With its proper -execution, a peer will be able to determine their own reachability -and may update its behavior accordingly. The testing process is -quite simple:</p> - -<pre> - Alice Bob Charlie - PeerTest -------------------> - PeerTest--------------------> - <-------------------PeerTest - <-------------------PeerTest - <------------------------------------------PeerTest - PeerTest------------------------------------------> - <------------------------------------------PeerTest -</pre> - -<p>Each of the PeerTest messages carry a nonce identifying the -test series itself, as initialized by Alice. If Alice doesn't -get a particular message that she expects, she will retransmit -accordingly, and based upon the data received or the messages -missing, she will know her reachability. The various end states -that may be reached are as follows:</p> - -<ul> -<li>If she doesn't receive a response from Bob, she will retransmit -up to a certain number of times, but if no response ever arrives, -she will know that her firewall or NAT is somehow misconfigured, -rejecting all inbound UDP packets even in direct response to an -outbound packet. Alternately, Bob may be down or unable to get -Charlie to reply.</li> - -<li>If Alice doesn't receive a PeerTest message with the -expected nonce from a third party (Charlie), she will retransmit -her initial request to Bob up to a certain number of times, even -if she has received Bob's reply already. If Charlie's first message -still doesn't get through but Bob's does, she knows that she is -behind a NAT or firewall that is rejecting unsolicited connection -attempts and that port forwarding is not operating properly (the -IP and port that Bob offered up should be forwarded).</li> - -<li>If Alice receives Bob's PeerTest message and both of Charlie's -PeerTest messages but the enclosed IP and port numbers in Bob's -and Charlie's second messages don't match, she knows that she is -behind a symmetric NAT, rewriting all of her outbound packets with -different 'from' ports for each peer contacted. She will need to -explicitly forward a port and always have that port exposed for -remote connectivity, ignoring further port discovery.</li> - -<li>If Alice receives Charlie's first message but not his second, -she will retransmit her PeerTest message to Charlie up to a -certain number of times, but if no response is received she knows -that Charlie is either confused or no longer online.</li> -</ul> - -<p>Alice should choose Bob arbitrarily from known peers who seem -to be capable of participating in peer tests. Bob in turn should -choose Charlie arbitrarily from peers that he knows who seem to be -capable of participating in peer tests and who are on a different -IP from both Bob and Alice. If the first error condition occurs -(Alice doesn't get PeerTest messages from Bob), Alice may decide -to designate a new peer as Bob and try again with a different nonce.</p> - -<p>Alice's introduction key is included in all of the PeerTest -messages so that she doesn't need to already have an established -session with Bob and so that Charlie can contact her without knowing -any additional information. Alice may go on to establish a session -with either Bob or Charlie, but it is not required.</p> - -<h2><a name="messageSequences">Message sequences</a></h2> - -<h3><a name="establishDirect">Connection establishment (direct)</a></h3> - -<pre> - Alice Bob - SessionRequest---------------------> - <---------------------SessionCreated - SessionConfirmed-------------------> - SessionConfirmed-------------------> - SessionConfirmed-------------------> - SessionConfirmed-------------------> - <--------------------------Data -</pre> - -<h3><a name="establishIndirect">Connection establishment (indirect)</a></h3> - -<pre> - Alice Bob Charlie - RelayRequest ----------------------> - <--------------RelayResponse RelayIntro-----------> - <--------------------------------------------Data (ignored) - SessionRequest--------------------------------------------> - <--------------------------------------------SessionCreated - SessionConfirmed------------------------------------------> - SessionConfirmed------------------------------------------> - SessionConfirmed------------------------------------------> - SessionConfirmed------------------------------------------> - <---------------------------------------------------Data -</pre> - -<h2><a name="sampleDatagrams">Sample datagrams</a></h2> - -<b>Minimal data message (no fragments, no ACKs, no NACKs, etc)</b><br /> -<i>(Size: 39 bytes)</i> - -<pre> - +----+----+----+----+----+----+----+----+ - | MAC | - | | - +----+----+----+----+----+----+----+----+ - | IV | - | | - +----+----+----+----+----+----+----+----+ - |flag| time |flag|#frg| | - +----+----+----+----+----+----+----+ | - | padding to fit a full AES256 block | - +----+----+----+----+----+----+----+----+ -</pre> - -<b>Minimal data message with payload</b><br /> -<i>(Size: 46+fragmentSize bytes)</i> - -<pre> - +----+----+----+----+----+----+----+----+ - | MAC | - | | - +----+----+----+----+----+----+----+----+ - | IV | - | | - +----+----+----+----+----+----+----+----+ - |flag| time |flag|#frg| - +----+----+----+----+----+----+----+----+ - messageId | frag info | | - +----+----+----+----+----+----+ | - | that many bytes of fragment data | - . . . - | | - +----+----+----+----+----+----+----+----+ -</pre> - -<h2><a name="capabilities">Peer capabilities</a></h2> - -<dl> - <dt>B</dt> - <dd>If the peer address contains the 'B' capability, that means - they are willing and able to participate in peer tests as - a 'Bob' or 'Charlie'.</dd> - <dt>C</dt> - <dd>If the peer address contains the 'C' capability, that means - they are willing and able to serve as an introducer - serving - as a Bob for an otherwise unreachable Alice.</dd> -</dl> diff --git a/router/doc/udp.png b/router/doc/udp.png deleted file mode 100644 index b4fd6241a1b9bc666f5e71fa498882ca60303cba..0000000000000000000000000000000000000000 Binary files a/router/doc/udp.png and /dev/null differ diff --git a/router/java/build.xml b/router/java/build.xml index 69f6b410946b8d74bab6cab22054a8073b49a9fa..e157dd25557d0a41488777e98634ccd5100a15fd 100644 --- a/router/java/build.xml +++ b/router/java/build.xml @@ -35,20 +35,51 @@ <target name="compile" depends="depend, dependVersion"> <mkdir dir="./build" /> <mkdir dir="./build/obj" /> - <javac srcdir="./src" debug="true" source="1.5" target="1.5" deprecation="on" destdir="./build/obj" classpath="../../core/java/build/i2p.jar" > + <javac srcdir="./src" debug="true" source="1.5" target="1.5" deprecation="on" + includeAntRuntime="false" + destdir="./build/obj" classpath="../../core/java/build/i2p.jar" > <compilerarg line="${javac.compilerargs}" /> </javac> </target> + <target name="compileTest" depends="builddeptest"> <mkdir dir="./build" /> <mkdir dir="./build/obj" /> - <javac srcdir="./src:./test" debug="true" source="1.5" target="1.5" deprecation="on" destdir="./build/obj" classpath="../../core/java/build/i2ptest.jar" > + <!-- junit classes are in ant runtime --> + <javac srcdir="./src:./test" debug="true" source="1.5" target="1.5" deprecation="on" + includeAntRuntime="true" + destdir="./build/obj" classpath="../../core/java/build/i2ptest.jar" > <compilerarg line="${javac.compilerargs}" /> </javac> </target> - <target name="jar" depends="compile"> - <jar destfile="./build/router.jar" basedir="./build/obj" includes="**/*.class" /> - </target> + + <target name="jar" depends="compile, jarUpToDate" unless="jar.uptodate" > + <exec executable="mtn" outputproperty="workspace.changes" errorproperty="mtn.error2" failifexecutionfails="false" > + <arg value="list" /> + <arg value="changed" /> + <arg value="." /> + </exec> + <!-- \n in an attribute value generates an invalid manifest --> + <exec executable="tr" inputstring="${workspace.changes}" outputproperty="workspace.changes.tr" errorproperty="mtn.error2" failifexecutionfails="false" > + <arg value="-s" /> + <arg value="[:space:]" /> + <arg value="," /> + </exec> + <jar destfile="./build/router.jar" basedir="./build/obj" includes="**/*.class" > + <manifest> + <attribute name="Build-Date" value="${build.timestamp}" /> + <attribute name="Base-Revision" value="${workspace.version}" /> + <attribute name="Workspace-Changes" value="${workspace.changes.tr}" /> + </manifest> + </jar> + </target> + + <target name="jarUpToDate"> + <uptodate property="jar.uptodate" targetfile="build/router.jar" > + <srcfiles dir= "." includes="build/obj/**/*.class" /> + </uptodate> + </target> + <target name="jarTest" depends="compileTest"> <jar destfile="./build/routertest.jar" basedir="./build/obj" includes="**/*.class" /> </target> diff --git a/router/java/src/net/i2p/data/i2np/DatabaseStoreMessage.java b/router/java/src/net/i2p/data/i2np/DatabaseStoreMessage.java index 0a2ee498b7c163c13292cbe7cda582c0044bfe92..b0a4cfc6d1ddbfdf9b781f74ff3f9493e35d6b97 100644 --- a/router/java/src/net/i2p/data/i2np/DatabaseStoreMessage.java +++ b/router/java/src/net/i2p/data/i2np/DatabaseStoreMessage.java @@ -12,6 +12,7 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import net.i2p.I2PAppContext; +import net.i2p.data.DatabaseEntry; import net.i2p.data.DataFormatException; import net.i2p.data.DataHelper; import net.i2p.data.Hash; @@ -28,59 +29,39 @@ import net.i2p.data.TunnelId; public class DatabaseStoreMessage extends I2NPMessageImpl { public final static int MESSAGE_TYPE = 1; private Hash _key; - private int _type; - private LeaseSet _leaseSet; - private RouterInfo _info; - private byte[] _leaseSetCache; - private byte[] _routerInfoCache; + private DatabaseEntry _dbEntry; + private byte[] _byteCache; private long _replyToken; private TunnelId _replyTunnel; private Hash _replyGateway; - public final static int KEY_TYPE_ROUTERINFO = 0; - public final static int KEY_TYPE_LEASESET = 1; - public DatabaseStoreMessage(I2PAppContext context) { super(context); - setValueType(-1); } /** * Defines the key in the network database being stored * */ - public Hash getKey() { return _key; } - public void setKey(Hash key) { _key = key; } - - /** - * Defines the router info value in the network database being stored - * - */ - public RouterInfo getRouterInfo() { return _info; } - public void setRouterInfo(RouterInfo routerInfo) { - _info = routerInfo; - if (_info != null) - setValueType(KEY_TYPE_ROUTERINFO); + public Hash getKey() { + if (_key != null) + return _key; // receive + if (_dbEntry != null) + return _dbEntry.getHash(); // create + return null; } /** - * Defines the lease set value in the network database being stored - * + * Defines the entry in the network database being stored */ - public LeaseSet getLeaseSet() { return _leaseSet; } - public void setLeaseSet(LeaseSet leaseSet) { - _leaseSet = leaseSet; - if (_leaseSet != null) - setValueType(KEY_TYPE_LEASESET); - } - + public DatabaseEntry getEntry() { return _dbEntry; } + /** - * Defines type of key being stored in the network database - - * either KEY_TYPE_ROUTERINFO or KEY_TYPE_LEASESET - * + * This also sets the key */ - public int getValueType() { return _type; } - public void setValueType(int type) { _type = type; } + public void setEntry(DatabaseEntry entry) { + _dbEntry = entry; + } /** * If a reply is desired, this token specifies the message ID that should @@ -90,6 +71,7 @@ public class DatabaseStoreMessage extends I2NPMessageImpl { * @return positive reply token ID, or 0 if no reply is necessary. */ public long getReplyToken() { return _replyToken; } + /** * Update the reply token. * @@ -113,13 +95,10 @@ public class DatabaseStoreMessage extends I2NPMessageImpl { if (type != MESSAGE_TYPE) throw new I2NPMessageException("Message type is incorrect for this message"); int curIndex = offset; - //byte keyData[] = new byte[Hash.HASH_LENGTH]; - //System.arraycopy(data, curIndex, keyData, 0, Hash.HASH_LENGTH); _key = Hash.create(data, curIndex); curIndex += Hash.HASH_LENGTH; - //_key = new Hash(keyData); - _type = (int)DataHelper.fromLong(data, curIndex, 1); + type = (int)DataHelper.fromLong(data, curIndex, 1); curIndex++; _replyToken = DataHelper.fromLong(data, curIndex, 4); @@ -131,39 +110,38 @@ public class DatabaseStoreMessage extends I2NPMessageImpl { _replyTunnel = new TunnelId(tunnel); curIndex += 4; - //byte gw[] = new byte[Hash.HASH_LENGTH]; - //System.arraycopy(data, curIndex, gw, 0, Hash.HASH_LENGTH); _replyGateway = Hash.create(data, curIndex); curIndex += Hash.HASH_LENGTH; - //_replyGateway = new Hash(gw); } else { _replyTunnel = null; _replyGateway = null; } - if (_type == KEY_TYPE_LEASESET) { - _leaseSet = new LeaseSet(); + if (type == DatabaseEntry.KEY_TYPE_LEASESET) { + _dbEntry = new LeaseSet(); try { - _leaseSet.readBytes(new ByteArrayInputStream(data, curIndex, data.length-curIndex)); + _dbEntry.readBytes(new ByteArrayInputStream(data, curIndex, data.length-curIndex)); } catch (DataFormatException dfe) { throw new I2NPMessageException("Error reading the leaseSet", dfe); } - } else if (_type == KEY_TYPE_ROUTERINFO) { - _info = new RouterInfo(); + } else if (type == DatabaseEntry.KEY_TYPE_ROUTERINFO) { + _dbEntry = new RouterInfo(); int compressedSize = (int)DataHelper.fromLong(data, curIndex, 2); curIndex += 2; try { byte decompressed[] = DataHelper.decompress(data, curIndex, compressedSize); - _info.readBytes(new ByteArrayInputStream(decompressed)); + _dbEntry.readBytes(new ByteArrayInputStream(decompressed)); } catch (DataFormatException dfe) { throw new I2NPMessageException("Error reading the routerInfo", dfe); } catch (IOException ioe) { throw new I2NPMessageException("Compressed routerInfo was corrupt", ioe); } } else { - throw new I2NPMessageException("Invalid type of key read from the structure - " + _type); + throw new I2NPMessageException("Invalid type of key read from the structure - " + type); } + //if (!key.equals(_dbEntry.getHash())) + // throw new I2NPMessageException("Hash mismatch in DSM"); } @@ -172,28 +150,28 @@ public class DatabaseStoreMessage extends I2NPMessageImpl { int len = Hash.HASH_LENGTH + 1 + 4; // key+type+replyToken if (_replyToken > 0) len += 4 + Hash.HASH_LENGTH; // replyTunnel+replyGateway - if (_type == KEY_TYPE_LEASESET) { - _leaseSetCache = _leaseSet.toByteArray(); - len += _leaseSetCache.length; - } else if (_type == KEY_TYPE_ROUTERINFO) { - byte uncompressed[] = _info.toByteArray(); - byte compressed[] = DataHelper.compress(uncompressed); - _routerInfoCache = compressed; - len += compressed.length + 2; + if (_dbEntry.getType() == DatabaseEntry.KEY_TYPE_LEASESET) { + _byteCache = _dbEntry.toByteArray(); + } else if (_dbEntry.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) { + byte uncompressed[] = _dbEntry.toByteArray(); + _byteCache = DataHelper.compress(uncompressed); + len += 2; } + len += _byteCache.length; return len; } + /** write the message body to the output array, starting at the given index */ protected int writeMessageBody(byte out[], int curIndex) throws I2NPMessageException { - if (_key == null) throw new I2NPMessageException("Invalid key"); - if ( (_type != KEY_TYPE_LEASESET) && (_type != KEY_TYPE_ROUTERINFO) ) throw new I2NPMessageException("Invalid key type"); - if ( (_type == KEY_TYPE_LEASESET) && (_leaseSet == null) ) throw new I2NPMessageException("Missing lease set"); - if ( (_type == KEY_TYPE_ROUTERINFO) && (_info == null) ) throw new I2NPMessageException("Missing router info"); + if (_dbEntry == null) throw new I2NPMessageException("Missing entry"); + int type = _dbEntry.getType(); + if (type != DatabaseEntry.KEY_TYPE_LEASESET && type != DatabaseEntry.KEY_TYPE_ROUTERINFO) + throw new I2NPMessageException("Invalid key type"); - System.arraycopy(_key.getData(), 0, out, curIndex, Hash.HASH_LENGTH); + // Use the hash of the DatabaseEntry + System.arraycopy(getKey().getData(), 0, out, curIndex, Hash.HASH_LENGTH); curIndex += Hash.HASH_LENGTH; - byte type[] = DataHelper.toLong(1, _type); - out[curIndex++] = type[0]; + out[curIndex++] = (byte) type; byte tok[] = DataHelper.toLong(4, _replyToken); System.arraycopy(tok, 0, out, curIndex, 4); curIndex += 4; @@ -209,17 +187,14 @@ public class DatabaseStoreMessage extends I2NPMessageImpl { curIndex += Hash.HASH_LENGTH; } - if (_type == KEY_TYPE_LEASESET) { - // initialized in calculateWrittenLength - System.arraycopy(_leaseSetCache, 0, out, curIndex, _leaseSetCache.length); - curIndex += _leaseSetCache.length; - } else if (_type == KEY_TYPE_ROUTERINFO) { - byte len[] = DataHelper.toLong(2, _routerInfoCache.length); + // _byteCache initialized in calculateWrittenLength + if (type == DatabaseEntry.KEY_TYPE_ROUTERINFO) { + byte len[] = DataHelper.toLong(2, _byteCache.length); out[curIndex++] = len[0]; out[curIndex++] = len[1]; - System.arraycopy(_routerInfoCache, 0, out, curIndex, _routerInfoCache.length); - curIndex += _routerInfoCache.length; } + System.arraycopy(_byteCache, 0, out, curIndex, _byteCache.length); + curIndex += _byteCache.length; return curIndex; } @@ -228,9 +203,7 @@ public class DatabaseStoreMessage extends I2NPMessageImpl { @Override public int hashCode() { return DataHelper.hashCode(getKey()) + - DataHelper.hashCode(getLeaseSet()) + - DataHelper.hashCode(getRouterInfo()) + - getValueType() + + DataHelper.hashCode(_dbEntry) + (int)getReplyToken() + DataHelper.hashCode(getReplyTunnel()) + DataHelper.hashCode(getReplyGateway()); @@ -241,9 +214,7 @@ public class DatabaseStoreMessage extends I2NPMessageImpl { if ( (object != null) && (object instanceof DatabaseStoreMessage) ) { DatabaseStoreMessage msg = (DatabaseStoreMessage)object; return DataHelper.eq(getKey(),msg.getKey()) && - DataHelper.eq(getLeaseSet(),msg.getLeaseSet()) && - DataHelper.eq(getRouterInfo(),msg.getRouterInfo()) && - _type == msg.getValueType() && + DataHelper.eq(_dbEntry,msg.getEntry()) && getReplyToken() == msg.getReplyToken() && DataHelper.eq(getReplyTunnel(), msg.getReplyTunnel()) && DataHelper.eq(getReplyGateway(), msg.getReplyGateway()); @@ -259,9 +230,7 @@ public class DatabaseStoreMessage extends I2NPMessageImpl { buf.append("\n\tExpiration: ").append(getMessageExpiration()); buf.append("\n\tUnique ID: ").append(getUniqueId()); buf.append("\n\tKey: ").append(getKey()); - buf.append("\n\tValue Type: ").append(getValueType()); - buf.append("\n\tRouter Info: ").append(getRouterInfo()); - buf.append("\n\tLease Set: ").append(getLeaseSet()); + buf.append("\n\tEntry: ").append(_dbEntry); buf.append("\n\tReply token: ").append(getReplyToken()); buf.append("\n\tReply tunnel: ").append(getReplyTunnel()); buf.append("\n\tReply gateway: ").append(getReplyGateway()); diff --git a/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java b/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java index 6b4ab71f4048065751cea8174b3d6d164b25ceee..eebb05f7e4ebdbf4c1fd618fdf7deaa76444535e 100644 --- a/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java +++ b/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java @@ -20,6 +20,7 @@ import net.i2p.data.DataHelper; import net.i2p.data.DataStructureImpl; import net.i2p.data.Hash; import net.i2p.util.Log; +import net.i2p.util.SimpleByteCache; /** * Defines the base message implementation. @@ -72,6 +73,7 @@ public abstract class I2NPMessageImpl extends DataStructureImpl implements I2NPM * Read the header, then read the rest into buffer, then call * readMessage in the implemented message type * + *<pre> * Specifically: * 1 byte type (if caller didn't read already, as specified by the type param * 4 byte ID @@ -79,9 +81,11 @@ public abstract class I2NPMessageImpl extends DataStructureImpl implements I2NPM * 2 byte size * 1 byte checksum * size bytes of payload (read by readMessage() in implementation) + *</pre> * * @param type the message type or -1 if we should read it here * @param buffer temp buffer to use + * @return total length of the message */ public int readBytes(InputStream in, int type, byte buffer[]) throws I2NPMessageException, IOException { try { @@ -110,24 +114,44 @@ public abstract class I2NPMessageImpl extends DataStructureImpl implements I2NPM cur += numRead; } - Hash calc = _context.sha().calculateHash(buffer, 0, size); + byte[] calc = SimpleByteCache.acquire(Hash.HASH_LENGTH); + _context.sha().calculateHash(buffer, 0, size, calc, 0); //boolean eq = calc.equals(h); - boolean eq = DataHelper.eq(checksum, 0, calc.getData(), 0, CHECKSUM_LENGTH); + boolean eq = DataHelper.eq(checksum, 0, calc, 0, CHECKSUM_LENGTH); + SimpleByteCache.release(calc); if (!eq) throw new I2NPMessageException("Hash does not match for " + getClass().getName()); - long start = _context.clock().now(); + //long start = _context.clock().now(); if (_log.shouldLog(Log.DEBUG)) _log.debug("Reading bytes: type = " + type + " / uniqueId : " + _uniqueId + " / expiration : " + _expiration); readMessage(buffer, 0, size, type); //long time = _context.clock().now() - start; //if (time > 50) // _context.statManager().addRateData("i2np.readTime", time, time); - return size + Hash.HASH_LENGTH + 1 + 4 + DataHelper.DATE_LENGTH; + return CHECKSUM_LENGTH + 1 + 2 + 4 + DataHelper.DATE_LENGTH + size; } catch (DataFormatException dfe) { throw new I2NPMessageException("Error reading the message header", dfe); } } + + /** + * Read the header, then read the rest into buffer, then call + * readMessage in the implemented message type + * + *<pre> + * Specifically: + * 1 byte type (if caller didn't read already, as specified by the type param + * 4 byte ID + * 8 byte expiration + * 2 byte size + * 1 byte checksum + * size bytes of payload (read by readMessage() in implementation) + *</pre> + * + * @param type the message type or -1 if we should read it here + * @return total length of the message + */ public int readBytes(byte data[], int type, int offset) throws I2NPMessageException, IOException { int cur = offset; if (type < 0) { @@ -153,13 +177,14 @@ public abstract class I2NPMessageImpl extends DataStructureImpl implements I2NPM + " cur=" + cur + " wanted=" + size + "]: " + getClass().getName()); - Hash calc = _context.sha().calculateHash(data, cur, size); - //boolean eq = calc.equals(h); - boolean eq = DataHelper.eq(hdata, 0, calc.getData(), 0, CHECKSUM_LENGTH); + byte[] calc = SimpleByteCache.acquire(Hash.HASH_LENGTH); + _context.sha().calculateHash(data, cur, size, calc, 0); + boolean eq = DataHelper.eq(hdata, 0, calc, 0, CHECKSUM_LENGTH); + SimpleByteCache.release(calc); if (!eq) throw new I2NPMessageException("Hash does not match for " + getClass().getName()); - long start = _context.clock().now(); + //long start = _context.clock().now(); if (_log.shouldLog(Log.DEBUG)) _log.debug("Reading bytes: type = " + type + " / uniqueId : " + _uniqueId + " / expiration : " + _expiration); readMessage(data, cur, size, type); @@ -215,7 +240,7 @@ public abstract class I2NPMessageImpl extends DataStructureImpl implements I2NPM } public int toByteArray(byte buffer[]) { - long start = _context.clock().now(); + //long start = _context.clock().now(); int prefixLen = 1 // type + 4 // uniqueId @@ -231,7 +256,8 @@ public abstract class I2NPMessageImpl extends DataStructureImpl implements I2NPM try { int writtenLen = writeMessageBody(buffer, prefixLen); int payloadLen = writtenLen - prefixLen; - Hash h = _context.sha().calculateHash(buffer, prefixLen, payloadLen); + byte[] h = SimpleByteCache.acquire(Hash.HASH_LENGTH); + _context.sha().calculateHash(buffer, prefixLen, payloadLen, h, 0); int off = 0; DataHelper.toLong(buffer, off, 1, getType()); @@ -242,7 +268,8 @@ public abstract class I2NPMessageImpl extends DataStructureImpl implements I2NPM off += DataHelper.DATE_LENGTH; DataHelper.toLong(buffer, off, 2, payloadLen); off += 2; - System.arraycopy(h.getData(), 0, buffer, off, CHECKSUM_LENGTH); + System.arraycopy(h, 0, buffer, off, CHECKSUM_LENGTH); + SimpleByteCache.release(h); //long time = _context.clock().now() - start; //if (time > 50) diff --git a/router/java/src/net/i2p/data/i2np/TunnelDataMessage.java b/router/java/src/net/i2p/data/i2np/TunnelDataMessage.java index 1ac01d0a6c87772a14604d72716473522ef07d2e..ef4930594f0f0491d17e18341dfb6803370b8d72 100644 --- a/router/java/src/net/i2p/data/i2np/TunnelDataMessage.java +++ b/router/java/src/net/i2p/data/i2np/TunnelDataMessage.java @@ -160,7 +160,7 @@ public class TunnelDataMessage extends I2NPMessageImpl { /** write the message body to the output array, starting at the given index */ protected int writeMessageBody(byte out[], int curIndex) throws I2NPMessageException { if ( (_tunnelId <= 0) || (_data == null) ) - throw new I2NPMessageException("Not enough data to write out (id=" + _tunnelId + " data=" + _data + ")"); + throw new I2NPMessageException("Not enough data to write out (id=" + _tunnelId + ")"); if (_data.length <= 0) throw new I2NPMessageException("Not enough data to write out (data.length=" + _data.length + ")"); diff --git a/router/java/src/net/i2p/router/Blocklist.java b/router/java/src/net/i2p/router/Blocklist.java index d401f1532ee9352acc207664662ba1b44e71eaa5..8027ac007dbbb080495c93196032ad5fd25cf813 100644 --- a/router/java/src/net/i2p/router/Blocklist.java +++ b/router/java/src/net/i2p/router/Blocklist.java @@ -59,7 +59,7 @@ import net.i2p.util.Log; * */ public class Blocklist { - private Log _log; + private final Log _log; private RouterContext _context; private long _blocklist[]; private int _blocklistSize; @@ -72,15 +72,11 @@ public class Blocklist { public Blocklist(RouterContext context) { _context = context; _log = context.logManager().getLog(Blocklist.class); - _blocklist = null; - _blocklistSize = 0; - _wrapSave = null; } + /** only for testing with main() */ public Blocklist() { _log = new Log(Blocklist.class); - _blocklist = null; - _blocklistSize = 0; } static final String PROP_BLOCKLIST_ENABLED = "router.blocklist.enable"; @@ -683,7 +679,7 @@ public class Blocklist { return; Job job = new ShitlistJob(peer); if (number > 0) - job.getTiming().setStartAfter(_context.clock().now() + (number * 30*1000)); + job.getTiming().setStartAfter(_context.clock().now() + (30*1000l * number)); _context.jobQueue().addJob(job); } diff --git a/router/java/src/net/i2p/router/ClientMessage.java b/router/java/src/net/i2p/router/ClientMessage.java index ec7820d696a47e8ff065f216e025b85d208d5c91..5b5a228a199c2e0117afcca2937e68265ed405dc 100644 --- a/router/java/src/net/i2p/router/ClientMessage.java +++ b/router/java/src/net/i2p/router/ClientMessage.java @@ -28,16 +28,10 @@ public class ClientMessage { private Hash _destinationHash; private MessageId _messageId; private long _expiration; + /** only for outbound messages */ + private int _flags; public ClientMessage() { - setPayload(null); - setDestination(null); - setFromDestination(null); - setReceptionInfo(null); - setSenderConfig(null); - setDestinationHash(null); - setMessageId(null); - setExpiration(0); } /** @@ -101,4 +95,17 @@ public class ClientMessage { */ public long getExpiration() { return _expiration; } public void setExpiration(long e) { _expiration = e; } + + /** + * Flags requested by the client that sent the message. This will only be available + * for locally originated messages. + * + * @since 0.8.4 + */ + public int getFlags() { return _flags; } + + /** + * @since 0.8.4 + */ + public void setFlags(int f) { _flags = f; } } diff --git a/router/java/src/net/i2p/router/ClientMessagePool.java b/router/java/src/net/i2p/router/ClientMessagePool.java index f4dfd0e4402b1a4e802bff5fda1f2312a9d4e554..750c76915eea8188661749d542d7a8bebbe3f005 100644 --- a/router/java/src/net/i2p/router/ClientMessagePool.java +++ b/router/java/src/net/i2p/router/ClientMessagePool.java @@ -23,12 +23,13 @@ import net.i2p.util.Log; * */ public class ClientMessagePool { - private Log _log; - private RouterContext _context; + private final Log _log; + private final RouterContext _context; public ClientMessagePool(RouterContext context) { _context = context; _log = _context.logManager().getLog(ClientMessagePool.class); + OutboundClientMessageOneShotJob.init(_context); } /** @@ -65,6 +66,7 @@ public class ClientMessagePool { } } +/****** private boolean isGuaranteed(ClientMessage msg) { Properties opts = null; if (msg.getSenderConfig() != null) @@ -76,4 +78,5 @@ public class ClientMessagePool { return false; } } +******/ } diff --git a/router/java/src/net/i2p/router/DummyNetworkDatabaseFacade.java b/router/java/src/net/i2p/router/DummyNetworkDatabaseFacade.java index 6031cf630e26c2a64f424c2c28ce593951e5e74e..0f06f507cc854b7fd1557f8c150af8f71052cbda 100644 --- a/router/java/src/net/i2p/router/DummyNetworkDatabaseFacade.java +++ b/router/java/src/net/i2p/router/DummyNetworkDatabaseFacade.java @@ -16,6 +16,7 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; +import net.i2p.data.DatabaseEntry; import net.i2p.data.Hash; import net.i2p.data.LeaseSet; import net.i2p.data.RouterInfo; @@ -36,6 +37,7 @@ class DummyNetworkDatabaseFacade extends NetworkDatabaseFacade { _routers.put(info.getIdentity().getHash(), info); } + public DatabaseEntry lookupLocally(Hash key) { return null; } public void lookupLeaseSet(Hash key, Job onFindJob, Job onFailedLookupJob, long timeoutMs) {} public LeaseSet lookupLeaseSetLocally(Hash key) { return null; } public void lookupRouterInfo(Hash key, Job onFindJob, Job onFailedLookupJob, long timeoutMs) { diff --git a/router/java/src/net/i2p/router/InNetMessagePool.java b/router/java/src/net/i2p/router/InNetMessagePool.java index 47b799da5cc09c1d5a93836f866cc20eaeb2ff37..d6067b2b3690aaab90a1f84f9bb9adc00562be52 100644 --- a/router/java/src/net/i2p/router/InNetMessagePool.java +++ b/router/java/src/net/i2p/router/InNetMessagePool.java @@ -30,15 +30,17 @@ import net.i2p.util.Log; * */ public class InNetMessagePool implements Service { - private Log _log; - private RouterContext _context; - private HandlerJobBuilder _handlerJobBuilders[]; + private final Log _log; + private final RouterContext _context; + private final HandlerJobBuilder _handlerJobBuilders[]; + /** following 5 unused unless DISPATCH_DIRECT == false */ private final List _pendingDataMessages; private final List _pendingDataMessagesFrom; private final List _pendingGatewayMessages; private SharedShortCircuitDataJob _shortCircuitDataJob; private SharedShortCircuitGatewayJob _shortCircuitGatewayJob; + private boolean _alive; private boolean _dispatchThreaded; @@ -79,7 +81,6 @@ public class InNetMessagePool implements Service { _shortCircuitGatewayJob = new SharedShortCircuitGatewayJob(context); } _log = _context.logManager().getLog(InNetMessagePool.class); - _alive = false; _context.statManager().createRateStat("inNetPool.dropped", "How often do we drop a message", "InNetPool", new long[] { 60*60*1000l }); _context.statManager().createRateStat("inNetPool.droppedDeliveryStatusDelay", "How long after a delivery status message is created do we receive it back again (for messages that are too slow to be handled)", "InNetPool", new long[] { 60*60*1000l }); _context.statManager().createRateStat("inNetPool.duplicate", "How often do we receive a duplicate message", "InNetPool", new long[] { 60*60*1000l }); @@ -87,12 +88,20 @@ public class InNetMessagePool implements Service { _context.statManager().createRateStat("inNetPool.droppedDbLookupResponseMessage", "How often we drop a slow-to-arrive db search response", "InNetPool", new long[] { 60*60*1000l }); } + /** + * @return previous builder for this message type, or null + * @throws AIOOBE if i2npMessageType is greater than MAX_I2NP_MESSAGE_TYPE + */ public HandlerJobBuilder registerHandlerJobBuilder(int i2npMessageType, HandlerJobBuilder builder) { HandlerJobBuilder old = _handlerJobBuilders[i2npMessageType]; _handlerJobBuilders[i2npMessageType] = builder; return old; } + /** + * @return previous builder for this message type, or null + * @throws AIOOBE if i2npMessageType is greater than MAX_I2NP_MESSAGE_TYPE + */ public HandlerJobBuilder unregisterHandlerJobBuilder(int i2npMessageType) { HandlerJobBuilder old = _handlerJobBuilders[i2npMessageType]; _handlerJobBuilders[i2npMessageType] = null; @@ -100,12 +109,14 @@ public class InNetMessagePool implements Service { } /** - * Add a new message to the pool, returning the number of messages in the - * pool so that the comm system can throttle inbound messages. If there is + * Add a new message to the pool. + * If there is * a HandlerJobBuilder for the inbound message type, the message is loaded * into a job created by that builder and queued up for processing instead * (though if the builder doesn't create a job, it is added to the pool) * + * @return -1 for some types of errors but not all; 0 otherwise + * (was queue length, long ago) */ public int add(I2NPMessage messageBody, RouterIdentity fromRouter, Hash fromRouterHash) { long exp = messageBody.getMessageExpiration(); diff --git a/router/java/src/net/i2p/router/JobQueue.java b/router/java/src/net/i2p/router/JobQueue.java index f56b25f9edb35a091c33a6750165be187b8d52ad..7f5cb008fe2fb53dbc4dbab50b393059f7c1afc4 100644 --- a/router/java/src/net/i2p/router/JobQueue.java +++ b/router/java/src/net/i2p/router/JobQueue.java @@ -34,22 +34,22 @@ import net.i2p.util.Log; * */ public class JobQueue { - private Log _log; - private RouterContext _context; + private final Log _log; + private final RouterContext _context; /** Integer (runnerId) to JobQueueRunner for created runners */ private final Map<Integer, JobQueueRunner> _queueRunners; /** a counter to identify a job runner */ private volatile static int _runnerId = 0; /** list of jobs that are ready to run ASAP */ - private BlockingQueue<Job> _readyJobs; + private final BlockingQueue<Job> _readyJobs; /** list of jobs that are scheduled for running in the future */ - private List<Job> _timedJobs; + private final List<Job> _timedJobs; /** job name to JobStat for that job */ private final Map<String, JobStats> _jobStats; /** how many job queue runners can go concurrently */ private int _maxRunners = 1; - private QueuePumper _pumper; + private final QueuePumper _pumper; /** will we allow the # job runners to grow beyond 1? */ private boolean _allowParallelOperation; /** have we been killed or are we alive? */ @@ -61,6 +61,8 @@ public class JobQueue { private static final int RUNNERS; static { long maxMemory = Runtime.getRuntime().maxMemory(); + if (maxMemory == Long.MAX_VALUE) + maxMemory = 128*1024*1024l; if (maxMemory < 64*1024*1024) RUNNERS = 3; else if (maxMemory < 256*1024*1024) @@ -208,7 +210,7 @@ public class JobQueue { * <code>false</code> if the job is finished or doesn't exist in the queue. */ public boolean isJobActive(Job job) { - if (_readyJobs.contains(job) | _timedJobs.contains(job)) + if (_readyJobs.contains(job) || _timedJobs.contains(job)) return true; for (JobQueueRunner runner: _queueRunners.values()) if (runner.getCurrentJob() == job) @@ -227,10 +229,14 @@ public class JobQueue { } public long getMaxLag() { + // first job is the one that has been waiting the longest Job j = _readyJobs.peek(); if (j == null) return 0; - // first job is the one that has been waiting the longest - long startAfter = j.getTiming().getStartAfter(); + JobTiming jt = j.getTiming(); + // PoisonJob timing is null, prevent NPE at shutdown + if (jt == null) + return 0; + long startAfter = jt.getStartAfter(); return _context.clock().now() - startAfter; } @@ -689,7 +695,7 @@ public class JobQueue { TreeMap<Long, Job> ordered = new TreeMap(); for (int i = 0; i < timedJobs.size(); i++) { Job j = timedJobs.get(i); - ordered.put(new Long(j.getTiming().getStartAfter()), j); + ordered.put(Long.valueOf(j.getTiming().getStartAfter()), j); } for (Iterator<Job> iter = ordered.values().iterator(); iter.hasNext(); ) { Job j = iter.next(); diff --git a/router/java/src/net/i2p/router/JobQueueRunner.java b/router/java/src/net/i2p/router/JobQueueRunner.java index ca0ee3f1bccf7a71e80f1f4bedc438bf2dc1ef12..e9b0d08fb99d921a166be0c944e7d20be9d28eb0 100644 --- a/router/java/src/net/i2p/router/JobQueueRunner.java +++ b/router/java/src/net/i2p/router/JobQueueRunner.java @@ -4,10 +4,10 @@ import net.i2p.util.Log; /** a do run run run a do run run */ class JobQueueRunner implements Runnable { - private Log _log; - private RouterContext _context; + private final Log _log; + private final RouterContext _context; private boolean _keepRunning; - private int _id; + private final int _id; private long _numJobs; private Job _currentJob; private Job _lastJob; @@ -19,9 +19,6 @@ class JobQueueRunner implements Runnable { _context = context; _id = id; _keepRunning = true; - _numJobs = 0; - _currentJob = null; - _lastJob = null; _log = _context.logManager().getLog(JobQueueRunner.class); _context.statManager().createRateStat("jobQueue.jobRun", "How long jobs take", "JobQueue", new long[] { 60*60*1000l, 24*60*60*1000l }); _context.statManager().createRateStat("jobQueue.jobRunSlow", "How long jobs that take over a second take", "JobQueue", new long[] { 60*60*1000l, 24*60*60*1000l }); diff --git a/router/java/src/net/i2p/router/JobStats.java b/router/java/src/net/i2p/router/JobStats.java index 19362cff371a623abc7a16067756f965fda0c775..f9cfdc9cc753e40b42351456ddbdf3dcffa867d2 100644 --- a/router/java/src/net/i2p/router/JobStats.java +++ b/router/java/src/net/i2p/router/JobStats.java @@ -4,7 +4,7 @@ import net.i2p.data.DataHelper; /** glorified struct to contain basic job stats */ class JobStats { - private String _job; + private final String _job; private volatile long _numRuns; private volatile long _totalTime; private volatile long _maxTime; diff --git a/router/java/src/net/i2p/router/JobTiming.java b/router/java/src/net/i2p/router/JobTiming.java index d979074a6968c70f79e2d368caed3c9e565ba492..fd410f131d35dfd5a071a5aa4837860ba7045463 100644 --- a/router/java/src/net/i2p/router/JobTiming.java +++ b/router/java/src/net/i2p/router/JobTiming.java @@ -18,7 +18,7 @@ public class JobTiming implements Clock.ClockUpdateListener { private long _start; private long _actualStart; private long _actualEnd; - private RouterContext _context; + private final RouterContext _context; public JobTiming(RouterContext context) { _context = context; diff --git a/router/java/src/net/i2p/router/KeyManager.java b/router/java/src/net/i2p/router/KeyManager.java index fd0e85a9eb6f31cefeac96dbc5cff92e4bc22564..0e0b4e5d6faee67e8866690d33da1dc140be538c 100644 --- a/router/java/src/net/i2p/router/KeyManager.java +++ b/router/java/src/net/i2p/router/KeyManager.java @@ -12,9 +12,7 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; -import java.util.HashSet; import java.util.Map; -import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import net.i2p.data.DataFormatException; @@ -37,14 +35,14 @@ import net.i2p.util.SecureFileOutputStream; * */ public class KeyManager { - private Log _log; - private RouterContext _context; + private final Log _log; + private final RouterContext _context; private PrivateKey _privateKey; private PublicKey _publicKey; private SigningPrivateKey _signingPrivateKey; private SigningPublicKey _signingPublicKey; private final Map<Hash, LeaseSetKeys> _leaseSetKeys; // Destination --> LeaseSetKeys - private SynchronizeKeysJob _synchronizeJob; + private final SynchronizeKeysJob _synchronizeJob; public final static String PROP_KEYDIR = "router.keyBackupDir"; public final static String DEFAULT_KEYDIR = "keyBackup"; @@ -61,10 +59,6 @@ public class KeyManager { _context = context; _log = _context.logManager().getLog(KeyManager.class); _synchronizeJob = new SynchronizeKeysJob(); - setPrivateKey(null); - setPublicKey(null); - setSigningPrivateKey(null); - setSigningPublicKey(null); _leaseSetKeys = new ConcurrentHashMap(); } @@ -132,12 +126,6 @@ public class KeyManager { return _leaseSetKeys.get(dest); } - public Set<LeaseSetKeys> getAllKeys() { - HashSet keys = new HashSet(); - keys.addAll(_leaseSetKeys.values()); - return keys; - } - private class SynchronizeKeysJob extends JobImpl { public SynchronizeKeysJob() { super(KeyManager.this._context); diff --git a/router/java/src/net/i2p/router/MessageValidator.java b/router/java/src/net/i2p/router/MessageValidator.java index b673702a1f777dc2adbb12d93d7ec1f0a269c227..b619166122885a9c4508584c6929be35a0537c5a 100644 --- a/router/java/src/net/i2p/router/MessageValidator.java +++ b/router/java/src/net/i2p/router/MessageValidator.java @@ -13,14 +13,13 @@ import net.i2p.util.Log; * */ public class MessageValidator { - private Log _log; - private RouterContext _context; + private final Log _log; + private final RouterContext _context; private DecayingBloomFilter _filter; public MessageValidator(RouterContext context) { _log = context.logManager().getLog(MessageValidator.class); - _filter = null; _context = context; context.statManager().createRateStat("router.duplicateMessageId", "Note that a duplicate messageId was received", "Router", new long[] { 10*60*1000l, 60*60*1000l, 3*60*60*1000l, 24*60*60*1000l }); diff --git a/router/java/src/net/i2p/router/MultiRouter.java b/router/java/src/net/i2p/router/MultiRouter.java index d8d316ae8aa0291d51e3ce370f0fb7aea4d553b6..43f618bc2209725b75e6edd356fcff49cd6f2c6f 100644 --- a/router/java/src/net/i2p/router/MultiRouter.java +++ b/router/java/src/net/i2p/router/MultiRouter.java @@ -90,13 +90,17 @@ public class MultiRouter { private static Properties getEnv(String filename) { Properties props = new Properties(); + FileInputStream in = null; try { - props.load(new FileInputStream(filename)); + in = new FileInputStream(filename); + props.load(in); props.setProperty("time.disabled", "true"); return props; } catch (IOException ioe) { ioe.printStackTrace(); return null; + } finally { + if (in != null) try { in.close(); } catch (IOException ioe) {} } } diff --git a/router/java/src/net/i2p/router/NetworkDatabaseFacade.java b/router/java/src/net/i2p/router/NetworkDatabaseFacade.java index 50b9d5364cc88f5bab7ada626721217509fa6e6b..741f9495347dd04ef6bec10af6dc107863c9f77e 100644 --- a/router/java/src/net/i2p/router/NetworkDatabaseFacade.java +++ b/router/java/src/net/i2p/router/NetworkDatabaseFacade.java @@ -13,6 +13,7 @@ import java.io.Writer; import java.util.Collections; import java.util.Set; +import net.i2p.data.DatabaseEntry; import net.i2p.data.Hash; import net.i2p.data.LeaseSet; import net.i2p.data.RouterInfo; @@ -32,6 +33,11 @@ public abstract class NetworkDatabaseFacade implements Service { */ public abstract Set<Hash> findNearestRouters(Hash key, int maxNumRouters, Set<Hash> peersToIgnore); + /** + * @return RouterInfo, LeaseSet, or null + * @since 0.8.3 + */ + public abstract DatabaseEntry lookupLocally(Hash key); public abstract void lookupLeaseSet(Hash key, Job onFindJob, Job onFailedLookupJob, long timeoutMs); public abstract LeaseSet lookupLeaseSetLocally(Hash key); public abstract void lookupRouterInfo(Hash key, Job onFindJob, Job onFailedLookupJob, long timeoutMs); diff --git a/router/java/src/net/i2p/router/OutNetMessage.java b/router/java/src/net/i2p/router/OutNetMessage.java index 72f262cc5613084f9a6ecbdd78d057757854f4a1..07fd8259c558ae654f34c79342d0a5d3a1650fb2 100644 --- a/router/java/src/net/i2p/router/OutNetMessage.java +++ b/router/java/src/net/i2p/router/OutNetMessage.java @@ -29,8 +29,8 @@ import net.i2p.util.Log; * */ public class OutNetMessage { - private Log _log; - private RouterContext _context; + private final Log _log; + private final RouterContext _context; private RouterInfo _target; private I2NPMessage _message; /** cached message class name, for use after we discard the message */ @@ -50,7 +50,7 @@ public class OutNetMessage { private long _sendBegin; private long _transmitBegin; private Exception _createdBy; - private long _created; + private final long _created; /** for debugging, contains a mapping of even name to Long (e.g. "begin sending", "handleOutbound", etc) */ private HashMap<String, Long> _timestamps; /** @@ -89,15 +89,18 @@ public class OutNetMessage { // only timestamp if we are debugging synchronized (this) { locked_initTimestamps(); - while (_timestamps.containsKey(eventName)) { - eventName = eventName + '.'; - } - _timestamps.put(eventName, new Long(now)); + // ??? + //while (_timestamps.containsKey(eventName)) { + // eventName = eventName + '.'; + //} + _timestamps.put(eventName, Long.valueOf(now)); _timestampOrder.add(eventName); } } return now - _created; } + + /** @deprecated unused */ public Map<String, Long> getTimestamps() { if (_log.shouldLog(Log.INFO)) { synchronized (this) { @@ -107,6 +110,8 @@ public class OutNetMessage { } return Collections.EMPTY_MAP; } + + /** @deprecated unused */ public Long getTimestamp(String eventName) { if (_log.shouldLog(Log.INFO)) { synchronized (this) { @@ -220,7 +225,7 @@ public class OutNetMessage { public void transportFailed(String transportStyle) { if (_failedTransports == null) - _failedTransports = new HashSet(1); + _failedTransports = new HashSet(2); _failedTransports.add(transportStyle); } /** not thread safe - dont fail transports and iterate over this at the same time */ @@ -368,7 +373,7 @@ public class OutNetMessage { @Override public boolean equals(Object obj) { if(obj == null) return false; - if(obj.getClass() != OutNetMessage.class) return false; + if(!(obj instanceof OutNetMessage)) return false; return obj == this; // two OutNetMessages are different even if they contain the same message } } diff --git a/router/java/src/net/i2p/router/OutNetMessagePool.java b/router/java/src/net/i2p/router/OutNetMessagePool.java index 8e057ff4982a99f6cd2bd45832ba1149988ec993..6b5ddfaab67aab47fa2d4790028e81cbbfff5b28 100644 --- a/router/java/src/net/i2p/router/OutNetMessagePool.java +++ b/router/java/src/net/i2p/router/OutNetMessagePool.java @@ -18,24 +18,18 @@ import net.i2p.util.Log; * that wants to send a message, and the communication subsystem periodically * retrieves messages for delivery. * + * Actually, this doesn't 'pool' anything, it calls the comm system directly. + * Nor does it organize by priority. But perhaps it could someday. */ public class OutNetMessagePool { - private Log _log; - private RouterContext _context; + private final Log _log; + private final RouterContext _context; public OutNetMessagePool(RouterContext context) { _context = context; _log = _context.logManager().getLog(OutNetMessagePool.class); } - /** - * Remove the highest priority message, or null if none are available. - * - */ - public OutNetMessage getNext() { - return null; - } - /** * Add a new message to the pool * @@ -47,8 +41,8 @@ public class OutNetMessagePool { return; } - if (_log.shouldLog(Log.INFO)) - _log.info("Adding outbound message to " + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Adding outbound message to " + msg.getTarget().getIdentity().getHash().toBase64().substring(0,6) + " with id " + msg.getMessage().getUniqueId() + " expiring on " + msg.getMessage().getMessageExpiration() @@ -70,7 +64,7 @@ public class OutNetMessagePool { return false; } if (msg.getTarget() == null) { - _log.error("No target in the OutNetMessage: " + msg, new Exception("Definitely a fuckup")); + _log.error("No target in the OutNetMessage: " + msg, new Exception()); return false; } if (msg.getPriority() < 0) { @@ -83,38 +77,4 @@ public class OutNetMessagePool { } return true; } - - /** - * Clear any messages that have expired, enqueuing any appropriate jobs - * - */ - public void clearExpired() { - // noop - } - - /** - * Retrieve the number of messages, regardless of priority. - * - */ - public int getCount() { return 0; } - - /** - * Retrieve the number of messages at the given priority. This can be used for - * subsystems that maintain a pool of messages to be sent whenever there is spare time, - * where all of these 'spare' messages are of the same priority. - * - */ - public int getCount(int priority) { return 0; } - - public void dumpPoolInfo() { return; } - - private static class ReverseIntegerComparator implements Comparator { - public int compare(Object lhs, Object rhs) { - if ( (lhs == null) || (rhs == null) ) return 0; // invalid, but never used - if ( !(lhs instanceof Integer) || !(rhs instanceof Integer)) return 0; - Integer lv = (Integer)lhs; - Integer rv = (Integer)rhs; - return - (lv.compareTo(rv)); - } - } } diff --git a/router/java/src/net/i2p/router/Router.java b/router/java/src/net/i2p/router/Router.java index 5904d04ea0b6bc0412086b16ff3e98d1a7844696..eee3ac866bd84d0a4fb9bb287265d5f2fb0cb129 100644 --- a/router/java/src/net/i2p/router/Router.java +++ b/router/java/src/net/i2p/router/Router.java @@ -539,16 +539,14 @@ public class Router { return true; return Boolean.valueOf(_context.getProperty(PROP_HIDDEN_HIDDEN)).booleanValue(); } + + /** + * @return the certificate for a new RouterInfo - probably a null cert. + */ public Certificate createCertificate() { - Certificate cert = new Certificate(); - if (isHidden()) { - cert.setCertificateType(Certificate.CERTIFICATE_TYPE_HIDDEN); - cert.setPayload(null); - } else { - cert.setCertificateType(Certificate.CERTIFICATE_TYPE_NULL); - cert.setPayload(null); - } - return cert; + if (isHidden()) + return new Certificate(Certificate.CERTIFICATE_TYPE_HIDDEN, null); + return Certificate.NULL_CERT; } /** @@ -1432,7 +1430,10 @@ private static class CoalesceStatsEvent implements SimpleTimer.TimedEvent { ctx.statManager().createRateStat("router.highCapacityPeers", "How many high capacity peers we know", "Throttle", new long[] { 5*60*1000, 60*60*1000 }); ctx.statManager().createRateStat("router.fastPeers", "How many fast peers we know", "Throttle", new long[] { 5*60*1000, 60*60*1000 }); _maxMemory = Runtime.getRuntime().maxMemory(); - ctx.statManager().createRateStat("router.memoryUsed", "(Bytes) Max is " + (_maxMemory / (1024*1024)) + "MB", "Router", new long[] { 60*1000 }); + String legend = "(Bytes)"; + if (_maxMemory < Long.MAX_VALUE) + legend += " Max is " + DataHelper.formatSize(_maxMemory) + 'B'; + ctx.statManager().createRateStat("router.memoryUsed", legend, "Router", new long[] { 60*1000 }); } private RouterContext getContext() { return _ctx; } public void timeReached() { diff --git a/router/java/src/net/i2p/router/RouterClock.java b/router/java/src/net/i2p/router/RouterClock.java index 06337f5a6eb055856ae5f2793227162dc685a382..3f7b629606838d51c7e8e0e7acee74af0fb9020f 100644 --- a/router/java/src/net/i2p/router/RouterClock.java +++ b/router/java/src/net/i2p/router/RouterClock.java @@ -24,7 +24,7 @@ public class RouterClock extends Clock { * All of this is @since 0.7.12 */ private static final long MAX_SLEW = 50; - private static final int DEFAULT_STRATUM = 8; + public static final int DEFAULT_STRATUM = 8; private static final int WORST_STRATUM = 16; /** the max NTP Timestamper delay is 30m right now, make this longer than that */ private static final long MIN_DELAY_FOR_WORSE_STRATUM = 45*60*1000; @@ -34,7 +34,7 @@ public class RouterClock extends Clock { private long _lastChanged; private int _lastStratum; - RouterContext _contextRC; // LINT field hides another field + private final RouterContext _contextRC; public RouterClock(RouterContext context) { super(context); @@ -44,20 +44,27 @@ public class RouterClock extends Clock { /** * Specify how far away from the "correct" time the computer is - a positive - * value means that we are slow, while a negative value means we are fast. + * value means that the system time is slow, while a negative value means the system time is fast. * + * @param offsetMs the delta from System.currentTimeMillis() (NOT the delta from now()) */ @Override public void setOffset(long offsetMs, boolean force) { setOffset(offsetMs, force, DEFAULT_STRATUM); } - /** @since 0.7.12 */ + /** + * @since 0.7.12 + * @param offsetMs the delta from System.currentTimeMillis() (NOT the delta from now()) + */ private void setOffset(long offsetMs, int stratum) { setOffset(offsetMs, false, stratum); } - /** @since 0.7.12 */ + /** + * @since 0.7.12 + * @param offsetMs the delta from System.currentTimeMillis() (NOT the delta from now()) + */ private void setOffset(long offsetMs, boolean force, int stratum) { long delta = offsetMs - _offset; if (!force) { @@ -91,7 +98,7 @@ public class RouterClock extends Clock { } // If so configured, check sanity of proposed clock offset - if (Boolean.valueOf(_contextRC.getProperty("router.clockOffsetSanityCheck","true")).booleanValue() && + if (_contextRC.getBooleanPropertyDefaultTrue("router.clockOffsetSanityCheck") && _alreadyChanged) { // Try calculating peer clock skew @@ -192,6 +199,7 @@ public class RouterClock extends Clock { /* * How far we still have to slew, for diagnostics * @since 0.7.12 + * @deprecated for debugging only */ public long getDeltaOffset() { return _desiredOffset - _offset; diff --git a/router/java/src/net/i2p/router/RouterContext.java b/router/java/src/net/i2p/router/RouterContext.java index cb3c6366251378c0cf50972d197c446bc6d960f3..4ac21fce55f35f924779be56bfac6d662d53e22c 100644 --- a/router/java/src/net/i2p/router/RouterContext.java +++ b/router/java/src/net/i2p/router/RouterContext.java @@ -6,16 +6,13 @@ import java.util.Properties; import net.i2p.I2PAppContext; import net.i2p.data.Hash; +import net.i2p.data.RouterInfo; import net.i2p.internal.InternalClientManager; import net.i2p.router.client.ClientManagerFacadeImpl; import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade; -import net.i2p.router.peermanager.Calculator; -import net.i2p.router.peermanager.CapacityCalculator; -import net.i2p.router.peermanager.IntegrationCalculator; import net.i2p.router.peermanager.PeerManagerFacadeImpl; import net.i2p.router.peermanager.ProfileManagerImpl; import net.i2p.router.peermanager.ProfileOrganizer; -import net.i2p.router.peermanager.SpeedCalculator; import net.i2p.router.transport.CommSystemFacadeImpl; import net.i2p.router.transport.FIFOBandwidthLimiter; import net.i2p.router.transport.OutboundMessageRegistry; @@ -24,6 +21,7 @@ import net.i2p.router.tunnel.TunnelDispatcher; import net.i2p.router.tunnel.pool.TunnelPoolManager; import net.i2p.util.Clock; import net.i2p.util.KeyRing; +import net.i2p.util.I2PProperties.I2PPropertyCallback; /** * Build off the core I2P context to provide a root for a router instance to @@ -57,11 +55,6 @@ public class RouterContext extends I2PAppContext { private MessageValidator _messageValidator; private MessageStateMonitor _messageStateMonitor; private RouterThrottle _throttle; - private RouterClock _clockX; // LINT field hides another field, hope rename won't break anything. - private Calculator _integrationCalc; - private Calculator _speedCalc; - private Calculator _capacityCalc; - private static List<RouterContext> _contexts = new ArrayList(1); @@ -100,11 +93,31 @@ public class RouterContext extends I2PAppContext { // or about 2 seconds per buffer - so about 200x faster // to fill than to drain - so we don't need too many long maxMemory = Runtime.getRuntime().maxMemory(); + if (maxMemory == Long.MAX_VALUE) + maxMemory = 96*1024*1024l; long buffs = Math.min(16, Math.max(2, maxMemory / (14 * 1024 * 1024))); envProps.setProperty("prng.buffers", "" + buffs); } return envProps; } + + /** + * Modify the configuration attributes of this context, changing + * one of the properties provided during the context construction. + * @param propName The name of the property. + * @param value The new value for the property. + */ + public void setProperty(String propName, String value) { + if(_overrideProps != null) { + _overrideProps.setProperty(propName, value); + } + } + + + public void addPropertyCallback(I2PPropertyCallback callback) { + _overrideProps.addCallBack(callback); + } + public void initAll() { if (getBooleanProperty("i2p.dummyClientFacade")) @@ -147,9 +160,6 @@ public class RouterContext extends I2PAppContext { _messageValidator = new MessageValidator(this); _throttle = new RouterThrottleImpl(this); //_throttle = new RouterDoSThrottle(this); - _integrationCalc = new IntegrationCalculator(this); - _speedCalc = new SpeedCalculator(this); - _capacityCalc = new CapacityCalculator(this); } /** @@ -163,8 +173,20 @@ public class RouterContext extends I2PAppContext { /** what router is this context working for? */ public Router router() { return _router; } - /** convenience method for querying the router's ident */ - public Hash routerHash() { return _router.getRouterInfo().getIdentity().getHash(); } + + /** + * Convenience method for getting the router hash. + * Equivalent to context.router().getRouterInfo().getIdentity().getHash() + * @return may be null if called very early + */ + public Hash routerHash() { + if (_router == null) + return null; + RouterInfo ri = _router.getRouterInfo(); + if (ri == null) + return null; + return ri.getIdentity().getHash(); + } /** * How are we coordinating clients for the router? @@ -271,13 +293,6 @@ public class RouterContext extends I2PAppContext { */ public RouterThrottle throttle() { return _throttle; } - /** how do we rank the integration of profiles? */ - public Calculator integrationCalculator() { return _integrationCalc; } - /** how do we rank the speed of profiles? */ - public Calculator speedCalculator() { return _speedCalc; } - /** how do we rank the capacity of profiles? */ - public Calculator capacityCalculator() { return _capacityCalc; } - @Override public String toString() { StringBuilder buf = new StringBuilder(512); @@ -301,8 +316,6 @@ public class RouterContext extends I2PAppContext { buf.append(_statPublisher).append('\n'); buf.append(_shitlist).append('\n'); buf.append(_messageValidator).append('\n'); - buf.append(_integrationCalc).append('\n'); - buf.append(_speedCalc).append('\n'); return buf.toString(); } @@ -352,23 +365,22 @@ public class RouterContext extends I2PAppContext { } /** - * The context's synchronized clock, which is kept context specific only to - * enable simulators to play with clock skew among different instances. - * - * It wouldn't be necessary to override clock(), except for the reason - * that it triggers initializeClock() of which we definitely - * need the local version to run. + * @return new Properties with system and context properties + * @since 0.8.4 */ @Override - public Clock clock() { - if (!_clockInitialized) initializeClock(); - return _clockX; + public Properties getProperties() { + Properties rv = super.getProperties(); + if (_router != null) + rv.putAll(_router.getConfigMap()); + return rv; } + @Override protected void initializeClock() { synchronized (this) { - if (_clockX == null) - _clockX = new RouterClock(this); + if (_clock == null) + _clock = new RouterClock(this); _clockInitialized = true; } } diff --git a/router/java/src/net/i2p/router/RouterThrottleImpl.java b/router/java/src/net/i2p/router/RouterThrottleImpl.java index d3d3129af31a263dde6fc0aa88a1c4f8bf802d93..777cc1a6afd0439945ea9c4a5f763fc8be925608 100644 --- a/router/java/src/net/i2p/router/RouterThrottleImpl.java +++ b/router/java/src/net/i2p/router/RouterThrottleImpl.java @@ -12,12 +12,12 @@ import net.i2p.util.Log; * */ class RouterThrottleImpl implements RouterThrottle { - private RouterContext _context; - private Log _log; + private final RouterContext _context; + private final Log _log; private String _tunnelStatus; /** - * arbitrary hard limit of 10 seconds - if its taking this long to get + * arbitrary hard limit - if it's taking this long to get * to a job, we're congested. * */ @@ -98,7 +98,7 @@ class RouterThrottleImpl implements RouterThrottle { if (_context.router().getUptime() < 20*60*1000) return TunnelHistory.TUNNEL_REJECT_BANDWIDTH; - long lag = _context.jobQueue().getMaxLag(); + //long lag = _context.jobQueue().getMaxLag(); // reject here if lag too high??? RateStat rs = _context.statManager().getRate("transport.sendProcessingTime"); diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index f2522cd4ed540000a936a603d4922f4a287ece1f..a411b009986dc5f1f6384384ad98aeea42885422 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 9; + public final static long BUILD = 0; /** for example "-test" */ public final static String EXTRA = ""; diff --git a/router/java/src/net/i2p/router/RouterWatchdog.java b/router/java/src/net/i2p/router/RouterWatchdog.java index 14dc01c1e65deb8735ff9b89c89d81a2ddce0d04..482f3b3edd7d95a308828568adfe803da4130f5d 100644 --- a/router/java/src/net/i2p/router/RouterWatchdog.java +++ b/router/java/src/net/i2p/router/RouterWatchdog.java @@ -12,8 +12,8 @@ import net.i2p.util.Log; * */ class RouterWatchdog implements Runnable { - private Log _log; - private RouterContext _context; + private final Log _log; + private final RouterContext _context; private int _consecutiveErrors; private static final long MAX_JOB_RUN_LAG = 60*1000; diff --git a/router/java/src/net/i2p/router/Shitlist.java b/router/java/src/net/i2p/router/Shitlist.java index f675d1056578151db6f8c55a560de209d1d9b793..a5c1c1c42c44efb557253ba52ddc6905ceac1c06 100644 --- a/router/java/src/net/i2p/router/Shitlist.java +++ b/router/java/src/net/i2p/router/Shitlist.java @@ -10,13 +10,13 @@ package net.i2p.router; import java.io.IOException; import java.io.Writer; -import java.util.concurrent.ConcurrentHashMap; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import net.i2p.data.DataHelper; import net.i2p.data.Hash; @@ -31,9 +31,9 @@ import net.i2p.util.Log; * shitlist. */ public class Shitlist { - private Log _log; - private RouterContext _context; - private Map<Hash, Entry> _entries; + private final Log _log; + private final RouterContext _context; + private final Map<Hash, Entry> _entries; public static class Entry { /** when it should expire, per the i2p clock */ @@ -156,7 +156,7 @@ public class Shitlist { e.causeCode = reasonCode; e.transports = null; if (transport != null) { - e.transports = new ConcurrentHashSet(1); + e.transports = new ConcurrentHashSet(2); e.transports.add(transport); } diff --git a/router/java/src/net/i2p/router/StatisticsManager.java b/router/java/src/net/i2p/router/StatisticsManager.java index 5a00f154c84bbb299408be373b5eb789532676b7..86cbef8fe8ec0a1f723ab34059bcc0a935073d20 100644 --- a/router/java/src/net/i2p/router/StatisticsManager.java +++ b/router/java/src/net/i2p/router/StatisticsManager.java @@ -157,9 +157,12 @@ public class StatisticsManager implements Service { return stats; } +/***** private void includeRate(String rateName, Properties stats, long selectedPeriods[]) { includeRate(rateName, stats, selectedPeriods, false); } +*****/ + /** * @param fudgeQuantity the data being published in this stat is too sensitive to, uh * publish, so we're kludge the quantity (allowing the fairly safe @@ -258,7 +261,6 @@ public class StatisticsManager implements Service { // bah saturation buf.append("0;0;0;0;"); } - long numPeriods = rate.getLifetimePeriods(); buf.append(num(fudgeQuantity)).append(';'); return buf.toString(); } diff --git a/router/java/src/net/i2p/router/TunnelPoolSettings.java b/router/java/src/net/i2p/router/TunnelPoolSettings.java index ae894cf14f694e1c960d24bfe3ccb075a874c0ef..64fa30d0d663b60bc50810254ad1d9671d8e2115 100644 --- a/router/java/src/net/i2p/router/TunnelPoolSettings.java +++ b/router/java/src/net/i2p/router/TunnelPoolSettings.java @@ -16,7 +16,7 @@ public class TunnelPoolSettings { private int _quantity; private int _backupQuantity; // private int _rebuildPeriod; - private int _duration; + //private int _duration; private int _length; private int _lengthVariance; private int _lengthOverride; @@ -24,8 +24,8 @@ public class TunnelPoolSettings { private boolean _isExploratory; private boolean _allowZeroHop; private int _IPRestriction; - private Properties _unknownOptions; - private Hash _randomKey; + private final Properties _unknownOptions; + private final Hash _randomKey; /** prefix used to override the router's defaults for clients */ public static final String PREFIX_DEFAULT = "router.defaultPool."; @@ -57,7 +57,7 @@ public class TunnelPoolSettings { _quantity = DEFAULT_QUANTITY; _backupQuantity = DEFAULT_BACKUP_QUANTITY; // _rebuildPeriod = DEFAULT_REBUILD_PERIOD; - _duration = DEFAULT_DURATION; + //_duration = DEFAULT_DURATION; _length = DEFAULT_LENGTH; _lengthVariance = DEFAULT_LENGTH_VARIANCE; _allowZeroHop = DEFAULT_ALLOW_ZERO_HOP; @@ -107,8 +107,9 @@ public class TunnelPoolSettings { public boolean isExploratory() { return _isExploratory; } public void setIsExploratory(boolean isExploratory) { _isExploratory = isExploratory; } - public int getDuration() { return _duration; } - public void setDuration(int ms) { _duration = ms; } + // Duration is hardcoded + //public int getDuration() { return _duration; } + //public void setDuration(int ms) { _duration = ms; } /** what destination is this a tunnel for (or null if none) */ public Hash getDestination() { return _destination; } @@ -141,8 +142,8 @@ public class TunnelPoolSettings { _allowZeroHop = getBoolean(value, DEFAULT_ALLOW_ZERO_HOP); else if (name.equalsIgnoreCase(prefix + PROP_BACKUP_QUANTITY)) _backupQuantity = getInt(value, DEFAULT_BACKUP_QUANTITY); - else if (name.equalsIgnoreCase(prefix + PROP_DURATION)) - _duration = getInt(value, DEFAULT_DURATION); + //else if (name.equalsIgnoreCase(prefix + PROP_DURATION)) + // _duration = getInt(value, DEFAULT_DURATION); else if (name.equalsIgnoreCase(prefix + PROP_LENGTH)) _length = getInt(value, DEFAULT_LENGTH); else if (name.equalsIgnoreCase(prefix + PROP_LENGTH_VARIANCE)) @@ -165,7 +166,7 @@ public class TunnelPoolSettings { if (props == null) return; props.setProperty(prefix + PROP_ALLOW_ZERO_HOP, ""+_allowZeroHop); props.setProperty(prefix + PROP_BACKUP_QUANTITY, ""+_backupQuantity); - props.setProperty(prefix + PROP_DURATION, ""+_duration); + //props.setProperty(prefix + PROP_DURATION, ""+_duration); props.setProperty(prefix + PROP_LENGTH, ""+_length); props.setProperty(prefix + PROP_LENGTH_VARIANCE, ""+_lengthVariance); if (_destinationNickname != null) diff --git a/router/java/src/net/i2p/router/client/ClientConnectionRunner.java b/router/java/src/net/i2p/router/client/ClientConnectionRunner.java index 8bef2776d5a5a3687da21a6fe72eb35049adcddb..88c1a8ededdbbfe199253993639f1f5f3ed4cc16 100644 --- a/router/java/src/net/i2p/router/client/ClientConnectionRunner.java +++ b/router/java/src/net/i2p/router/client/ClientConnectionRunner.java @@ -51,11 +51,11 @@ import net.i2p.util.SimpleTimer; * @author jrandom */ class ClientConnectionRunner { - private Log _log; + private final Log _log; protected final RouterContext _context; - private ClientManager _manager; + private final ClientManager _manager; /** socket for this particular peer connection */ - private Socket _socket; + private final Socket _socket; /** output stream of the socket that I2CP messages bound to the client should be written to */ private OutputStream _out; /** session ID of the current client */ @@ -63,13 +63,13 @@ class ClientConnectionRunner { /** user's config */ private SessionConfig _config; /** static mapping of MessageId to Payload, storing messages for retrieval */ - private Map<MessageId, Payload> _messages; + private final Map<MessageId, Payload> _messages; /** lease set request state, or null if there is no request pending on at the moment */ private LeaseRequestState _leaseRequest; /** currently allocated leaseSet, or null if none is allocated */ private LeaseSet _currentLeaseSet; /** set of messageIds created but not yet ACCEPTED */ - private Set<MessageId> _acceptedPending; + private final Set<MessageId> _acceptedPending; /** thingy that does stuff */ protected I2CPMessageReader _reader; /** just for this destination */ @@ -137,15 +137,14 @@ class ClientConnectionRunner { _messages.clear(); if (_sessionKeyManager != null) _sessionKeyManager.shutdown(); - if (_manager != null) - _manager.unregisterConnection(this); + _manager.unregisterConnection(this); if (_currentLeaseSet != null) _context.netDb().unpublish(_currentLeaseSet); _leaseRequest = null; synchronized (_alreadyProcessed) { _alreadyProcessed.clear(); } - _config = null; + //_config = null; //_manager = null; } @@ -280,8 +279,12 @@ class ClientConnectionRunner { MessageId id = new MessageId(); id.setMessageId(getNextMessageId()); long expiration = 0; - if (message instanceof SendMessageExpiresMessage) - expiration = ((SendMessageExpiresMessage) message).getExpiration().getTime(); + int flags = 0; + if (message.getType() == SendMessageExpiresMessage.MESSAGE_TYPE) { + SendMessageExpiresMessage msg = (SendMessageExpiresMessage) message; + expiration = msg.getExpirationTime(); + flags = msg.getFlags(); + } if (!_dontSendMSM) _acceptedPending.add(id); @@ -289,16 +292,17 @@ class ClientConnectionRunner { _log.debug("** Receiving message [" + id.getMessageId() + "] with payload of size [" + payload.getSize() + "]" + " for session [" + _sessionId.getSessionId() + "]"); - long beforeDistribute = _context.clock().now(); + //long beforeDistribute = _context.clock().now(); // the following blocks as described above SessionConfig cfg = _config; if (cfg != null) - _manager.distributeMessage(cfg.getDestination(), dest, payload, id, expiration); - long timeToDistribute = _context.clock().now() - beforeDistribute; - if (_log.shouldLog(Log.DEBUG)) - _log.warn("Time to distribute in the manager to " - + dest.calculateHash().toBase64() + ": " - + timeToDistribute); + _manager.distributeMessage(cfg.getDestination(), dest, payload, id, expiration, flags); + // else log error? + //long timeToDistribute = _context.clock().now() - beforeDistribute; + //if (_log.shouldLog(Log.DEBUG)) + // _log.warn("Time to distribute in the manager to " + // + dest.calculateHash().toBase64() + ": " + // + timeToDistribute); return id; } diff --git a/router/java/src/net/i2p/router/client/ClientManager.java b/router/java/src/net/i2p/router/client/ClientManager.java index a534bdfb19627fb9b9acab93d67a061167159959..6f4d4414f5c2644e31afeb7fda5c3ae5cf590885 100644 --- a/router/java/src/net/i2p/router/client/ClientManager.java +++ b/router/java/src/net/i2p/router/client/ClientManager.java @@ -193,7 +193,11 @@ class ClientManager { } } - void distributeMessage(Destination fromDest, Destination toDest, Payload payload, MessageId msgId, long expiration) { + /** + * Distribute message to a local or remote destination. + * @param flags ignored for local + */ + void distributeMessage(Destination fromDest, Destination toDest, Payload payload, MessageId msgId, long expiration, int flags) { // check if there is a runner for it ClientConnectionRunner runner = getRunner(toDest); if (runner != null) { @@ -204,6 +208,7 @@ class ClientManager { // sender went away return; } + // TODO can we just run this inline instead? _ctx.jobQueue().addJob(new DistributeLocal(toDest, runner, sender, fromDest, payload, msgId)); } else { // remote. w00t @@ -217,22 +222,22 @@ class ClientManager { ClientMessage msg = new ClientMessage(); msg.setDestination(toDest); msg.setPayload(payload); - msg.setReceptionInfo(null); msg.setSenderConfig(runner.getConfig()); msg.setFromDestination(runner.getConfig().getDestination()); msg.setMessageId(msgId); msg.setExpiration(expiration); + msg.setFlags(flags); _ctx.clientMessagePool().add(msg, true); } } private class DistributeLocal extends JobImpl { - private Destination _toDest; - private ClientConnectionRunner _to; - private ClientConnectionRunner _from; - private Destination _fromDest; - private Payload _payload; - private MessageId _msgId; + private final Destination _toDest; + private final ClientConnectionRunner _to; + private final ClientConnectionRunner _from; + private final Destination _fromDest; + private final Payload _payload; + private final MessageId _msgId; public DistributeLocal(Destination toDest, ClientConnectionRunner to, ClientConnectionRunner from, Destination fromDest, Payload payload, MessageId id) { super(_ctx); @@ -433,7 +438,9 @@ class ClientManager { } } + /** @deprecated unused */ public void renderStatusHTML(Writer out) throws IOException { +/****** StringBuilder buf = new StringBuilder(8*1024); buf.append("<u><b>Local destinations</b></u><br>"); @@ -479,6 +486,7 @@ class ClientManager { buf.append("\n<hr>\n"); out.write(buf.toString()); out.flush(); +******/ } public void messageReceived(ClientMessage msg) { diff --git a/router/java/src/net/i2p/router/client/ClientManagerFacadeImpl.java b/router/java/src/net/i2p/router/client/ClientManagerFacadeImpl.java index e4b6b2a36d38edf3a2560bd1cedf83b401f96c3b..35492936c4a9ef02a7f787458ce2670212ec0079 100644 --- a/router/java/src/net/i2p/router/client/ClientManagerFacadeImpl.java +++ b/router/java/src/net/i2p/router/client/ClientManagerFacadeImpl.java @@ -207,6 +207,7 @@ public class ClientManagerFacadeImpl extends ClientManagerFacade implements Inte } } + /** @deprecated unused */ @Override public void renderStatusHTML(Writer out) throws IOException { if (_manager != null) diff --git a/router/java/src/net/i2p/router/client/QueuedClientConnectionRunner.java b/router/java/src/net/i2p/router/client/QueuedClientConnectionRunner.java index 758e8221e76e1956f1ed9596f3be895513e27414..aac9b68e0cfa528e23bd4d3105837678a1d410ce 100644 --- a/router/java/src/net/i2p/router/client/QueuedClientConnectionRunner.java +++ b/router/java/src/net/i2p/router/client/QueuedClientConnectionRunner.java @@ -46,6 +46,7 @@ class QueuedClientConnectionRunner extends ClientConnectionRunner { void stopRunning() { super.stopRunning(); queue.close(); + // queue = null; } /** diff --git a/router/java/src/net/i2p/router/client/SSLClientListenerRunner.java b/router/java/src/net/i2p/router/client/SSLClientListenerRunner.java index 0dc053a3361e3b57d2d6d7931712cbe10d307b8a..8d423ef0b31d2183f29bd0f830de84b8c54672fc 100644 --- a/router/java/src/net/i2p/router/client/SSLClientListenerRunner.java +++ b/router/java/src/net/i2p/router/client/SSLClientListenerRunner.java @@ -142,12 +142,12 @@ class SSLClientListenerRunner extends ClientListenerRunner { private void exportCert(File ks) { File sdir = new SecureDirectory(_context.getConfigDir(), "certificates"); if (sdir.exists() || sdir.mkdir()) { + InputStream fis = null; try { KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); - InputStream fis = new FileInputStream(ks); + fis = new FileInputStream(ks); String ksPass = _context.getProperty(PROP_KEYSTORE_PASSWORD, DEFAULT_KEYSTORE_PASSWORD); keyStore.load(fis, ksPass.toCharArray()); - fis.close(); Certificate cert = keyStore.getCertificate(KEY_ALIAS); if (cert != null) { File certFile = new File(sdir, ASCII_KEYFILE); @@ -159,6 +159,8 @@ class SSLClientListenerRunner extends ClientListenerRunner { _log.error("Error saving ASCII SSL keys", gse); } catch (IOException ioe) { _log.error("Error saving ASCII SSL keys", ioe); + } finally { + if (fis != null) try { fis.close(); } catch (IOException ioe) {} } } else { _log.error("Error saving ASCII SSL keys"); @@ -208,12 +210,12 @@ class SSLClientListenerRunner extends ClientListenerRunner { " in " + (new File(_context.getConfigDir(), "router.config")).getAbsolutePath()); return false; } + InputStream fis = null; try { SSLContext sslc = SSLContext.getInstance("TLS"); KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); - InputStream fis = new FileInputStream(ks); + fis = new FileInputStream(ks); keyStore.load(fis, ksPass.toCharArray()); - fis.close(); KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); kmf.init(keyStore, keyPass.toCharArray()); sslc.init(kmf.getKeyManagers(), null, _context.random()); @@ -223,6 +225,8 @@ class SSLClientListenerRunner extends ClientListenerRunner { _log.error("Error loading SSL keys", gse); } catch (IOException ioe) { _log.error("Error loading SSL keys", ioe); + } finally { + if (fis != null) try { fis.close(); } catch (IOException ioe) {} } return false; } diff --git a/router/java/src/net/i2p/router/message/CloveSet.java b/router/java/src/net/i2p/router/message/CloveSet.java index 8c414edcdedd861d9f2ef2fd3d348610a8b80819..5df37525688678b3e5b8d80bdc4dc659e00d6122 100644 --- a/router/java/src/net/i2p/router/message/CloveSet.java +++ b/router/java/src/net/i2p/router/message/CloveSet.java @@ -18,15 +18,14 @@ import net.i2p.data.i2np.GarlicClove; * Wrap up the data contained in a CloveMessage after being decrypted * */ -public class CloveSet { - private List _cloves; +class CloveSet { + private final List _cloves; private Certificate _cert; private long _msgId; private long _expiration; public CloveSet() { - _cloves = new ArrayList(); - _cert = null; + _cloves = new ArrayList(4); _msgId = -1; _expiration = -1; } diff --git a/router/java/src/net/i2p/router/message/GarlicConfig.java b/router/java/src/net/i2p/router/message/GarlicConfig.java index b23d4ac9a34836a5599991d9ae8cfa75debfb1eb..93af2714c21cad9d613c02174d32d4cf281dbaa6 100644 --- a/router/java/src/net/i2p/router/message/GarlicConfig.java +++ b/router/java/src/net/i2p/router/message/GarlicConfig.java @@ -21,13 +21,13 @@ import net.i2p.data.i2np.DeliveryInstructions; * Define the contents of a garlic chunk that contains 1 or more sub garlics * */ -public class GarlicConfig { +class GarlicConfig { private RouterInfo _recipient; private PublicKey _recipientPublicKey; private Certificate _cert; private long _id; private long _expiration; - private List _cloveConfigs; + private final List _cloveConfigs; private DeliveryInstructions _instructions; private boolean _requestAck; private RouterInfo _replyThroughRouter; // router through which any replies will be sent before delivery to us @@ -39,7 +39,7 @@ public class GarlicConfig { public GarlicConfig() { _id = -1; _expiration = -1; - _cloveConfigs = new ArrayList(); + _cloveConfigs = new ArrayList(4); _replyBlockMessageId = -1; _replyBlockExpiration = -1; } diff --git a/router/java/src/net/i2p/router/message/GarlicMessageHandler.java b/router/java/src/net/i2p/router/message/GarlicMessageHandler.java index 1db82eddbd7dce73f100f7291be054849ce04d1f..9f435c3bd55a4163da2c060827ea1bb4d9fde675 100644 --- a/router/java/src/net/i2p/router/message/GarlicMessageHandler.java +++ b/router/java/src/net/i2p/router/message/GarlicMessageHandler.java @@ -21,7 +21,7 @@ import net.i2p.router.RouterContext; * */ public class GarlicMessageHandler implements HandlerJobBuilder { - private RouterContext _context; + private final RouterContext _context; public GarlicMessageHandler(RouterContext context) { _context = context; diff --git a/router/java/src/net/i2p/router/message/GarlicMessageParser.java b/router/java/src/net/i2p/router/message/GarlicMessageParser.java index 31192dbcf113e08e236deaebe92f9733f8a1e584..b56ed291c1d842b0dea6b1032372218ebabba8c9 100644 --- a/router/java/src/net/i2p/router/message/GarlicMessageParser.java +++ b/router/java/src/net/i2p/router/message/GarlicMessageParser.java @@ -24,9 +24,9 @@ import net.i2p.util.Log; * Read a GarlicMessage, decrypt it, and return the resulting CloveSet * */ -public class GarlicMessageParser { - private Log _log; - private RouterContext _context; +class GarlicMessageParser { + private final Log _log; + private final RouterContext _context; public GarlicMessageParser(RouterContext context) { _context = context; @@ -47,7 +47,7 @@ public class GarlicMessageParser { } if (decrData == null) { if (_log.shouldLog(Log.WARN)) - _log.warn("Decryption of garlic message failed (data = " + encData + ")", new Exception("Decrypt fail")); + _log.warn("Decryption of garlic message failed", new Exception("Decrypt fail")); return null; } else { try { diff --git a/router/java/src/net/i2p/router/message/GarlicMessageReceiver.java b/router/java/src/net/i2p/router/message/GarlicMessageReceiver.java index 5013ab409efbdfe51ebabba97d0a2ffb375cf473..def373cf7a825d31cc0996a0994edef3be09f27a 100644 --- a/router/java/src/net/i2p/router/message/GarlicMessageReceiver.java +++ b/router/java/src/net/i2p/router/message/GarlicMessageReceiver.java @@ -26,11 +26,11 @@ import net.i2p.util.Log; * */ public class GarlicMessageReceiver { - private RouterContext _context; - private Log _log; - private CloveReceiver _receiver; - private Hash _clientDestination; - private GarlicMessageParser _parser; + private final RouterContext _context; + private final Log _log; + private final CloveReceiver _receiver; + private final Hash _clientDestination; + private final GarlicMessageParser _parser; private final static int FORWARD_PRIORITY = 50; diff --git a/router/java/src/net/i2p/router/message/HandleGarlicMessageJob.java b/router/java/src/net/i2p/router/message/HandleGarlicMessageJob.java index 32959b3a4107a1c55b8ac3719d0167a375ccaa51..d879cb5fc5bd52816cbbde948ddf2afc26de834d 100644 --- a/router/java/src/net/i2p/router/message/HandleGarlicMessageJob.java +++ b/router/java/src/net/i2p/router/message/HandleGarlicMessageJob.java @@ -28,9 +28,9 @@ import net.i2p.util.Log; * need to be. soon) * */ -public class HandleGarlicMessageJob extends JobImpl implements GarlicMessageReceiver.CloveReceiver { - private Log _log; - private GarlicMessage _message; +class HandleGarlicMessageJob extends JobImpl implements GarlicMessageReceiver.CloveReceiver { + private final Log _log; + private final GarlicMessage _message; //private RouterIdentity _from; //private Hash _fromHash; //private Map _cloves; // map of clove Id --> Expiration of cloves we've already seen diff --git a/router/java/src/net/i2p/router/message/OutboundClientMessageJobHelper.java b/router/java/src/net/i2p/router/message/OutboundClientMessageJobHelper.java index 9025fd22b35a77b537411359d43a3f340ca540cc..0ba55213e07003edb2d4e634ead4ec06d0a3fada 100644 --- a/router/java/src/net/i2p/router/message/OutboundClientMessageJobHelper.java +++ b/router/java/src/net/i2p/router/message/OutboundClientMessageJobHelper.java @@ -227,9 +227,8 @@ class OutboundClientMessageJobHelper { clove.setExpiration(expiration); clove.setId(ctx.random().nextLong(I2NPMessage.MAX_ID_VALUE)); DatabaseStoreMessage msg = new DatabaseStoreMessage(ctx); - msg.setLeaseSet(replyLeaseSet); + msg.setEntry(replyLeaseSet); msg.setMessageExpiration(expiration); - msg.setKey(replyLeaseSet.getDestination().calculateHash()); clove.setPayload(msg); clove.setRecipientPublicKey(null); clove.setRequestAck(false); diff --git a/router/java/src/net/i2p/router/message/OutboundClientMessageOneShotJob.java b/router/java/src/net/i2p/router/message/OutboundClientMessageOneShotJob.java index bfa09419932f6ac049f5358597f54e7de4289c1e..fc22cadfacabc3d2d517c4571c696f0494d67fdc 100644 --- a/router/java/src/net/i2p/router/message/OutboundClientMessageOneShotJob.java +++ b/router/java/src/net/i2p/router/message/OutboundClientMessageOneShotJob.java @@ -47,21 +47,21 @@ import net.i2p.util.SimpleTimer; * */ public class OutboundClientMessageOneShotJob extends JobImpl { - private Log _log; + private final Log _log; private long _overallExpiration; private ClientMessage _clientMessage; - private MessageId _clientMessageId; - private int _clientMessageSize; - private Destination _from; - private Destination _to; - private String _toString; + private final MessageId _clientMessageId; + private final int _clientMessageSize; + private final Destination _from; + private final Destination _to; + private final String _toString; /** target destination's leaseSet, if known */ private LeaseSet _leaseSet; /** Actual lease the message is being routed through */ private Lease _lease; private PayloadGarlicConfig _clove; private long _cloveId; - private long _start; + private final long _start; private boolean _finished; private long _leaseSetLookupBegin; private TunnelInfo _outTunnel; @@ -103,8 +103,6 @@ public class OutboundClientMessageOneShotJob extends JobImpl { */ private static final int BUNDLE_PROBABILITY_DEFAULT = 100; - private static final Object _initializeLock = new Object(); - private static boolean _initialized = false; private static final int CLEAN_INTERVAL = 5*60*1000; private static final int REPLY_REQUEST_INTERVAL = 60*1000; @@ -115,26 +113,6 @@ public class OutboundClientMessageOneShotJob extends JobImpl { super(ctx); _log = ctx.logManager().getLog(OutboundClientMessageOneShotJob.class); - synchronized (_initializeLock) { - if (!_initialized) { - SimpleScheduler.getInstance().addPeriodicEvent(new OCMOSJCacheCleaner(ctx), CLEAN_INTERVAL, CLEAN_INTERVAL); - ctx.statManager().createFrequencyStat("client.sendMessageFailFrequency", "How often does a client fail to send a message?", "ClientMessages", new long[] { 60*1000l, 60*60*1000l, 24*60*60*1000l }); - ctx.statManager().createRateStat("client.sendMessageSize", "How large are messages sent by the client?", "ClientMessages", new long[] { 60*1000l, 60*60*1000l, 24*60*60*1000l }); - ctx.statManager().createRateStat("client.sendAckTime", "Message round trip time", "ClientMessages", new long[] { 60*1000l, 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); - ctx.statManager().createRateStat("client.timeoutCongestionTunnel", "How lagged our tunnels are when a send times out?", "ClientMessages", new long[] { 60*1000l, 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); - ctx.statManager().createRateStat("client.timeoutCongestionMessage", "How fast we process messages locally when a send times out?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); - ctx.statManager().createRateStat("client.timeoutCongestionInbound", "How much faster we are receiving data than our average bps when a send times out?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); - ctx.statManager().createRateStat("client.leaseSetFoundLocally", "How often we tried to look for a leaseSet and found it locally?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); - ctx.statManager().createRateStat("client.leaseSetFoundRemoteTime", "How long we tried to look for a remote leaseSet (when we succeeded)?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); - ctx.statManager().createRateStat("client.leaseSetFailedRemoteTime", "How long we tried to look for a remote leaseSet (when we failed)?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); - ctx.statManager().createRateStat("client.dispatchPrepareTime", "How long until we've queued up the dispatch job (since we started)?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); - ctx.statManager().createRateStat("client.dispatchTime", "How long until we've dispatched the message (since we started)?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); - ctx.statManager().createRateStat("client.dispatchSendTime", "How long the actual dispatching takes?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); - ctx.statManager().createRateStat("client.dispatchNoTunnels", "How long after start do we run out of tunnels to send/receive with?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); - ctx.statManager().createRateStat("client.dispatchNoACK", "Repeated message sends to a peer (no ack required)", "ClientMessages", new long[] { 60*1000l, 5*60*1000l, 60*60*1000l }); - _initialized = true; - } - } long timeoutMs = OVERALL_TIMEOUT_MS_DEFAULT; _clientMessage = msg; _clientMessageId = msg.getMessageId(); @@ -149,10 +127,17 @@ public class OutboundClientMessageOneShotJob extends JobImpl { // otherwise router config, otherwise default _overallExpiration = msg.getExpiration(); if (_overallExpiration > 0) { - _overallExpiration = Math.max(_overallExpiration, _start + OVERALL_TIMEOUT_MS_MIN); - _overallExpiration = Math.min(_overallExpiration, _start + OVERALL_TIMEOUT_MS_DEFAULT); - if (_log.shouldLog(Log.INFO)) - _log.info(getJobId() + ": Message Expiration (ms): " + (_overallExpiration - _start)); + // Unless it's already expired, set a min and max expiration + if (_overallExpiration <= _start) { + _overallExpiration = Math.max(_overallExpiration, _start + OVERALL_TIMEOUT_MS_MIN); + _overallExpiration = Math.min(_overallExpiration, _start + OVERALL_TIMEOUT_MS_DEFAULT); + if (_log.shouldLog(Log.INFO)) + _log.info(getJobId() + ": Message Expiration (ms): " + (_overallExpiration - _start)); + } else { + if (_log.shouldLog(Log.WARN)) + _log.warn(getJobId() + ": Expired before we got to it"); + // runJob() will call dieFatal() + } } else { String param = msg.getSenderConfig().getOptions().getProperty(OVERALL_TIMEOUT_MS_PARAM); if (param == null) @@ -171,15 +156,38 @@ public class OutboundClientMessageOneShotJob extends JobImpl { if (_log.shouldLog(Log.INFO)) _log.info(getJobId() + " Default Expiration (ms): " + timeoutMs); } - _finished = false; } + /** call once only */ + public static void init(RouterContext ctx) { + SimpleScheduler.getInstance().addPeriodicEvent(new OCMOSJCacheCleaner(ctx), CLEAN_INTERVAL, CLEAN_INTERVAL); + ctx.statManager().createFrequencyStat("client.sendMessageFailFrequency", "How often does a client fail to send a message?", "ClientMessages", new long[] { 60*1000l, 60*60*1000l, 24*60*60*1000l }); + ctx.statManager().createRateStat("client.sendMessageSize", "How large are messages sent by the client?", "ClientMessages", new long[] { 60*1000l, 60*60*1000l, 24*60*60*1000l }); + ctx.statManager().createRateStat("client.sendAckTime", "Message round trip time", "ClientMessages", new long[] { 60*1000l, 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); + ctx.statManager().createRateStat("client.timeoutCongestionTunnel", "How lagged our tunnels are when a send times out?", "ClientMessages", new long[] { 60*1000l, 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); + ctx.statManager().createRateStat("client.timeoutCongestionMessage", "How fast we process messages locally when a send times out?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); + ctx.statManager().createRateStat("client.timeoutCongestionInbound", "How much faster we are receiving data than our average bps when a send times out?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); + ctx.statManager().createRateStat("client.leaseSetFoundLocally", "How often we tried to look for a leaseSet and found it locally?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); + ctx.statManager().createRateStat("client.leaseSetFoundRemoteTime", "How long we tried to look for a remote leaseSet (when we succeeded)?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); + ctx.statManager().createRateStat("client.leaseSetFailedRemoteTime", "How long we tried to look for a remote leaseSet (when we failed)?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); + ctx.statManager().createRateStat("client.dispatchPrepareTime", "How long until we've queued up the dispatch job (since we started)?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); + ctx.statManager().createRateStat("client.dispatchTime", "How long until we've dispatched the message (since we started)?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); + ctx.statManager().createRateStat("client.dispatchSendTime", "How long the actual dispatching takes?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); + ctx.statManager().createRateStat("client.dispatchNoTunnels", "How long after start do we run out of tunnels to send/receive with?", "ClientMessages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); + ctx.statManager().createRateStat("client.dispatchNoACK", "Repeated message sends to a peer (no ack required)", "ClientMessages", new long[] { 60*1000l, 5*60*1000l, 60*60*1000l }); + } + public String getName() { return "Outbound client message"; } public void runJob() { + long now = getContext().clock().now(); + if (now >= _overallExpiration) { + dieFatal(); + return; + } if (_log.shouldLog(Log.DEBUG)) _log.debug(getJobId() + ": Send outbound client message job beginning"); - long timeoutMs = _overallExpiration - getContext().clock().now(); + long timeoutMs = _overallExpiration - now; if (_log.shouldLog(Log.DEBUG)) _log.debug(getJobId() + ": preparing to search for the leaseSet for " + _toString); Hash key = _to.calculateHash(); @@ -249,7 +257,6 @@ public class OutboundClientMessageOneShotJob extends JobImpl { } // If the last leaseSet we sent him is still good, don't bother sending again - long now = getContext().clock().now(); synchronized (_leaseSetCache) { if (!force) { LeaseSet ls = _leaseSetCache.get(hashPair()); @@ -326,7 +333,6 @@ public class OutboundClientMessageOneShotJob extends JobImpl { _log.warn(getJobId() + ": Lookup locally didn't find the leaseSet for " + _toString); return false; } - long now = getContext().clock().now(); // Use the same lease if it's still good // Even if _leaseSet changed, _leaseSet.getEncryptionKey() didn't... @@ -373,7 +379,7 @@ public class OutboundClientMessageOneShotJob extends JobImpl { // randomize the ordering (so leases with equal # of failures per next // sort are randomly ordered) - Collections.shuffle(leases); + Collections.shuffle(leases, getContext().random()); /**** if (false) { @@ -793,7 +799,6 @@ public class OutboundClientMessageOneShotJob extends JobImpl { private TunnelInfo selectOutboundTunnel(Destination to) { TunnelInfo tunnel; - long now = getContext().clock().now(); synchronized (_tunnelCache) { /** * If old tunnel is valid and no longer backlogged, use it. diff --git a/router/java/src/net/i2p/router/message/PayloadGarlicConfig.java b/router/java/src/net/i2p/router/message/PayloadGarlicConfig.java index a5e8368d3438355c4773bd3c64f32e05f6657679..fb92898c816ec711c95c03ef6cfd1c7bb1558520 100644 --- a/router/java/src/net/i2p/router/message/PayloadGarlicConfig.java +++ b/router/java/src/net/i2p/router/message/PayloadGarlicConfig.java @@ -19,7 +19,6 @@ public class PayloadGarlicConfig extends GarlicConfig { public PayloadGarlicConfig() { super(); - _payload = null; } /** diff --git a/router/java/src/net/i2p/router/message/SendMessageDirectJob.java b/router/java/src/net/i2p/router/message/SendMessageDirectJob.java index c67eeaa4ad986d0fa6cd57f8a512c791176ae4f7..5ded790ab8150840ac4469b19932e25e2fd09d1b 100644 --- a/router/java/src/net/i2p/router/message/SendMessageDirectJob.java +++ b/router/java/src/net/i2p/router/message/SendMessageDirectJob.java @@ -22,16 +22,16 @@ import net.i2p.router.RouterContext; import net.i2p.util.Log; public class SendMessageDirectJob extends JobImpl { - private Log _log; - private I2NPMessage _message; - private Hash _targetHash; + private final Log _log; + private final I2NPMessage _message; + private final Hash _targetHash; private RouterInfo _router; - private long _expiration; - private int _priority; - private Job _onSend; - private ReplyJob _onSuccess; - private Job _onFail; - private MessageSelector _selector; + private final long _expiration; + private final int _priority; + private final Job _onSend; + private final ReplyJob _onSuccess; + private final Job _onFail; + private final MessageSelector _selector; private boolean _alreadySearched; private boolean _sent; private long _searchOn; @@ -47,7 +47,6 @@ public class SendMessageDirectJob extends JobImpl { _log = getContext().logManager().getLog(SendMessageDirectJob.class); _message = message; _targetHash = toPeer; - _router = null; if (timeoutMs < 10*1000) { if (_log.shouldLog(Log.WARN)) _log.warn("Very little time given [" + timeoutMs + "], resetting to 5s", new Exception("stingy bastard")); @@ -56,8 +55,6 @@ public class SendMessageDirectJob extends JobImpl { _expiration = timeoutMs + ctx.clock().now(); } _priority = priority; - _searchOn = 0; - _alreadySearched = false; _onSend = onSend; _onSuccess = onSuccess; _onFail = onFail; @@ -66,7 +63,6 @@ public class SendMessageDirectJob extends JobImpl { throw new IllegalArgumentException("Attempt to send a null message"); if (_targetHash == null) throw new IllegalArgumentException("Attempt to send a message to a null peer"); - _sent = false; } public String getName() { return "Send Message Direct"; } diff --git a/router/java/src/net/i2p/router/networkdb/HandleDatabaseLookupMessageJob.java b/router/java/src/net/i2p/router/networkdb/HandleDatabaseLookupMessageJob.java index ce907ae719a6101353db3467396cb8a4f8f7ae55..8cdc87e6f97eb7be0ae2bb4a40d09d29183e64d4 100644 --- a/router/java/src/net/i2p/router/networkdb/HandleDatabaseLookupMessageJob.java +++ b/router/java/src/net/i2p/router/networkdb/HandleDatabaseLookupMessageJob.java @@ -12,7 +12,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.Set; -import net.i2p.data.DataStructure; +import net.i2p.data.DatabaseEntry; import net.i2p.data.Hash; import net.i2p.data.LeaseSet; import net.i2p.data.RouterIdentity; @@ -227,20 +227,19 @@ public class HandleDatabaseLookupMessageJob extends JobImpl { return routerHashSet.contains(getContext().routerHash()); } - private void sendData(Hash key, DataStructure data, Hash toPeer, TunnelId replyTunnel) { + private void sendData(Hash key, DatabaseEntry data, Hash toPeer, TunnelId replyTunnel) { + if (!key.equals(data.getHash())) { + _log.error("Hash mismatch HDLMJ"); + return; + } if (_log.shouldLog(Log.DEBUG)) _log.debug("Sending data matching key " + key.toBase64() + " to peer " + toPeer.toBase64() + " tunnel " + replyTunnel); DatabaseStoreMessage msg = new DatabaseStoreMessage(getContext()); - msg.setKey(key); - if (data instanceof LeaseSet) { - msg.setLeaseSet((LeaseSet)data); - msg.setValueType(DatabaseStoreMessage.KEY_TYPE_LEASESET); + if (data.getType() == DatabaseEntry.KEY_TYPE_LEASESET) { getContext().statManager().addRateData("netDb.lookupsMatchedLeaseSet", 1, 0); - } else if (data instanceof RouterInfo) { - msg.setRouterInfo((RouterInfo)data); - msg.setValueType(DatabaseStoreMessage.KEY_TYPE_ROUTERINFO); } + msg.setEntry(data); getContext().statManager().addRateData("netDb.lookupsMatched", 1, 0); getContext().statManager().addRateData("netDb.lookupsHandled", 1, 0); sendMessage(msg, toPeer, replyTunnel); diff --git a/router/java/src/net/i2p/router/networkdb/HandleDatabaseStoreMessageJob.java b/router/java/src/net/i2p/router/networkdb/HandleDatabaseStoreMessageJob.java index a61f947a59565ada3f5a83175f02b773f58c8e23..183d1da04754613c6c2054861ee00c580c8a3bf7 100644 --- a/router/java/src/net/i2p/router/networkdb/HandleDatabaseStoreMessageJob.java +++ b/router/java/src/net/i2p/router/networkdb/HandleDatabaseStoreMessageJob.java @@ -10,9 +10,11 @@ package net.i2p.router.networkdb; import java.util.Date; +import net.i2p.data.DatabaseEntry; import net.i2p.data.Hash; import net.i2p.data.LeaseSet; import net.i2p.data.RouterIdentity; +import net.i2p.data.RouterInfo; import net.i2p.data.i2np.DatabaseStoreMessage; import net.i2p.data.i2np.DeliveryStatusMessage; import net.i2p.router.JobImpl; @@ -59,16 +61,17 @@ public class HandleDatabaseStoreMessageJob extends JobImpl { String invalidMessage = null; boolean wasNew = false; - if (_message.getValueType() == DatabaseStoreMessage.KEY_TYPE_LEASESET) { + DatabaseEntry entry = _message.getEntry(); + if (entry.getType() == DatabaseEntry.KEY_TYPE_LEASESET) { getContext().statManager().addRateData("netDb.storeLeaseSetHandled", 1, 0); try { - LeaseSet ls = _message.getLeaseSet(); + LeaseSet ls = (LeaseSet) entry; // mark it as something we received, so we'll answer queries // for it. this flag does NOT get set on entries that we // receive in response to our own lookups. ls.setReceivedAsPublished(true); - LeaseSet match = getContext().netDb().store(_message.getKey(), _message.getLeaseSet()); + LeaseSet match = getContext().netDb().store(_message.getKey(), ls); if (match == null) { wasNew = true; } else { @@ -78,13 +81,14 @@ public class HandleDatabaseStoreMessageJob extends JobImpl { } catch (IllegalArgumentException iae) { invalidMessage = iae.getMessage(); } - } else if (_message.getValueType() == DatabaseStoreMessage.KEY_TYPE_ROUTERINFO) { + } else if (entry.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) { + RouterInfo ri = (RouterInfo) entry; getContext().statManager().addRateData("netDb.storeRouterInfoHandled", 1, 0); if (_log.shouldLog(Log.INFO)) _log.info("Handling dbStore of router " + _message.getKey() + " with publishDate of " - + new Date(_message.getRouterInfo().getPublished())); + + new Date(ri.getPublished())); try { - Object match = getContext().netDb().store(_message.getKey(), _message.getRouterInfo()); + Object match = getContext().netDb().store(_message.getKey(), ri); wasNew = (null == match); getContext().profileManager().heardAbout(_message.getKey()); } catch (IllegalArgumentException iae) { @@ -92,7 +96,7 @@ public class HandleDatabaseStoreMessageJob extends JobImpl { } } else { if (_log.shouldLog(Log.ERROR)) - _log.error("Invalid DatabaseStoreMessage data type - " + _message.getValueType() + _log.error("Invalid DatabaseStoreMessage data type - " + entry.getType() + ": " + _message); } diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/DataStore.java b/router/java/src/net/i2p/router/networkdb/kademlia/DataStore.java index b4b55f3f8e77477cb805a71271b1ad28ccefae9c..ab064e2b0b1214565e3b696a0cadbd9570be7782 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/DataStore.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/DataStore.java @@ -8,21 +8,27 @@ package net.i2p.router.networkdb.kademlia; * */ +import java.util.Collection; +import java.util.Map; import java.util.Set; -import net.i2p.data.DataStructure; +import net.i2p.data.DatabaseEntry; import net.i2p.data.Hash; public interface DataStore { public boolean isInitialized(); public boolean isKnown(Hash key); - public DataStructure get(Hash key); - public DataStructure get(Hash key, boolean persist); - public boolean put(Hash key, DataStructure data); - public boolean put(Hash key, DataStructure data, boolean persist); - public DataStructure remove(Hash key); - public DataStructure remove(Hash key, boolean persist); + public DatabaseEntry get(Hash key); + public DatabaseEntry get(Hash key, boolean persist); + public boolean put(Hash key, DatabaseEntry data); + public boolean put(Hash key, DatabaseEntry data, boolean persist); + public DatabaseEntry remove(Hash key); + public DatabaseEntry remove(Hash key, boolean persist); public Set<Hash> getKeys(); + /** @since 0.8.3 */ + public Collection<DatabaseEntry> getEntries(); + /** @since 0.8.3 */ + public Set<Map.Entry<Hash, DatabaseEntry>> getMapEntries(); public void stop(); public void restart(); public void rescan(); diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/ExpireLeasesJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/ExpireLeasesJob.java index 7d4be13367b4f3678bff6817d9b29d58016290c0..6ea401d6671b145288eecadc20dba0e3288c72e3 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/ExpireLeasesJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/ExpireLeasesJob.java @@ -9,9 +9,10 @@ package net.i2p.router.networkdb.kademlia; */ import java.util.HashSet; -import java.util.Iterator; +import java.util.Map; import java.util.Set; +import net.i2p.data.DatabaseEntry; import net.i2p.data.Hash; import net.i2p.data.LeaseSet; import net.i2p.router.JobImpl; @@ -26,8 +27,8 @@ import net.i2p.util.Log; * */ class ExpireLeasesJob extends JobImpl { - private Log _log; - private KademliaNetworkDatabaseFacade _facade; + private final Log _log; + private final KademliaNetworkDatabaseFacade _facade; private final static long RERUN_DELAY_MS = 1*60*1000; @@ -38,11 +39,11 @@ class ExpireLeasesJob extends JobImpl { } public String getName() { return "Expire Lease Sets Job"; } + public void runJob() { - Set toExpire = selectKeysToExpire(); + Set<Hash> toExpire = selectKeysToExpire(); _log.info("Leases to expire: " + toExpire); - for (Iterator iter = toExpire.iterator(); iter.hasNext(); ) { - Hash key = (Hash)iter.next(); + for (Hash key : toExpire) { _facade.fail(key); //_log.info("Lease " + key + " is expiring, so lets look for it again", new Exception("Expire and search")); //_facade.lookupLeaseSet(key, null, null, RERUN_DELAY_MS); @@ -56,17 +57,15 @@ class ExpireLeasesJob extends JobImpl { * don't have any leases that haven't yet passed, even with the CLOCK_FUDGE_FACTOR) * */ - private Set selectKeysToExpire() { - Set keys = _facade.getDataStore().getKeys(); - Set toExpire = new HashSet(128); - for (Iterator iter = keys.iterator(); iter.hasNext(); ) { - Hash key = (Hash)iter.next(); - Object obj = _facade.getDataStore().get(key); - if (obj instanceof LeaseSet) { + private Set<Hash> selectKeysToExpire() { + Set<Hash> toExpire = new HashSet(128); + for (Map.Entry<Hash, DatabaseEntry> entry : _facade.getDataStore().getMapEntries()) { + DatabaseEntry obj = entry.getValue(); + if (obj.getType() == DatabaseEntry.KEY_TYPE_LEASESET) { LeaseSet ls = (LeaseSet)obj; if (!ls.isCurrent(Router.CLOCK_FUDGE_FACTOR)) - toExpire.add(key); - else + toExpire.add(entry.getKey()); + else if (_log.shouldLog(Log.DEBUG)) _log.debug("Lease " + ls.getDestination().calculateHash() + " is current, no need to expire"); } } diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/ExpireRoutersJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/ExpireRoutersJob.java index 1d7de01389c0308d2084724805705e7b7e26772b..60bfb6e3aa02cff389b38004326c83849f235bb5 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/ExpireRoutersJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/ExpireRoutersJob.java @@ -9,7 +9,6 @@ package net.i2p.router.networkdb.kademlia; */ import java.util.Collections; -import java.util.Iterator; import java.util.Set; import net.i2p.data.Hash; @@ -28,8 +27,8 @@ import net.i2p.util.Log; * */ class ExpireRoutersJob extends JobImpl { - private Log _log; - private KademliaNetworkDatabaseFacade _facade; + private final Log _log; + private final KademliaNetworkDatabaseFacade _facade; /** rerun fairly often, so the fails don't queue up too many netdb searches at once */ private final static long RERUN_DELAY_MS = 120*1000; @@ -41,11 +40,13 @@ class ExpireRoutersJob extends JobImpl { } public String getName() { return "Expire Routers Job"; } + public void runJob() { - Set toExpire = selectKeysToExpire(); - _log.info("Routers to expire (drop and try to refetch): " + toExpire); - for (Iterator iter = toExpire.iterator(); iter.hasNext(); ) { - Hash key = (Hash)iter.next(); + // this always returns an empty set (see below) + Set<Hash> toExpire = selectKeysToExpire(); + if (_log.shouldLog(Log.INFO)) + _log.info("Routers to expire (drop and try to refetch): " + toExpire); + for (Hash key : toExpire) { _facade.fail(key); } _facade.queueForExploration(toExpire); @@ -61,9 +62,8 @@ class ExpireRoutersJob extends JobImpl { * * @return nothing for now */ - private Set selectKeysToExpire() { - for (Iterator iter = _facade.getAllRouters().iterator(); iter.hasNext(); ) { - Hash key = (Hash)iter.next(); + private Set<Hash> selectKeysToExpire() { + for (Hash key : _facade.getAllRouters()) { // Don't expire anybody we are connected to if (!getContext().commSystem().isEstablished(key)) { // This does a _facade.validate() and fail() which is sufficient... diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodOnlyLookupMatchJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodOnlyLookupMatchJob.java index 20572667e7f3c3d1ecd8d3f2bb71a99fa5ad82bd..34b0e4e2b9c67f8621ac4ae09303df3a2f0e255b 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodOnlyLookupMatchJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodOnlyLookupMatchJob.java @@ -1,5 +1,8 @@ package net.i2p.router.networkdb.kademlia; +import net.i2p.data.DatabaseEntry; +import net.i2p.data.LeaseSet; +import net.i2p.data.RouterInfo; import net.i2p.data.i2np.DatabaseSearchReplyMessage; import net.i2p.data.i2np.DatabaseStoreMessage; import net.i2p.data.i2np.I2NPMessage; @@ -61,14 +64,15 @@ class FloodOnlyLookupMatchJob extends JobImpl implements ReplyJob { // We do it here first to make sure it is in the DB before // runJob() and search.success() is called??? // Should we just pass the DataStructure directly back to somebody? - if (dsm.getValueType() == DatabaseStoreMessage.KEY_TYPE_LEASESET) { + if (dsm.getEntry().getType() == DatabaseEntry.KEY_TYPE_LEASESET) { // Since HFDSMJ wants to setReceivedAsPublished(), we have to // set a flag saying this was really the result of a query, // so don't do that. - dsm.getLeaseSet().setReceivedAsReply(); - getContext().netDb().store(dsm.getKey(), dsm.getLeaseSet()); + LeaseSet ls = (LeaseSet) dsm.getEntry(); + ls.setReceivedAsReply(); + getContext().netDb().store(dsm.getKey(), ls); } else { - getContext().netDb().store(dsm.getKey(), dsm.getRouterInfo()); + getContext().netDb().store(dsm.getKey(), (RouterInfo) dsm.getEntry()); } } catch (IllegalArgumentException iae) { if (_log.shouldLog(Log.WARN)) diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodSearchJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodSearchJob.java index bfa5c59ead02121e2f0a5c49870140b6ae7c6a58..1cecc2074137a32bf040825f19e34ab7cb6b0ce6 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodSearchJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodSearchJob.java @@ -182,8 +182,7 @@ public class FloodSearchJob extends JobImpl { _search = job; } public void runJob() { - if ( (getContext().netDb().lookupLeaseSetLocally(_search.getKey()) != null) || - (getContext().netDb().lookupRouterInfoLocally(_search.getKey()) != null) ) { + if (getContext().netDb().lookupLocally(_search.getKey()) != null) { _search.success(); } else { int remaining = _search.getLookupsRemaining(); diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillMonitorJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillMonitorJob.java index 3964b3a1ea49246f856362ed52a7c05662335e39..04683309a6c3b9145fdde066c46354357691409a 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillMonitorJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillMonitorJob.java @@ -26,8 +26,8 @@ class FloodfillMonitorJob extends JobImpl { private static final int REQUEUE_DELAY = 60*60*1000; private static final long MIN_UPTIME = 2*60*60*1000; private static final long MIN_CHANGE_DELAY = 6*60*60*1000; - private static final int MIN_FF = 60; - private static final int MAX_FF = 100; + private static final int MIN_FF = 75; + private static final int MAX_FF = 150; private static final String PROP_FLOODFILL_PARTICIPANT = "router.floodfillParticipant"; public FloodfillMonitorJob(RouterContext context, FloodfillNetworkDatabaseFacade facade) { diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java index 540173ed63404457315894cf71bd784db7bc8788..5ba6701353326c768197adec60af97b8d0890d82 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java @@ -7,8 +7,8 @@ import java.util.List; import java.util.Map; import java.util.Set; +import net.i2p.data.DatabaseEntry; import net.i2p.data.DataFormatException; -import net.i2p.data.DataStructure; import net.i2p.data.Hash; import net.i2p.data.LeaseSet; import net.i2p.data.RouterInfo; @@ -93,11 +93,11 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad } @Override - public void sendStore(Hash key, DataStructure ds, Job onSuccess, Job onFailure, long sendTimeout, Set toIgnore) { + public void sendStore(Hash key, DatabaseEntry ds, Job onSuccess, Job onFailure, long sendTimeout, Set toIgnore) { // if we are a part of the floodfill netDb, don't send out our own leaseSets as part // of the flooding - instead, send them to a random floodfill peer so *they* can flood 'em out. // perhaps statistically adjust this so we are the source every 1/N times... or something. - if (floodfillEnabled() && (ds instanceof RouterInfo)) { + if (floodfillEnabled() && (ds.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO)) { flood(ds); if (onSuccess != null) _context.jobQueue().addJob(onSuccess); @@ -129,12 +129,8 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad * We do this to implement Kademlia within the floodfills, i.e. * we flood to those closest to the key. */ - public void flood(DataStructure ds) { - Hash key; - if (ds instanceof LeaseSet) - key = ((LeaseSet)ds).getDestination().calculateHash(); - else - key = ((RouterInfo)ds).getIdentity().calculateHash(); + public void flood(DatabaseEntry ds) { + Hash key = ds.getHash(); Hash rkey = _context.routingKeyGenerator().getRoutingKey(key); FloodfillPeerSelector sel = (FloodfillPeerSelector)getPeerSelector(); List peers = sel.selectFloodfillParticipants(rkey, MAX_TO_FLOOD, getKBuckets()); @@ -151,12 +147,7 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad if (peer.equals(_context.routerHash())) continue; DatabaseStoreMessage msg = new DatabaseStoreMessage(_context); - if (ds instanceof LeaseSet) { - msg.setLeaseSet((LeaseSet)ds); - } else { - msg.setRouterInfo((RouterInfo)ds); - } - msg.setKey(key); + msg.setEntry(ds); msg.setReplyGateway(null); msg.setReplyToken(0); msg.setReplyTunnel(null); @@ -242,13 +233,9 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad List<RouterInfo> rv = new ArrayList(); DataStore ds = getDataStore(); if (ds != null) { - Set keys = ds.getKeys(); - if (keys != null) { - for (Iterator iter = keys.iterator(); iter.hasNext(); ) { - Object o = ds.get((Hash)iter.next()); - if (o instanceof RouterInfo) - rv.add((RouterInfo)o); - } + for (DatabaseEntry o : ds.getEntries()) { + if (o.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) + rv.add((RouterInfo)o); } } return rv; diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillPeerSelector.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillPeerSelector.java index 4eb4e482540127990ba30a6f407da9b0530974a9..9c4093899d2b15ba017629ee2ef50534bc02ac0e 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillPeerSelector.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillPeerSelector.java @@ -11,6 +11,7 @@ package net.i2p.router.networkdb.kademlia; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.TreeSet; @@ -19,6 +20,7 @@ import net.i2p.data.Hash; import net.i2p.data.RouterInfo; import net.i2p.router.RouterContext; import net.i2p.router.peermanager.PeerProfile; +import net.i2p.router.util.RandomIterator; import net.i2p.stat.Rate; import net.i2p.util.Log; @@ -72,8 +74,10 @@ class FloodfillPeerSelector extends PeerSelector { */ List<Hash> selectNearestExplicitThin(Hash key, int maxNumRouters, Set<Hash> peersToIgnore, KBucketSet kbuckets, boolean preferConnected) { if (peersToIgnore == null) - peersToIgnore = new HashSet(1); - peersToIgnore.add(_context.routerHash()); + peersToIgnore = Collections.singleton(_context.routerHash()); + else + peersToIgnore.add(_context.routerHash()); + // TODO this is very slow FloodfillSelectionCollector matches = new FloodfillSelectionCollector(key, peersToIgnore, maxNumRouters); if (kbuckets == null) return new ArrayList(); kbuckets.getAll(matches); @@ -91,8 +95,7 @@ class FloodfillPeerSelector extends PeerSelector { * List is not sorted and not shuffled. */ List<Hash> selectFloodfillParticipants(KBucketSet kbuckets) { - Set<Hash> ignore = new HashSet(1); - ignore.add(_context.routerHash()); + Set<Hash> ignore = Collections.singleton(_context.routerHash()); return selectFloodfillParticipants(ignore, kbuckets); } @@ -104,6 +107,8 @@ class FloodfillPeerSelector extends PeerSelector { */ private List<Hash> selectFloodfillParticipants(Set<Hash> toIgnore, KBucketSet kbuckets) { if (kbuckets == null) return Collections.EMPTY_LIST; + // TODO this is very slow - use profile getPeersByCapability('f') instead + _context.statManager().addRateData("netDb.newFSC", 0, 0); FloodfillSelectionCollector matches = new FloodfillSelectionCollector(null, toIgnore, 0); kbuckets.getAll(matches); return matches.getFloodfillParticipants(); @@ -127,8 +132,7 @@ class FloodfillPeerSelector extends PeerSelector { * Group 3: All others */ List<Hash> selectFloodfillParticipants(Hash key, int maxNumRouters, KBucketSet kbuckets) { - Set<Hash> ignore = new HashSet(1); - ignore.add(_context.routerHash()); + Set<Hash> ignore = Collections.singleton(_context.routerHash()); return selectFloodfillParticipants(key, maxNumRouters, ignore, kbuckets); } @@ -147,8 +151,7 @@ class FloodfillPeerSelector extends PeerSelector { */ List<Hash> selectFloodfillParticipants(Hash key, int howMany, Set<Hash> toIgnore, KBucketSet kbuckets) { if (toIgnore == null) { - toIgnore = new HashSet(1); - toIgnore.add(_context.routerHash()); + toIgnore = Collections.singleton(_context.routerHash()); } else if (!toIgnore.contains(_context.routerHash())) { // copy the Set so we don't confuse StoreJob toIgnore = new HashSet(toIgnore); @@ -320,7 +323,6 @@ class FloodfillPeerSelector extends PeerSelector { * Group 4: Non-floodfills, sorted by closest-to-the-key */ public List<Hash> get(int howMany, boolean preferConnected) { - Collections.shuffle(_floodfillMatches, _context.random()); List<Hash> rv = new ArrayList(howMany); List<Hash> badff = new ArrayList(howMany); List<Hash> unconnectedff = new ArrayList(howMany); @@ -329,8 +331,8 @@ class FloodfillPeerSelector extends PeerSelector { // Only add in "good" floodfills here... // Let's say published in last 3h and no failed sends in last 30m // (Forever shitlisted ones are excluded in add() above) - for (int i = 0; found < howMany && i < _floodfillMatches.size(); i++) { - Hash entry = (Hash) _floodfillMatches.get(i); + for (Iterator<Hash> iter = new RandomIterator(_floodfillMatches); (found < howMany) && iter.hasNext(); ) { + Hash entry = iter.next(); RouterInfo info = _context.netDb().lookupRouterInfoLocally(entry); if (info != null && now - info.getPublished() > 3*60*60*1000) { badff.add(entry); @@ -391,6 +393,7 @@ class FloodfillPeerSelector extends PeerSelector { if (peersToIgnore != null && peersToIgnore.contains(Hash.FAKE_HASH)) { // return non-ff peersToIgnore.addAll(selectFloodfillParticipants(peersToIgnore, kbuckets)); + // TODO this is very slow FloodfillSelectionCollector matches = new FloodfillSelectionCollector(rkey, peersToIgnore, maxNumRouters); kbuckets.getAll(matches); return matches.get(maxNumRouters); diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillStoreJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillStoreJob.java index 14969df83a0ac39b86ac99f425a6166c594ddf46..babd35dd258497a6cb44c85db5c3ed2dac9b8b50 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillStoreJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillStoreJob.java @@ -12,7 +12,7 @@ import java.util.Iterator; import java.util.NoSuchElementException; import java.util.Set; -import net.i2p.data.DataStructure; +import net.i2p.data.DatabaseEntry; import net.i2p.data.Hash; import net.i2p.data.LeaseSet; import net.i2p.data.RouterInfo; @@ -30,7 +30,7 @@ class FloodfillStoreJob extends StoreJob { * Send a data structure to the floodfills * */ - public FloodfillStoreJob(RouterContext context, FloodfillNetworkDatabaseFacade facade, Hash key, DataStructure data, Job onSuccess, Job onFailure, long timeoutMs) { + public FloodfillStoreJob(RouterContext context, FloodfillNetworkDatabaseFacade facade, Hash key, DatabaseEntry data, Job onSuccess, Job onFailure, long timeoutMs) { this(context, facade, key, data, onSuccess, onFailure, timeoutMs, null); } @@ -38,7 +38,7 @@ class FloodfillStoreJob extends StoreJob { * @param toSkip set of peer hashes of people we dont want to send the data to (e.g. we * already know they have it). This can be null. */ - public FloodfillStoreJob(RouterContext context, FloodfillNetworkDatabaseFacade facade, Hash key, DataStructure data, Job onSuccess, Job onFailure, long timeoutMs, Set<Hash> toSkip) { + public FloodfillStoreJob(RouterContext context, FloodfillNetworkDatabaseFacade facade, Hash key, DatabaseEntry data, Job onSuccess, Job onFailure, long timeoutMs, Set<Hash> toSkip) { super(context, facade, key, data, onSuccess, onFailure, timeoutMs, toSkip); _facade = facade; } @@ -63,15 +63,12 @@ class FloodfillStoreJob extends StoreJob { } // Get the time stamp from the data we sent, so the Verify job can meke sure that // it finds something stamped with that time or newer. - long published = 0; - DataStructure data = _state.getData(); - boolean isRouterInfo = data instanceof RouterInfo; + DatabaseEntry data = _state.getData(); + boolean isRouterInfo = data.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO; + long published = data.getDate(); if (isRouterInfo) { - published = ((RouterInfo) data).getPublished(); // Temporarily disable return; - } else if (data instanceof LeaseSet) { - published = ((LeaseSet) data).getEarliestLeaseDate(); } // we should always have exactly one successful entry Hash sentTo = null; diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillVerifyStoreJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillVerifyStoreJob.java index fa944f384dafc0c53a653f3b593532597ac692bb..c7dca12718bb448d6d912d764c82edb6a2bfd63e 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillVerifyStoreJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillVerifyStoreJob.java @@ -4,7 +4,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import net.i2p.data.DataStructure; +import net.i2p.data.DatabaseEntry; import net.i2p.data.Hash; import net.i2p.data.RouterInfo; import net.i2p.data.i2np.DatabaseLookupMessage; @@ -201,10 +201,7 @@ public class FloodfillVerifyStoreJob extends JobImpl { // Verify it's as recent as the one we sent boolean success = false; DatabaseStoreMessage dsm = (DatabaseStoreMessage)_message; - if (_isRouterInfo && dsm.getValueType() == DatabaseStoreMessage.KEY_TYPE_ROUTERINFO) - success = dsm.getRouterInfo().getPublished() >= _published; - else if ((!_isRouterInfo) && dsm.getValueType() == DatabaseStoreMessage.KEY_TYPE_LEASESET) - success = dsm.getLeaseSet().getEarliestLeaseDate() >= _published; + success = dsm.getEntry().getDate() >= _published; if (success) { // store ok, w00t! getContext().profileManager().dbLookupSuccessful(_target, delay); @@ -218,7 +215,7 @@ public class FloodfillVerifyStoreJob extends JobImpl { if (_log.shouldLog(Log.WARN)) _log.warn("Verify failed (older) for " + _key); if (_log.shouldLog(Log.INFO)) - _log.info("Rcvd older lease: " + dsm.getLeaseSet()); + _log.info("Rcvd older lease: " + dsm.getEntry()); } else if (_message instanceof DatabaseSearchReplyMessage) { // assume 0 old, all new, 0 invalid, 0 dup getContext().profileManager().dbLookupReply(_target, 0, @@ -245,11 +242,7 @@ public class FloodfillVerifyStoreJob extends JobImpl { * So at least we'll try THREE ffs round-robin if things continue to fail... */ private void resend() { - DataStructure ds; - if (_isRouterInfo) - ds = _facade.lookupRouterInfoLocally(_key); - else - ds = _facade.lookupLeaseSetLocally(_key); + DatabaseEntry ds = _facade.lookupLocally(_key); if (ds != null) { Set<Hash> toSkip = new HashSet(2); if (_sentTo != null) diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseLookupMessageJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseLookupMessageJob.java index 4e3c9c30ce377d539a505fd699df345d7aee8ea9..1409ecc2a153716777587490f0e21d49edbf600d 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseLookupMessageJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseLookupMessageJob.java @@ -57,9 +57,7 @@ public class HandleFloodfillDatabaseLookupMessageJob extends HandleDatabaseLooku // that would increment the netDb.lookupsHandled and netDb.lookupsMatched stats DatabaseStoreMessage msg = new DatabaseStoreMessage(getContext()); RouterInfo me = getContext().router().getRouterInfo(); - msg.setKey(me.getIdentity().getHash()); - msg.setRouterInfo(me); - msg.setValueType(DatabaseStoreMessage.KEY_TYPE_ROUTERINFO); + msg.setEntry(me); sendMessage(msg, toPeer, replyTunnel); } } diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseStoreMessageJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseStoreMessageJob.java index ea53c15667726b8dcf212e1fabcbfcee5d8921b1..a546ad7a27e2467322e1ce8eb500c644c3f6bed0 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseStoreMessageJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseStoreMessageJob.java @@ -11,6 +11,7 @@ package net.i2p.router.networkdb.kademlia; import java.util.Date; import java.util.Set; +import net.i2p.data.DatabaseEntry; import net.i2p.data.Hash; import net.i2p.data.LeaseSet; import net.i2p.data.RouterIdentity; @@ -55,7 +56,8 @@ public class HandleFloodfillDatabaseStoreMessageJob extends JobImpl { boolean wasNew = false; RouterInfo prevNetDb = null; Hash key = _message.getKey(); - if (_message.getValueType() == DatabaseStoreMessage.KEY_TYPE_LEASESET) { + DatabaseEntry entry = _message.getEntry(); + if (entry.getType() == DatabaseEntry.KEY_TYPE_LEASESET) { getContext().statManager().addRateData("netDb.storeLeaseSetHandled", 1, 0); if (_log.shouldLog(Log.INFO)) _log.info("Handling dbStore of leaseset " + _message); @@ -75,7 +77,7 @@ public class HandleFloodfillDatabaseStoreMessageJob extends JobImpl { throw new IllegalArgumentException("Peer attempted to store local leaseSet: " + key.toBase64().substring(0, 4)); } - LeaseSet ls = _message.getLeaseSet(); + LeaseSet ls = (LeaseSet) entry; //boolean oldrar = ls.getReceivedAsReply(); //boolean oldrap = ls.getReceivedAsPublished(); // If this was received as a response to a query, @@ -91,10 +93,10 @@ public class HandleFloodfillDatabaseStoreMessageJob extends JobImpl { //boolean rap = ls.getReceivedAsPublished(); //if (_log.shouldLog(Log.INFO)) // _log.info("oldrap? " + oldrap + " oldrar? " + oldrar + " newrap? " + rap); - LeaseSet match = getContext().netDb().store(key, _message.getLeaseSet()); + LeaseSet match = getContext().netDb().store(key, ls); if (match == null) { wasNew = true; - } else if (match.getEarliestLeaseDate() < _message.getLeaseSet().getEarliestLeaseDate()) { + } else if (match.getEarliestLeaseDate() < ls.getEarliestLeaseDate()) { wasNew = true; // If it is in our keyspace and we are talking to it @@ -117,11 +119,12 @@ public class HandleFloodfillDatabaseStoreMessageJob extends JobImpl { } catch (IllegalArgumentException iae) { invalidMessage = iae.getMessage(); } - } else if (_message.getValueType() == DatabaseStoreMessage.KEY_TYPE_ROUTERINFO) { + } else if (entry.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) { + RouterInfo ri = (RouterInfo) entry; getContext().statManager().addRateData("netDb.storeRouterInfoHandled", 1, 0); if (_log.shouldLog(Log.INFO)) _log.info("Handling dbStore of router " + key + " with publishDate of " - + new Date(_message.getRouterInfo().getPublished())); + + new Date(ri.getPublished())); try { // Never store our RouterInfo received from somebody else. // This generally happens from a FloodfillVerifyStoreJob. @@ -132,8 +135,8 @@ public class HandleFloodfillDatabaseStoreMessageJob extends JobImpl { // throw rather than return, so that we send the ack below (prevent easy attack) throw new IllegalArgumentException("Peer attempted to store our RouterInfo"); } - prevNetDb = getContext().netDb().store(key, _message.getRouterInfo()); - wasNew = ((null == prevNetDb) || (prevNetDb.getPublished() < _message.getRouterInfo().getPublished())); + prevNetDb = getContext().netDb().store(key, ri); + wasNew = ((null == prevNetDb) || (prevNetDb.getPublished() < ri.getPublished())); // Check new routerinfo address against blocklist if (wasNew) { if (prevNetDb == null) { @@ -143,7 +146,7 @@ public class HandleFloodfillDatabaseStoreMessageJob extends JobImpl { _log.warn("Blocklisting new peer " + key); } else { Set oldAddr = prevNetDb.getAddresses(); - Set newAddr = _message.getRouterInfo().getAddresses(); + Set newAddr = ri.getAddresses(); if (newAddr != null && (!newAddr.equals(oldAddr)) && (!getContext().shitlist().isShitlistedForever(key)) && getContext().blocklist().isBlocklisted(key) && @@ -157,7 +160,7 @@ public class HandleFloodfillDatabaseStoreMessageJob extends JobImpl { } } else { if (_log.shouldLog(Log.ERROR)) - _log.error("Invalid DatabaseStoreMessage data type - " + _message.getValueType() + _log.error("Invalid DatabaseStoreMessage data type - " + entry.getType() + ": " + _message); } @@ -198,12 +201,9 @@ public class HandleFloodfillDatabaseStoreMessageJob extends JobImpl { return; } long floodBegin = System.currentTimeMillis(); - if (_message.getValueType() == DatabaseStoreMessage.KEY_TYPE_LEASESET) - _facade.flood(_message.getLeaseSet()); + _facade.flood(_message.getEntry()); // ERR: see comment in HandleDatabaseLookupMessageJob regarding hidden mode //else if (!_message.getRouterInfo().isHidden()) - else - _facade.flood(_message.getRouterInfo()); long floodEnd = System.currentTimeMillis(); getContext().statManager().addRateData("netDb.storeFloodNew", floodEnd-floodBegin, 0); } else { diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/HarvesterJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/HarvesterJob.java index 7ced65ed0fa8ca33e84462df758d0db23145b8bc..48ddc4f2c79fbd5e761944222e284181d72965a0 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/HarvesterJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/HarvesterJob.java @@ -85,9 +85,9 @@ class HarvesterJob extends JobImpl { long when = info.getPublished(); if (when + MIN_UPDATE_FREQUENCY > now) continue; - while (routersByAge.containsKey(new Long(when))) + while (routersByAge.containsKey(Long.valueOf(when))) when++; - routersByAge.put(new Long(when), info.getIdentity().getHash()); + routersByAge.put(Long.valueOf(when), info.getIdentity().getHash()); } } diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/KBucketImpl.java b/router/java/src/net/i2p/router/networkdb/kademlia/KBucketImpl.java index 568a283f9b17eabda7f203bf2a03ecdc81cb0b19..bd7c62fdeb5399644a99fc6da5b503df0514ca67 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/KBucketImpl.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/KBucketImpl.java @@ -387,15 +387,15 @@ class KBucketImpl implements KBucket { local.prepareCache(); KBucketImpl bucket = new KBucketImpl(I2PAppContext.getGlobalContext(), local); bucket.setRange(low, high); - Hash lowerBoundKey = bucket.getRangeBeginKey(); - Hash upperBoundKey = bucket.getRangeEndKey(); + //Hash lowerBoundKey = bucket.getRangeBeginKey(); + //Hash upperBoundKey = bucket.getRangeEndKey(); for (int i = 0; i < 100000; i++) { Hash rnd = bucket.generateRandomKey(); //buf.append(toString(rnd.getData())).append('\n'); boolean ok = bucket.shouldContain(rnd); if (!ok) { byte diff[] = bucket.getLocal().cachedXor(rnd); - BigInteger dv = new BigInteger(1, diff); + //BigInteger dv = new BigInteger(1, diff); //log.error("WTF! bucket doesn't want: \n" + toString(rnd.getData()) // + "\nDelta: \n" + toString(diff) + "\nDelta val: \n" + dv.toString(2) // + "\nBucket: \n"+bucket, new Exception("WTF")); @@ -403,7 +403,7 @@ class KBucketImpl implements KBucket { log.error("\nLow: " + DataHelper.toHexString(bucket.getRangeBeginKey().getData()) + "\nVal: " + DataHelper.toHexString(rnd.getData()) + "\nHigh:" + DataHelper.toHexString(bucket.getRangeEndKey().getData())); - try { Thread.sleep(1000); } catch (Exception e) {} + try { Thread.sleep(1000); } catch (InterruptedException e) {} System.exit(0); } else { //_log.debug("Ok, bucket wants: \n" + toString(rnd.getData())); @@ -415,7 +415,6 @@ class KBucketImpl implements KBucket { private static void testRand2() { Log log = I2PAppContext.getGlobalContext().logManager().getLog(KBucketImpl.class); - StringBuilder buf = new StringBuilder(1024*1024*16); int low = 1; int high = 200; byte hash[] = new byte[Hash.HASH_LENGTH]; @@ -424,15 +423,15 @@ class KBucketImpl implements KBucket { local.prepareCache(); KBucketImpl bucket = new KBucketImpl(I2PAppContext.getGlobalContext(), local); bucket.setRange(low, high); - Hash lowerBoundKey = bucket.getRangeBeginKey(); - Hash upperBoundKey = bucket.getRangeEndKey(); + //Hash lowerBoundKey = bucket.getRangeBeginKey(); + //Hash upperBoundKey = bucket.getRangeEndKey(); for (int i = 0; i < 100000; i++) { Hash rnd = bucket.generateRandomKey(); //buf.append(toString(rnd.getData())).append('\n'); boolean ok = bucket.shouldContain(rnd); if (!ok) { byte diff[] = bucket.getLocal().cachedXor(rnd); - BigInteger dv = new BigInteger(1, diff); + //BigInteger dv = new BigInteger(1, diff); //log.error("WTF! bucket doesn't want: \n" + toString(rnd.getData()) // + "\nDelta: \n" + toString(diff) + "\nDelta val: \n" + dv.toString(2) // + "\nBucket: \n"+bucket, new Exception("WTF")); @@ -440,13 +439,13 @@ class KBucketImpl implements KBucket { log.error("\nLow: " + DataHelper.toHexString(bucket.getRangeBeginKey().getData()) + "\nVal: " + DataHelper.toHexString(rnd.getData()) + "\nHigh:" + DataHelper.toHexString(bucket.getRangeEndKey().getData())); - try { Thread.sleep(1000); } catch (Exception e) {} + try { Thread.sleep(1000); } catch (InterruptedException e) {} System.exit(0); } else { //_log.debug("Ok, bucket wants: \n" + toString(rnd.getData())); } } - log.info("Passed 100,000 random key generations against a random hash\n" + buf.toString()); + log.info("Passed 100,000 random key generations against a random hash"); } private final static String toString(byte b[]) { diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/KBucketSet.java b/router/java/src/net/i2p/router/networkdb/kademlia/KBucketSet.java index f576d967c7952b7f79a913fce4ddc0128016be6a..c630e2e9d1e4e27ac6216fbaaab89bc55cf8a099 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/KBucketSet.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/KBucketSet.java @@ -42,6 +42,7 @@ class KBucketSet { _context = context; _log = context.logManager().getLog(KBucketSet.class); createBuckets(); + context.statManager().createRateStat("netDb.KBSGetAllTime", "Time to add all Hashes to the Collector", "NetworkDatabase", new long[] { 60*60*1000 }); } /** @@ -99,8 +100,10 @@ class KBucketSet { } public void getAll(SelectionCollector collector) { + long start = _context.clock().now(); for (int i = 0; i < _buckets.length; i++) _buckets[i].getEntries(collector); + _context.statManager().addRateData("netDb.KBSGetAllTime", _context.clock().now() - start, 0); } public int pickBucket(Hash key) { diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java index 0ae7181044be256dd93959cfdfa3139a0dedbbb1..7a3b7741a93f2b29c858fbdda91259c0b63083dd 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java @@ -24,8 +24,8 @@ import java.util.Properties; import java.util.Set; import java.util.TreeSet; +import net.i2p.data.DatabaseEntry; import net.i2p.data.DataHelper; -import net.i2p.data.DataStructure; import net.i2p.data.Destination; import net.i2p.data.Hash; import net.i2p.data.Lease; @@ -88,9 +88,8 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { void searchComplete(Hash key) { if (_log.shouldLog(Log.DEBUG)) _log.debug("search Complete: " + key); - SearchJob removed = null; synchronized (_activeRequests) { - removed = (SearchJob)_activeRequests.remove(key); + _activeRequests.remove(key); } } @@ -121,7 +120,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { * know anyone or just started up) -- see validate() below */ private final static long ROUTER_INFO_EXPIRATION = 3*24*60*60*1000l; - private final static long ROUTER_INFO_EXPIRATION_MIN = 150*60*1000l; + private final static long ROUTER_INFO_EXPIRATION_MIN = 120*60*1000l; private final static long ROUTER_INFO_EXPIRATION_SHORT = 90*60*1000l; private final static long ROUTER_INFO_EXPIRATION_FLOODFILL = 60*60*1000l; @@ -235,11 +234,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { public void startup() { _log.info("Starting up the kademlia network database"); RouterInfo ri = _context.router().getRouterInfo(); - String dbDir = _context.router().getConfigSetting(PROP_DB_DIR); - if (dbDir == null) { - _log.info("No DB dir specified [" + PROP_DB_DIR + "], using [" + DEFAULT_DB_DIR + "]"); - dbDir = DEFAULT_DB_DIR; - } + String dbDir = _context.getProperty(PROP_DB_DIR, DEFAULT_DB_DIR); String enforce = _context.getProperty(PROP_ENFORCE_NETID); if (enforce != null) _enforceNetId = Boolean.valueOf(enforce).booleanValue(); @@ -247,7 +242,11 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { _enforceNetId = DEFAULT_ENFORCE_NETID; _kb = new KBucketSet(_context, ri.getIdentity().getHash()); - _ds = new PersistentDataStore(_context, dbDir, this); + try { + _ds = new PersistentDataStore(_context, dbDir, this); + } catch (IOException ioe) { + throw new RuntimeException("Unable to initialize netdb storage", ioe); + } //_ds = new TransientDataStore(); // _exploreKeys = new HashSet(64); _dbDir = dbDir; @@ -350,21 +349,11 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { /** get the hashes for all known routers */ public Set<Hash> getAllRouters() { if (!_initialized) return Collections.EMPTY_SET; - Set<Hash> keys = _ds.getKeys(); - Set<Hash> rv = new HashSet(keys.size()); - if (_log.shouldLog(Log.DEBUG)) - _log.debug("getAllRouters(): # keys in the datastore: " + keys.size()); - for (Hash key : keys) { - DataStructure ds = _ds.get(key); - if (ds == null) { - if (_log.shouldLog(Log.INFO)) - _log.info("Selected hash " + key.toBase64() + " is not stored locally"); - } else if ( !(ds instanceof RouterInfo) ) { - // leaseSet - } else { - if (_log.shouldLog(Log.DEBUG)) - _log.debug("getAllRouters(): key is router: " + key.toBase64()); - rv.add(key); + Set<Map.Entry<Hash, DatabaseEntry>> entries = _ds.getMapEntries(); + Set<Hash> rv = new HashSet(entries.size()); + for (Map.Entry<Hash, DatabaseEntry> entry : entries) { + if (entry.getValue().getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) { + rv.add(entry.getKey()); } } return rv; @@ -383,8 +372,8 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { public int size() { return _count; } public void add(Hash entry) { if (_ds == null) return; - Object o = _ds.get(entry); - if (o instanceof RouterInfo) + DatabaseEntry o = _ds.get(entry); + if (o != null && o.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) _count++; } } @@ -400,12 +389,9 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { public int getKnownLeaseSets() { if (_ds == null) return 0; //return _ds.countLeaseSets(); - Set<Hash> keys = _ds.getKeys(); int rv = 0; - for (Hash key : keys) { - DataStructure ds = _ds.get(key); - if (ds != null && - ds instanceof LeaseSet && + for (DatabaseEntry ds : _ds.getEntries()) { + if (ds.getType() == DatabaseEntry.KEY_TYPE_LEASESET && ((LeaseSet)ds).getReceivedAsPublished()) rv++; } @@ -418,8 +404,8 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { public int size() { return _count; } public void add(Hash entry) { if (_ds == null) return; - Object o = _ds.get(entry); - if (o instanceof LeaseSet) + DatabaseEntry o = _ds.get(entry); + if (o != null && o.getType() == DatabaseEntry.KEY_TYPE_LEASESET) _count++; } } @@ -434,6 +420,32 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { return _kb.size(); } + /** + * @return RouterInfo, LeaseSet, or null, validated + * @since 0.8.3 + */ + public DatabaseEntry lookupLocally(Hash key) { + if (!_initialized) + return null; + DatabaseEntry rv = _ds.get(key); + if (rv == null) + return null; + if (rv.getType() == DatabaseEntry.KEY_TYPE_LEASESET) { + LeaseSet ls = (LeaseSet)rv; + if (ls.isCurrent(Router.CLOCK_FUDGE_FACTOR)) + return rv; + else + fail(key); + } else if (rv.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) { + try { + if (validate(key, (RouterInfo)rv) == null) + return rv; + } catch (IllegalArgumentException iae) {} + fail(key); + } + return null; + } + public void lookupLeaseSet(Hash key, Job onFindJob, Job onFailedLookupJob, long timeoutMs) { if (!_initialized) return; LeaseSet ls = lookupLeaseSetLocally(key); @@ -453,9 +465,9 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { public LeaseSet lookupLeaseSetLocally(Hash key) { if (!_initialized) return null; - if (_ds.isKnown(key)) { - DataStructure ds = _ds.get(key); - if (ds instanceof LeaseSet) { + DatabaseEntry ds = _ds.get(key); + if (ds != null) { + if (ds.getType() == DatabaseEntry.KEY_TYPE_LEASESET) { LeaseSet ls = (LeaseSet)ds; if (ls.isCurrent(Router.CLOCK_FUDGE_FACTOR)) { return ls; @@ -489,9 +501,9 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { public RouterInfo lookupRouterInfoLocally(Hash key) { if (!_initialized) return null; - DataStructure ds = _ds.get(key); + DatabaseEntry ds = _ds.get(key); if (ds != null) { - if (ds instanceof RouterInfo) { + if (ds.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) { // more aggressive than perhaps is necessary, but makes sure we // drop old references that we had accepted on startup (since // startup allows some lax rules). @@ -610,6 +622,8 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { * Determine whether this leaseSet will be accepted as valid and current * given what we know now. * + * TODO this is called several times, only check the key and signature once + * * @return reason why the entry is not valid, or null if it is valid */ String validate(Hash key, LeaseSet leaseSet) { @@ -692,6 +706,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { * Determine whether this routerInfo will be accepted as valid and current * given what we know now. * + * TODO this is called several times, only check the key and signature once */ String validate(Hash key, RouterInfo routerInfo) throws IllegalArgumentException { long now = _context.clock().now(); @@ -807,30 +822,26 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { public void fail(Hash dbEntry) { if (!_initialized) return; - boolean isRouterInfo = false; - Object o = _ds.get(dbEntry); - if (o instanceof RouterInfo) - isRouterInfo = true; - - if (isRouterInfo) { - lookupBeforeDropping(dbEntry, (RouterInfo)o); - return; - } else { - // we always drop leaseSets that are failed [timed out], - // regardless of how many routers we have. this is called on a lease if - // it has expired *or* its tunnels are failing and we want to see if there - // are any updates - if (_log.shouldLog(Log.INFO)) - _log.info("Dropping a lease: " + dbEntry); - } - + DatabaseEntry o = _ds.get(dbEntry); if (o == null) { + // if we dont know the key, lets make sure it isn't a now-dead peer _kb.remove(dbEntry); _context.peerManager().removeCapabilities(dbEntry); - // if we dont know the key, lets make sure it isn't a now-dead peer + return; } - - _ds.remove(dbEntry, isRouterInfo); + + if (o.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) { + lookupBeforeDropping(dbEntry, (RouterInfo)o); + return; + } + + // we always drop leaseSets that are failed [timed out], + // regardless of how many routers we have. this is called on a lease if + // it has expired *or* its tunnels are failing and we want to see if there + // are any updates + if (_log.shouldLog(Log.INFO)) + _log.info("Dropping a lease: " + dbEntry); + _ds.remove(dbEntry, false); } /** don't use directly - see F.N.D.F. override */ @@ -852,7 +863,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { public void unpublish(LeaseSet localLeaseSet) { if (!_initialized) return; Hash h = localLeaseSet.getDestination().calculateHash(); - DataStructure data = _ds.remove(h); + DatabaseEntry data = _ds.remove(h); if (data == null) { if (_log.shouldLog(Log.WARN)) @@ -906,8 +917,8 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { Set keys = getDataStore().getKeys(); for (Iterator iter = keys.iterator(); iter.hasNext(); ) { Hash key = (Hash)iter.next(); - Object o = getDataStore().get(key); - if (o instanceof LeaseSet) + DatabaseEntry o = getDataStore().get(key); + if (o.getType() == DatabaseEntry.KEY_TYPE_LEASESET) leases.add(o); } return leases; @@ -920,8 +931,8 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { Set keys = getDataStore().getKeys(); for (Iterator iter = keys.iterator(); iter.hasNext(); ) { Hash key = (Hash)iter.next(); - Object o = getDataStore().get(key); - if (o instanceof RouterInfo) + DatabaseEntry o = getDataStore().get(key); + if (o.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) routers.add(o); } return routers; @@ -953,7 +964,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { } /** unused (overridden in FNDF) */ - public void sendStore(Hash key, DataStructure ds, Job onSuccess, Job onFailure, long sendTimeout, Set toIgnore) { + public void sendStore(Hash key, DatabaseEntry ds, Job onSuccess, Job onFailure, long sendTimeout, Set toIgnore) { if ( (ds == null) || (key == null) ) { if (onFailure != null) _context.jobQueue().addJob(onFailure); diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/LookupThrottler.java b/router/java/src/net/i2p/router/networkdb/kademlia/LookupThrottler.java index b4cef3621e5db85747462ed1281e38be05f0a3d1..3c82810e1f52fab03550ff70d6686ec3be355db4 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/LookupThrottler.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/LookupThrottler.java @@ -58,13 +58,15 @@ class LookupThrottler { @Override public boolean equals(Object obj) { + if (obj == null || !(obj instanceof ReplyTunnel)) + return false; return this.h.equals(((ReplyTunnel)obj).h) && this.id.equals(((ReplyTunnel)obj).id); } @Override public int hashCode() { - return this.h.hashCode() + this.id.hashCode(); + return this.h.hashCode() ^ this.id.hashCode(); } } } diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/PeerSelector.java b/router/java/src/net/i2p/router/networkdb/kademlia/PeerSelector.java index 2a6d889003b25054dfb02a6a86180ee05e3373b3..49dbc8b8fd7c2eadfdcd3c5460b26dc2a85b9660 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/PeerSelector.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/PeerSelector.java @@ -31,8 +31,8 @@ import net.i2p.util.Log; * Mostly unused, see overrides in FloodfillPeerSelector */ class PeerSelector { - protected Log _log; - protected RouterContext _context; + protected final Log _log; + protected final RouterContext _context; public PeerSelector(RouterContext ctx) { _context = ctx; diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java b/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java index 429489cf08bfe5d8452f29bc65ba7ba02296f817..ad938e7ed37ba65a9df2c4e8a3f5939c973dc25a 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java @@ -19,8 +19,8 @@ import java.util.NoSuchElementException; import java.util.concurrent.ConcurrentHashMap; import net.i2p.data.Base64; +import net.i2p.data.DatabaseEntry; import net.i2p.data.DataFormatException; -import net.i2p.data.DataStructure; import net.i2p.data.Hash; import net.i2p.data.LeaseSet; import net.i2p.data.RouterInfo; @@ -39,19 +39,22 @@ import net.i2p.util.SecureFileOutputStream; * */ class PersistentDataStore extends TransientDataStore { - private Log _log; - private String _dbDir; - private KademliaNetworkDatabaseFacade _facade; - private Writer _writer; - private ReadJob _readJob; + private final Log _log; + private final File _dbDir; + private final KademliaNetworkDatabaseFacade _facade; + private final Writer _writer; + private final ReadJob _readJob; private boolean _initialized; private final static int READ_DELAY = 60*1000; - public PersistentDataStore(RouterContext ctx, String dbDir, KademliaNetworkDatabaseFacade facade) { + /** + * @param dbDir relative path + */ + public PersistentDataStore(RouterContext ctx, String dbDir, KademliaNetworkDatabaseFacade facade) throws IOException { super(ctx); _log = ctx.logManager().getLog(PersistentDataStore.class); - _dbDir = dbDir; + _dbDir = getDbDir(dbDir); _facade = facade; _readJob = new ReadJob(); _context.jobQueue().addJob(_readJob); @@ -79,7 +82,6 @@ class PersistentDataStore extends TransientDataStore { @Override public void restart() { super.restart(); - _dbDir = _facade.getDbDir(); } @Override @@ -89,7 +91,7 @@ class PersistentDataStore extends TransientDataStore { } @Override - public DataStructure get(Hash key) { + public DatabaseEntry get(Hash key) { return get(key, true); } @@ -98,8 +100,8 @@ class PersistentDataStore extends TransientDataStore { * @param persist if false, call super only, don't access disk */ @Override - public DataStructure get(Hash key, boolean persist) { - DataStructure rv = super.get(key); + public DatabaseEntry get(Hash key, boolean persist) { + DatabaseEntry rv = super.get(key); /***** if (rv != null || !persist) return rv; @@ -114,7 +116,7 @@ class PersistentDataStore extends TransientDataStore { } @Override - public DataStructure remove(Hash key) { + public DatabaseEntry remove(Hash key) { return remove(key, true); } @@ -122,7 +124,7 @@ class PersistentDataStore extends TransientDataStore { * @param persist if false, call super only, don't access disk */ @Override - public DataStructure remove(Hash key, boolean persist) { + public DatabaseEntry remove(Hash key, boolean persist) { if (persist) { _writer.remove(key); _context.jobQueue().addJob(new RemoveJob(key)); @@ -131,7 +133,7 @@ class PersistentDataStore extends TransientDataStore { } @Override - public boolean put(Hash key, DataStructure data) { + public boolean put(Hash key, DatabaseEntry data) { return put(key, data, true); } @@ -140,11 +142,11 @@ class PersistentDataStore extends TransientDataStore { * @return success */ @Override - public boolean put(Hash key, DataStructure data, boolean persist) { + public boolean put(Hash key, DatabaseEntry data, boolean persist) { if ( (data == null) || (key == null) ) return false; boolean rv = super.put(key, data); // Don't bother writing LeaseSets to disk - if (rv && persist && data instanceof RouterInfo) + if (rv && persist && data.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) _writer.queue(key, data); return rv; } @@ -160,8 +162,7 @@ class PersistentDataStore extends TransientDataStore { if (_log.shouldLog(Log.INFO)) _log.info("Removing key " + _key /* , getAddedBy() */); try { - File dbDir = getDbDir(); - removeFile(_key, dbDir); + removeFile(_key, _dbDir); } catch (IOException ioe) { _log.error("Error removing key " + _key, ioe); } @@ -180,10 +181,10 @@ class PersistentDataStore extends TransientDataStore { * We store a reference to the data here too, * rather than simply pull it from super.get(), because * we will soon have to implement a scheme for keeping only - * a subset of all DataStructures in memory and keeping the rest on disk. + * a subset of all DatabaseEntrys in memory and keeping the rest on disk. */ private class Writer implements Runnable { - private final Map<Hash, DataStructure>_keys; + private final Map<Hash, DatabaseEntry>_keys; private final Object _waitLock; private volatile boolean _quit; @@ -192,7 +193,7 @@ class PersistentDataStore extends TransientDataStore { _waitLock = new Object(); } - public void queue(Hash key, DataStructure data) { + public void queue(Hash key, DatabaseEntry data) { int pending = _keys.size(); boolean exists = (null != _keys.put(key, data)); if (exists) @@ -201,7 +202,7 @@ class PersistentDataStore extends TransientDataStore { } /** check to see if it's in the write queue */ - public DataStructure get(Hash key) { + public DatabaseEntry get(Hash key) { return _keys.get(key); } @@ -212,16 +213,16 @@ class PersistentDataStore extends TransientDataStore { public void run() { _quit = false; Hash key = null; - DataStructure data = null; + DatabaseEntry data = null; int count = 0; int lastCount = 0; long startTime = 0; while (true) { // get a new iterator every time to get a random entry without // having concurrency issues or copying to a List or Array - Iterator<Map.Entry<Hash, DataStructure>> iter = _keys.entrySet().iterator(); + Iterator<Map.Entry<Hash, DatabaseEntry>> iter = _keys.entrySet().iterator(); try { - Map.Entry<Hash, DataStructure> entry = iter.next(); + Map.Entry<Hash, DatabaseEntry> entry = iter.next(); key = entry.getKey(); data = entry.getValue(); iter.remove(); @@ -236,7 +237,10 @@ class PersistentDataStore extends TransientDataStore { if (key != null) { if (data != null) { - write(key, data); + // synch with the reader job + synchronized (_dbDir) { + write(key, data); + } data = null; } key = null; @@ -271,23 +275,22 @@ class PersistentDataStore extends TransientDataStore { } } - private void write(Hash key, DataStructure data) { + private void write(Hash key, DatabaseEntry data) { if (_log.shouldLog(Log.INFO)) _log.info("Writing key " + key); FileOutputStream fos = null; File dbFile = null; try { String filename = null; - File dbDir = getDbDir(); - if (data instanceof LeaseSet) + if (data.getType() == DatabaseEntry.KEY_TYPE_LEASESET) filename = getLeaseSetName(key); - else if (data instanceof RouterInfo) + else if (data.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) filename = getRouterInfoName(key); else throw new IOException("We don't know how to write objects of type " + data.getClass().getName()); - dbFile = new File(dbDir, filename); + dbFile = new File(_dbDir, filename); long dataPublishDate = getPublishDate(data); if (dbFile.lastModified() < dataPublishDate) { // our filesystem is out of date, lets replace it @@ -313,27 +316,33 @@ class PersistentDataStore extends TransientDataStore { if (fos != null) try { fos.close(); } catch (IOException ioe) {} } } - private long getPublishDate(DataStructure data) { - if (data instanceof RouterInfo) { - return ((RouterInfo)data).getPublished(); - } else if (data instanceof LeaseSet) { - return ((LeaseSet)data).getEarliestLeaseDate(); - } else { - return -1; - } + private long getPublishDate(DatabaseEntry data) { + return data.getDate(); } /** This is only for manual reseeding? Why bother every 60 sec??? */ private class ReadJob extends JobImpl { private boolean _alreadyWarned; + private long _lastModified; + public ReadJob() { super(PersistentDataStore.this._context); _alreadyWarned = false; } + public String getName() { return "DB Read Job"; } + public void runJob() { - _log.info("Rereading new files"); - readFiles(); + // check directory mod time to save a lot of object churn in scanning all the file names + long lastMod = _dbDir.lastModified(); + if (lastMod > _lastModified) { + _lastModified = lastMod; + _log.info("Rereading new files"); + // synch with the writer job + synchronized (_dbDir) { + readFiles(); + } + } requeue(READ_DELAY); } @@ -343,9 +352,8 @@ class PersistentDataStore extends TransientDataStore { private void readFiles() { int routerCount = 0; - try { - File dbDir = getDbDir(); - File routerInfoFiles[] = dbDir.listFiles(RouterInfoFilter.getInstance()); + + File routerInfoFiles[] = _dbDir.listFiles(RouterInfoFilter.getInstance()); if (routerInfoFiles != null) { routerCount += routerInfoFiles.length; if (routerInfoFiles.length > 5) @@ -360,9 +368,6 @@ class PersistentDataStore extends TransientDataStore { } } } - } catch (IOException ioe) { - _log.error("Error reading files in the db dir", ioe); - } if (!_alreadyWarned) { ReseedChecker.checkReseed(_context, routerCount); @@ -384,9 +389,9 @@ class PersistentDataStore extends TransientDataStore { private boolean shouldRead() { // persist = false to call only super.get() - DataStructure data = get(_key, false); + DatabaseEntry data = get(_key, false); if (data == null) return true; - if (data instanceof RouterInfo) { + if (data.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) { long knownDate = ((RouterInfo)data).getPublished(); long fileDate = _routerFile.lastModified(); if (fileDate > knownDate) @@ -442,8 +447,8 @@ class PersistentDataStore extends TransientDataStore { } - private File getDbDir() throws IOException { - File f = new SecureDirectory(_context.getRouterDir(), _dbDir); + private File getDbDir(String dbDir) throws IOException { + File f = new SecureDirectory(_context.getRouterDir(), dbDir); if (!f.exists()) { boolean created = f.mkdirs(); if (!created) diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/RepublishLeaseSetJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/RepublishLeaseSetJob.java index 223dd70f851faa8436891db3203685bc4e7f0bfd..239fd4772e5cfad9e7d5f8a2cf2e0453775ebc0c 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/RepublishLeaseSetJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/RepublishLeaseSetJob.java @@ -89,7 +89,7 @@ public class RepublishLeaseSetJob extends JobImpl { return _lastPublished; } - class OnRepublishSuccess extends JobImpl { + private static class OnRepublishSuccess extends JobImpl { public OnRepublishSuccess(RouterContext ctx) { super(ctx); } public String getName() { return "Publish leaseSet successful"; } public void runJob() { @@ -98,7 +98,7 @@ public class RepublishLeaseSetJob extends JobImpl { } } - class OnRepublishFailure extends JobImpl { + private static class OnRepublishFailure extends JobImpl { private RepublishLeaseSetJob _job; public OnRepublishFailure(RouterContext ctx, RepublishLeaseSetJob job) { super(ctx); diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java index 9400a17f696394d1d2be36ce0a432afc00c5f1cc..739a7c14827b4c5b9c969159e8284a4805775f3f 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java @@ -9,13 +9,13 @@ package net.i2p.router.networkdb.kademlia; */ import java.util.ArrayList; -import java.util.HashSet; +import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Set; +import net.i2p.data.DatabaseEntry; import net.i2p.data.DataHelper; -import net.i2p.data.DataStructure; import net.i2p.data.Hash; import net.i2p.data.LeaseSet; import net.i2p.data.RouterInfo; @@ -293,12 +293,12 @@ class SearchJob extends JobImpl { attempted.addAll(closestHashes); for (Iterator iter = closestHashes.iterator(); iter.hasNext(); ) { Hash peer = (Hash)iter.next(); - DataStructure ds = _facade.getDataStore().get(peer); + DatabaseEntry ds = _facade.getDataStore().get(peer); if (ds == null) { if (_log.shouldLog(Log.INFO)) _log.info("Next closest peer " + peer + " was only recently referred to us, sending a search for them"); getContext().netDb().lookupRouterInfo(peer, null, null, _timeoutMs); - } else if (!(ds instanceof RouterInfo)) { + } else if (!(ds.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO)) { if (_log.shouldLog(Log.WARN)) _log.warn(getJobId() + ": Error selecting closest hash that wasnt a router! " + peer + " : " + ds.getClass().getName()); @@ -635,7 +635,7 @@ class SearchJob extends JobImpl { * */ private void resend() { - DataStructure ds = _facade.lookupLeaseSetLocally(_state.getTarget()); + DatabaseEntry ds = _facade.lookupLeaseSetLocally(_state.getTarget()); if (ds == null) { if (SHOULD_RESEND_ROUTERINFO) { ds = _facade.lookupRouterInfoLocally(_state.getTarget()); @@ -665,8 +665,7 @@ class SearchJob extends JobImpl { */ private boolean resend(RouterInfo toPeer, LeaseSet ls) { DatabaseStoreMessage msg = new DatabaseStoreMessage(getContext()); - msg.setKey(ls.getDestination().calculateHash()); - msg.setLeaseSet(ls); + msg.setEntry(ls); msg.setMessageExpiration(getContext().clock().now() + RESEND_TIMEOUT); TunnelInfo outTunnel = getContext().tunnelManager().selectOutboundTunnel(); @@ -801,8 +800,7 @@ class SearchJob extends JobImpl { if (rv) { if (_log.shouldLog(Log.DEBUG)) _log.debug(getJobId() + ": Queueing up for next time: " + peer); - Set s = new HashSet(1); - s.add(peer); + Set<Hash> s = Collections.singleton(peer); _facade.queueForExploration(s); } return rv; diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/SearchState.java b/router/java/src/net/i2p/router/networkdb/kademlia/SearchState.java index 6fe5831ddfa2b83bf1e59342a0fd9a09a35cd3a7..25d86acf180af6be2f296e9fccff3402c097cc2d 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/SearchState.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/SearchState.java @@ -98,7 +98,7 @@ class SearchState { synchronized (_pendingPeers) { _pendingPeers.addAll(pending); for (Iterator iter = pending.iterator(); iter.hasNext(); ) - _pendingPeerTimes.put(iter.next(), new Long(_context.clock().now())); + _pendingPeerTimes.put(iter.next(), Long.valueOf(_context.clock().now())); } synchronized (_attemptedPeers) { _attemptedPeers.addAll(pending); @@ -107,7 +107,7 @@ class SearchState { public void addPending(Hash peer) { synchronized (_pendingPeers) { _pendingPeers.add(peer); - _pendingPeerTimes.put(peer, new Long(_context.clock().now())); + _pendingPeerTimes.put(peer, Long.valueOf(_context.clock().now())); } synchronized (_attemptedPeers) { _attemptedPeers.add(peer); diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/SearchUpdateReplyFoundJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/SearchUpdateReplyFoundJob.java index b5a824472a8cd8fb0b59bcb9cd9fbd41fcfb03e4..22602b497a6d7d787dceab1f2145be80e6955a55 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/SearchUpdateReplyFoundJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/SearchUpdateReplyFoundJob.java @@ -2,7 +2,9 @@ package net.i2p.router.networkdb.kademlia; import java.util.Date; +import net.i2p.data.DatabaseEntry; import net.i2p.data.Hash; +import net.i2p.data.LeaseSet; import net.i2p.data.RouterInfo; import net.i2p.data.i2np.DatabaseSearchReplyMessage; import net.i2p.data.i2np.DatabaseStoreMessage; @@ -78,22 +80,23 @@ class SearchUpdateReplyFoundJob extends JobImpl implements ReplyJob { long timeToReply = _state.dataFound(_peer); DatabaseStoreMessage msg = (DatabaseStoreMessage)message; - if (msg.getValueType() == DatabaseStoreMessage.KEY_TYPE_LEASESET) { + DatabaseEntry entry = msg.getEntry(); + if (entry.getType() == DatabaseEntry.KEY_TYPE_LEASESET) { try { - _facade.store(msg.getKey(), msg.getLeaseSet()); + _facade.store(msg.getKey(), (LeaseSet) entry); getContext().profileManager().dbLookupSuccessful(_peer, timeToReply); } catch (IllegalArgumentException iae) { if (_log.shouldLog(Log.ERROR)) _log.warn("Peer " + _peer + " sent us an invalid leaseSet: " + iae.getMessage()); getContext().profileManager().dbLookupReply(_peer, 0, 0, 1, 0, timeToReply); } - } else if (msg.getValueType() == DatabaseStoreMessage.KEY_TYPE_ROUTERINFO) { + } else if (entry.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) { if (_log.shouldLog(Log.INFO)) _log.info(getJobId() + ": dbStore received on search containing router " + msg.getKey() + " with publishDate of " - + new Date(msg.getRouterInfo().getPublished())); + + new Date(entry.getDate())); try { - _facade.store(msg.getKey(), msg.getRouterInfo()); + _facade.store(msg.getKey(), (RouterInfo) entry); getContext().profileManager().dbLookupSuccessful(_peer, timeToReply); } catch (IllegalArgumentException iae) { if (_log.shouldLog(Log.ERROR)) @@ -102,7 +105,7 @@ class SearchUpdateReplyFoundJob extends JobImpl implements ReplyJob { } } else { if (_log.shouldLog(Log.ERROR)) - _log.error(getJobId() + ": Unknown db store type?!@ " + msg.getValueType()); + _log.error(getJobId() + ": Unknown db store type?!@ " + entry.getType()); } } else if (message instanceof DatabaseSearchReplyMessage) { _job.replyFound((DatabaseSearchReplyMessage)message, _peer); diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/StoreJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/StoreJob.java index ad8217c6a7944319b2ee195015501445c4a456c8..c1a8494290d3be1bb1573b2d6bd3ebcc6eab8b51 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/StoreJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/StoreJob.java @@ -13,7 +13,7 @@ import java.util.Iterator; import java.util.List; import java.util.Set; -import net.i2p.data.DataStructure; +import net.i2p.data.DatabaseEntry; import net.i2p.data.Hash; import net.i2p.data.LeaseSet; import net.i2p.data.RouterInfo; @@ -61,7 +61,7 @@ class StoreJob extends JobImpl { * */ public StoreJob(RouterContext context, KademliaNetworkDatabaseFacade facade, Hash key, - DataStructure data, Job onSuccess, Job onFailure, long timeoutMs) { + DatabaseEntry data, Job onSuccess, Job onFailure, long timeoutMs) { this(context, facade, key, data, onSuccess, onFailure, timeoutMs, null); } @@ -70,7 +70,7 @@ class StoreJob extends JobImpl { * already know they have it). This can be null. */ public StoreJob(RouterContext context, KademliaNetworkDatabaseFacade facade, Hash key, - DataStructure data, Job onSuccess, Job onFailure, long timeoutMs, Set<Hash> toSkip) { + DatabaseEntry data, Job onSuccess, Job onFailure, long timeoutMs, Set<Hash> toSkip) { super(context); _log = context.logManager().getLog(StoreJob.class); _facade = facade; @@ -167,8 +167,8 @@ class StoreJob extends JobImpl { _log.info(getJobId() + ": Continue sending key " + _state.getTarget() + " after " + _state.getAttempted().size() + " tries to " + closestHashes); for (Iterator<Hash> iter = closestHashes.iterator(); iter.hasNext(); ) { Hash peer = iter.next(); - DataStructure ds = _facade.getDataStore().get(peer); - if ( (ds == null) || !(ds instanceof RouterInfo) ) { + DatabaseEntry ds = _facade.getDataStore().get(peer); + if ( (ds == null) || !(ds.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) ) { if (_log.shouldLog(Log.INFO)) _log.info(getJobId() + ": Error selecting closest hash that wasnt a router! " + peer + " : " + ds); _state.addSkipped(peer); @@ -255,16 +255,19 @@ class StoreJob extends JobImpl { * */ private void sendStore(RouterInfo router, int responseTime) { + if (!_state.getTarget().equals(_state.getData().getHash())) { + _log.error("Hash mismatch StoreJob"); + return; + } DatabaseStoreMessage msg = new DatabaseStoreMessage(getContext()); - msg.setKey(_state.getTarget()); - if (_state.getData() instanceof RouterInfo) { - msg.setRouterInfo((RouterInfo)_state.getData()); + if (_state.getData().getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) { if (responseTime > MAX_DIRECT_EXPIRATION) responseTime = MAX_DIRECT_EXPIRATION; - } else if (_state.getData() instanceof LeaseSet) - msg.setLeaseSet((LeaseSet)_state.getData()); - else + } else if (_state.getData().getType() == DatabaseEntry.KEY_TYPE_LEASESET) { + } else { throw new IllegalArgumentException("Storing an unknown data type! " + _state.getData()); + } + msg.setEntry(_state.getData()); msg.setMessageExpiration(getContext().clock().now() + _timeoutMs); if (router.getIdentity().equals(getContext().router().getRouterInfo().getIdentity())) { @@ -286,7 +289,7 @@ class StoreJob extends JobImpl { * */ private void sendStore(DatabaseStoreMessage msg, RouterInfo peer, long expiration) { - if (msg.getValueType() == DatabaseStoreMessage.KEY_TYPE_LEASESET) { + if (msg.getEntry().getType() == DatabaseEntry.KEY_TYPE_LEASESET) { getContext().statManager().addRateData("netDb.storeLeaseSetSent", 1, 0); // if it is an encrypted leaseset... if (getContext().keyRing().get(msg.getKey()) != null) @@ -440,7 +443,6 @@ class StoreJob extends JobImpl { sent = wm.getMessage(); _state.addPending(to, wm); } else { - sent = msg; _state.addPending(to); // now that almost all floodfills are at 0.7.10, // just refuse to store unencrypted to older ones. diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/StoreState.java b/router/java/src/net/i2p/router/networkdb/kademlia/StoreState.java index eb131fdfc5c5608bbe1e05aeb53cb58d498fec6a..9666c09be520533526c44e46a9621b9b6dce8f37 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/StoreState.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/StoreState.java @@ -9,7 +9,7 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; -import net.i2p.data.DataStructure; +import net.i2p.data.DatabaseEntry; import net.i2p.data.Hash; import net.i2p.router.RouterContext; @@ -19,7 +19,7 @@ import net.i2p.router.RouterContext; class StoreState { private RouterContext _context; private Hash _key; - private DataStructure _data; + private DatabaseEntry _data; private final HashSet<Hash> _pendingPeers; private Map<Hash, Long> _pendingPeerTimes; private Map<Hash, MessageWrapper.WrappedMessage> _pendingMessages; @@ -31,10 +31,10 @@ class StoreState { private volatile long _completed; private volatile long _started; - public StoreState(RouterContext ctx, Hash key, DataStructure data) { + public StoreState(RouterContext ctx, Hash key, DatabaseEntry data) { this(ctx, key, data, null); } - public StoreState(RouterContext ctx, Hash key, DataStructure data, Set<Hash> toSkip) { + public StoreState(RouterContext ctx, Hash key, DatabaseEntry data, Set<Hash> toSkip) { _context = ctx; _key = key; _data = data; @@ -54,7 +54,7 @@ class StoreState { } public Hash getTarget() { return _key; } - public DataStructure getData() { return _data; } + public DatabaseEntry getData() { return _data; } public Set<Hash> getPending() { synchronized (_pendingPeers) { return (Set<Hash>)_pendingPeers.clone(); @@ -114,7 +114,7 @@ class StoreState { public void addPending(Hash peer) { synchronized (_pendingPeers) { _pendingPeers.add(peer); - _pendingPeerTimes.put(peer, new Long(_context.clock().now())); + _pendingPeerTimes.put(peer, Long.valueOf(_context.clock().now())); } synchronized (_attemptedPeers) { _attemptedPeers.add(peer); @@ -124,7 +124,7 @@ class StoreState { synchronized (_pendingPeers) { _pendingPeers.addAll(pending); for (Iterator<Hash> iter = pending.iterator(); iter.hasNext(); ) - _pendingPeerTimes.put(iter.next(), new Long(_context.clock().now())); + _pendingPeerTimes.put(iter.next(), Long.valueOf(_context.clock().now())); } synchronized (_attemptedPeers) { _attemptedPeers.addAll(pending); diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/TransientDataStore.java b/router/java/src/net/i2p/router/networkdb/kademlia/TransientDataStore.java index d5e10738c26c560ed97169bf4d4d4f296336288b..e0a3a2a633762639891abf69b4697fb0143dafff 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/TransientDataStore.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/TransientDataStore.java @@ -8,14 +8,15 @@ package net.i2p.router.networkdb.kademlia; * */ +import java.util.Collection; import java.util.Date; import java.util.concurrent.ConcurrentHashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; +import net.i2p.data.DatabaseEntry; import net.i2p.data.DataHelper; -import net.i2p.data.DataStructure; import net.i2p.data.Hash; import net.i2p.data.LeaseSet; import net.i2p.data.RouterInfo; @@ -24,7 +25,7 @@ import net.i2p.util.Log; class TransientDataStore implements DataStore { private Log _log; - private ConcurrentHashMap<Hash, DataStructure> _data; + private ConcurrentHashMap<Hash, DatabaseEntry> _data; protected RouterContext _context; public TransientDataStore(RouterContext ctx) { @@ -51,12 +52,28 @@ class TransientDataStore implements DataStore { return new HashSet(_data.keySet()); } + /** + * @return not a copy + * @since 0.8.3 + */ + public Collection<DatabaseEntry> getEntries() { + return _data.values(); + } + + /** + * @return not a copy + * @since 0.8.3 + */ + public Set<Map.Entry<Hash, DatabaseEntry>> getMapEntries() { + return _data.entrySet(); + } + /** for PersistentDataStore only - don't use here @throws IAE always */ - public DataStructure get(Hash key, boolean persist) { + public DatabaseEntry get(Hash key, boolean persist) { throw new IllegalArgumentException("no"); } - public DataStructure get(Hash key) { + public DatabaseEntry get(Hash key) { return _data.get(key); } @@ -66,15 +83,15 @@ class TransientDataStore implements DataStore { public int countLeaseSets() { int count = 0; - for (DataStructure d : _data.values()) { - if (d instanceof LeaseSet) + for (DatabaseEntry d : _data.values()) { + if (d.getType() == DatabaseEntry.KEY_TYPE_LEASESET) count++; } return count; } /** for PersistentDataStore only - don't use here @throws IAE always */ - public boolean put(Hash key, DataStructure data, boolean persist) { + public boolean put(Hash key, DatabaseEntry data, boolean persist) { throw new IllegalArgumentException("no"); } @@ -82,14 +99,14 @@ class TransientDataStore implements DataStore { * @param data must be validated before here * @return success */ - public boolean put(Hash key, DataStructure data) { + public boolean put(Hash key, DatabaseEntry data) { if (data == null) return false; if (_log.shouldLog(Log.DEBUG)) _log.debug("Storing key " + key); - DataStructure old = null; + DatabaseEntry old = null; old = _data.putIfAbsent(key, data); boolean rv = false; - if (data instanceof RouterInfo) { + if (data.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) { // Don't do this here so we don't reset it at router startup; // the StoreMessageJob calls this //_context.profileManager().heardAbout(key); @@ -113,7 +130,7 @@ class TransientDataStore implements DataStore { _log.info("New router for " + key + ": published on " + new Date(ri.getPublished())); rv = true; } - } else if (data instanceof LeaseSet) { + } else if (data.getType() == DatabaseEntry.KEY_TYPE_LEASESET) { LeaseSet ls = (LeaseSet)data; if (old != null) { LeaseSet ols = (LeaseSet)old; @@ -144,23 +161,13 @@ class TransientDataStore implements DataStore { return rv; } - @Override - public int hashCode() { - return DataHelper.hashCode(_data); - } - @Override - public boolean equals(Object obj) { - if ( (obj == null) || (obj.getClass() != getClass()) ) return false; - TransientDataStore ds = (TransientDataStore)obj; - return DataHelper.eq(ds._data, _data); - } @Override public String toString() { StringBuilder buf = new StringBuilder(); buf.append("Transient DataStore: ").append(_data.size()).append("\nKeys: "); - for (Map.Entry<Hash, DataStructure> e : _data.entrySet()) { + for (Map.Entry<Hash, DatabaseEntry> e : _data.entrySet()) { Hash key = e.getKey(); - DataStructure dp = e.getValue(); + DatabaseEntry dp = e.getValue(); buf.append("\n\t*Key: ").append(key.toString()).append("\n\tContent: ").append(dp.toString()); } buf.append("\n"); @@ -168,11 +175,11 @@ class TransientDataStore implements DataStore { } /** for PersistentDataStore only - don't use here */ - public DataStructure remove(Hash key, boolean persist) { + public DatabaseEntry remove(Hash key, boolean persist) { throw new IllegalArgumentException("no"); } - public DataStructure remove(Hash key) { + public DatabaseEntry remove(Hash key) { if (_log.shouldLog(Log.DEBUG)) _log.debug("Removing key " + key.toBase64()); return _data.remove(key); diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/XORComparator.java b/router/java/src/net/i2p/router/networkdb/kademlia/XORComparator.java index 3c2b9d2d2c8c8f5b2e11909f2714077c9484f685..71dbefc6e2c4b1e53f6aac9e7b8311bd3efd2a71 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/XORComparator.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/XORComparator.java @@ -9,7 +9,7 @@ import net.i2p.data.Hash; * Help sort Hashes in relation to a base key using the XOR metric * */ -class XORComparator implements Comparator { +class XORComparator implements Comparator<Hash> { private Hash _base; /** * @param target key to compare distances with @@ -17,15 +17,11 @@ class XORComparator implements Comparator { public XORComparator(Hash target) { _base = target; } - public int compare(Object lhs, Object rhs) { + public int compare(Hash lhs, Hash rhs) { if (lhs == null) throw new NullPointerException("LHS is null"); if (rhs == null) throw new NullPointerException("RHS is null"); - if ( (lhs instanceof Hash) && (rhs instanceof Hash) ) { - byte lhsDelta[] = DataHelper.xor(((Hash)lhs).getData(), _base.getData()); - byte rhsDelta[] = DataHelper.xor(((Hash)rhs).getData(), _base.getData()); - return DataHelper.compareTo(lhsDelta, rhsDelta); - } else { - throw new ClassCastException(lhs.getClass().getName() + " / " + rhs.getClass().getName()); - } + byte lhsDelta[] = DataHelper.xor(lhs.getData(), _base.getData()); + byte rhsDelta[] = DataHelper.xor(rhs.getData(), _base.getData()); + return DataHelper.compareTo(lhsDelta, rhsDelta); } } diff --git a/router/java/src/net/i2p/router/networkdb/reseed/ReseedChecker.java b/router/java/src/net/i2p/router/networkdb/reseed/ReseedChecker.java index dd11c4ae2145178c5fc1fbc75cd5d1f86c12c5db..6bb816985da20e829434de112d4e815c3b47fc43 100644 --- a/router/java/src/net/i2p/router/networkdb/reseed/ReseedChecker.java +++ b/router/java/src/net/i2p/router/networkdb/reseed/ReseedChecker.java @@ -35,9 +35,9 @@ public class ReseedChecker { if (!noReseedFile.exists() && !noReseedFileAlt1.exists() && !noReseedFileAlt2.exists() && !noReseedFileAlt3.exists()) { Log _log = context.logManager().getLog(ReseedChecker.class); if (count <= 1) - _log.error("Downloading peer router information for a new I2P installation"); + _log.logAlways(Log.INFO, "Downloading peer router information for a new I2P installation"); else - _log.error("Very few routerInfo files remaining - reseeding now"); + _log.logAlways(Log.WARN, "Very few known peers remaining - reseeding now"); Reseeder reseeder = new Reseeder(context); reseeder.requestReseed(); } diff --git a/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java b/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java index 4f225ec977ddfc59cc2508744d9da3bcb3043f4d..3e1c0b0753c533f69ba5eff10d29cecb2c53647a 100644 --- a/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java +++ b/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java @@ -3,6 +3,7 @@ package net.i2p.router.networkdb.reseed; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; +import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.Collections; @@ -13,7 +14,10 @@ import java.util.Set; import java.util.StringTokenizer; import net.i2p.I2PAppContext; +import net.i2p.data.DataHelper; +import net.i2p.router.RouterClock; import net.i2p.router.RouterContext; +import net.i2p.router.util.RFC822Date; import net.i2p.util.EepGet; import net.i2p.util.I2PAppThread; import net.i2p.util.Log; @@ -33,21 +37,32 @@ import net.i2p.util.Translate; * the router log, and the wrapper log. */ public class Reseeder { + /** FIXME don't keep a static reference, store _isRunning some other way */ private static ReseedRunner _reseedRunner; - private RouterContext _context; - private Log _log; + private final RouterContext _context; + private final Log _log; // Reject unreasonably big files, because we download into a ByteArrayOutputStream. private static final long MAX_RESEED_RESPONSE_SIZE = 1024 * 1024; + /** limit to spend on a single host, to avoid getting stuck on one that is seriously overloaded */ + private static final int MAX_TIME_PER_HOST = 7 * 60 * 1000; + /** + * NOTE - URLs in both the standard and SSL groups should use the same hostname and path, + * so the reseed process will not download from both. + * + * NOTE - Each seedURL must be a directory, it must end with a '/', + * it can't end with 'index.html', for example. Both because of how individual file + * URLs are constructed, and because SSLEepGet doesn't follow redirects. + */ public static final String DEFAULT_SEED_URL = - "http://a.netdb.i2p2.de/,http://b.netdb.i2p2.de/,http://c.netdb.i2p2.de/," + - "http://reseed.i2p-projekt.de/,http://www.i2pbote.net/netDb/,http://r31453.ovh.net/static_media/files/netDb/"; + "http://a.netdb.i2p2.de/,http://c.netdb.i2p2.de/," + + "http://reseed.i2p-projekt.de/,http://forum.i2p2.de/netdb/,http://www.i2pbote.net/netDb/,http://r31453.ovh.net/static_media/files/netDb/"; /** @since 0.8.2 */ public static final String DEFAULT_SSL_SEED_URL = "https://a.netdb.i2p2.de/,https://c.netdb.i2p2.de/," + - "https://www.i2pbote.net/netDb/," + + "https://forum.i2p2.de/netdb/,https://www.i2pbote.net/netDb/," + "https://r31453.ovh.net/static_media/files/netDb/"; private static final String PROP_INPROGRESS = "net.i2p.router.web.ReseedHandler.reseedInProgress"; @@ -91,13 +106,13 @@ public class Reseeder { private String _proxyHost; private int _proxyPort; private SSLEepGet.SSLState _sslState; + private int _gotDate; + private long _attemptStarted; + private static final int MAX_DATE_SETS = 2; public ReseedRunner() { - _isRunning = false; - System.clearProperty(PROP_ERROR); - System.setProperty(PROP_STATUS, _("Reseeding")); - System.setProperty(PROP_INPROGRESS, "true"); } + public boolean isRunning() { return _isRunning; } /* @@ -106,6 +121,11 @@ public class Reseeder { */ public void run() { _isRunning = true; + System.clearProperty(PROP_ERROR); + System.setProperty(PROP_STATUS, _("Reseeding")); + System.setProperty(PROP_INPROGRESS, "true"); + _attemptStarted = 0; + _gotDate = 0; _sslState = null; // start fresh if (_context.getBooleanProperty(PROP_PROXY_ENABLE)) { _proxyHost = _context.getProperty(PROP_PROXY_HOST); @@ -145,8 +165,48 @@ public class Reseeder { public void bytesTransferred(long alreadyTransferred, int currentWrite, long bytesTransferred, long bytesRemaining, String url) {} public void transferComplete(long alreadyTransferred, long bytesTransferred, long bytesRemaining, String url, String outputFile, boolean notModified) {} public void transferFailed(String url, long bytesTransferred, long bytesRemaining, int currentAttempt) {} - public void headerReceived(String url, int attemptNum, String key, String val) {} - public void attempting(String url) {} + + /** + * Use the Date header as a backup time source + */ + public void headerReceived(String url, int attemptNum, String key, String val) { + // We do this more than once, because + // the first SSL handshake may take a while, and it may take the server + // a while to render the index page. + if (_gotDate < MAX_DATE_SETS && "date".equalsIgnoreCase(key) && _attemptStarted > 0) { + long timeRcvd = System.currentTimeMillis(); + long serverTime = RFC822Date.parse822Date(val); + if (serverTime > 0) { + // add 500ms since it's 1-sec resolution, and add half the RTT + long now = serverTime + 500 + ((timeRcvd - _attemptStarted) / 2); + long offset = now - _context.clock().now(); + if (_context.clock().getUpdatedSuccessfully()) { + // 2nd time better than the first + if (_gotDate > 0) + _context.clock().setNow(now, RouterClock.DEFAULT_STRATUM - 2); + else + _context.clock().setNow(now, RouterClock.DEFAULT_STRATUM - 1); + if (_log.shouldLog(Log.WARN)) + _log.warn("Reseed adjusting clock by " + + DataHelper.formatDuration(Math.abs(offset))); + } else { + // No peers or NTP yet, this is probably better than the peer average will be for a while + // default stratum - 1, so the peer average is a worse stratum + _context.clock().setNow(now, RouterClock.DEFAULT_STRATUM - 1); + _log.logAlways(Log.WARN, "NTP failure, Reseed adjusting clock by " + + DataHelper.formatDuration(Math.abs(offset))); + } + _gotDate++; + } + } + } + + /** save the start time */ + public void attempting(String url) { + if (_gotDate < MAX_DATE_SETS) + _attemptStarted = System.currentTimeMillis(); + } + // End of EepGet status listeners /** @@ -166,7 +226,7 @@ public class Reseeder { List<String> URLList = new ArrayList(); String URLs = _context.getProperty(PROP_RESEED_URL); boolean defaulted = URLs == null; - boolean SSLDisable = _context.getBooleanProperty(PROP_SSL_DISABLE); + boolean SSLDisable = _context.getBooleanPropertyDefaultTrue(PROP_SSL_DISABLE); if (defaulted) { if (SSLDisable) URLs = DEFAULT_SEED_URL; @@ -176,14 +236,14 @@ public class Reseeder { StringTokenizer tok = new StringTokenizer(URLs, " ,"); while (tok.hasMoreTokens()) URLList.add(tok.nextToken().trim()); - Collections.shuffle(URLList); + Collections.shuffle(URLList, _context.random()); if (defaulted && !SSLDisable) { // put the non-SSL at the end of the SSL List<String> URLList2 = new ArrayList(); tok = new StringTokenizer(DEFAULT_SEED_URL, " ,"); while (tok.hasMoreTokens()) URLList2.add(tok.nextToken().trim()); - Collections.shuffle(URLList2); + Collections.shuffle(URLList2, _context.random()); URLList.addAll(URLList2); } int total = 0; @@ -228,6 +288,8 @@ public class Reseeder { **/ private int reseedOne(String seedURL, boolean echoStatus) { try { + // Don't use context clock as we may be adjusting the time + final long timeLimit = System.currentTimeMillis() + MAX_TIME_PER_HOST; System.setProperty(PROP_STATUS, _("Reseeding: fetching seed URL.")); System.err.println("Reseeding from " + seedURL); URL dir = new URL(seedURL); @@ -262,11 +324,12 @@ public class Reseeder { } List<String> urlList = new ArrayList(urls); - Collections.shuffle(urlList); + Collections.shuffle(urlList, _context.random()); int fetched = 0; int errors = 0; // 200 max from one URL - for (Iterator<String> iter = urlList.iterator(); iter.hasNext() && fetched < 200; ) { + for (Iterator<String> iter = urlList.iterator(); + iter.hasNext() && fetched < 200 && System.currentTimeMillis() < timeLimit; ) { try { System.setProperty(PROP_STATUS, _("Reseeding: fetching router info from seed URL ({0} successful, {1} errors).", fetched, errors)); @@ -278,7 +341,7 @@ public class Reseeder { if (fetched % 60 == 0) System.out.println(); } - } catch (Exception e) { + } catch (IOException e) { errors++; } } @@ -298,20 +361,20 @@ public class Reseeder { } /* Since we don't return a value, we should always throw an exception if something fails. */ - private void fetchSeed(String seedURL, String peer) throws Exception { + private void fetchSeed(String seedURL, String peer) throws IOException { URL url = new URL(seedURL + (seedURL.endsWith("/") ? "" : "/") + "routerInfo-" + peer + ".dat"); byte data[] = readURL(url); if (data == null) { // Logging deprecated here since attemptFailed() provides better info _log.debug("Failed fetching seed: " + url.toString()); - throw new Exception ("Failed fetching seed."); + throw new IOException("Failed fetching seed."); } //System.out.println("read: " + (data != null ? data.length : -1)); writeSeed(peer, data); } - private byte[] readURL(URL url) throws Exception { + private byte[] readURL(URL url) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(4*1024); EepGet get; @@ -338,15 +401,21 @@ public class Reseeder { return null; } - private void writeSeed(String name, byte data[]) throws Exception { + private void writeSeed(String name, byte data[]) throws IOException { String dirName = "netDb"; // _context.getProperty("router.networkDatabase.dbDir", "netDb"); File netDbDir = new SecureDirectory(_context.getRouterDir(), dirName); if (!netDbDir.exists()) { boolean ok = netDbDir.mkdirs(); } - FileOutputStream fos = new SecureFileOutputStream(new File(netDbDir, "routerInfo-" + name + ".dat")); - fos.write(data); - fos.close(); + FileOutputStream fos = null; + try { + fos = new SecureFileOutputStream(new File(netDbDir, "routerInfo-" + name + ".dat")); + fos.write(data); + } finally { + try { + if (fos != null) fos.close(); + } catch (IOException ioe) {} + } } } diff --git a/router/java/src/net/i2p/router/peermanager/Calculator.java b/router/java/src/net/i2p/router/peermanager/Calculator.java deleted file mode 100644 index 99fb99fd8240a28600e2d96ddb5663c983bdc091..0000000000000000000000000000000000000000 --- a/router/java/src/net/i2p/router/peermanager/Calculator.java +++ /dev/null @@ -1,18 +0,0 @@ -package net.i2p.router.peermanager; - - -/** - * Provide a means of quantifying a profiles fitness in some particular aspect, as well - * as to coordinate via statics the four known aspects. - * - */ -public class Calculator { - /** - * Evaluate the profile according to the current metric - */ - public double calc(PeerProfile profile) { return 0.0d; } - /** - * Evaluate the profile according to the current metric - */ - public boolean calcBoolean(PeerProfile profile) { return false; } -} diff --git a/router/java/src/net/i2p/router/peermanager/CapacityCalculator.java b/router/java/src/net/i2p/router/peermanager/CapacityCalculator.java index 891ca88c47596d167dfb19c44701a16e0f106335..96570260c5de43c09b24efe897e8ca963b4a0b8c 100644 --- a/router/java/src/net/i2p/router/peermanager/CapacityCalculator.java +++ b/router/java/src/net/i2p/router/peermanager/CapacityCalculator.java @@ -1,30 +1,22 @@ package net.i2p.router.peermanager; -import net.i2p.router.RouterContext; +import net.i2p.I2PAppContext; import net.i2p.stat.Rate; import net.i2p.stat.RateStat; -import net.i2p.util.Log; /** * Estimate how many of our tunnels the peer can join per hour. */ -public class CapacityCalculator extends Calculator { - private Log _log; - private RouterContext _context; - - public CapacityCalculator(RouterContext context) { - _context = context; - _log = context.logManager().getLog(CapacityCalculator.class); - } +class CapacityCalculator { + private static final I2PAppContext _context = I2PAppContext.getGlobalContext(); /** used to adjust each period so that we keep trying to expand the peer's capacity */ - static long GROWTH_FACTOR = 5; + static final long GROWTH_FACTOR = 5; /** the calculator estimates over a 1 hour period */ private static long ESTIMATE_PERIOD = 60*60*1000; - @Override - public double calc(PeerProfile profile) { + public static double calc(PeerProfile profile) { double capacity; if (tooOld(profile)) { @@ -91,37 +83,42 @@ public class CapacityCalculator extends Calculator { * * Let A = accects, R = rejects, F = fails * @return estimated and adjusted accepts per hour, for the given period - * which is, more or less, max(0, 5 + (A * (A / (A + R))) - (4 * F)) + * which is, more or less, max(0, 5 + (A * (A / (A + 2R))) - (4 * F)) */ private static double estimateCapacity(RateStat acceptStat, RateStat rejectStat, RateStat failedStat, int period) { Rate curAccepted = acceptStat.getRate(period); Rate curRejected = rejectStat.getRate(period); Rate curFailed = failedStat.getRate(period); - long eventCount = 0; - if (curAccepted != null) + double eventCount = 0; + if (curAccepted != null) { eventCount = curAccepted.getCurrentEventCount() + curAccepted.getLastEventCount(); - // Punish for rejections. - // We don't want to simply do eventCount -= rejected or we get to zero with 50% rejection, - // and we don't want everybody to be at zero during times of congestion. - if (eventCount > 0) { - long rejected = curRejected.getCurrentEventCount() + curRejected.getLastEventCount(); - eventCount = eventCount * eventCount / (eventCount + rejected); + // Punish for rejections. + // We don't want to simply do eventCount -= rejected or we get to zero with 50% rejection, + // and we don't want everybody to be at zero during times of congestion. + if (eventCount > 0 && curRejected != null) { + long rejected = curRejected.getCurrentEventCount() + curRejected.getLastEventCount(); + if (rejected > 0) + eventCount *= eventCount / (eventCount + (2 * rejected)); + } } + double stretch = ((double)ESTIMATE_PERIOD) / period; double val = eventCount * stretch; - long failed = 0; + // Let's say a failure is 4 times worse than a rejection. // It's actually much worse than that, but with 2-hop tunnels and a 8-peer // fast pool, for example, you have a 1/7 chance of being falsely blamed. // We also don't want to drive everybody's capacity to zero, that isn't helpful. - if (curFailed != null) - failed = (long) (0.5 + (4.0 * (curFailed.getCurrentTotalValue() + curFailed.getLastTotalValue()) / 100.0)); - if (failed > 0) { - //if ( (period <= 10*60*1000) && (curFailed.getCurrentEventCount() > 0) ) - // return 0.0d; // their tunnels have failed in the last 0-10 minutes - //else - val -= failed * stretch; + if (curFailed != null) { + double failed = curFailed.getCurrentTotalValue() + curFailed.getLastTotalValue(); + if (failed > 0) { + //if ( (period <= 10*60*1000) && (curFailed.getCurrentEventCount() > 0) ) + // return 0.0d; // their tunnels have failed in the last 0-10 minutes + //else + // .04 = 4.0 / 100.0 adjustment to failed + val -= 0.04 * failed * stretch; + } } val += GROWTH_FACTOR; diff --git a/router/java/src/net/i2p/router/peermanager/DBHistory.java b/router/java/src/net/i2p/router/peermanager/DBHistory.java index 36b9bc9a3015d08fa1e1f3689a2292fd7d726571..3c5eb077efe8c8149d2c34e961a7e1a78c865579 100644 --- a/router/java/src/net/i2p/router/peermanager/DBHistory.java +++ b/router/java/src/net/i2p/router/peermanager/DBHistory.java @@ -13,8 +13,8 @@ import net.i2p.util.Log; * */ public class DBHistory { - private Log _log; - private RouterContext _context; + private final Log _log; + private final RouterContext _context; private long _successfulLookups; private long _failedLookups; private RateStat _failedLookupRate; @@ -32,25 +32,13 @@ public class DBHistory { private long _lastStoreFailed; private long _unpromptedDbStoreNew; private long _unpromptedDbStoreOld; - private String _statGroup; + private final String _statGroup; public DBHistory(RouterContext context, String statGroup) { _context = context; _log = context.logManager().getLog(DBHistory.class); _statGroup = statGroup; - _successfulLookups = 0; - _failedLookups = 0; - _failedLookupRate = null; - _invalidReplyRate = null; - _lookupReplyNew = 0; - _lookupReplyOld = 0; - _lookupReplyDuplicate = 0; - _lookupReplyInvalid = 0; - _lookupsReceived = 0; - _avgDelayBetweenLookupsReceived = 0; _lastLookupReceived = -1; - _unpromptedDbStoreNew = 0; - _unpromptedDbStoreOld = 0; createRates(statGroup); } diff --git a/router/java/src/net/i2p/router/peermanager/IntegrationCalculator.java b/router/java/src/net/i2p/router/peermanager/IntegrationCalculator.java index f306b199573ceead4a7c635d9953cc35d1dba7cf..14437e4bf01fddcbef6d64816d7c96da7564aea1 100644 --- a/router/java/src/net/i2p/router/peermanager/IntegrationCalculator.java +++ b/router/java/src/net/i2p/router/peermanager/IntegrationCalculator.java @@ -1,24 +1,13 @@ package net.i2p.router.peermanager; -import net.i2p.router.RouterContext; -import net.i2p.util.Log; - /** * Determine how well integrated the peer is - how likely they will be useful * to us if we are trying to get further connected. * */ -public class IntegrationCalculator extends Calculator { - private Log _log; - private RouterContext _context; - - public IntegrationCalculator(RouterContext context) { - _context = context; - _log = context.logManager().getLog(IntegrationCalculator.class); - } +class IntegrationCalculator { - @Override - public double calc(PeerProfile profile) { + public static double calc(PeerProfile profile) { long val = 0; if (profile.getIsExpandedDB()) { // give more weight to recent counts diff --git a/router/java/src/net/i2p/router/peermanager/PeerManager.java b/router/java/src/net/i2p/router/peermanager/PeerManager.java index bfe038e8c50266c7eaaab0d4ad11f5f1f4fe756d..8a7ea723d131d02e889619055715409937533e46 100644 --- a/router/java/src/net/i2p/router/peermanager/PeerManager.java +++ b/router/java/src/net/i2p/router/peermanager/PeerManager.java @@ -23,10 +23,9 @@ import net.i2p.data.RouterInfo; import net.i2p.router.PeerSelectionCriteria; import net.i2p.router.RouterContext; import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade; -import net.i2p.util.Log; -import net.i2p.util.SimpleScheduler; -import net.i2p.util.SimpleTimer; import net.i2p.util.ConcurrentHashSet; +import net.i2p.util.Log; +import net.i2p.util.SimpleTimer2; /** * Manage the current state of the statistics @@ -43,12 +42,15 @@ import net.i2p.util.ConcurrentHashSet; * */ class PeerManager { - private Log _log; - private RouterContext _context; - private ProfileOrganizer _organizer; - private ProfilePersistenceHelper _persistenceHelper; - private Set<Hash> _peersByCapability[]; + private final Log _log; + private final RouterContext _context; + private final ProfileOrganizer _organizer; + private final ProfilePersistenceHelper _persistenceHelper; + private final Set<Hash> _peersByCapability[]; private final Map<Hash, String> _capabilitiesByPeer; + private static final long REORGANIZE_TIME = 45*1000; + private static final long REORGANIZE_TIME_MEDIUM = 123*1000; + private static final long REORGANIZE_TIME_LONG = 551*1000; public PeerManager(RouterContext context) { _context = context; @@ -62,17 +64,30 @@ class PeerManager { _peersByCapability[i] = new ConcurrentHashSet(); loadProfiles(); ////_context.jobQueue().addJob(new EvaluateProfilesJob(_context)); - SimpleScheduler.getInstance().addPeriodicEvent(new Reorg(), 0, 45*1000); + //SimpleScheduler.getInstance().addPeriodicEvent(new Reorg(), 0, REORGANIZE_TIME); + new Reorg(); //_context.jobQueue().addJob(new PersistProfilesJob(_context, this)); } - private class Reorg implements SimpleTimer.TimedEvent { + private class Reorg extends SimpleTimer2.TimedEvent { + public Reorg() { + super(SimpleTimer2.getInstance(), REORGANIZE_TIME); + } public void timeReached() { try { _organizer.reorganize(true); } catch (Throwable t) { _log.log(Log.CRIT, "Error evaluating profiles", t); } + long uptime = _context.router().getUptime(); + long delay; + if (uptime > 2*60*60*1000) + delay = REORGANIZE_TIME_LONG; + else if (uptime > 10*60*1000) + delay = REORGANIZE_TIME_MEDIUM; + else + delay = REORGANIZE_TIME; + schedule(delay); } } @@ -115,6 +130,7 @@ class PeerManager { */ List<Hash> selectPeers(PeerSelectionCriteria criteria) { Set<Hash> peers = new HashSet(criteria.getMinimumRequired()); + // not a singleton, SANFP adds to it Set<Hash> exclude = new HashSet(1); exclude.add(_context.routerHash()); switch (criteria.getPurpose()) { diff --git a/router/java/src/net/i2p/router/peermanager/PeerProfile.java b/router/java/src/net/i2p/router/peermanager/PeerProfile.java index 6f7fe54bbe8acd7bdddd5f0ddccb98a85c26ad67..034f559ae43f4e045d2c19afb7b35aa9d4e174b5 100644 --- a/router/java/src/net/i2p/router/peermanager/PeerProfile.java +++ b/router/java/src/net/i2p/router/peermanager/PeerProfile.java @@ -24,10 +24,10 @@ import net.i2p.util.Log; */ public class PeerProfile { - private Log _log; - private RouterContext _context; + private final Log _log; + private final RouterContext _context; // whoozaat? - private Hash _peer; + private final Hash _peer; // general peer stats private long _firstHeardAbout; private long _lastHeardAbout; @@ -62,16 +62,13 @@ public class PeerProfile { public PeerProfile(RouterContext context, Hash peer) { this(context, peer, true); } + + /** + * @param expand must be true (see below) + */ public PeerProfile(RouterContext context, Hash peer, boolean expand) { _context = context; _log = context.logManager().getLog(PeerProfile.class); - _expanded = false; - _speedValue = 0; - _capacityValue = 0; - _integrationValue = 0; - _isFailing = false; - _consecutiveShitlists = 0; - _tunnelTestResponseTimeAvg = 0.0d; _peer = peer; // this is always true, and there are several places in the router that will NPE // if it is false, so all need to be fixed before we can have non-expanded profiles @@ -81,7 +78,6 @@ public class PeerProfile { /** what peer is being profiled */ public Hash getPeer() { return _peer; } - public void setPeer(Hash peer) { _peer = peer; } /** * are we keeping an expanded profile on the peer, or just the bare minimum. @@ -133,7 +129,10 @@ public class PeerProfile { } - /** when did we first hear about this peer? */ + /** + * When did we first hear about this peer? + * Currently unused, candidate for removal. + */ public long getFirstHeardAbout() { return _firstHeardAbout; } public void setFirstHeardAbout(long when) { _firstHeardAbout = when; } @@ -474,9 +473,9 @@ public class PeerProfile { _log.debug("Coalesced: speed [" + _speedValue + "] capacity [" + _capacityValue + "] integration [" + _integrationValue + "] failing? [" + _isFailing + "]"); } - private double calculateSpeed() { return _context.speedCalculator().calc(this); } - private double calculateCapacity() { return _context.capacityCalculator().calc(this); } - private double calculateIntegration() { return _context.integrationCalculator().calc(this); } + private double calculateSpeed() { return SpeedCalculator.calc(this); } + private double calculateCapacity() { return CapacityCalculator.calc(this); } + private double calculateIntegration() { return IntegrationCalculator.calc(this); } /** deprecated - unused - always false */ private boolean calculateIsFailing() { return false; } /** deprecated - unused - always false */ @@ -484,14 +483,17 @@ public class PeerProfile { @Override public int hashCode() { return (_peer == null ? 0 : _peer.hashCode()); } + @Override public boolean equals(Object obj) { - if (obj == null) return false; - if (obj.getClass() != PeerProfile.class) return false; - if (_peer == null) return false; + if (obj == null || + (!(obj instanceof PeerProfile)) || + _peer == null) + return false; PeerProfile prof = (PeerProfile)obj; return _peer.equals(prof.getPeer()); } + @Override public String toString() { return "Profile: " + getPeer().toBase64(); } diff --git a/router/java/src/net/i2p/router/peermanager/PeerTestJob.java b/router/java/src/net/i2p/router/peermanager/PeerTestJob.java index 11e8cacb86c8d9137beeea0e495959b96a1b10e1..1d5fe3a849ac1dc098c434dc07ffe83ff316cc3f 100644 --- a/router/java/src/net/i2p/router/peermanager/PeerTestJob.java +++ b/router/java/src/net/i2p/router/peermanager/PeerTestJob.java @@ -178,8 +178,7 @@ public class PeerTestJob extends JobImpl { */ private DatabaseStoreMessage buildMessage(RouterInfo peer, TunnelId replyTunnel, Hash replyGateway, long nonce, long expiration) { DatabaseStoreMessage msg = new DatabaseStoreMessage(getContext()); - msg.setKey(peer.getIdentity().getHash()); - msg.setRouterInfo(peer); + msg.setEntry(peer); msg.setReplyGateway(replyGateway); msg.setReplyTunnel(replyTunnel); msg.setReplyToken(nonce); diff --git a/router/java/src/net/i2p/router/peermanager/ProfileManagerImpl.java b/router/java/src/net/i2p/router/peermanager/ProfileManagerImpl.java index 712a3cba65b643c4bcf71537c6ce69c98bf857a7..5a0a69f0be2e5cc1d2e1a00e53824b22d35f90f3 100644 --- a/router/java/src/net/i2p/router/peermanager/ProfileManagerImpl.java +++ b/router/java/src/net/i2p/router/peermanager/ProfileManagerImpl.java @@ -341,6 +341,7 @@ public class ProfileManagerImpl implements ProfileManager { PeerProfile prof = _context.profileOrganizer().getProfile(peer); if (prof == null) { prof = new PeerProfile(_context, peer); + prof.setFirstHeardAbout(_context.clock().now()); _context.profileOrganizer().addProfile(prof); } return prof; diff --git a/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java b/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java index 03b49269f46b3813a05382d9ca2455bfef26baf7..a63dd97699151becb03bc130c5f76bf928d70e50 100644 --- a/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java +++ b/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java @@ -2,7 +2,6 @@ package net.i2p.router.peermanager; import java.io.IOException; import java.io.OutputStream; -import java.io.Writer; import java.net.InetAddress; import java.net.UnknownHostException; import java.text.DecimalFormat; @@ -22,12 +21,14 @@ import java.util.TreeSet; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantReadWriteLock; +import net.i2p.crypto.SHA256Generator; import net.i2p.data.Hash; import net.i2p.data.RouterAddress; import net.i2p.data.RouterInfo; import net.i2p.router.NetworkDatabaseFacade; import net.i2p.router.RouterContext; import net.i2p.router.tunnel.pool.TunnelPeerSelector; +import net.i2p.router.util.RandomIterator; import net.i2p.stat.Rate; import net.i2p.stat.RateStat; import net.i2p.util.Log; @@ -39,23 +40,23 @@ import net.i2p.util.Log; * should be used to add new profiles (placing them into the appropriate groupings). */ public class ProfileOrganizer { - private Log _log; - private RouterContext _context; + private final Log _log; + private final RouterContext _context; /** H(routerIdentity) to PeerProfile for all peers that are fast and high capacity*/ - private Map<Hash, PeerProfile> _fastPeers; + private final Map<Hash, PeerProfile> _fastPeers; /** H(routerIdentity) to PeerProfile for all peers that have high capacities */ - private Map<Hash, PeerProfile> _highCapacityPeers; + private final Map<Hash, PeerProfile> _highCapacityPeers; /** H(routerIdentity) to PeerProfile for all peers that well integrated into the network and not failing horribly */ - private Map<Hash, PeerProfile> _wellIntegratedPeers; + private final Map<Hash, PeerProfile> _wellIntegratedPeers; /** H(routerIdentity) to PeerProfile for all peers that are not failing horribly */ - private Map<Hash, PeerProfile> _notFailingPeers; + private final Map<Hash, PeerProfile> _notFailingPeers; /** H(routerIdnetity), containing elements in _notFailingPeers */ - private List<Hash> _notFailingPeersList; + private final List<Hash> _notFailingPeersList; /** H(routerIdentity) to PeerProfile for all peers that ARE failing horribly (but that we haven't dropped reference to yet) */ - private Map<Hash, PeerProfile> _failingPeers; + private final Map<Hash, PeerProfile> _failingPeers; /** who are we? */ private Hash _us; - private ProfilePersistenceHelper _persistenceHelper; + private final ProfilePersistenceHelper _persistenceHelper; /** PeerProfile objects for all peers profiled, orderd by the ones with the highest capacity first */ private Set<PeerProfile> _strictCapacityOrder; @@ -67,7 +68,7 @@ public class ProfileOrganizer { /** integration value, seperating well integrated from not well integrated */ private double _thresholdIntegrationValue; - private InverseCapacityComparator _comp; + private final InverseCapacityComparator _comp; /** * Defines the minimum number of 'fast' peers that the organizer should select. See @@ -77,7 +78,9 @@ public class ProfileOrganizer { public static final String PROP_MINIMUM_FAST_PEERS = "profileOrganizer.minFastPeers"; public static final int DEFAULT_MINIMUM_FAST_PEERS = 8; /** this is misnamed, it is really the max minimum number. */ - private static final int DEFAULT_MAXIMUM_FAST_PEERS = 16; + private static final int DEFAULT_MAXIMUM_FAST_PEERS = 18; + private static final int ABSOLUTE_MAX_FAST_PEERS = 60; + /** * Defines the minimum number of 'high capacity' peers that the organizer should * select when using the mean - if less than this many are available, select the @@ -86,13 +89,11 @@ public class ProfileOrganizer { */ public static final String PROP_MINIMUM_HIGH_CAPACITY_PEERS = "profileOrganizer.minHighCapacityPeers"; public static final int DEFAULT_MINIMUM_HIGH_CAPACITY_PEERS = 10; + private static final int ABSOLUTE_MAX_HIGHCAP_PEERS = 150; /** synchronized against this lock when updating the tier that peers are located in (and when fetching them from a peer) */ private final ReentrantReadWriteLock _reorganizeLock = new ReentrantReadWriteLock(true); - /** incredibly weak PRNG, just used for shuffling peers. no need to waste the real PRNG on this */ - private Random _random = new Random(); - public ProfileOrganizer(RouterContext context) { _context = context; _log = context.logManager().getLog(ProfileOrganizer.class); @@ -104,9 +105,6 @@ public class ProfileOrganizer { _notFailingPeersList = new ArrayList(256); _failingPeers = new HashMap(16); _strictCapacityOrder = new TreeSet(_comp); - _thresholdSpeedValue = 0.0d; - _thresholdCapacityValue = 0.0d; - _thresholdIntegrationValue = 0.0d; _persistenceHelper = new ProfilePersistenceHelper(_context); _context.statManager().createRateStat("peer.profileSortTime", "How long the reorg takes sorting peers", "Peers", new long[] { 10*60*1000 }); @@ -255,10 +253,15 @@ public class ProfileOrganizer { return false; } - public void exportProfile(Hash profile, OutputStream out) throws IOException { + /** + * @return true if successful, false if not found + */ + public boolean exportProfile(Hash profile, OutputStream out) throws IOException { PeerProfile prof = getProfile(profile); - if (prof != null) + boolean rv = prof != null; + if (rv) _persistenceHelper.writeProfile(prof, out); + return rv; } /** @@ -275,6 +278,20 @@ public class ProfileOrganizer { public void selectFastPeers(int howMany, Set<Hash> exclude, Set<Hash> matches) { selectFastPeers(howMany, exclude, matches, 0); } + + /** + * Return a set of Hashes for peers that are both fast and reliable. If an insufficient + * number of peers are both fast and reliable, fall back onto high capacity peers, and if that + * doesn't contain sufficient peers, fall back onto not failing peers, and even THAT doesn't + * have sufficient peers, fall back onto failing peers. + * + * @param howMany how many peers are desired + * @param exclude set of Hashes for routers that we don't want selected + * @param matches set to store the return value in + * @param mask 0-4 Number of bytes to match to determine if peers in the same IP range should + * not be in the same tunnel. 0 = disable check; 1 = /8; 2 = /16; 3 = /24; 4 = exact IP match + * + */ public void selectFastPeers(int howMany, Set<Hash> exclude, Set<Hash> matches, int mask) { getReadLock(); try { @@ -291,6 +308,51 @@ public class ProfileOrganizer { return; } + /** + * Return a set of Hashes for peers that are both fast and reliable. If an insufficient + * number of peers are both fast and reliable, fall back onto high capacity peers, and if that + * doesn't contain sufficient peers, fall back onto not failing peers, and even THAT doesn't + * have sufficient peers, fall back onto failing peers. + * + * @param howMany how many peers are desired + * @param exclude set of Hashes for routers that we don't want selected + * @param matches set to store the return value in + * @param randomKey used for deterministic random partitioning into subtiers + * @param subTierMode 0 or 2-7: + *<pre> + * 0: no partitioning, use entire tier + * 2: return only from group 0 or 1 + * 3: return only from group 2 or 3 + * 4: return only from group 0 + * 5: return only from group 1 + * 6: return only from group 2 + * 7: return only from group 3 + *</pre> + */ + public void selectFastPeers(int howMany, Set<Hash> exclude, Set<Hash> matches, Hash randomKey, int subTierMode) { + getReadLock(); + try { + if (subTierMode > 0) { + int sz = _fastPeers.size(); + if (sz < 6 || (subTierMode >= 4 && sz < 12)) + subTierMode = 0; + } + if (subTierMode > 0) + locked_selectPeers(_fastPeers, howMany, exclude, matches, randomKey, subTierMode); + else + locked_selectPeers(_fastPeers, howMany, exclude, matches, 2); + } finally { releaseReadLock(); } + if (matches.size() < howMany) { + if (_log.shouldLog(Log.INFO)) + _log.info("selectFastPeers("+howMany+"), not enough fast (" + matches.size() + ") going on to highCap"); + selectHighCapacityPeers(howMany, exclude, matches, 2); + } else { + if (_log.shouldLog(Log.INFO)) + _log.info("selectFastPeers("+howMany+"), found enough fast (" + matches.size() + ")"); + } + return; + } + /** * Return a set of Hashes for peers that have a high capacity * @@ -298,6 +360,11 @@ public class ProfileOrganizer { public void selectHighCapacityPeers(int howMany, Set<Hash> exclude, Set<Hash> matches) { selectHighCapacityPeers(howMany, exclude, matches, 0); } + + /** + * @param mask 0-4 Number of bytes to match to determine if peers in the same IP range should + * not be in the same tunnel. 0 = disable check; 1 = /8; 2 = /16; 3 = /24; 4 = exact IP match + */ public void selectHighCapacityPeers(int howMany, Set<Hash> exclude, Set<Hash> matches, int mask) { getReadLock(); try { @@ -322,6 +389,7 @@ public class ProfileOrganizer { } return; } + /** * Return a set of Hashes for peers that are well integrated into the network. * @@ -329,6 +397,13 @@ public class ProfileOrganizer { public void selectWellIntegratedPeers(int howMany, Set<Hash> exclude, Set<Hash> matches) { selectWellIntegratedPeers(howMany, exclude, matches, 0); } + + /** + * Return a set of Hashes for peers that are well integrated into the network. + * + * @param mask 0-4 Number of bytes to match to determine if peers in the same IP range should + * not be in the same tunnel. 0 = disable check; 1 = /8; 2 = /16; 3 = /24; 4 = exact IP match + */ public void selectWellIntegratedPeers(int howMany, Set<Hash> exclude, Set<Hash> matches, int mask) { getReadLock(); try { @@ -345,6 +420,7 @@ public class ProfileOrganizer { return; } + /** * Return a set of Hashes for peers that are not failing, preferring ones that * we are already talking with @@ -353,12 +429,18 @@ public class ProfileOrganizer { public void selectNotFailingPeers(int howMany, Set<Hash> exclude, Set<Hash> matches) { selectNotFailingPeers(howMany, exclude, matches, false, 0); } + + /** + * @param mask ignored, should call locked_selectPeers, to be fixed + */ public void selectNotFailingPeers(int howMany, Set<Hash> exclude, Set<Hash> matches, int mask) { selectNotFailingPeers(howMany, exclude, matches, false, mask); } + public void selectNotFailingPeers(int howMany, Set<Hash> exclude, Set<Hash> matches, boolean onlyNotFailing) { selectNotFailingPeers(howMany, exclude, matches, onlyNotFailing, 0); } + /** * Return a set of Hashes for peers that are not failing, preferring ones that * we are already talking with @@ -367,6 +449,7 @@ public class ProfileOrganizer { * @param exclude what peers to skip (may be null) * @param matches set to store the matches in * @param onlyNotFailing if true, don't include any high capacity peers + * @param mask ignored, should call locked_selectPeers, to be fixed */ public void selectNotFailingPeers(int howMany, Set<Hash> exclude, Set<Hash> matches, boolean onlyNotFailing, int mask) { if (matches.size() < howMany) @@ -411,6 +494,9 @@ public class ProfileOrganizer { * and we're using this to try and limit connections. * * This DOES cascade further to non-connected peers. + * + * @param mask 0-4 Number of bytes to match to determine if peers in the same IP range should + * not be in the same tunnel. 0 = disable check; 1 = /8; 2 = /16; 3 = /24; 4 = exact IP match */ private void selectActiveNotFailingPeers2(int howMany, Set<Hash> exclude, Set<Hash> matches, int mask) { if (matches.size() < howMany) { @@ -442,6 +528,7 @@ public class ProfileOrganizer { public void selectAllNotFailingPeers(int howMany, Set<Hash> exclude, Set<Hash> matches, boolean onlyNotFailing) { selectAllNotFailingPeers(howMany, exclude, matches, onlyNotFailing, 0); } + /** * @param mask ignored, should call locked_selectPeers, to be fixed * @@ -491,6 +578,7 @@ public class ProfileOrganizer { } return; } + /** * I'm not quite sure why you'd want this... (other than for failover from the better results) * @@ -608,6 +696,7 @@ public class ProfileOrganizer { * */ public void reorganize() { reorganize(false); } + public void reorganize(boolean shouldCoalesce) { long sortTime = 0; int coalesceTime = 0; @@ -1028,10 +1117,10 @@ public class ProfileOrganizer { /** called after locking the reorganizeLock */ private PeerProfile locked_getProfile(Hash peer) { - PeerProfile cur = (PeerProfile)_notFailingPeers.get(peer); + PeerProfile cur = _notFailingPeers.get(peer); if (cur != null) return cur; - cur = (PeerProfile)_failingPeers.get(peer); + cur = _failingPeers.get(peer); return cur; } @@ -1043,17 +1132,23 @@ public class ProfileOrganizer { private void locked_selectPeers(Map<Hash, PeerProfile> peers, int howMany, Set<Hash> toExclude, Set<Hash> matches) { locked_selectPeers(peers, howMany, toExclude, matches, 0); } + + /** + * @param mask 0-4 Number of bytes to match to determine if peers in the same IP range should + * not be in the same tunnel. 0 = disable check; 1 = /8; 2 = /16; 3 = /24; 4 = exact IP match + */ private void locked_selectPeers(Map<Hash, PeerProfile> peers, int howMany, Set<Hash> toExclude, Set<Hash> matches, int mask) { - List all = new ArrayList(peers.keySet()); - if (toExclude != null) - all.removeAll(toExclude); - - all.removeAll(matches); - all.remove(_us); - Collections.shuffle(all, _random); + List<Hash> all = new ArrayList(peers.keySet()); Set<Integer> IPSet = new HashSet(8); - for (int i = 0; (matches.size() < howMany) && (i < all.size()); i++) { - Hash peer = (Hash)all.get(i); + // use RandomIterator to avoid shuffling the whole thing + for (Iterator<Hash> iter = new RandomIterator(all); (matches.size() < howMany) && iter.hasNext(); ) { + Hash peer = iter.next(); + if (toExclude != null && toExclude.contains(peer)) + continue; + if (matches.contains(peer)) + continue; + if (_us.equals(peer)) + continue; boolean ok = isSelectable(peer); if (ok) { ok = mask <= 0 || notRestricted(peer, IPSet, mask); @@ -1117,7 +1212,7 @@ public class ProfileOrganizer { } /** generate an arbitrary unique value for this ip/mask (mask = 1-4) */ - private Integer maskedIP(byte[] ip, int mask) { + private static Integer maskedIP(byte[] ip, int mask) { int rv = 0; for (int i = 0; i < mask; i++) rv = (rv << 8) | (ip[i] & 0xff); @@ -1125,7 +1220,7 @@ public class ProfileOrganizer { } /** does a contain any of the elements in b? */ - private boolean containsAny(Set a, Set b) { + private static boolean containsAny(Set a, Set b) { for (Object o : b) { if (a.contains(o)) return true; @@ -1133,6 +1228,58 @@ public class ProfileOrganizer { return false; } + /** + * @param randomKey used for deterministic random partitioning into subtiers + * @param subTierMode 2-7: + *<pre> + * 2: return only from group 0 or 1 + * 3: return only from group 2 or 3 + * 4: return only from group 0 + * 5: return only from group 1 + * 6: return only from group 2 + * 7: return only from group 3 + *</pre> + */ + private void locked_selectPeers(Map<Hash, PeerProfile> peers, int howMany, Set<Hash> toExclude, Set<Hash> matches, Hash randomKey, int subTierMode) { + List<Hash> all = new ArrayList(peers.keySet()); + // use RandomIterator to avoid shuffling the whole thing + for (Iterator<Hash> iter = new RandomIterator(all); (matches.size() < howMany) && iter.hasNext(); ) { + Hash peer = iter.next(); + if (toExclude != null && toExclude.contains(peer)) + continue; + if (matches.contains(peer)) + continue; + if (_us.equals(peer)) + continue; + int subTier = getSubTier(peer, randomKey); + if (subTierMode >= 4) { + if (subTier != (subTierMode & 0x03)) + continue; + } else { + if ((subTier >> 1) != (subTierMode & 0x01)) + continue; + } + boolean ok = isSelectable(peer); + if (ok) + matches.add(peer); + else + matches.remove(peer); + } + } + + /** + * Implement a random, deterministic split into 4 groups that cannot be predicted by + * others. + * @return 0-3 + */ + private static int getSubTier(Hash peer, Hash randomKey) { + byte[] data = new byte[Hash.HASH_LENGTH + 4]; + System.arraycopy(peer.getData(), 0, data, 0, Hash.HASH_LENGTH); + System.arraycopy(randomKey.getData(), 0, data, Hash.HASH_LENGTH, 4); + Hash rh = SHA256Generator.getInstance().calculateHash(data); + return rh.getData()[0] & 0x03; + } + public boolean isSelectable(Hash peer) { NetworkDatabaseFacade netDb = _context.netDb(); // the CLI shouldn't depend upon the netDb @@ -1247,18 +1394,18 @@ public class ProfileOrganizer { */ protected int getMinimumFastPeers() { int def = Math.min(DEFAULT_MAXIMUM_FAST_PEERS, - (2 *_context.clientManager().listClients().size()) + DEFAULT_MINIMUM_FAST_PEERS - 2); + (6 *_context.clientManager().listClients().size()) + DEFAULT_MINIMUM_FAST_PEERS - 2); return _context.getProperty(PROP_MINIMUM_FAST_PEERS, def); } /** fixme add config @since 0.7.10 */ protected int getMaximumFastPeers() { - return 30; + return ABSOLUTE_MAX_FAST_PEERS; } /** fixme add config @since 0.7.11 */ protected int getMaximumHighCapPeers() { - return 75; + return ABSOLUTE_MAX_HIGHCAP_PEERS; } /** diff --git a/router/java/src/net/i2p/router/peermanager/ProfilePersistenceHelper.java b/router/java/src/net/i2p/router/peermanager/ProfilePersistenceHelper.java index e012fab4906c9a19694a6bd84710429f0028a6df..af0167f20ab447359dbcf19aeaaf3ee38a9c0a47 100644 --- a/router/java/src/net/i2p/router/peermanager/ProfilePersistenceHelper.java +++ b/router/java/src/net/i2p/router/peermanager/ProfilePersistenceHelper.java @@ -1,11 +1,14 @@ package net.i2p.router.peermanager; +import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FilenameFilter; +import java.io.InputStream; import java.io.IOException; import java.io.OutputStream; +import java.util.Date; import java.util.HashSet; import java.util.Iterator; import java.util.Properties; @@ -22,13 +25,24 @@ import net.i2p.util.Log; import net.i2p.util.SecureDirectory; import net.i2p.util.SecureFileOutputStream; +/** + * Write profiles to disk at shutdown, + * read at startup. + * The files are gzip compressed, we previously stored them + * with a ".dat" extension instead of ".txt.gz", so it wasn't apparent. + * Now migrated to a ".txt.gz" extension. + */ class ProfilePersistenceHelper { - private Log _log; - private RouterContext _context; + private final Log _log; + private final RouterContext _context; public final static String PROP_PEER_PROFILE_DIR = "router.profileDir"; public final static String DEFAULT_PEER_PROFILE_DIR = "peerProfiles"; private final static String NL = System.getProperty("line.separator"); + private static final String PREFIX = "profile-"; + private static final String SUFFIX = ".txt.gz"; + private static final String UNCOMPRESSED_SUFFIX = ".txt"; + private static final String OLD_SUFFIX = ".dat"; /** * If we haven't been able to get a message through to the peer in 3 days, @@ -74,58 +88,49 @@ class ProfilePersistenceHelper { if (_log.shouldLog(Log.DEBUG)) _log.debug("Writing the profile to " + f.getName() + " took " + delay + "ms"); } + /** write out the data from the profile to the stream */ public void writeProfile(PeerProfile profile, OutputStream out) throws IOException { String groups = null; if (_context.profileOrganizer().isFailing(profile.getPeer())) { - groups = "failing"; + groups = "Failing"; } else if (!_context.profileOrganizer().isHighCapacity(profile.getPeer())) { - groups = "not failing"; + groups = "Standard"; } else { if (_context.profileOrganizer().isFast(profile.getPeer())) - groups = "fast and high capacity"; + groups = "Fast, High Capacity"; else - groups = "high capacity"; + groups = "High Capacity"; if (_context.profileOrganizer().isWellIntegrated(profile.getPeer())) - groups = groups + ", well integrated"; + groups = groups + ", Integrated"; } StringBuilder buf = new StringBuilder(512); buf.append("########################################################################").append(NL); - buf.append("# profile for ").append(profile.getPeer().toBase64()).append(NL); + buf.append("# Profile for peer ").append(profile.getPeer().toBase64()).append(NL); if (_us != null) buf.append("# as calculated by ").append(_us.toBase64()).append(NL); buf.append("#").append(NL); - buf.append("# capacity: ").append(profile.getCapacityValue()).append(NL); - buf.append("# integration: ").append(profile.getIntegrationValue()).append(NL); - buf.append("# speedValue: ").append(profile.getSpeedValue()).append(NL); - buf.append("#").append(NL); + buf.append("# Speed: ").append(profile.getSpeedValue()).append(NL); + buf.append("# Capacity: ").append(profile.getCapacityValue()).append(NL); + buf.append("# Integration: ").append(profile.getIntegrationValue()).append(NL); buf.append("# Groups: ").append(groups).append(NL); + buf.append("#").append(NL); buf.append("########################################################################").append(NL); buf.append("##").append(NL); - buf.append("# Capacity bonus: used to affect the capacity score after all other calculations are done").append(NL); - buf.append("capacityBonus=").append(profile.getCapacityBonus()).append(NL); - buf.append("# Integration bonus: used to affect the integration score after all other calculations are done").append(NL); - buf.append("integrationBonus=").append(profile.getIntegrationBonus()).append(NL); - buf.append("# Speed bonus: used to affect the speed score after all other calculations are done").append(NL); - buf.append("speedBonus=").append(profile.getSpeedBonus()).append(NL); - buf.append(NL).append(NL); - buf.append("# Last heard about: when did we last get a reference to this peer? (milliseconds since the epoch)").append(NL); - buf.append("lastHeardAbout=").append(profile.getLastHeardAbout()).append(NL); - buf.append("# First heard about: when did we first get a reference to this peer? (milliseconds since the epoch)").append(NL); - buf.append("firstHeardAbout=").append(profile.getFirstHeardAbout()).append(NL); - buf.append("# Last sent to successfully: when did we last send the peer a message successfully? (milliseconds from the epoch)").append(NL); - buf.append("lastSentToSuccessfully=").append(profile.getLastSendSuccessful()).append(NL); - buf.append("# Last failed send: when did we last fail to send a message to the peer? (milliseconds from the epoch)").append(NL); - buf.append("lastFailedSend=").append(profile.getLastSendFailed()).append(NL); - buf.append("# Last heard from: when did we last get a message from the peer? (milliseconds from the epoch)").append(NL); - buf.append("lastHeardFrom=").append(profile.getLastHeardFrom()).append(NL); - buf.append("# moving average as to how fast the peer replies").append(NL); - buf.append("tunnelTestTimeAverage=").append(profile.getTunnelTestTimeAverage()).append(NL); - buf.append("tunnelPeakThroughput=").append(profile.getPeakThroughputKBps()).append(NL); - buf.append("tunnelPeakTunnelThroughput=").append(profile.getPeakTunnelThroughputKBps()).append(NL); - buf.append("tunnelPeakTunnel1mThroughput=").append(profile.getPeakTunnel1mThroughputKBps()).append(NL); + add(buf, "speedBonus", profile.getSpeedBonus(), "Manual adjustment to the speed score"); + add(buf, "capacityBonus", profile.getCapacityBonus(), "Manual adjustment to the capacity score"); + add(buf, "integrationBonus", profile.getIntegrationBonus(), "Manual adjustment to the integration score"); + addDate(buf, "firstHeardAbout", profile.getFirstHeardAbout(), "When did we first get a reference to this peer?"); + addDate(buf, "lastHeardAbout", profile.getLastHeardAbout(), "When did we last get a reference to this peer?"); + addDate(buf, "lastHeardFrom", profile.getLastHeardFrom(), "When did we last get a message from the peer?"); + addDate(buf, "lastSentToSuccessfully", profile.getLastSendSuccessful(), "When did we last send the peer a message successfully?"); + addDate(buf, "lastFailedSend", profile.getLastSendFailed(), "When did we last fail to send a message to the peer?"); + add(buf, "tunnelTestTimeAverage", profile.getTunnelTestTimeAverage(), "Moving average as to how fast the peer replies"); + add(buf, "tunnelPeakThroughput", profile.getPeakThroughputKBps(), "KBytes/sec"); + add(buf, "tunnelPeakTunnelThroughput", profile.getPeakTunnelThroughputKBps(), "KBytes/sec"); + add(buf, "tunnelPeakTunnel1mThroughput", profile.getPeakTunnel1mThroughputKBps(), "KBytes/sec"); buf.append(NL); out.write(buf.toString().getBytes()); @@ -146,12 +151,29 @@ class ProfilePersistenceHelper { } } - public Set readProfiles() { + /** @since 0.8.5 */ + private static void addDate(StringBuilder buf, String name, long val, String description) { + String when = val > 0 ? (new Date(val)).toString() : "Never"; + add(buf, name, val, description + ' ' + when); + } + + /** @since 0.8.5 */ + private static void add(StringBuilder buf, String name, long val, String description) { + buf.append("# ").append(name).append(NL).append("# ").append(description).append(NL); + buf.append(name).append('=').append(val).append(NL).append(NL); + } + + /** @since 0.8.5 */ + private static void add(StringBuilder buf, String name, double val, String description) { + buf.append("# ").append(name).append(NL).append("# ").append(description).append(NL); + buf.append(name).append('=').append(val).append(NL).append(NL); + } + + public Set<PeerProfile> readProfiles() { long start = _context.clock().now(); - Set files = selectFiles(); - Set profiles = new HashSet(files.size()); - for (Iterator iter = files.iterator(); iter.hasNext();) { - File f = (File)iter.next(); + Set<File> files = selectFiles(); + Set<PeerProfile> profiles = new HashSet(files.size()); + for (File f : files) { PeerProfile profile = readProfile(f); if (profile != null) profiles.add(profile); @@ -162,10 +184,11 @@ class ProfilePersistenceHelper { return profiles; } - private Set selectFiles() { + private Set<File> selectFiles() { File files[] = getProfileDir().listFiles(new FilenameFilter() { public boolean accept(File dir, String filename) { - return (filename.startsWith("profile-") && filename.endsWith(".dat")); + return (filename.startsWith(PREFIX) && + (filename.endsWith(SUFFIX) || filename.endsWith(OLD_SUFFIX) || filename.endsWith(UNCOMPRESSED_SUFFIX))); } }); Set rv = new HashSet(files.length); @@ -198,6 +221,14 @@ class ProfilePersistenceHelper { ", since we haven't heard from them in a long time"); file.delete(); return null; + } else if (file.getName().endsWith(OLD_SUFFIX)) { + // migrate to new file name, ignore failure + String newName = file.getAbsolutePath(); + newName = newName.substring(0, newName.length() - OLD_SUFFIX.length()) + SUFFIX; + boolean success = file.renameTo(new File(newName)); + if (!success) + // new file exists and on Windows? + file.delete(); } profile.setCapacityBonus(getLong(props, "capacityBonus")); @@ -270,11 +301,12 @@ class ProfilePersistenceHelper { } private void loadProps(Properties props, File file) { + InputStream fin = null; try { - FileInputStream fin = new FileInputStream(file); + fin = new BufferedInputStream(new FileInputStream(file), 1); + fin.mark(1); int c = fin.read(); - fin.close(); - fin = new FileInputStream(file); // ghetto mark+reset + fin.reset(); if (c == '#') { // uncompressed if (_log.shouldLog(Log.INFO)) @@ -289,12 +321,16 @@ class ProfilePersistenceHelper { } catch (IOException ioe) { if (_log.shouldLog(Log.WARN)) _log.warn("Error loading properties from " + file.getName(), ioe); + } finally { + try { + if (fin != null) fin.close(); + } catch (IOException e) {} } } private Hash getHash(String name) { - String key = name.substring("profile-".length()); - key = key.substring(0, key.length() - ".dat".length()); + String key = name.substring(PREFIX.length()); + key = key.substring(0, 44); //Hash h = new Hash(); try { //h.fromBase64(key); @@ -310,7 +346,7 @@ class ProfilePersistenceHelper { } private File pickFile(PeerProfile profile) { - return new File(getProfileDir(), "profile-" + profile.getPeer().toBase64() + ".dat"); + return new File(getProfileDir(), PREFIX + profile.getPeer().toBase64() + SUFFIX); } private File getProfileDir() { @@ -332,7 +368,7 @@ class ProfilePersistenceHelper { rnd.nextBytes(data); Hash peer = new Hash(data); try { - File f = new File(dir, "profile-" + peer.toBase64() + ".dat"); + File f = new File(dir, PREFIX + peer.toBase64() + SUFFIX); f.createNewFile(); System.out.println("Created " + peer.toBase64()); } catch (IOException ioe) {} diff --git a/router/java/src/net/i2p/router/peermanager/SpeedCalculator.java b/router/java/src/net/i2p/router/peermanager/SpeedCalculator.java index c5ac1c3c56d26871dc33beec002063983fd5c70b..cf1b7f069d707db8ab8666ab404bbde97c2cf4cb 100644 --- a/router/java/src/net/i2p/router/peermanager/SpeedCalculator.java +++ b/router/java/src/net/i2p/router/peermanager/SpeedCalculator.java @@ -1,7 +1,5 @@ package net.i2p.router.peermanager; -import net.i2p.router.RouterContext; - /** * Quantify how fast the peer is - how fast they respond to our requests, how fast * they pass messages on, etc. This should be affected both by their bandwidth/latency, @@ -13,13 +11,9 @@ import net.i2p.router.RouterContext; * see the previous versions in change control to get 400+ lines of old code. * */ -public class SpeedCalculator extends Calculator { - - public SpeedCalculator(RouterContext context) { - } +class SpeedCalculator { - @Override - public double calc(PeerProfile profile) { + public static double calc(PeerProfile profile) { // measures 1 minute throughput of individual tunnels double d = (profile.getPeakTunnel1mThroughputKBps()*1024d) + profile.getSpeedBonus(); if (d >= 0) return d; diff --git a/router/java/src/net/i2p/router/peermanager/TunnelHistory.java b/router/java/src/net/i2p/router/peermanager/TunnelHistory.java index 208415ca0b3f0e5e5e911c037522ebc109a9eeba..63f3741d481f6b08c63c4e439ee24239cbc3a656 100644 --- a/router/java/src/net/i2p/router/peermanager/TunnelHistory.java +++ b/router/java/src/net/i2p/router/peermanager/TunnelHistory.java @@ -2,6 +2,7 @@ package net.i2p.router.peermanager; import java.io.IOException; import java.io.OutputStream; +import java.util.Date; import java.util.Properties; import net.i2p.router.RouterContext; @@ -13,8 +14,8 @@ import net.i2p.util.Log; * */ public class TunnelHistory { - private RouterContext _context; - private Log _log; + private final RouterContext _context; + private final Log _log; private volatile long _lifetimeAgreedTo; private volatile long _lifetimeRejected; private volatile long _lastAgreedTo; @@ -26,7 +27,7 @@ public class TunnelHistory { private volatile long _lastFailed; private RateStat _rejectRate; private RateStat _failRate; - private String _statGroup; + private final String _statGroup; /** probabalistic tunnel rejection due to a flood of requests - essentially unused */ public static final int TUNNEL_REJECT_PROBABALISTIC_REJECT = 10; @@ -110,6 +111,7 @@ public class TunnelHistory { _lastFailed = _context.clock().now(); } +/***** all unused public void setLifetimeAgreedTo(long num) { _lifetimeAgreedTo = num; } public void setLifetimeRejected(long num) { _lifetimeRejected = num; } public void setLifetimeFailed(long num) { _lifetimeFailed = num; } @@ -119,6 +121,7 @@ public class TunnelHistory { public void setLastRejectedTransient(long when) { _lastRejectedTransient = when; } public void setLastRejectedProbabalistic(long when) { _lastRejectedProbabalistic = when; } public void setLastFailed(long when) { _lastFailed = when; } +******/ public RateStat getRejectionRate() { return _rejectRate; } public RateStat getFailedRate() { return _failRate; } @@ -138,12 +141,12 @@ public class TunnelHistory { buf.append("#################").append(NL); buf.append("# Tunnel history").append(NL); buf.append("###").append(NL); - add(buf, "lastAgreedTo", _lastAgreedTo, "When did the peer last agree to participate in a tunnel? (milliseconds since the epoch)"); - add(buf, "lastFailed", _lastFailed, "When was the last time a tunnel that the peer agreed to participate failed? (milliseconds since the epoch)"); - add(buf, "lastRejectedCritical", _lastRejectedCritical, "When was the last time the peer refused to participate in a tunnel? (milliseconds since the epoch)"); - add(buf, "lastRejectedBandwidth", _lastRejectedBandwidth, "When was the last time the peer refused to participate in a tunnel? (milliseconds since the epoch)"); - add(buf, "lastRejectedTransient", _lastRejectedTransient, "When was the last time the peer refused to participate in a tunnel? (milliseconds since the epoch)"); - add(buf, "lastRejectedProbabalistic", _lastRejectedProbabalistic, "When was the last time the peer refused to participate in a tunnel? (milliseconds since the epoch)"); + addDate(buf, "lastAgreedTo", _lastAgreedTo, "When did the peer last agree to participate in a tunnel?"); + addDate(buf, "lastFailed", _lastFailed, "When was the last time a tunnel that the peer agreed to participate failed?"); + addDate(buf, "lastRejectedCritical", _lastRejectedCritical, "When was the last time the peer refused to participate in a tunnel (Critical response code)?"); + addDate(buf, "lastRejectedBandwidth", _lastRejectedBandwidth, "When was the last time the peer refused to participate in a tunnel (Bandwidth response code)?"); + addDate(buf, "lastRejectedTransient", _lastRejectedTransient, "When was the last time the peer refused to participate in a tunnel (Transient load response code)?"); + addDate(buf, "lastRejectedProbabalistic", _lastRejectedProbabalistic, "When was the last time the peer refused to participate in a tunnel (Probabalistic response code)?"); add(buf, "lifetimeAgreedTo", _lifetimeAgreedTo, "How many tunnels has the peer ever agreed to participate in?"); add(buf, "lifetimeFailed", _lifetimeFailed, "How many tunnels has the peer ever agreed to participate in that failed prematurely?"); add(buf, "lifetimeRejected", _lifetimeRejected, "How many tunnels has the peer ever refused to participate in?"); @@ -152,8 +155,13 @@ public class TunnelHistory { _failRate.store(out, "tunnelHistory.failRate"); } + private static void addDate(StringBuilder buf, String name, long val, String description) { + String when = val > 0 ? (new Date(val)).toString() : "Never"; + add(buf, name, val, description + ' ' + when); + } + private static void add(StringBuilder buf, String name, long val, String description) { - buf.append("# ").append(name.toUpperCase()).append(NL).append("# ").append(description).append(NL); + buf.append("# ").append(name).append(NL).append("# ").append(description).append(NL); buf.append("tunnels.").append(name).append('=').append(val).append(NL).append(NL); } diff --git a/router/java/src/net/i2p/router/startup/WorkingDir.java b/router/java/src/net/i2p/router/startup/WorkingDir.java index 1a8249798a8d338312192a305abd480ece53f2ed..a1f414ac29869470e3c41dfcad2250a779dddc0e 100644 --- a/router/java/src/net/i2p/router/startup/WorkingDir.java +++ b/router/java/src/net/i2p/router/startup/WorkingDir.java @@ -164,14 +164,22 @@ public class WorkingDir { } } - /** Returns <code>false</code> if a directory is empty, or contains nothing besides a subdirectory named plugins */ + /** + * Tests if <code>dir</code> has been set up as a I2P working directory.<br/> + * Returns <code>false</code> if a directory is empty, or contains nothing besides + * subdirectories named <code>plugins</code> and/or <code>logs</code>.<br/> + * Returns <code>true</code> if the directory contains something not named + * <code>plugins</code> or <code>logs</code>.</br> + * This allows to pre-install plugins before the first router start. + */ private static boolean isSetup(File dir) { if (dir.isDirectory()) { String[] files = dir.list(); - if (files.length == 0) + if (files == null) return false; - if (files.length>1 || !"plugins".equals(files[0])) - return true; + for (String file: files) + if (!"plugins".equals(file) && !"logs".equals(file)) + return true; } return false; } diff --git a/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java b/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java index 094f526c79913e433bfa53e178bee6d2f0b22725..780a25d6b28b24af9ab23cd4a57dea484fb2e212 100644 --- a/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java +++ b/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java @@ -36,15 +36,14 @@ import net.i2p.util.SimpleTimer; import net.i2p.util.Translate; public class CommSystemFacadeImpl extends CommSystemFacade { - private Log _log; - private RouterContext _context; + private final Log _log; + private final RouterContext _context; private TransportManager _manager; private GeoIP _geoIP; public CommSystemFacadeImpl(RouterContext context) { _context = context; _log = _context.logManager().getLog(CommSystemFacadeImpl.class); - _manager = null; _context.statManager().createRateStat("transport.getBidsJobTime", "How long does it take?", "Transport", new long[] { 10*60*1000l }); startGeoIP(); } @@ -215,7 +214,7 @@ public class CommSystemFacadeImpl extends CommSystemFacade { * This should really be moved to ntcp/NTCPTransport.java, why is it here? */ public static RouterAddress createNTCPAddress(RouterContext ctx) { - if (!TransportManager.enableNTCP(ctx)) return null; + if (!TransportManager.isNTCPEnabled(ctx)) return null; String name = ctx.router().getConfigSetting(PROP_I2NP_NTCP_HOSTNAME); String port = ctx.router().getConfigSetting(PROP_I2NP_NTCP_PORT); /* @@ -510,7 +509,7 @@ public class CommSystemFacadeImpl extends CommSystemFacade { buf.append("<tt>"); boolean found = _context.netDb().lookupRouterInfoLocally(peer) != null; if (found) - buf.append("<a title=\"").append(_("NetDb entry")).append("\" href=\"netdb.jsp?r=").append(h).append("\">"); + buf.append("<a title=\"").append(_("NetDb entry")).append("\" href=\"netdb?r=").append(h).append("\">"); buf.append(h); if (found) buf.append("</a>"); diff --git a/router/java/src/net/i2p/router/transport/FIFOBandwidthLimiter.java b/router/java/src/net/i2p/router/transport/FIFOBandwidthLimiter.java index 112d3660140285009f309d4c48794e7f02721472..c0245478314bde43ae73920ef5f8e91545b265a3 100644 --- a/router/java/src/net/i2p/router/transport/FIFOBandwidthLimiter.java +++ b/router/java/src/net/i2p/router/transport/FIFOBandwidthLimiter.java @@ -31,18 +31,18 @@ import net.i2p.util.Log; * */ public class FIFOBandwidthLimiter { - private Log _log; - private I2PAppContext _context; + private final Log _log; + private final I2PAppContext _context; private final List<Request> _pendingInboundRequests; private final List<Request> _pendingOutboundRequests; /** how many bytes we can consume for inbound transmission immediately */ - private AtomicInteger _availableInbound = new AtomicInteger(); + private final AtomicInteger _availableInbound = new AtomicInteger(); /** how many bytes we can consume for outbound transmission immediately */ - private AtomicInteger _availableOutbound = new AtomicInteger(); + private final AtomicInteger _availableOutbound = new AtomicInteger(); /** how many bytes we can queue up for bursting */ - private AtomicInteger _unavailableInboundBurst = new AtomicInteger(); + private final AtomicInteger _unavailableInboundBurst = new AtomicInteger(); /** how many bytes we can queue up for bursting */ - private AtomicInteger _unavailableOutboundBurst = new AtomicInteger(); + private final AtomicInteger _unavailableOutboundBurst = new AtomicInteger(); /** how large _unavailableInbound can get */ private int _maxInboundBurst; /** how large _unavailableInbound can get */ @@ -56,14 +56,14 @@ public class FIFOBandwidthLimiter { /** shortcut of whether our inbound rate is unlimited */ private boolean _inboundUnlimited; /** lifetime counter of bytes received */ - private AtomicLong _totalAllocatedInboundBytes = new AtomicLong(); + private final AtomicLong _totalAllocatedInboundBytes = new AtomicLong(); /** lifetime counter of bytes sent */ - private AtomicLong _totalAllocatedOutboundBytes = new AtomicLong(); + private final AtomicLong _totalAllocatedOutboundBytes = new AtomicLong(); /** lifetime counter of tokens available for use but exceeded our maxInboundBurst size */ - private AtomicLong _totalWastedInboundBytes = new AtomicLong(); + private final AtomicLong _totalWastedInboundBytes = new AtomicLong(); /** lifetime counter of tokens available for use but exceeded our maxOutboundBurst size */ - private AtomicLong _totalWastedOutboundBytes = new AtomicLong(); - private FIFOBandwidthRefiller _refiller; + private final AtomicLong _totalWastedOutboundBytes = new AtomicLong(); + private final FIFOBandwidthRefiller _refiller; private long _lastTotalSent; private long _lastTotalReceived; @@ -73,8 +73,6 @@ public class FIFOBandwidthLimiter { private float _sendBps15s; private float _recvBps15s; - private static int __id = 0; - public /* static */ long now() { // dont use the clock().now(), since that may jump return System.currentTimeMillis(); @@ -98,13 +96,9 @@ public class FIFOBandwidthLimiter { _pendingOutboundRequests = new ArrayList(16); _lastTotalSent = _totalAllocatedOutboundBytes.get(); _lastTotalReceived = _totalAllocatedInboundBytes.get(); - _sendBps = 0; - _recvBps = 0; _lastStatsUpdated = now(); _refiller = new FIFOBandwidthRefiller(_context, this); - I2PThread t = new I2PThread(_refiller); - t.setName("BWRefiller" + (++__id)); - t.setDaemon(true); + I2PThread t = new I2PThread(_refiller, "BWRefiller", true); t.setPriority(I2PThread.NORM_PRIORITY-1); t.start(); } @@ -753,7 +747,7 @@ public class FIFOBandwidthLimiter { private int _allocationsSinceWait; private boolean _aborted; private boolean _waited; - List<Request> satisfiedBuffer; + final List<Request> satisfiedBuffer; private CompleteListener _lsnr; private Object _attachment; diff --git a/router/java/src/net/i2p/router/transport/FIFOBandwidthRefiller.java b/router/java/src/net/i2p/router/transport/FIFOBandwidthRefiller.java index 2065cdc28ce0647cbc6f9b0569c80601807d20e2..bc8dd18520d070240311e869528fdb888f6b6b7f 100644 --- a/router/java/src/net/i2p/router/transport/FIFOBandwidthRefiller.java +++ b/router/java/src/net/i2p/router/transport/FIFOBandwidthRefiller.java @@ -7,9 +7,9 @@ import net.i2p.I2PAppContext; import net.i2p.util.Log; public class FIFOBandwidthRefiller implements Runnable { - private Log _log; - private I2PAppContext _context; - private FIFOBandwidthLimiter _limiter; + private final Log _log; + private final I2PAppContext _context; + private final FIFOBandwidthLimiter _limiter; /** how many KBps do we want to allow? */ private int _inboundKBytesPerSecond; /** how many KBps do we want to allow? */ diff --git a/router/java/src/net/i2p/router/transport/GeoIP.java b/router/java/src/net/i2p/router/transport/GeoIP.java index 85a89b3c6410b5eeaf471a37ace4812e5bc0fc58..1593487cf9d950d0f9fd413e0b8eab21bb6466b8 100644 --- a/router/java/src/net/i2p/router/transport/GeoIP.java +++ b/router/java/src/net/i2p/router/transport/GeoIP.java @@ -16,6 +16,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicBoolean; import net.i2p.data.DataHelper; +import net.i2p.data.Hash; import net.i2p.router.RouterContext; import net.i2p.util.ConcurrentHashSet; import net.i2p.util.Log; @@ -35,7 +36,7 @@ import net.i2p.util.Log; * * @author zzz */ -public class GeoIP { +class GeoIP { private Log _log; private RouterContext _context; private final Map<String, String> _codeToName; @@ -251,7 +252,11 @@ public class GeoIP { */ private void updateOurCountry() { String oldCountry = _context.router().getConfigSetting(PROP_IP_COUNTRY); - String country = _context.commSystem().getCountry(_context.routerHash()); + Hash ourHash = _context.routerHash(); + // we should always have a RouterInfo by now, but we had one report of an NPE here + if (ourHash == null) + return; + String country = _context.commSystem().getCountry(ourHash); if (country != null && !country.equals(oldCountry)) { _context.router().setConfigSetting(PROP_IP_COUNTRY, country); _context.router().saveConfig(); diff --git a/router/java/src/net/i2p/router/transport/GetBidsJob.java b/router/java/src/net/i2p/router/transport/GetBidsJob.java index 55f8cdb7961bf1c4d27ea53abd5639c2a875d158..e014cc6411842a66f29305ee85f72004f74168ce 100644 --- a/router/java/src/net/i2p/router/transport/GetBidsJob.java +++ b/router/java/src/net/i2p/router/transport/GetBidsJob.java @@ -21,10 +21,10 @@ import net.i2p.util.Log; * pass it on to the transport for processing * */ -public class GetBidsJob extends JobImpl { - private Log _log; - private CommSystemFacadeImpl _facade; - private OutNetMessage _msg; +class GetBidsJob extends JobImpl { + private final Log _log; + private final CommSystemFacadeImpl _facade; + private final OutNetMessage _msg; public GetBidsJob(RouterContext ctx, CommSystemFacadeImpl facade, OutNetMessage msg) { super(ctx); diff --git a/router/java/src/net/i2p/router/transport/TransportImpl.java b/router/java/src/net/i2p/router/transport/TransportImpl.java index 7ac7d05b2c7189742e5ebf39483614571bca4cdb..fef5850227f52736d06eebeb5c9217669ec8c149 100644 --- a/router/java/src/net/i2p/router/transport/TransportImpl.java +++ b/router/java/src/net/i2p/router/transport/TransportImpl.java @@ -512,7 +512,7 @@ public abstract class TransportImpl implements Transport { public void markUnreachable(Hash peer) { long now = _context.clock().now(); synchronized (_unreachableEntries) { - _unreachableEntries.put(peer, new Long(now)); + _unreachableEntries.put(peer, Long.valueOf(now)); } markWasUnreachable(peer, true); } diff --git a/router/java/src/net/i2p/router/transport/TransportManager.java b/router/java/src/net/i2p/router/transport/TransportManager.java index a682840b1780fa28749d2e0d52870fa4f36983eb..81cf89340fb946f8c9b15085d4698a43323545fe 100644 --- a/router/java/src/net/i2p/router/transport/TransportManager.java +++ b/router/java/src/net/i2p/router/transport/TransportManager.java @@ -37,19 +37,19 @@ import net.i2p.util.Log; import net.i2p.util.Translate; public class TransportManager implements TransportEventListener { - private Log _log; + private final Log _log; /** * Converted from List to prevent concurrent modification exceptions. * If we want more than one transport with the same style we will have to change this. */ - private Map<String, Transport> _transports; - private RouterContext _context; - private UPnPManager _upnpManager; + private final Map<String, Transport> _transports; + private final RouterContext _context; + private final UPnPManager _upnpManager; + /** default true */ public final static String PROP_ENABLE_UDP = "i2np.udp.enable"; + /** default true */ public final static String PROP_ENABLE_NTCP = "i2np.ntcp.enable"; - public final static String DEFAULT_ENABLE_NTCP = "true"; - public final static String DEFAULT_ENABLE_UDP = "true"; /** default true */ public final static String PROP_ENABLE_UPNP = "i2np.upnp.enable"; @@ -63,8 +63,10 @@ public class TransportManager implements TransportEventListener { _context.statManager().createRateStat("transport.bidFailNoTransports", "Could not attempt to bid on message, as none of the transports could attempt it", "Transport", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); _context.statManager().createRateStat("transport.bidFailAllTransports", "Could not attempt to bid on message, as all of the transports had failed", "Transport", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); _transports = new ConcurrentHashMap(2); - if (Boolean.valueOf(_context.getProperty(PROP_ENABLE_UPNP, "true")).booleanValue()) + if (_context.getBooleanPropertyDefaultTrue(PROP_ENABLE_UPNP)) _upnpManager = new UPnPManager(context, this); + else + _upnpManager = null; } public void addTransport(Transport transport) { @@ -80,37 +82,33 @@ public class TransportManager implements TransportEventListener { } private void configTransports() { - String enableUDP = _context.router().getConfigSetting(PROP_ENABLE_UDP); - if (enableUDP == null) - enableUDP = DEFAULT_ENABLE_UDP; - if ("true".equalsIgnoreCase(enableUDP)) { + boolean enableUDP = _context.getBooleanPropertyDefaultTrue(PROP_ENABLE_UDP); + if (enableUDP) { UDPTransport udp = new UDPTransport(_context); addTransport(udp); initializeAddress(udp); } - if (enableNTCP(_context)) + if (isNTCPEnabled(_context)) addTransport(new NTCPTransport(_context)); if (_transports.isEmpty()) _log.log(Log.CRIT, "No transports are enabled"); } - public static boolean enableNTCP(RouterContext ctx) { - String enableNTCP = ctx.router().getConfigSetting(PROP_ENABLE_NTCP); - if (enableNTCP == null) - enableNTCP = DEFAULT_ENABLE_NTCP; - return "true".equalsIgnoreCase(enableNTCP); + public static boolean isNTCPEnabled(RouterContext ctx) { + return ctx.getBooleanPropertyDefaultTrue(PROP_ENABLE_NTCP); } - private static void initializeAddress(Transport t) { + private void initializeAddress(Transport t) { String ips = Addresses.getAnyAddress(); if (ips == null) return; - InetAddress ia = null; + InetAddress ia; try { ia = InetAddress.getByName(ips); - } catch (UnknownHostException e) {return;} - if (ia == null) + } catch (UnknownHostException e) { + _log.error("UDP failed to bind to local address", e); return; + } byte[] ip = ia.getAddress(); t.externalAddressReceived(Transport.SOURCE_INTERFACE, ip, 0); } @@ -461,9 +459,9 @@ public class TransportManager implements TransportEventListener { if (_log.shouldLog(Log.DEBUG)) _log.debug("I2NPMessage received: " + message.getClass().getName(), new Exception("Where did I come from again?")); try { - int num = _context.inNetMessagePool().add(message, fromRouter, fromRouterHash); + _context.inNetMessagePool().add(message, fromRouter, fromRouterHash); if (_log.shouldLog(Log.DEBUG)) - _log.debug("Added to in pool: "+ num); + _log.debug("Added to in pool"); } catch (IllegalArgumentException iae) { if (_log.shouldLog(Log.WARN)) _log.warn("Error receiving message", iae); diff --git a/router/java/src/net/i2p/router/transport/UPnP.java b/router/java/src/net/i2p/router/transport/UPnP.java index d13a51cecdc97acdd9d9b1ff096492f250a0586d..fe3ad037766eae862544fb9da5c88a31a73367a1 100644 --- a/router/java/src/net/i2p/router/transport/UPnP.java +++ b/router/java/src/net/i2p/router/transport/UPnP.java @@ -10,8 +10,10 @@ import java.util.HashSet; import java.util.Iterator; import java.util.Set; -import net.i2p.util.Log; import net.i2p.I2PAppContext; +import net.i2p.data.DataHelper; +import net.i2p.util.Log; +import net.i2p.util.Translate; import org.cybergarage.upnp.Action; import org.cybergarage.upnp.ArgumentList; @@ -52,9 +54,9 @@ import org.freenetproject.ForwardPortStatus; * TODO: Advertise the node like the MDNS plugin does * TODO: Implement EventListener and react on ip-change */ -public class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { - private Log _log; - private I2PAppContext _context; +class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { + private final Log _log; + private final I2PAppContext _context; /** some schemas */ private static final String ROUTER_DEVICE = "urn:schemas-upnp-org:device:InternetGatewayDevice:1"; @@ -73,7 +75,7 @@ public class UPnP extends ControlPoint implements DeviceChangeListener, EventLis /** List of ports we want to forward */ private Set<ForwardPort> portsToForward; /** List of ports we have actually forwarded */ - private Set<ForwardPort> portsForwarded; + private final Set<ForwardPort> portsForwarded; /** Callback to call when a forward fails or succeeds */ private ForwardPortCallback forwardCallback; @@ -397,31 +399,31 @@ public class UPnP extends ControlPoint implements DeviceChangeListener, EventLis for(int i=0; i<sl.size(); i++) { Service serv = sl.getService(i); if(serv == null) continue; - sb.append("<li>Service: "); + sb.append("<li>").append(_("Service")).append(": "); if("urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1".equals(serv.getServiceType())){ - sb.append("WAN Common Interface Config<ul>"); - sb.append("<li>Status: " + toString("GetCommonLinkProperties", "NewPhysicalLinkStatus", serv)); - sb.append("<li>Type: " + toString("GetCommonLinkProperties", "NewWANAccessType", serv)); - sb.append("<li>Upstream: " + toString("GetCommonLinkProperties", "NewLayer1UpstreamMaxBitRate", serv)); - sb.append("<li>Downstream: " + toString("GetCommonLinkProperties", "NewLayer1DownstreamMaxBitRate", serv) + "<br>"); + sb.append(_("WAN Common Interface Configuration")); + sb.append("<ul><li>").append(_("Status")).append(": " + toString("GetCommonLinkProperties", "NewPhysicalLinkStatus", serv)); + sb.append("<li>").append(_("Type")).append(": " + toString("GetCommonLinkProperties", "NewWANAccessType", serv)); + sb.append("<li>").append(_("Upstream")).append(": " + toString("GetCommonLinkProperties", "NewLayer1UpstreamMaxBitRate", serv)); + sb.append("<li>").append(_("Downstream")).append(": " + toString("GetCommonLinkProperties", "NewLayer1DownstreamMaxBitRate", serv) + "<br>"); }else if("urn:schemas-upnp-org:service:WANPPPConnection:1".equals(serv.getServiceType())){ - sb.append("WAN PPP Connection<ul>"); - sb.append("<li>Status: " + toString("GetStatusInfo", "NewConnectionStatus", serv)); - sb.append("<li>Type: " + toString("GetConnectionTypeInfo", "NewConnectionType", serv)); - sb.append("<li>Upstream: " + toString("GetLinkLayerMaxBitRates", "NewUpstreamMaxBitRate", serv)); - sb.append("<li>Downstream: " + toString("GetLinkLayerMaxBitRates", "NewDownstreamMaxBitRate", serv) + "<br>"); - sb.append("<li>External IP: " + toString("GetExternalIPAddress", "NewExternalIPAddress", serv) + "<br>"); + sb.append(_("WAN PPP Connection")); + sb.append("<ul><li>").append(_("Status")).append(": " + toString("GetStatusInfo", "NewConnectionStatus", serv)); + sb.append("<li>").append(_("Type")).append(": " + toString("GetConnectionTypeInfo", "NewConnectionType", serv)); + sb.append("<li>").append(_("Upstream")).append(": " + toString("GetLinkLayerMaxBitRates", "NewUpstreamMaxBitRate", serv)); + sb.append("<li>").append(_("Downstream")).append(": " + toString("GetLinkLayerMaxBitRates", "NewDownstreamMaxBitRate", serv) + "<br>"); + sb.append("<li>").append(_("External IP")).append(": " + toString("GetExternalIPAddress", "NewExternalIPAddress", serv) + "<br>"); }else if("urn:schemas-upnp-org:service:Layer3Forwarding:1".equals(serv.getServiceType())){ - sb.append("Layer 3 Forwarding<ul>"); - sb.append("<li>Default Connection Service: " + toString("GetDefaultConnectionService", "NewDefaultConnectionService", serv)); + sb.append(_("Layer 3 Forwarding")); + sb.append("<ul><li>").append(_("Default Connection Service")).append(": " + toString("GetDefaultConnectionService", "NewDefaultConnectionService", serv)); }else if(WAN_IP_CONNECTION.equals(serv.getServiceType())){ - sb.append("WAN IP Connection<ul>"); - sb.append("<li>Status: " + toString("GetStatusInfo", "NewConnectionStatus", serv)); - sb.append("<li>Type: " + toString("GetConnectionTypeInfo", "NewConnectionType", serv)); - sb.append("<li>External IP: " + toString("GetExternalIPAddress", "NewExternalIPAddress", serv) + "<br>"); + sb.append(_("WAN IP Connection")); + sb.append("<ul><li>").append(_("Status")).append(": " + toString("GetStatusInfo", "NewConnectionStatus", serv)); + sb.append("<li>").append(_("Type")).append(": " + toString("GetConnectionTypeInfo", "NewConnectionType", serv)); + sb.append("<li>").append(_("External IP")).append(": " + toString("GetExternalIPAddress", "NewExternalIPAddress", serv) + "<br>"); }else if("urn:schemas-upnp-org:service:WANEthernetLinkConfig:1".equals(serv.getServiceType())){ - sb.append("WAN Ethernet Link Config<ol>"); - sb.append("<li>Status: " + toString("GetEthernetLinkStatus", "NewEthernetLinkStatus", serv) + "<br>"); + sb.append(_("WAN Ethernet Link Configuration")); + sb.append("<ul><li>").append(_("Status")).append(": " + toString("GetEthernetLinkStatus", "NewEthernetLinkStatus", serv) + "<br>"); }else sb.append("~~~~~~~ "+serv.getServiceType() + "<ul>"); //listActions(serv, sb); @@ -433,10 +435,12 @@ public class UPnP extends ControlPoint implements DeviceChangeListener, EventLis private void listSubDev(String prefix, Device dev, StringBuilder sb){ if (prefix == null) - sb.append("Device: "); + sb.append("<p>").append(_("Found Device")).append(": "); else - sb.append("<li>Subdevice: "); + sb.append("<li>").append(_("Subdevice")).append(": "); sb.append(dev.getFriendlyName()); + if (prefix == null) + sb.append("</p>"); listSubServices(dev, sb); DeviceList dl = dev.getDeviceList(); @@ -454,38 +458,40 @@ public class UPnP extends ControlPoint implements DeviceChangeListener, EventLis /** warning - slow */ public String renderStatusHTML() { final StringBuilder sb = new StringBuilder(); - sb.append("<h3><a name=\"upnp\"></a>UPnP Status</h3>"); + sb.append("<h3><a name=\"upnp\"></a>").append(_("UPnP Status")).append("</h3>"); if(isDisabled) { - sb.append("UPnP has been disabled; Do you have more than one UPnP Internet Gateway Device on your LAN ?"); + sb.append(_("UPnP has been disabled; Do you have more than one UPnP Internet Gateway Device on your LAN ?")); return sb.toString(); } else if(!isNATPresent()) { - sb.append("UPnP has not found any UPnP-aware, compatible device on your LAN."); + sb.append(_("UPnP has not found any UPnP-aware, compatible device on your LAN.")); return sb.toString(); } - // FIXME L10n! - sb.append("<p>Found "); listSubDev(null, _router, sb); String addr = getNATAddress(); + sb.append("<p>"); if (addr != null) - sb.append("<br>The current external IP address reported by UPnP is " + addr); + sb.append(_("The current external IP address reported by UPnP is {0}", addr)); else - sb.append("<br>The current external IP address is not available."); + sb.append(_("The current external IP address is not available.")); int downstreamMaxBitRate = getDownstreamMaxBitRate(); int upstreamMaxBitRate = getUpstreamMaxBitRate(); if(downstreamMaxBitRate > 0) - sb.append("<br>UPnP reports the max downstream bit rate is : " + downstreamMaxBitRate+ " bits/sec\n"); + sb.append("<br>").append(_("UPnP reports the maximum downstream bit rate is {0}bits/sec", DataHelper.formatSize2(downstreamMaxBitRate))); if(upstreamMaxBitRate > 0) - sb.append("<br>UPnP reports the max upstream bit rate is : " + upstreamMaxBitRate+ " bits/sec\n"); + sb.append("<br>").append(_("UPnP reports the maximum upstream bit rate is {0}bits/sec", DataHelper.formatSize2(upstreamMaxBitRate))); synchronized(lock) { if(portsToForward != null) { for(ForwardPort port : portsToForward) { - sb.append("<br>" + protoToString(port.protocol) + " port " + port.portNumber + " for " + port.name); + sb.append("<br>"); if(portsForwarded.contains(port)) - sb.append(" has been forwarded successfully by UPnP.\n"); + // {0} is TCP or UDP + // {1,number,#####} prevents 12345 from being output as 12,345 in the English locale. + // If you want the digit separator in your locale, translate as {1}. + sb.append(_("{0} port {1,number,#####} was successfully forwarded by UPnP.", protoToString(port.protocol), port.portNumber)); else - sb.append(" has not been forwarded by UPnP.\n"); + sb.append(_("{0} port {1,number,#####} was not forwarded by UPnP.", protoToString(port.protocol), port.portNumber)); } } } @@ -554,7 +560,10 @@ public class UPnP extends ControlPoint implements DeviceChangeListener, EventLis return retval; } - /** non-blocking */ + /** + * non-blocking + * @param ports non-null + */ public void onChangePublicPorts(Set<ForwardPort> ports, ForwardPortCallback cb) { Set<ForwardPort> portsToDumpNow = null; Set<ForwardPort> portsToForwardNow = null; @@ -568,7 +577,7 @@ public class UPnP extends ControlPoint implements DeviceChangeListener, EventLis portsToForward = ports; portsToForwardNow = ports; portsToDumpNow = null; - } else if(ports == null || ports.isEmpty()) { + } else if(ports.isEmpty()) { portsToDumpNow = portsToForward; portsToForward = ports; portsToForwardNow = null; @@ -708,4 +717,27 @@ public class UPnP extends ControlPoint implements DeviceChangeListener, EventLis Thread.sleep(2000); } } + + private static final String BUNDLE_NAME = "net.i2p.router.web.messages"; + + /** + * Translate + */ + private final String _(String s) { + return Translate.getString(s, _context, BUNDLE_NAME); + } + + /** + * Translate + */ + private final String _(String s, Object o) { + return Translate.getString(s, o, _context, BUNDLE_NAME); + } + + /** + * Translate + */ + private final String _(String s, Object o, Object o2) { + return Translate.getString(s, o, o2, _context, BUNDLE_NAME); + } } diff --git a/router/java/src/net/i2p/router/transport/UPnPManager.java b/router/java/src/net/i2p/router/transport/UPnPManager.java index 7996a45562aa26021141f9ca916a19f2288d5ca0..40829c1e5be95cde1c400577d8f9bd8214e2ae16 100644 --- a/router/java/src/net/i2p/router/transport/UPnPManager.java +++ b/router/java/src/net/i2p/router/transport/UPnPManager.java @@ -11,6 +11,7 @@ import java.util.Set; import net.i2p.router.RouterContext; import net.i2p.util.Log; +import net.i2p.util.Translate; import org.cybergarage.util.Debug; import org.freenetproject.DetectedIP; @@ -24,14 +25,14 @@ import org.freenetproject.ForwardPortStatus; * * @author zzz */ -public class UPnPManager { - private Log _log; - private RouterContext _context; - private UPnP _upnp; - private UPnPCallback _upnpCallback; +class UPnPManager { + private final Log _log; + private final RouterContext _context; + private final UPnP _upnp; + private final UPnPCallback _upnpCallback; private volatile boolean _isRunning; private InetAddress _detectedAddress; - private TransportManager _manager; + private final TransportManager _manager; /** * This is the TCP HTTP Event listener * We move these so we don't conflict with other users of the same upnp library @@ -56,7 +57,6 @@ public class UPnPManager { _upnp.setHTTPPort(_context.getProperty(PROP_HTTP_PORT, DEFAULT_HTTP_PORT)); _upnp.setSSDPPort(_context.getProperty(PROP_SSDP_PORT, DEFAULT_SSDP_PORT)); _upnpCallback = new UPnPCallback(); - _isRunning = false; } public synchronized void start() { @@ -87,8 +87,9 @@ public class UPnPManager { if (!_isRunning) return; Set<ForwardPort> forwards = new HashSet(ports.size()); - for (String style : ports.keySet()) { - int port = ports.get(style).intValue(); + for (Map.Entry<String, Integer> entry : ports.entrySet()) { + String style = entry.getKey(); + int port = entry.getValue().intValue(); int protocol = -1; if ("SSU".equals(style)) protocol = ForwardPort.PROTOCOL_UDP_IPV4; @@ -136,8 +137,9 @@ public class UPnPManager { _log.debug("No external address returned"); } - for (ForwardPort fp : statuses.keySet()) { - ForwardPortStatus fps = statuses.get(fp); + for (Map.Entry<ForwardPort, ForwardPortStatus> entry : statuses.entrySet()) { + ForwardPort fp = entry.getKey(); + ForwardPortStatus fps = entry.getValue(); if (_log.shouldLog(Log.DEBUG)) _log.debug(fp.name + " " + fp.protocol + " " + fp.portNumber + " status: " + fps.status + " reason: " + fps.reasonString + " ext port: " + fps.externalPort); @@ -156,7 +158,17 @@ public class UPnPManager { public String renderStatusHTML() { if (!_isRunning) - return "<h3><a name=\"upnp\"></a>UPnP is not enabled</h3>\n"; + return "<h3><a name=\"upnp\"></a>" + _("UPnP is not enabled") + "</h3>\n"; return _upnp.renderStatusHTML(); } + + private static final String BUNDLE_NAME = "net.i2p.router.web.messages"; + + /** + * Translate + */ + private final String _(String s) { + return Translate.getString(s, _context, BUNDLE_NAME); + } + } diff --git a/router/java/src/net/i2p/router/transport/ntcp/EstablishState.java b/router/java/src/net/i2p/router/transport/ntcp/EstablishState.java index 8de07fe6eac85eac1cef236f05c52b9370fc76ca..3dfc1b89342fb1a4689f1bcf4fea299cc0b22fed 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/EstablishState.java +++ b/router/java/src/net/i2p/router/transport/ntcp/EstablishState.java @@ -69,7 +69,7 @@ import net.i2p.util.Log; * NOTE: Check info is unused. * */ -public class EstablishState { +class EstablishState { private RouterContext _context; private Log _log; @@ -399,7 +399,7 @@ public class EstablishState { _context.clock().setOffset(1000 * (_tsB - _tsA), true); _tsA = _tsB; if (diff != 0) - _log.error("NTP failure, NTCP adjusting clock by " + DataHelper.formatDuration(diff)); + _log.logAlways(Log.WARN, "NTP failure, NTCP adjusting clock by " + DataHelper.formatDuration(diff)); } else if (diff >= Router.CLOCK_FUDGE_FACTOR) { _context.statManager().addRateData("ntcp.invalidOutboundSkew", diff, 0); _transport.markReachable(_con.getRemotePeer().calculateHash(), false); @@ -617,7 +617,7 @@ public class EstablishState { _context.clock().setOffset(1000 * (_tsB - tsA), true); tsA = _tsB; if (diff != 0) - _log.error("NTP failure, NTCP adjusting clock by " + DataHelper.formatDuration(diff)); + _log.logAlways(Log.WARN, "NTP failure, NTCP adjusting clock by " + DataHelper.formatDuration(diff)); } else if (diff >= Router.CLOCK_FUDGE_FACTOR) { _context.statManager().addRateData("ntcp.invalidInboundSkew", diff, 0); _transport.markReachable(alice.calculateHash(), true); diff --git a/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java b/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java index 29592bf524cba24bca0a45221e5a7a1c0ee4b2cc..eeeef56c1a3f723758bd149ea316cbd12f6c2e2a 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java +++ b/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java @@ -26,7 +26,7 @@ import net.i2p.util.Log; /** * */ -public class EventPumper implements Runnable { +class EventPumper implements Runnable { private RouterContext _context; private Log _log; private volatile boolean _alive; diff --git a/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java b/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java index 3fb4c6b375de7908765779a87244a2c95947488f..a24b3d9728c0e0374b689f5ca0a3641a7175f3c9 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java +++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java @@ -53,9 +53,9 @@ import net.i2p.util.Log; *</pre> * */ -public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener { - private RouterContext _context; - private Log _log; +class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener { + private final RouterContext _context; + private final Log _log; private SocketChannel _chan; private SelectionKey _conKey; /** list of ByteBuffer containing data we have read and are ready to process, oldest first */ @@ -71,7 +71,7 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener { private long _establishedOn; private EstablishState _establishState; private NTCPTransport _transport; - private boolean _isInbound; + private final boolean _isInbound; private boolean _closed; private NTCPAddress _remAddr; private RouterIdentity _remotePeer; @@ -87,17 +87,17 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener { private byte _curReadBlock[]; /** next byte to which data should be placed in the _curReadBlock */ private int _curReadBlockIndex; - private byte _decryptBlockBuf[]; + private final byte _decryptBlockBuf[]; /** last AES block of the encrypted I2NP message (to serve as the next block's IV) */ private byte _prevReadBlock[]; private byte _prevWriteEnd[]; /** current partially read I2NP message */ - private ReadState _curReadState; + private final ReadState _curReadState; private long _messagesRead; private long _messagesWritten; private long _lastSendTime; private long _lastReceiveTime; - private long _created; + private final long _created; private long _nextMetaTime; /** unencrypted outbound metadata buffer */ private final byte _meta[] = new byte[16]; @@ -127,28 +127,21 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener { _context = ctx; _log = ctx.logManager().getLog(getClass()); _created = System.currentTimeMillis(); - _lastSendTime = _created; - _lastReceiveTime = _created; _transport = transport; _chan = chan; _readBufs = new LinkedBlockingQueue(); _writeBufs = new LinkedBlockingQueue(); _bwRequests = new ConcurrentHashSet(2); _outbound = new LinkedBlockingQueue(); - _established = false; _isInbound = true; - _closed = false; _decryptBlockBuf = new byte[16]; - _curReadBlock = new byte[16]; - _prevReadBlock = new byte[16]; _curReadState = new ReadState(); _establishState = new EstablishState(ctx, transport, this); _conKey = key; _conKey.attach(this); - _sendingMeta = false; - _consecutiveBacklog = 0; - transport.establishing(this); + initialize(); } + /** * Create an outbound unconnected NTCP connection * @@ -157,26 +150,25 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener { _context = ctx; _log = ctx.logManager().getLog(getClass()); _created = System.currentTimeMillis(); - _lastSendTime = _created; - _lastReceiveTime = _created; _transport = transport; + _remotePeer = remotePeer; _remAddr = remAddr; _readBufs = new LinkedBlockingQueue(); _writeBufs = new LinkedBlockingQueue(); _bwRequests = new ConcurrentHashSet(2); _outbound = new LinkedBlockingQueue(); - _established = false; _isInbound = false; - _closed = false; _decryptBlockBuf = new byte[16]; + _curReadState = new ReadState(); + initialize(); + } + + private void initialize() { + _lastSendTime = _created; + _lastReceiveTime = _created; _curReadBlock = new byte[16]; _prevReadBlock = new byte[16]; - _curReadState = new ReadState(); - _remotePeer = remotePeer; - _sendingMeta = false; - _consecutiveBacklog = 0; - //_establishState = new EstablishState(ctx, transport, this); - transport.establishing(this); + _transport.establishing(this); } public SocketChannel getChannel() { return _chan; } @@ -207,13 +199,18 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener { _nextMetaTime = System.currentTimeMillis() + _context.random().nextInt(META_FREQUENCY); _nextInfoTime = System.currentTimeMillis() + (INFO_FREQUENCY / 2) + _context.random().nextInt(INFO_FREQUENCY); } + + /** @return seconds */ public long getClockSkew() { return _clockSkew; } + + /** @return milliseconds */ public long getUptime() { if (!_established) return getTimeSinceCreated(); else return System.currentTimeMillis()-_establishedOn; } + public long getMessagesSent() { return _messagesWritten; } public long getMessagesReceived() { return _messagesRead; } public long getOutboundQueueSize() { @@ -222,9 +219,16 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener { queued++; return queued; } + + /** @return milliseconds */ public long getTimeSinceSend() { return System.currentTimeMillis()-_lastSendTime; } + + /** @return milliseconds */ public long getTimeSinceReceive() { return System.currentTimeMillis()-_lastReceiveTime; } + + /** @return milliseconds */ public long getTimeSinceCreated() { return System.currentTimeMillis()-_created; } + public int getConsecutiveBacklog() { return _consecutiveBacklog; } public boolean isClosed() { return _closed; } @@ -344,8 +348,7 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener { OutNetMessage infoMsg = new OutNetMessage(_context); infoMsg.setExpiration(_context.clock().now()+10*1000); DatabaseStoreMessage dsm = new DatabaseStoreMessage(_context); - dsm.setKey(_context.routerHash()); - dsm.setRouterInfo(_context.router().getRouterInfo()); + dsm.setEntry(_context.router().getRouterInfo()); infoMsg.setMessage(dsm); infoMsg.setPriority(100); RouterInfo target = _context.netDb().lookupRouterInfoLocally(_remotePeer.calculateHash()); @@ -625,26 +628,26 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener { } msg.beginTransmission(); - long begin = System.currentTimeMillis(); + //long begin = System.currentTimeMillis(); PrepBuffer buf = (PrepBuffer)msg.releasePreparationBuffer(); if (buf == null) throw new RuntimeException("buf is null for " + msg); _context.aes().encrypt(buf.unencrypted, 0, buf.encrypted, 0, _sessionKey, _prevWriteEnd, 0, buf.unencryptedLength); System.arraycopy(buf.encrypted, buf.encrypted.length-16, _prevWriteEnd, 0, _prevWriteEnd.length); - long encryptedTime = System.currentTimeMillis(); + //long encryptedTime = System.currentTimeMillis(); //if (_log.shouldLog(Log.DEBUG)) // _log.debug("Encrypting " + msg + " [" + System.identityHashCode(msg) + "] crc=" + crc.getValue() + "\nas: " // + Base64.encode(encrypted, 0, 16) + "...\ndecrypted: " // + Base64.encode(unencrypted, 0, 16) + "..." + "\nIV=" + Base64.encode(_prevWriteEnd, 0, 16)); _transport.getPumper().wantsWrite(this, buf.encrypted); - long wantsTime = System.currentTimeMillis(); + //long wantsTime = System.currentTimeMillis(); releaseBuf(buf); - long releaseTime = System.currentTimeMillis(); - if (_log.shouldLog(Log.DEBUG)) - _log.debug("prepared outbound " + System.identityHashCode(msg) - + " encrypted=" + (encryptedTime-begin) - + " wantsWrite=" + (wantsTime-encryptedTime) - + " releaseBuf=" + (releaseTime-wantsTime)); + //long releaseTime = System.currentTimeMillis(); + //if (_log.shouldLog(Log.DEBUG)) + // _log.debug("prepared outbound " + System.identityHashCode(msg) + // + " encrypted=" + (encryptedTime-begin) + // + " wantsWrite=" + (wantsTime-encryptedTime) + // + " releaseBuf=" + (releaseTime-wantsTime)); // for every 6-12 hours that we are connected to a peer, send them // our updated netDb info (they may not accept it and instead query @@ -667,9 +670,9 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener { //if (!_isInbound && !_established) // return; msg.beginPrepare(); - long begin = System.currentTimeMillis(); + //long begin = System.currentTimeMillis(); PrepBuffer buf = acquireBuf(); - long alloc = System.currentTimeMillis(); + //long alloc = System.currentTimeMillis(); I2NPMessage m = msg.getMessage(); buf.baseLength = m.toByteArray(buf.base); @@ -689,7 +692,7 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener { _context.random().nextBytes(buf.pad); // maybe more than necessary, but its only the prng System.arraycopy(buf.pad, 0, buf.unencrypted, 2+sz, buf.padLength); - long serialized = System.currentTimeMillis(); + //long serialized = System.currentTimeMillis(); buf.crc.update(buf.unencrypted, 0, buf.unencryptedLength-4); long val = buf.crc.getValue(); @@ -700,11 +703,11 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener { DataHelper.toLong(buf.unencrypted, buf.unencryptedLength-4, 4, val); buf.encrypted = new byte[buf.unencryptedLength]; - long crced = System.currentTimeMillis(); + //long crced = System.currentTimeMillis(); msg.prepared(buf); - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Buffered prepare took " + (crced-begin) + ", alloc=" + (alloc-begin) - + " serialize=" + (serialized-alloc) + " crc=" + (crced-serialized)); + //if (_log.shouldLog(Log.DEBUG)) + // _log.debug("Buffered prepare took " + (crced-begin) + ", alloc=" + (alloc-begin) + // + " serialize=" + (serialized-alloc) + " crc=" + (crced-serialized)); } private static final int MIN_PREP_BUFS = 5; @@ -828,14 +831,16 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener { * contents have been fully allocated */ public void queuedRecv(ByteBuffer buf, FIFOBandwidthLimiter.Request req) { - addRequest(req); req.attach(buf); req.setCompleteListener(this); + addRequest(req); } + + /** ditto for writes */ public void queuedWrite(ByteBuffer buf, FIFOBandwidthLimiter.Request req) { - addRequest(req); req.attach(buf); req.setCompleteListener(this); + addRequest(req); } /** @@ -1083,15 +1088,6 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener { // enqueueInfoMessage(); // this often? } - @Override - public int hashCode() { return System.identityHashCode(this); } - @Override - public boolean equals(Object obj) { - if(obj == null) return false; - if(obj.getClass() != NTCPConnection.class) return false; - return obj == this; - } - private static final int MAX_HANDLERS = 4; private final static LinkedBlockingQueue<I2NPMessageHandler> _i2npHandlers = new LinkedBlockingQueue(MAX_HANDLERS); diff --git a/router/java/src/net/i2p/router/transport/ntcp/NTCPSendFinisher.java b/router/java/src/net/i2p/router/transport/ntcp/NTCPSendFinisher.java index 374c7a5ba0dbf89fca890c991106a7209377476d..630036204d5402a6f0c9c7a339265fc27397a88a 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/NTCPSendFinisher.java +++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPSendFinisher.java @@ -23,7 +23,7 @@ import net.i2p.util.Log; * * @author zzz */ -public class NTCPSendFinisher { +class NTCPSendFinisher { private static final int MIN_THREADS = 1; private static final int MAX_THREADS = 4; private final I2PAppContext _context; @@ -31,7 +31,13 @@ public class NTCPSendFinisher { private final Log _log; private static int _count; private ThreadPoolExecutor _executor; - private static int _threads; + private static final int THREADS; + static { + long maxMemory = Runtime.getRuntime().maxMemory(); + if (maxMemory == Long.MAX_VALUE) + maxMemory = 96*1024*1024l; + THREADS = (int) Math.max(MIN_THREADS, Math.min(MAX_THREADS, 1 + (maxMemory / (32*1024*1024)))); + } public NTCPSendFinisher(I2PAppContext context, NTCPTransport transport) { _context = context; @@ -42,9 +48,7 @@ public class NTCPSendFinisher { public void start() { _count = 0; - long maxMemory = Runtime.getRuntime().maxMemory(); - _threads = (int) Math.max(MIN_THREADS, Math.min(MAX_THREADS, 1 + (maxMemory / (32*1024*1024)))); - _executor = new CustomThreadPoolExecutor(_threads); + _executor = new CustomThreadPoolExecutor(THREADS); } public void stop() { @@ -73,7 +77,7 @@ public class NTCPSendFinisher { private static class CustomThreadFactory implements ThreadFactory { public Thread newThread(Runnable r) { Thread rv = Executors.defaultThreadFactory().newThread(r); - rv.setName("NTCPSendFinisher " + (++_count) + '/' + _threads); + rv.setName("NTCPSendFinisher " + (++_count) + '/' + THREADS); rv.setDaemon(true); return rv; } diff --git a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java index 62d57810e87fedab50b873093eeecc325d5c4e28..326f659effbf2b8fdf193edb155af88edc86c88a 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java +++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java @@ -491,6 +491,8 @@ public class NTCPTransport extends TransportImpl { _pumper.startPumping(); long maxMemory = Runtime.getRuntime().maxMemory(); + if (maxMemory == Long.MAX_VALUE) + maxMemory = 128*1024*1024l; int nr, nw; if (maxMemory < 32*1024*1024) { nr = nw = 1; diff --git a/router/java/src/net/i2p/router/transport/udp/ACKSender.java b/router/java/src/net/i2p/router/transport/udp/ACKSender.java index d6035766db1410fbf757b842ce3e52ce6bca2b02..33fd401df1d2b24f9370bd811e0a7bfb28604ced 100644 --- a/router/java/src/net/i2p/router/transport/udp/ACKSender.java +++ b/router/java/src/net/i2p/router/transport/udp/ACKSender.java @@ -2,6 +2,7 @@ package net.i2p.router.transport.udp; import java.util.HashSet; import java.util.List; +import java.util.NoSuchElementException; import java.util.Set; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; @@ -120,7 +121,7 @@ class ACKSender implements Runnable { try { // bulk operations may throw an exception _peersToACK.addAll(notYet); - } catch (Exception e) {} + } catch (NoSuchElementException nsee) {} notYet.clear(); break; } else { diff --git a/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java b/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java index d19f929c275b22df983e31aef2655689e376140f..24e0efe87720e18fa00108da7712ef1d153bc623 100644 --- a/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java +++ b/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java @@ -577,8 +577,7 @@ class EstablishmentManager { (isInbound ? " inbound con from " + peer : "outbound con to " + peer)); DatabaseStoreMessage m = new DatabaseStoreMessage(_context); - m.setKey(_context.routerHash()); - m.setRouterInfo(_context.router().getRouterInfo()); + m.setEntry(_context.router().getRouterInfo()); m.setMessageExpiration(_context.clock().now() + 10*1000); _transport.send(m, peer); } @@ -642,7 +641,7 @@ class EstablishmentManager { private void handlePendingIntro(OutboundEstablishState state) { long nonce = _context.random().nextLong(MAX_NONCE); while (true) { - OutboundEstablishState old = _liveIntroductions.putIfAbsent(new Long(nonce), state); + OutboundEstablishState old = _liveIntroductions.putIfAbsent(Long.valueOf(nonce), state); if (old != null) { nonce = _context.random().nextLong(MAX_NONCE); } else { @@ -670,7 +669,7 @@ class EstablishmentManager { } public void timeReached() { // remove only if value equal to state - boolean removed = _liveIntroductions.remove(new Long(_nonce), _state); + boolean removed = _liveIntroductions.remove(Long.valueOf(_nonce), _state); if (removed) { if (_log.shouldLog(Log.DEBUG)) _log.debug("Send intro for " + _state.getRemoteHostId().toString() + " timed out"); @@ -682,7 +681,7 @@ class EstablishmentManager { void receiveRelayResponse(RemoteHostId bob, UDPPacketReader reader) { long nonce = reader.getRelayResponseReader().readNonce(); - OutboundEstablishState state = _liveIntroductions.remove(new Long(nonce)); + OutboundEstablishState state = _liveIntroductions.remove(Long.valueOf(nonce)); if (state == null) return; // already established diff --git a/router/java/src/net/i2p/router/transport/udp/InboundMessageFragments.java b/router/java/src/net/i2p/router/transport/udp/InboundMessageFragments.java index bc0ddc5f5e1fdc0fabec9c8a0d520028b05e2617..f685c9e787e6a1dbc522ee8d9ff23757814f0353 100644 --- a/router/java/src/net/i2p/router/transport/udp/InboundMessageFragments.java +++ b/router/java/src/net/i2p/router/transport/udp/InboundMessageFragments.java @@ -100,7 +100,7 @@ class InboundMessageFragments /*implements UDPTransport.PartialACKSource */{ for (int i = 0; i < fragments; i++) { long mid = data.readMessageId(i); - Long messageId = new Long(mid); + Long messageId = Long.valueOf(mid); if (_recentlyCompletedMessages.isKnown(mid)) { _context.statManager().addRateData("udp.ignoreRecentDuplicate", 1, 0); diff --git a/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java b/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java index 326c43f15d1b4721d641b7a9db81df3e5d6619ad..b39f44de9ad7f7803ee406e620a64f29e7d33a55 100644 --- a/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java +++ b/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java @@ -53,7 +53,7 @@ class IntroductionManager { _log.debug("Adding peer " + peer.getRemoteHostId() + ", weRelayToThemAs " + peer.getWeRelayToThemAs() + ", theyRelayToUsAs " + peer.getTheyRelayToUsAs()); if (peer.getWeRelayToThemAs() > 0) - _outbound.put(new Long(peer.getWeRelayToThemAs()), peer); + _outbound.put(Long.valueOf(peer.getWeRelayToThemAs()), peer); if (peer.getTheyRelayToUsAs() > 0) { _inbound.add(peer); } @@ -65,14 +65,14 @@ class IntroductionManager { _log.debug("removing peer " + peer.getRemoteHostId() + ", weRelayToThemAs " + peer.getWeRelayToThemAs() + ", theyRelayToUsAs " + peer.getTheyRelayToUsAs()); if (peer.getWeRelayToThemAs() > 0) - _outbound.remove(new Long(peer.getWeRelayToThemAs())); + _outbound.remove(Long.valueOf(peer.getWeRelayToThemAs())); if (peer.getTheyRelayToUsAs() > 0) { _inbound.remove(peer); } } public PeerState get(long id) { - return _outbound.get(new Long(id)); + return _outbound.get(Long.valueOf(id)); } /** diff --git a/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java b/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java index 4988a06851a463b3b9abd9367c623741e185e96c..dede98ef7dc1c629f2f4ddc7796f54a8f56a66a5 100644 --- a/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java +++ b/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java @@ -39,6 +39,8 @@ class MessageReceiver { _completeMessages = new LinkedBlockingQueue(); long maxMemory = Runtime.getRuntime().maxMemory(); + if (maxMemory == Long.MAX_VALUE) + maxMemory = 96*1024*1024l; if (maxMemory < 32*1024*1024) _threadCount = 1; else if (maxMemory < 64*1024*1024) diff --git a/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java b/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java index 98daaecf981e36220259e5a4ad482f5a841bdcfd..cc43c4b2e3cb2d6091cb7100e9514bc9f50b68c3 100644 --- a/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java +++ b/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java @@ -661,7 +661,6 @@ class PacketBuilder { */ public UDPPacket buildSessionDestroyPacket(PeerState peer) { UDPPacket packet = buildPacketHeader((byte)(UDPPacket.PAYLOAD_TYPE_SESSION_DESTROY << 4)); - byte data[] = packet.getPacket().getData(); int off = HEADER_SIZE; StringBuilder msg = null; diff --git a/router/java/src/net/i2p/router/transport/udp/PacketHandler.java b/router/java/src/net/i2p/router/transport/udp/PacketHandler.java index 2c0138228d728d69a854573718659232a03526bc..824f4a9285eab2e3a3d65c5e5c4e626621832bfd 100644 --- a/router/java/src/net/i2p/router/transport/udp/PacketHandler.java +++ b/router/java/src/net/i2p/router/transport/udp/PacketHandler.java @@ -20,14 +20,14 @@ import net.i2p.util.Log; * */ class PacketHandler { - private RouterContext _context; - private Log _log; - private UDPTransport _transport; - private UDPEndpoint _endpoint; - private EstablishmentManager _establisher; - private InboundMessageFragments _inbound; - private PeerTestManager _testManager; - private IntroductionManager _introManager; + private final RouterContext _context; + private final Log _log; + private final UDPTransport _transport; + private final UDPEndpoint _endpoint; + private final EstablishmentManager _establisher; + private final InboundMessageFragments _inbound; + private final PeerTestManager _testManager; + private final IntroductionManager _introManager; private boolean _keepReading; private final Handler[] _handlers; @@ -48,6 +48,8 @@ class PacketHandler { _introManager = introManager; long maxMemory = Runtime.getRuntime().maxMemory(); + if (maxMemory == Long.MAX_VALUE) + maxMemory = 96*1024*1024l; int num_handlers; if (maxMemory < 32*1024*1024) num_handlers = 1; @@ -337,6 +339,9 @@ class PacketHandler { _state = 30; } + /** + * @param state non-null + */ private void receivePacket(UDPPacketReader reader, UDPPacket packet, InboundEstablishState state) { receivePacket(reader, packet, state, true); } @@ -345,11 +350,12 @@ class PacketHandler { * Inbound establishing conn * Decrypt and validate the packet then call handlePacket() * + * @param state non-null * @param allowFallback if it isn't valid for this establishment state, try as a non-establishment packet */ private void receivePacket(UDPPacketReader reader, UDPPacket packet, InboundEstablishState state, boolean allowFallback) { _state = 31; - if ( (state != null) && (_log.shouldLog(Log.DEBUG)) ) { + if (_log.shouldLog(Log.DEBUG)) { StringBuilder buf = new StringBuilder(128); buf.append("Attempting to receive a packet on a known inbound state: "); buf.append(state); @@ -388,10 +394,12 @@ class PacketHandler { /** * Outbound establishing conn * Decrypt and validate the packet then call handlePacket() + * + * @param state non-null */ private void receivePacket(UDPPacketReader reader, UDPPacket packet, OutboundEstablishState state) { _state = 35; - if ( (state != null) && (_log.shouldLog(Log.DEBUG)) ) { + if (_log.shouldLog(Log.DEBUG)) { StringBuilder buf = new StringBuilder(128); buf.append("Attempting to receive a packet on a known outbound state: "); buf.append(state); @@ -467,7 +475,7 @@ class PacketHandler { // so we have to wait for NTCP to do it _context.clock().setOffset(0 - skew, true); if (skew != 0) - _log.error("NTP failure, UDP adjusting clock by " + DataHelper.formatDuration(Math.abs(skew))); + _log.logAlways(Log.WARN, "NTP failure, UDP adjusting clock by " + DataHelper.formatDuration(Math.abs(skew))); } if (skew > GRACE_PERIOD) { diff --git a/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java b/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java index a3211a5a620f065212fe56117fb747f59d889b78..46b1e4666884af6891487359a1f8bab4d41d8eb3 100644 --- a/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java +++ b/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java @@ -153,7 +153,7 @@ class PeerTestManager { _log.debug("Running test with bob = " + bobIP + ":" + bobPort + " " + test.getNonce()); while (_recentTests.size() > 16) _recentTests.poll(); - _recentTests.offer(new Long(test.getNonce())); + _recentTests.offer(Long.valueOf(test.getNonce())); sendTestToBob(); @@ -432,7 +432,7 @@ class PeerTestManager { testInfo.readIP(testIP, 0); } - PeerTestState state = _activeTests.get(new Long(nonce)); + PeerTestState state = _activeTests.get(Long.valueOf(nonce)); if (state == null) { if ( (testIP == null) || (testPort <= 0) ) { @@ -441,7 +441,7 @@ class PeerTestManager { _log.debug("test IP/port are blank coming from " + from + ", assuming we are Bob and they are alice"); receiveFromAliceAsBob(from, testInfo, nonce, null); } else { - if (_recentTests.contains(new Long(nonce))) { + if (_recentTests.contains(Long.valueOf(nonce))) { // ignore the packet, as its a holdover from a recently completed locally // initiated test } else { @@ -536,7 +536,7 @@ class PeerTestManager { _log.debug("Receive from bob (" + from + ") as charlie, sending back to bob and sending to alice @ " + aliceIP + ":" + alicePort); if (isNew) { - _activeTests.put(new Long(nonce), state); + _activeTests.put(Long.valueOf(nonce), state); SimpleScheduler.getInstance().addEvent(new RemoveTest(nonce), MAX_CHARLIE_LIFETIME); } @@ -615,7 +615,7 @@ class PeerTestManager { } if (isNew) { - _activeTests.put(new Long(nonce), state); + _activeTests.put(Long.valueOf(nonce), state); SimpleScheduler.getInstance().addEvent(new RemoveTest(nonce), MAX_CHARLIE_LIFETIME); } @@ -691,7 +691,7 @@ class PeerTestManager { _nonce = nonce; } public void timeReached() { - _activeTests.remove(new Long(_nonce)); + _activeTests.remove(Long.valueOf(_nonce)); } } } diff --git a/router/java/src/net/i2p/router/transport/udp/RemoteHostId.java b/router/java/src/net/i2p/router/transport/udp/RemoteHostId.java index 510d712a0bb478838e0e6a3977ca823b4ce6e9dc..837a50268e62d94a68855eb59bf7232498a4f57b 100644 --- a/router/java/src/net/i2p/router/transport/udp/RemoteHostId.java +++ b/router/java/src/net/i2p/router/transport/udp/RemoteHostId.java @@ -28,21 +28,15 @@ final class RemoteHostId { @Override public int hashCode() { - int rv = 0; - for (int i = 0; _ip != null && i < _ip.length; i++) - rv += _ip[i] << i; - for (int i = 0; _peerHash != null && i < _peerHash.length; i++) - rv += _peerHash[i] << i; - rv += _port; - return rv; + return DataHelper.hashCode(_ip) ^ DataHelper.hashCode(_peerHash) ^ _port; } @Override public boolean equals(Object obj) { if (obj == null) - throw new NullPointerException("obj is null"); + return false; if (!(obj instanceof RemoteHostId)) - throw new ClassCastException("obj is a " + obj.getClass().getName()); + return false; RemoteHostId id = (RemoteHostId)obj; return (_port == id.getPort()) && DataHelper.eq(_ip, id.getIP()) && DataHelper.eq(_peerHash, id.getPeerHash()); } diff --git a/router/java/src/net/i2p/router/transport/udp/UDPAddress.java b/router/java/src/net/i2p/router/transport/udp/UDPAddress.java index 6db0b1c6c2d840106582216896634306eeaff141..bcee07605e44a222faed26f1fc4c4b3b7f957d29 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPAddress.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPAddress.java @@ -10,6 +10,7 @@ import net.i2p.data.SessionKey; /** * basic helper to parse out peer info from a udp address + * FIXME public for ConfigNetHelper */ public class UDPAddress { private String _host; @@ -152,7 +153,7 @@ public class UDPAddress { } public String getHost() { return _host; } - public InetAddress getHostAddress() { + InetAddress getHostAddress() { if (_hostAddress == null) { try { _hostAddress = InetAddress.getByName(_host); @@ -163,10 +164,10 @@ public class UDPAddress { return _hostAddress; } public int getPort() { return _port; } - public byte[] getIntroKey() { return _introKey; } + byte[] getIntroKey() { return _introKey; } - public int getIntroducerCount() { return (_introAddresses == null ? 0 : _introAddresses.length); } - public InetAddress getIntroducerHost(int i) { + int getIntroducerCount() { return (_introAddresses == null ? 0 : _introAddresses.length); } + InetAddress getIntroducerHost(int i) { if (_introAddresses[i] == null) { try { _introAddresses[i] = InetAddress.getByName(_introHosts[i]); @@ -176,8 +177,8 @@ public class UDPAddress { } return _introAddresses[i]; } - public int getIntroducerPort(int i) { return _introPorts[i]; } - public byte[] getIntroducerKey(int i) { return _introKeys[i]; } - public long getIntroducerTag(int i) { return _introTags[i]; } + int getIntroducerPort(int i) { return _introPorts[i]; } + byte[] getIntroducerKey(int i) { return _introKeys[i]; } + long getIntroducerTag(int i) { return _introTags[i]; } } diff --git a/router/java/src/net/i2p/router/transport/udp/UDPReceiver.java b/router/java/src/net/i2p/router/transport/udp/UDPReceiver.java index 0a1937db10d8c7c59e9c21da37b49536e6e7a563..ded71f8a2abe350980aa06ca08cefa5bf2ca0ff6 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPReceiver.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPReceiver.java @@ -20,16 +20,16 @@ import net.i2p.util.SimpleTimer; * */ class UDPReceiver { - private RouterContext _context; - private Log _log; + private final RouterContext _context; + private final Log _log; private DatagramSocket _socket; private String _name; private final BlockingQueue<UDPPacket> _inboundQueue; private boolean _keepRunning; - private Runner _runner; - private UDPTransport _transport; + private final Runner _runner; + private final UDPTransport _transport; private static int __id; - private int _id; + private final int _id; private static final int TYPE_POISON = -99999; public UDPReceiver(RouterContext ctx, UDPTransport transport, DatagramSocket socket, String name) { @@ -179,8 +179,7 @@ class UDPReceiver { msg.append(queueSize); msg.append(" queued for "); msg.append(headPeriod); - if (_transport != null) - msg.append(" packet handlers: ").append(_transport.getPacketHandlerStatus()); + msg.append(" packet handlers: ").append(_transport.getPacketHandlerStatus()); _log.warn(msg.toString()); } return queueSize; diff --git a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java index b55d845adcd276ab5e0fb8a78b627e4a1f29e7a3..b8f1d35ee4b38d8268533f68164256be884e1f2f 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java @@ -18,6 +18,7 @@ import java.util.TreeSet; import java.util.Vector; import java.util.concurrent.ConcurrentHashMap; +import net.i2p.data.DatabaseEntry; import net.i2p.data.DataHelper; import net.i2p.data.Hash; import net.i2p.data.RouterAddress; @@ -33,6 +34,7 @@ import net.i2p.router.RouterContext; import net.i2p.router.transport.Transport; import net.i2p.router.transport.TransportBid; import net.i2p.router.transport.TransportImpl; +import net.i2p.router.util.RandomIterator; import net.i2p.util.ConcurrentHashSet; import net.i2p.util.Log; import net.i2p.util.SimpleScheduler; @@ -52,16 +54,16 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private PacketHandler _handler; private EstablishmentManager _establisher; private final MessageQueue _outboundMessages; - private OutboundMessageFragments _fragments; + private final OutboundMessageFragments _fragments; private final OutboundMessageFragments.ActiveThrottle _activeThrottle; private OutboundRefiller _refiller; private PacketPusher _pusher; - private InboundMessageFragments _inboundFragments; + private final InboundMessageFragments _inboundFragments; private UDPFlooder _flooder; private PeerTestManager _testManager; private final IntroductionManager _introManager; - private ExpirePeerEvent _expireEvent; - private PeerTestEvent _testEvent; + private final ExpirePeerEvent _expireEvent; + private final PeerTestEvent _testEvent; private short _reachabilityStatus; private long _reachabilityStatusLastUpdated; private long _introducersSelectedOn; @@ -156,7 +158,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority public static final int DEFAULT_COST = 5; private static final int TEST_FREQUENCY = 13*60*1000; - public static final long[] RATES = { 10*60*1000 }; + static final long[] RATES = { 10*60*1000 }; private static final int[] BID_VALUES = { 15, 20, 50, 65, 80, 95, 100, 115, TransportBid.TRANSIENT_FAIL }; private static final int FAST_PREFERRED_BID = 0; @@ -227,8 +229,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority } public void startup() { - if (_fragments != null) - _fragments.shutdown(); + _fragments.shutdown(); if (_pusher != null) _pusher.shutdown(); if (_handler != null) @@ -239,8 +240,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority _establisher.shutdown(); if (_refiller != null) _refiller.shutdown(); - if (_inboundFragments != null) - _inboundFragments.shutdown(); + _inboundFragments.shutdown(); if (_flooder != null) _flooder.shutdown(); _introManager.reset(); @@ -345,14 +345,12 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority _refiller.shutdown(); if (_handler != null) _handler.shutdown(); - if (_fragments != null) - _fragments.shutdown(); + _fragments.shutdown(); if (_pusher != null) _pusher.shutdown(); if (_establisher != null) _establisher.shutdown(); - if (_inboundFragments != null) - _inboundFragments.shutdown(); + _inboundFragments.shutdown(); _expireEvent.setIsAlive(false); _testEvent.setIsAlive(false); } @@ -773,8 +771,11 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority public void messageReceived(I2NPMessage inMsg, RouterIdentity remoteIdent, Hash remoteIdentHash, long msToReceive, int bytesReceived) { if (inMsg.getType() == DatabaseStoreMessage.MESSAGE_TYPE) { DatabaseStoreMessage dsm = (DatabaseStoreMessage)inMsg; - if ( (dsm.getRouterInfo() != null) && - (dsm.getRouterInfo().getNetworkId() != Router.NETWORK_ID) ) { + DatabaseEntry entry = dsm.getEntry(); + if (entry == null) + return; + if (entry.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO && + ((RouterInfo) entry).getNetworkId() != Router.NETWORK_ID) { // this is pre-0.6.1.10, so it isn't going to happen any more /* @@ -792,7 +793,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority + " because they are in the wrong net"); } */ - Hash peerHash = dsm.getRouterInfo().getIdentity().calculateHash(); + Hash peerHash = entry.getHash(); PeerState peer = getPeerState(peerHash); if (peer != null) { RemoteHostId remote = peer.getRemoteHostId(); @@ -801,14 +802,14 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority SimpleScheduler.getInstance().addEvent(new RemoveDropList(remote), DROPLIST_PERIOD); } markUnreachable(peerHash); - _context.shitlist().shitlistRouter(peerHash, "Part of the wrong network, version = " + dsm.getRouterInfo().getOption("router.version")); + _context.shitlist().shitlistRouter(peerHash, "Part of the wrong network, version = " + ((RouterInfo) entry).getOption("router.version")); //_context.shitlist().shitlistRouter(peerHash, "Part of the wrong network", STYLE); dropPeer(peerHash, false, "wrong network"); if (_log.shouldLog(Log.WARN)) - _log.warn("Dropping the peer " + peerHash.toBase64() + " because they are in the wrong net: " + dsm.getRouterInfo()); + _log.warn("Dropping the peer " + peerHash.toBase64() + " because they are in the wrong net: " + entry); return; } else { - if (dsm.getRouterInfo() != null) { + if (entry.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO) { if (_log.shouldLog(Log.INFO)) _log.info("Received an RI from the same net"); } else { @@ -1116,7 +1117,11 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority if (msg == null) return; if (msg.getTarget() == null) return; if (msg.getTarget().getIdentity() == null) return; - + if (_establisher == null) { + failed(msg, "UDP not up yet"); + return; + } + msg.timestamp("sending on UDP transport"); Hash to = msg.getTarget().getIdentity().calculateHash(); PeerState peer = getPeerState(to); @@ -1443,11 +1448,12 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority if (_log.shouldLog(Log.INFO)) _log.info("Sending message failed: " + msg, new Exception("failed from")); - if (!_context.messageHistory().getDoLog()) + if (_context.messageHistory().getDoLog()) _context.messageHistory().sendMessage(msg.getMessageType(), msg.getMessageId(), msg.getExpiration(), msg.getTarget().getIdentity().calculateHash(), false, reason); super.afterSend(msg, false); } + public void succeeded(OutboundMessageState msg) { if (msg == null) return; if (_log.shouldLog(Log.DEBUG)) @@ -1633,7 +1639,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private static final IdleInComparator _instance = new IdleInComparator(); public static final IdleInComparator instance() { return _instance; } @Override - protected int compare(PeerState l, PeerState r) { + public int compare(PeerState l, PeerState r) { long rv = r.getLastReceiveTime() - l.getLastReceiveTime(); if (rv == 0) // fallback on alpha return super.compare(l, r); @@ -1645,7 +1651,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private static final IdleOutComparator _instance = new IdleOutComparator(); public static final IdleOutComparator instance() { return _instance; } @Override - protected int compare(PeerState l, PeerState r) { + public int compare(PeerState l, PeerState r) { long rv = r.getLastSendTime() - l.getLastSendTime(); if (rv == 0) // fallback on alpha return super.compare(l, r); @@ -1657,7 +1663,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private static final RateInComparator _instance = new RateInComparator(); public static final RateInComparator instance() { return _instance; } @Override - protected int compare(PeerState l, PeerState r) { + public int compare(PeerState l, PeerState r) { long rv = l.getReceiveBps() - r.getReceiveBps(); if (rv == 0) // fallback on alpha return super.compare(l, r); @@ -1669,7 +1675,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private static final RateOutComparator _instance = new RateOutComparator(); public static final RateOutComparator instance() { return _instance; } @Override - protected int compare(PeerState l, PeerState r) { + public int compare(PeerState l, PeerState r) { long rv = l.getSendBps() - r.getSendBps(); if (rv == 0) // fallback on alpha return super.compare(l, r); @@ -1681,7 +1687,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private static final UptimeComparator _instance = new UptimeComparator(); public static final UptimeComparator instance() { return _instance; } @Override - protected int compare(PeerState l, PeerState r) { + public int compare(PeerState l, PeerState r) { long rv = r.getKeyEstablishedTime() - l.getKeyEstablishedTime(); if (rv == 0) // fallback on alpha return super.compare(l, r); @@ -1693,7 +1699,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private static final SkewComparator _instance = new SkewComparator(); public static final SkewComparator instance() { return _instance; } @Override - protected int compare(PeerState l, PeerState r) { + public int compare(PeerState l, PeerState r) { long rv = Math.abs(l.getClockSkew()) - Math.abs(r.getClockSkew()); if (rv == 0) // fallback on alpha return super.compare(l, r); @@ -1705,7 +1711,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private static final CwndComparator _instance = new CwndComparator(); public static final CwndComparator instance() { return _instance; } @Override - protected int compare(PeerState l, PeerState r) { + public int compare(PeerState l, PeerState r) { long rv = l.getSendWindowBytes() - r.getSendWindowBytes(); if (rv == 0) // fallback on alpha return super.compare(l, r); @@ -1717,7 +1723,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private static final SsthreshComparator _instance = new SsthreshComparator(); public static final SsthreshComparator instance() { return _instance; } @Override - protected int compare(PeerState l, PeerState r) { + public int compare(PeerState l, PeerState r) { long rv = l.getSlowStartThreshold() - r.getSlowStartThreshold(); if (rv == 0) // fallback on alpha return super.compare(l, r); @@ -1729,7 +1735,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private static final RTTComparator _instance = new RTTComparator(); public static final RTTComparator instance() { return _instance; } @Override - protected int compare(PeerState l, PeerState r) { + public int compare(PeerState l, PeerState r) { long rv = l.getRTT() - r.getRTT(); if (rv == 0) // fallback on alpha return super.compare(l, r); @@ -1741,7 +1747,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private static final DevComparator _instance = new DevComparator(); public static final DevComparator instance() { return _instance; } @Override - protected int compare(PeerState l, PeerState r) { + public int compare(PeerState l, PeerState r) { long rv = l.getRTTDeviation() - r.getRTTDeviation(); if (rv == 0) // fallback on alpha return super.compare(l, r); @@ -1753,7 +1759,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private static final RTOComparator _instance = new RTOComparator(); public static final RTOComparator instance() { return _instance; } @Override - protected int compare(PeerState l, PeerState r) { + public int compare(PeerState l, PeerState r) { long rv = l.getRTO() - r.getRTO(); if (rv == 0) // fallback on alpha return super.compare(l, r); @@ -1765,7 +1771,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private static final MTUComparator _instance = new MTUComparator(); public static final MTUComparator instance() { return _instance; } @Override - protected int compare(PeerState l, PeerState r) { + public int compare(PeerState l, PeerState r) { long rv = l.getMTU() - r.getMTU(); if (rv == 0) // fallback on alpha return super.compare(l, r); @@ -1777,7 +1783,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private static final SendCountComparator _instance = new SendCountComparator(); public static final SendCountComparator instance() { return _instance; } @Override - protected int compare(PeerState l, PeerState r) { + public int compare(PeerState l, PeerState r) { long rv = l.getPacketsTransmitted() - r.getPacketsTransmitted(); if (rv == 0) // fallback on alpha return super.compare(l, r); @@ -1789,7 +1795,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private static final RecvCountComparator _instance = new RecvCountComparator(); public static final RecvCountComparator instance() { return _instance; } @Override - protected int compare(PeerState l, PeerState r) { + public int compare(PeerState l, PeerState r) { long rv = l.getPacketsReceived() - r.getPacketsReceived(); if (rv == 0) // fallback on alpha return super.compare(l, r); @@ -1801,7 +1807,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private static final ResendComparator _instance = new ResendComparator(); public static final ResendComparator instance() { return _instance; } @Override - protected int compare(PeerState l, PeerState r) { + public int compare(PeerState l, PeerState r) { long rv = l.getPacketsRetransmitted() - r.getPacketsRetransmitted(); if (rv == 0) // fallback on alpha return super.compare(l, r); @@ -1813,7 +1819,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private static final DupComparator _instance = new DupComparator(); public static final DupComparator instance() { return _instance; } @Override - protected int compare(PeerState l, PeerState r) { + public int compare(PeerState l, PeerState r) { long rv = l.getPacketsReceivedDuplicate() - r.getPacketsReceivedDuplicate(); if (rv == 0) // fallback on alpha return super.compare(l, r); @@ -1822,17 +1828,12 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority } } - private static class PeerComparator implements Comparator { - public int compare(Object lhs, Object rhs) { - if ( (lhs == null) || (rhs == null) || !(lhs instanceof PeerState) || !(rhs instanceof PeerState)) - throw new IllegalArgumentException("rhs = " + rhs + " lhs = " + lhs); - return compare((PeerState)lhs, (PeerState)rhs); - } - protected int compare(PeerState l, PeerState r) { - // base64 retains binary ordering - return l.getRemotePeer().toBase64().compareTo(r.getRemotePeer().toBase64()); + private static class PeerComparator implements Comparator<PeerState> { + public int compare(PeerState l, PeerState r) { + return DataHelper.compareTo(l.getRemotePeer().getData(), r.getRemotePeer().getData()); } } + private static class InverseComparator implements Comparator { private Comparator _comp; public InverseComparator(Comparator comp) { _comp = comp; } @@ -2327,9 +2328,8 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority PeerState pickTestPeer(RemoteHostId dontInclude) { List<PeerState> peers = new ArrayList(_peersByIdent.values()); - Collections.shuffle(peers, _context.random()); - for (int i = 0; i < peers.size(); i++) { - PeerState peer = peers.get(i); + for (Iterator<PeerState> iter = new RandomIterator(peers); iter.hasNext(); ) { + PeerState peer = iter.next(); if ( (dontInclude != null) && (dontInclude.equals(peer.getRemoteHostId())) ) continue; RouterInfo peerInfo = _context.netDb().lookupRouterInfoLocally(peer.getRemotePeer()); diff --git a/router/java/src/net/i2p/router/tunnel/BuildMessageGenerator.java b/router/java/src/net/i2p/router/tunnel/BuildMessageGenerator.java index da169db7517f3125aa930af617244f605ac2dfbc..1790669890f1d1abea6c1d49a44f4e71bfdd2221 100644 --- a/router/java/src/net/i2p/router/tunnel/BuildMessageGenerator.java +++ b/router/java/src/net/i2p/router/tunnel/BuildMessageGenerator.java @@ -21,9 +21,6 @@ import net.i2p.util.Log; * */ public class BuildMessageGenerator { - // cached, rather than creating lots of temporary Integer objects whenever we build a tunnel - public static final Integer ORDER[] = new Integer[TunnelBuildMessage.MAX_RECORD_COUNT]; - static { for (int i = 0; i < ORDER.length; i++) ORDER[i] = Integer.valueOf(i); } /** return null if it is unable to find a router's public key (etc) */ /**** diff --git a/router/java/src/net/i2p/router/tunnel/FragmentHandler.java b/router/java/src/net/i2p/router/tunnel/FragmentHandler.java index 7948c5387b7ac4917df0d89841dc5afab4014331..a0a2f2edacdf2fe8d93cf450001547614215c987 100644 --- a/router/java/src/net/i2p/router/tunnel/FragmentHandler.java +++ b/router/java/src/net/i2p/router/tunnel/FragmentHandler.java @@ -15,6 +15,7 @@ import net.i2p.data.i2np.I2NPMessageHandler; import net.i2p.router.RouterContext; import net.i2p.util.ByteCache; import net.i2p.util.Log; +import net.i2p.util.SimpleByteCache; import net.i2p.util.SimpleTimer; /** @@ -241,19 +242,21 @@ public class FragmentHandler { if (_log.shouldLog(Log.DEBUG)) _log.debug("endpoint IV: " + Base64.encode(preV, validLength - HopProcessor.IV_LENGTH, HopProcessor.IV_LENGTH)); - Hash v = _context.sha().calculateHash(preV, 0, validLength); + byte[] v = SimpleByteCache.acquire(Hash.HASH_LENGTH); + _context.sha().calculateHash(preV, 0, validLength, v, 0); _validateCache.release(ba); - boolean eq = DataHelper.eq(v.getData(), 0, preprocessed, offset + HopProcessor.IV_LENGTH, 4); + boolean eq = DataHelper.eq(v, 0, preprocessed, offset + HopProcessor.IV_LENGTH, 4); if (!eq) { if (_log.shouldLog(Log.WARN)) { _log.warn("Corrupt tunnel message - verification fails: " + Base64.encode(preprocessed, offset+HopProcessor.IV_LENGTH, 4) - + " != " + Base64.encode(v.getData(), 0, 4)); + + " != " + Base64.encode(v, 0, 4)); _log.warn("No matching endpoint: # pad bytes: " + (paddingEnd-(HopProcessor.IV_LENGTH+4)-1) + " offset=" + offset + " length=" + length + " paddingEnd=" + paddingEnd + ' ' + Base64.encode(preprocessed, offset, length), new Exception("trace")); } } + SimpleByteCache.release(v); if (eq) { int excessPadding = paddingEnd - (HopProcessor.IV_LENGTH + 4 + 1); @@ -360,10 +363,10 @@ public class FragmentHandler { FragmentedMessage msg = null; if (fragmented) { synchronized (_fragmentedMessages) { - msg = _fragmentedMessages.get(new Long(messageId)); + msg = _fragmentedMessages.get(Long.valueOf(messageId)); if (msg == null) { msg = new FragmentedMessage(_context); - _fragmentedMessages.put(new Long(messageId), msg); + _fragmentedMessages.put(Long.valueOf(messageId), msg); } } } else { @@ -377,7 +380,7 @@ public class FragmentHandler { if (!ok) return -1; if (msg.isComplete()) { synchronized (_fragmentedMessages) { - _fragmentedMessages.remove(new Long(messageId)); + _fragmentedMessages.remove(Long.valueOf(messageId)); } if (msg.getExpireEvent() != null) SimpleTimer.getInstance().removeEvent(msg.getExpireEvent()); @@ -432,10 +435,10 @@ public class FragmentHandler { FragmentedMessage msg = null; synchronized (_fragmentedMessages) { - msg = _fragmentedMessages.get(new Long(messageId)); + msg = _fragmentedMessages.get(Long.valueOf(messageId)); if (msg == null) { msg = new FragmentedMessage(_context); - _fragmentedMessages.put(new Long(messageId), msg); + _fragmentedMessages.put(Long.valueOf(messageId), msg); } } @@ -446,7 +449,7 @@ public class FragmentHandler { if (msg.isComplete()) { synchronized (_fragmentedMessages) { - _fragmentedMessages.remove(new Long(messageId)); + _fragmentedMessages.remove(Long.valueOf(messageId)); } if (msg.getExpireEvent() != null) SimpleTimer.getInstance().removeEvent(msg.getExpireEvent()); @@ -529,7 +532,7 @@ public class FragmentHandler { public void timeReached() { boolean removed = false; synchronized (_fragmentedMessages) { - removed = (null != _fragmentedMessages.remove(new Long(_msg.getMessageId()))); + removed = (null != _fragmentedMessages.remove(Long.valueOf(_msg.getMessageId()))); } synchronized (_msg) { if (removed && !_msg.getReleased()) { diff --git a/router/java/src/net/i2p/router/tunnel/HopConfig.java b/router/java/src/net/i2p/router/tunnel/HopConfig.java index 532bdfe20c5157f28d16dcca4c9c47a871363862..3ac96bf280c78a2a45bea08e22a770cd81620f9c 100644 --- a/router/java/src/net/i2p/router/tunnel/HopConfig.java +++ b/router/java/src/net/i2p/router/tunnel/HopConfig.java @@ -73,7 +73,7 @@ public class HopConfig { } public void setSendTunnelId(byte id[]) { _sendTunnelId = id; } - private TunnelId getTunnel(byte id[]) { + private static TunnelId getTunnel(byte id[]) { if (id == null) return null; else diff --git a/router/java/src/net/i2p/router/tunnel/HopProcessor.java b/router/java/src/net/i2p/router/tunnel/HopProcessor.java index 205339d7f4076f1556aaf30178a9d91dfc3bd991..eac1f71dae8230111519d3c7110932a792acf481 100644 --- a/router/java/src/net/i2p/router/tunnel/HopProcessor.java +++ b/router/java/src/net/i2p/router/tunnel/HopProcessor.java @@ -77,7 +77,7 @@ public class HopProcessor { boolean okIV = _validator.receiveIV(orig, offset, orig, offset + IV_LENGTH); if (!okIV) { if (_log.shouldLog(Log.WARN)) - _log.warn("Invalid IV received on tunnel " + _config.getReceiveTunnelId()); + _log.warn("Invalid IV received on tunnel " + _config.getReceiveTunnel()); return false; } diff --git a/router/java/src/net/i2p/router/tunnel/InboundMessageDistributor.java b/router/java/src/net/i2p/router/tunnel/InboundMessageDistributor.java index fcdb77ea9ea47868f0e23f65d9f4aec9ec68e171..82fdc47c60ef2bbd56c881a1d427deaa209e7495 100644 --- a/router/java/src/net/i2p/router/tunnel/InboundMessageDistributor.java +++ b/router/java/src/net/i2p/router/tunnel/InboundMessageDistributor.java @@ -1,8 +1,10 @@ package net.i2p.router.tunnel; +import net.i2p.data.DatabaseEntry; import net.i2p.data.Hash; import net.i2p.data.LeaseSet; import net.i2p.data.Payload; +import net.i2p.data.RouterInfo; import net.i2p.data.TunnelId; import net.i2p.data.i2np.DataMessage; import net.i2p.data.i2np.DatabaseSearchReplyMessage; @@ -71,7 +73,7 @@ public class InboundMessageDistributor implements GarlicMessageReceiver.CloveRec msg = newMsg; } else if ( (_client != null) && (msg.getType() == DatabaseStoreMessage.MESSAGE_TYPE) && - (((DatabaseStoreMessage)msg).getValueType() == DatabaseStoreMessage.KEY_TYPE_ROUTERINFO)) { + (((DatabaseStoreMessage)msg).getEntry().getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO)) { // FVSJ may result in an unsolicited RI store if the peer went non-ff. // Maybe we can figure out a way to handle this safely, so we don't ask him again. // For now, just hope we eventually find out through other means. @@ -165,7 +167,7 @@ public class InboundMessageDistributor implements GarlicMessageReceiver.CloveRec // unnecessarily DatabaseStoreMessage dsm = (DatabaseStoreMessage)data; try { - if (dsm.getValueType() == DatabaseStoreMessage.KEY_TYPE_LEASESET) { + if (dsm.getEntry().getType() == DatabaseEntry.KEY_TYPE_LEASESET) { // If it was stored to us before, don't undo the // receivedAsPublished flag so we will continue to respond to requests // for the leaseset. That is, we don't want this to change the @@ -173,10 +175,11 @@ public class InboundMessageDistributor implements GarlicMessageReceiver.CloveRec // When the keyspace rotates at midnight, and this leaseset moves out // of our keyspace, maybe we shouldn't do this? // Should we do this whether ff or not? - LeaseSet old = _context.netDb().store(dsm.getKey(), dsm.getLeaseSet()); + LeaseSet ls = (LeaseSet) dsm.getEntry(); + LeaseSet old = _context.netDb().store(dsm.getKey(), ls); if (old != null && old.getReceivedAsPublished() /** && ((FloodfillNetworkDatabaseFacade)_context.netDb()).floodfillEnabled() **/ ) - dsm.getLeaseSet().setReceivedAsPublished(true); + ls.setReceivedAsPublished(true); if (_log.shouldLog(Log.INFO)) _log.info("Storing LS for: " + dsm.getKey() + " sent to: " + _client); } else { @@ -189,7 +192,7 @@ public class InboundMessageDistributor implements GarlicMessageReceiver.CloveRec _log.error("Dropped dangerous message down a tunnel for " + _client.toBase64() + ": " + dsm, new Exception("cause")); return; } - _context.netDb().store(dsm.getKey(), dsm.getRouterInfo()); + _context.netDb().store(dsm.getKey(), (RouterInfo) dsm.getEntry()); } } catch (IllegalArgumentException iae) { if (_log.shouldLog(Log.WARN)) diff --git a/router/java/src/net/i2p/router/tunnel/TrivialPreprocessor.java b/router/java/src/net/i2p/router/tunnel/TrivialPreprocessor.java index c9b28b85629fe8a448115d21b7da411deba14b95..ae120c18f83a79cd58aef434a2a3be452377b7d4 100644 --- a/router/java/src/net/i2p/router/tunnel/TrivialPreprocessor.java +++ b/router/java/src/net/i2p/router/tunnel/TrivialPreprocessor.java @@ -52,92 +52,11 @@ public class TrivialPreprocessor implements TunnelGateway.QueuePreprocessor { * NOTE: Unused here, see BatchedPreprocessor override, super is not called. */ public boolean preprocessQueue(List<TunnelGateway.Pending> pending, TunnelGateway.Sender sender, TunnelGateway.Receiver rec) { - if (true) throw new IllegalArgumentException("unused, right?"); - long begin = System.currentTimeMillis(); - StringBuilder buf = null; - if (_log.shouldLog(Log.DEBUG)) { - buf = new StringBuilder(256); - buf.append("Trivial preprocessing of ").append(pending.size()).append(" "); - } - while (!pending.isEmpty()) { - TunnelGateway.Pending msg = pending.remove(0); - long beforePreproc = System.currentTimeMillis(); - byte preprocessed[][] = preprocess(msg); - long afterPreproc = System.currentTimeMillis(); - if (buf != null) - buf.append("preprocessed into " + preprocessed.length + " fragments after " + (afterPreproc-beforePreproc) + ". "); - for (int i = 0; i < preprocessed.length; i++) { - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Preprocessed: fragment " + i + "/" + (preprocessed.length-1) + " in " - + msg.getMessageId() + ": " - + " send through " + sender + " receive with " + rec); - //Base64.encode(preprocessed[i])); - long beforeSend = System.currentTimeMillis(); - long id = sender.sendPreprocessed(preprocessed[i], rec); - long afterSend = System.currentTimeMillis(); - if (buf != null) - buf.append("send of " + msg.getMessageId() + " took " + (afterSend-beforeSend) + ". "); - msg.addMessageId(id); - } - notePreprocessing(msg.getMessageId(), msg.getFragmentNumber(), preprocessed.length, msg.getMessageIds(), null); - if (preprocessed.length != msg.getFragmentNumber() + 1) { - throw new RuntimeException("wtf, preprocessed " + msg.getMessageId() + " into " - + msg.getFragmentNumber() + "/" + preprocessed.length + " fragments, size = " - + msg.getData().length); - } - if (buf != null) - buf.append("all fragments sent after " + (System.currentTimeMillis()-afterPreproc) + ". "); - } - if (buf != null) { - buf.append("queue preprocessed after " + (System.currentTimeMillis()-begin) + "."); - _log.debug(buf.toString()); - } - return false; + throw new IllegalArgumentException("unused, right?"); } protected void notePreprocessing(long messageId, int numFragments, int totalLength, List<Long> messageIds, String msg) {} - /* - * @deprecated unused except by above - */ - private byte[][] preprocess(TunnelGateway.Pending msg) { - List<byte[]> fragments = new ArrayList(1); - - while (msg.getOffset() < msg.getData().length) { - fragments.add(preprocessFragment(msg)); - //if (_log.shouldLog(Log.DEBUG)) - // _log.debug("\n\nafter preprocessing fragment\n\n"); - } - - byte rv[][] = new byte[fragments.size()][]; - for (int i = 0; i < fragments.size(); i++) - rv[i] = fragments.get(i); - return rv; - } - - /** - * Preprocess the next available fragment off the given one in phases: - * First, write it out as { instructions + payload + random IV }, calculate the - * SHA256 of that, then move the instructions + payload to the end - * of the target, setting IV as the beginning. Then add the necessary random pad - * bytes after the IV, followed by the first 4 bytes of that SHA256, lining up - * exactly to meet the beginning of the instructions. (i hope) - * - * @deprecated unused except by above - */ - private byte[] preprocessFragment(TunnelGateway.Pending msg) { - byte target[] = _dataCache.acquire().getData(); - - int offset = 0; - if (msg.getOffset() <= 0) - offset = writeFirstFragment(msg, target, offset); - else - offset = writeSubsequentFragment(msg, target, offset); - - preprocess(target, offset); - return target; - } - /** * Wrap the preprocessed fragments with the necessary padding / checksums * to act as a tunnel message. @@ -189,16 +108,9 @@ public class TrivialPreprocessor implements TunnelGateway.QueuePreprocessor { //_log.debug("# pad bytes: " + numPadBytes + " payloadLength: " + payloadLength + " instructions: " + instructionsLength); - int paddingRemaining = numPadBytes; - // FIXME inefficient, waste of 3/4 of the entropy - // Should get a byte array of random, change all the zeros to something else, and ArrayCopy - while (paddingRemaining > 0) { - byte b = (byte)(_context.random().nextInt() & 0xFF); - if (b != 0x00) { - fragments[offset] = b; - offset++; - paddingRemaining--; - } + if (numPadBytes > 0) { + fillRandomNonZero(fragments, offset, numPadBytes); + offset += numPadBytes; } fragments[offset] = 0x0; // no more padding @@ -207,6 +119,28 @@ public class TrivialPreprocessor implements TunnelGateway.QueuePreprocessor { _log.debug("Preprocessing beginning of the fragment instructions at " + offset); } + /** + * Efficiently fill with nonzero random data + * Don't waste too much entropy or call random() too often. + * @since 0.8.5 + */ + private void fillRandomNonZero(byte[] b, int off, int len) { + // get about as much as we think we will need, overestimate some + final int est = len + (len / 128) + 3; + final byte[] tmp = new byte[est]; + _context.random().nextBytes(tmp); + int extra = len; + for (int i = 0; i < len; i++) { + while (tmp[i] == 0) { + if (extra < est) + tmp[i] = tmp[extra++]; // use from the extra we have at the end + else + tmp[i] = (byte)(_context.random().nextInt() & 0xFF); // waste 3/4 of the entropy + } + } + System.arraycopy(tmp, 0, b, off, len); + } + /** is this a follw up byte? */ private static final byte MASK_IS_SUBSEQUENT = FragmentHandler.MASK_IS_SUBSEQUENT; /** how should this be delivered? shift this 5 the right and get TYPE_* */ diff --git a/router/java/src/net/i2p/router/tunnel/TunnelCreatorConfig.java b/router/java/src/net/i2p/router/tunnel/TunnelCreatorConfig.java index 99b612dd271770bb6a668a3f1ce45888ece70395..497e8ddcdfc1234e9c584c59a87ccc23dc750c6d 100644 --- a/router/java/src/net/i2p/router/tunnel/TunnelCreatorConfig.java +++ b/router/java/src/net/i2p/router/tunnel/TunnelCreatorConfig.java @@ -18,17 +18,17 @@ import net.i2p.router.TunnelInfo; * */ public class TunnelCreatorConfig implements TunnelInfo { - protected RouterContext _context; + protected final RouterContext _context; /** only necessary for client tunnels */ - private Hash _destination; + private final Hash _destination; /** gateway first */ - private HopConfig _config[]; + private final HopConfig _config[]; /** gateway first */ - private Hash _peers[]; + private final Hash _peers[]; private long _expiration; private List<Integer> _order; private long _replyMessageId; - private boolean _isInbound; + private final boolean _isInbound; private long _messagesProcessed; private volatile long _verifiedBytesTransferred; private boolean _failed; @@ -48,10 +48,6 @@ public class TunnelCreatorConfig implements TunnelInfo { } _isInbound = isInbound; _destination = destination; - _messagesProcessed = 0; - _verifiedBytesTransferred = 0; - _failed = false; - _failures = 0; } /** diff --git a/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java b/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java index c8424d8533807a09c6af276e6500b33c64280e62..8669f8cb53c532a1d8ca1e2d86f8c70826b8b4a5 100644 --- a/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java +++ b/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java @@ -623,7 +623,7 @@ public class TunnelDispatcher implements Service { // drop in proportion to size w.r.t. a standard 1024-byte message // this is a little expensive but we want to adjust the curve between 0 and 1 // Most messages are 1024, only at the OBEP do we see other sizes - if (len != 1024d) + if ((int)len != 1024) pctDrop = (float) Math.pow(pctDrop, 1024d / len); float rand = _context.random().nextFloat(); boolean reject = rand <= pctDrop; @@ -709,7 +709,8 @@ public class TunnelDispatcher implements Service { _validator = new BloomFilterIVValidator(_context, getShareBandwidth(_context)); } - private static int getShareBandwidth(RouterContext ctx) { + /** @return in KBps */ + public static int getShareBandwidth(RouterContext ctx) { int irateKBps = ctx.bandwidthLimiter().getInboundKBytesPerSecond(); int orateKBps = ctx.bandwidthLimiter().getOutboundKBytesPerSecond(); double pct = ctx.router().getSharePercentage(); @@ -743,7 +744,7 @@ public class TunnelDispatcher implements Service { private static final int LEAVE_BATCH_TIME = 10*1000; public void add(HopConfig cfg) { - Long dropTime = new Long(cfg.getExpiration() + 2*Router.CLOCK_FUDGE_FACTOR + LEAVE_BATCH_TIME); + Long dropTime = Long.valueOf(cfg.getExpiration() + 2*Router.CLOCK_FUDGE_FACTOR + LEAVE_BATCH_TIME); boolean noTunnels; synchronized (LeaveTunnel.this) { noTunnels = _configs.isEmpty(); diff --git a/router/java/src/net/i2p/router/tunnel/TunnelGateway.java b/router/java/src/net/i2p/router/tunnel/TunnelGateway.java index 3ec567098a91de813dde6e564b73eab7e797564b..a7673f1b6df20276498193271de64252a3b193c8 100644 --- a/router/java/src/net/i2p/router/tunnel/TunnelGateway.java +++ b/router/java/src/net/i2p/router/tunnel/TunnelGateway.java @@ -229,7 +229,7 @@ public class TunnelGateway { synchronized (Pending.this) { if (_messageIds == null) _messageIds = new ArrayList(); - _messageIds.add(new Long(id)); + _messageIds.add(Long.valueOf(id)); } } /** diff --git a/router/java/src/net/i2p/router/tunnel/TunnelGatewayPumper.java b/router/java/src/net/i2p/router/tunnel/TunnelGatewayPumper.java index 7f29f5743d09b94aaf127dcba64c73bd030393f4..38c72dfaf842bdb37f583ff1b302912ab1ddb44f 100644 --- a/router/java/src/net/i2p/router/tunnel/TunnelGatewayPumper.java +++ b/router/java/src/net/i2p/router/tunnel/TunnelGatewayPumper.java @@ -26,6 +26,8 @@ public class TunnelGatewayPumper implements Runnable { _wantsPumping = new LinkedBlockingQueue(); _stop = false; long maxMemory = Runtime.getRuntime().maxMemory(); + if (maxMemory == Long.MAX_VALUE) + maxMemory = 96*1024*1024l; _pumpers = (int) Math.max(MIN_PUMPERS, Math.min(MAX_PUMPERS, 1 + (maxMemory / (32*1024*1024)))); for (int i = 0; i < _pumpers; i++) new I2PThread(this, "Tunnel GW pumper " + (i+1) + '/' + _pumpers, true).start(); diff --git a/router/java/src/net/i2p/router/tunnel/pool/BuildExecutor.java b/router/java/src/net/i2p/router/tunnel/pool/BuildExecutor.java index 8b08b6ec8cf5ed3d4e296e42bc609d243f7950fb..62e47bfe552c2d8ebcccd433718a4968aab2ce7c 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/BuildExecutor.java +++ b/router/java/src/net/i2p/router/tunnel/pool/BuildExecutor.java @@ -27,9 +27,9 @@ import net.i2p.util.Log; */ class BuildExecutor implements Runnable { private final ArrayList<Long> _recentBuildIds = new ArrayList(100); - private RouterContext _context; - private Log _log; - private TunnelPoolManager _manager; + private final RouterContext _context; + private final Log _log; + private final TunnelPoolManager _manager; /** list of TunnelCreatorConfig elements of tunnels currently being built */ private final Object _currentlyBuilding; /** indexed by ptcc.getReplyMessageId() */ @@ -37,7 +37,7 @@ class BuildExecutor implements Runnable { /** indexed by ptcc.getReplyMessageId() */ private final ConcurrentHashMap<Long, PooledTunnelCreatorConfig> _recentlyBuildingMap; private boolean _isRunning; - private BuildHandler _handler; + private final BuildHandler _handler; private boolean _repoll; private static final int MAX_CONCURRENT_BUILDS = 10; /** accept replies up to a minute after we gave up on them */ @@ -248,8 +248,6 @@ class BuildExecutor implements Runnable { int pendingRemaining = 0; //long loopBegin = 0; - //long beforeHandleInboundReplies = 0; - //long afterHandleInboundReplies = 0; //long afterBuildZeroHop = 0; long afterBuildReal = 0; long afterHandleInbound = 0; @@ -268,10 +266,6 @@ class BuildExecutor implements Runnable { wanted.add(pool); } - //beforeHandleInboundReplies = System.currentTimeMillis(); - _handler.handleInboundReplies(); - //afterHandleInboundReplies = System.currentTimeMillis(); - // allowed() also expires timed out requests (for new style requests) int allowed = allowed(); @@ -294,7 +288,9 @@ class BuildExecutor implements Runnable { if (!_repoll) { if (_log.shouldLog(Log.DEBUG)) _log.debug("No tunnel to build with (allowed=" + allowed + ", wanted=" + wanted.size() + ", pending=" + pendingRemaining + "), wait for a while"); - _currentlyBuilding.wait(1*1000+_context.random().nextInt(1*1000)); + try { + _currentlyBuilding.wait(1*1000+_context.random().nextInt(1*1000)); + } catch (InterruptedException ie) {} } } } else { @@ -325,9 +321,6 @@ class BuildExecutor implements Runnable { _log.debug("Configuring new tunnel " + i + " for " + pool + ": " + cfg); buildTunnel(pool, cfg); realBuilt++; - - // we want replies to go to the top of the queue - _handler.handleInboundReplies(); } else { i--; } @@ -369,7 +362,7 @@ class BuildExecutor implements Runnable { wanted.clear(); pools.clear(); - } catch (Exception e) { + } catch (RuntimeException e) { if (_log.shouldLog(Log.CRIT)) _log.log(Log.CRIT, "B0rked in the tunnel builder", e); } @@ -389,10 +382,8 @@ class BuildExecutor implements Runnable { * This prevents a large number of client pools from starving the exploratory pool. * */ - private static class TunnelPoolComparator implements Comparator { - public int compare(Object l, Object r) { - TunnelPool tpl = (TunnelPool) l; - TunnelPool tpr = (TunnelPool) r; + private static class TunnelPoolComparator implements Comparator<TunnelPool> { + public int compare(TunnelPool tpl, TunnelPool tpr) { if (tpl.getSettings().isExploratory() && !tpr.getSettings().isExploratory()) return -1; if (tpr.getSettings().isExploratory() && !tpl.getSettings().isExploratory()) @@ -459,11 +450,15 @@ class BuildExecutor implements Runnable { for (int i = 0; i < 32; i++) _recentBuildIds.remove(0); } - _recentBuildIds.add(new Long(id)); + _recentBuildIds.add(Long.valueOf(id)); } } } + /** + * This wakes up the executor, so call this after TunnelPool.addTunnel() + * so we don't build too many. + */ public void buildComplete(PooledTunnelCreatorConfig cfg, TunnelPool pool) { if (_log.shouldLog(Log.DEBUG)) _log.debug("Build complete for " + cfg); @@ -483,7 +478,7 @@ class BuildExecutor implements Runnable { public boolean wasRecentlyBuilding(long replyId) { synchronized (_recentBuildIds) { - return _recentBuildIds.contains(new Long(replyId)); + return _recentBuildIds.contains(Long.valueOf(replyId)); } } diff --git a/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java b/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java index 7be46e0c73e555fe707c23c3178b775eb9b34e08..ad6805002c12e8d9630a662c5402aeba36b944fd 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java +++ b/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java @@ -1,7 +1,7 @@ package net.i2p.router.tunnel.pool; -import java.util.ArrayList; import java.util.List; +import java.util.concurrent.LinkedBlockingQueue; import net.i2p.data.Base64; import net.i2p.data.ByteArray; @@ -27,43 +27,42 @@ import net.i2p.router.peermanager.TunnelHistory; import net.i2p.router.tunnel.BuildMessageProcessor; import net.i2p.router.tunnel.BuildReplyHandler; import net.i2p.router.tunnel.HopConfig; +import net.i2p.router.tunnel.TunnelDispatcher; import net.i2p.stat.Rate; import net.i2p.stat.RateStat; import net.i2p.util.Log; /** + * Handle the received tunnel build message requests and replies, + * including sending responsses to requests, updating the + * lists of our tunnels and participating tunnels, + * and updating stats. * - * Note that 10 minute tunnel expiration is hardcoded in here. + * Replies are handled immediately on reception; requests are queued. * + * Note that 10 minute tunnel expiration is hardcoded in here. */ class BuildHandler { - private RouterContext _context; - private Log _log; - private BuildExecutor _exec; - private Job _buildMessageHandlerJob; - private Job _buildReplyMessageHandlerJob; - /** list of BuildMessageState, oldest first */ - private final List<BuildMessageState> _inboundBuildMessages; - /** list of BuildReplyMessageState, oldest first - unused unless HANDLE_REPLIES_INLINE == false */ - private final List<BuildReplyMessageState> _inboundBuildReplyMessages; - /** list of BuildEndMessageState, oldest first - unused unless HANDLE_REPLIES_INLINE == false */ - private final List<BuildEndMessageState> _inboundBuildEndMessages; - private BuildMessageProcessor _processor; - - private static final boolean HANDLE_REPLIES_INLINE = true; - + private final RouterContext _context; + private final Log _log; + private final BuildExecutor _exec; + private final Job _buildMessageHandlerJob; + private final Job _buildReplyMessageHandlerJob; + private final LinkedBlockingQueue<BuildMessageState> _inboundBuildMessages; + private final BuildMessageProcessor _processor; + private final ParticipatingThrottler _throttler; + + /** TODO these may be too high, review and adjust */ + private static final int MIN_QUEUE = 12; + private static final int MAX_QUEUE = 96; + public BuildHandler(RouterContext ctx, BuildExecutor exec) { _context = ctx; _log = ctx.logManager().getLog(getClass()); _exec = exec; - _inboundBuildMessages = new ArrayList(16); - if (HANDLE_REPLIES_INLINE) { - _inboundBuildEndMessages = null; - _inboundBuildReplyMessages = null; - } else { - _inboundBuildEndMessages = new ArrayList(16); - _inboundBuildReplyMessages = new ArrayList(16); - } + // Queue size = 12 * share BW / 48K + int sz = Math.min(MAX_QUEUE, Math.max(MIN_QUEUE, TunnelDispatcher.getShareBandwidth(ctx) * MIN_QUEUE / 48)); + _inboundBuildMessages = new LinkedBlockingQueue(sz); _context.statManager().createRateStat("tunnel.reject.10", "How often we reject a tunnel probabalistically", "Tunnels", new long[] { 60*1000, 10*60*1000 }); _context.statManager().createRateStat("tunnel.reject.20", "How often we reject a tunnel because of transient overload", "Tunnels", new long[] { 60*1000, 10*60*1000 }); @@ -93,6 +92,7 @@ class BuildHandler { _context.statManager().createRateStat("tunnel.corruptBuildReply", "", "Tunnels", new long[] { 24*60*60*1000l }); _processor = new BuildMessageProcessor(ctx); + _throttler = new ParticipatingThrottler(ctx); _buildMessageHandlerJob = new TunnelBuildMessageHandlerJob(ctx); _buildReplyMessageHandlerJob = new TunnelBuildReplyMessageHandlerJob(ctx); TunnelBuildMessageHandlerJobBuilder tbmhjb = new TunnelBuildMessageHandlerJobBuilder(); @@ -108,122 +108,37 @@ class BuildHandler { /** * Blocking call to handle a few of the pending inbound requests, returning how many - * requests remain after this pass + * requests remain after this pass. This is called by BuildExecutor. */ int handleInboundRequests() { - int dropExpired = 0; - int remaining = 0; - List handled = null; - long beforeFindHandled = System.currentTimeMillis(); - synchronized (_inboundBuildMessages) { - int toHandle = _inboundBuildMessages.size(); - if (toHandle > 0) { - if (toHandle > MAX_HANDLE_AT_ONCE) - toHandle = MAX_HANDLE_AT_ONCE; - handled = new ArrayList(toHandle); - //if (false) { - // for (int i = 0; i < toHandle; i++) // LIFO for lower response time (should we RED it for DoS?) - // handled.add(_inboundBuildMessages.remove(_inboundBuildMessages.size()-1)); - //} else { - // drop any expired messages - long dropBefore = System.currentTimeMillis() - (BuildRequestor.REQUEST_TIMEOUT/4); - do { - BuildMessageState state = (BuildMessageState)_inboundBuildMessages.get(0); - if (state.recvTime <= dropBefore) { - _inboundBuildMessages.remove(0); - dropExpired++; - if (_log.shouldLog(Log.WARN)) - _log.warn("Not even trying to handle/decrypt the request " + state.msg.getUniqueId() - + ", since we received it a long time ago: " + (System.currentTimeMillis() - state.recvTime)); - _context.statManager().addRateData("tunnel.dropLoadDelay", System.currentTimeMillis() - state.recvTime, 0); - } else { - break; - } - } while (!_inboundBuildMessages.isEmpty()); - - if (dropExpired > 0) - _context.throttle().setTunnelStatus(_x("Dropping tunnel requests: Too slow")); - - // now pull off the oldest requests first (we're doing a tail-drop - // when adding) - for (int i = 0; i < toHandle && !_inboundBuildMessages.isEmpty(); i++) - handled.add(_inboundBuildMessages.remove(0)); - //} - } - remaining = _inboundBuildMessages.size(); - } - if (handled != null) { - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Handling " + handled.size() + " requests (took " + (System.currentTimeMillis()-beforeFindHandled) + "ms to find them)"); - - for (int i = 0; i < handled.size(); i++) { - BuildMessageState state = (BuildMessageState)handled.get(i); - long beforeHandle = System.currentTimeMillis(); - long actualTime = handleRequest(state); - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Handle took " + (System.currentTimeMillis()-beforeHandle) + "/" + actualTime + " (" + i + " out of " + handled.size() + " with " + remaining + " remaining)"); - } - handled.clear(); - } - if (!HANDLE_REPLIES_INLINE) { - synchronized (_inboundBuildEndMessages) { - int toHandle = _inboundBuildEndMessages.size(); - if (toHandle > 0) { - if (handled == null) - handled = new ArrayList(_inboundBuildEndMessages); - else - handled.addAll(_inboundBuildEndMessages); - _inboundBuildEndMessages.clear(); - } - } - } - if (handled != null) { + for (int i = 0; i < MAX_HANDLE_AT_ONCE; ) { + BuildMessageState state = _inboundBuildMessages.poll(); + if (state == null) + return 0; + long dropBefore = System.currentTimeMillis() - (BuildRequestor.REQUEST_TIMEOUT/4); + if (state.recvTime <= dropBefore) { + if (_log.shouldLog(Log.WARN)) + _log.warn("Not even trying to handle/decrypt the request " + state.msg.getUniqueId() + + ", since we received it a long time ago: " + (System.currentTimeMillis() - state.recvTime)); + _context.statManager().addRateData("tunnel.dropLoadDelay", System.currentTimeMillis() - state.recvTime, 0); + _context.throttle().setTunnelStatus(_x("Dropping tunnel requests: Too slow")); + continue; + } + + i++; + long beforeHandle = System.currentTimeMillis(); + long actualTime = handleRequest(state); if (_log.shouldLog(Log.DEBUG)) - _log.debug("Handling " + handled.size() + " requests that are actually replies"); - // these are inbound build messages that actually contain the full replies, since - // they are for inbound tunnels we have created - for (int i = 0; i < handled.size(); i++) { - BuildEndMessageState state = (BuildEndMessageState)handled.get(i); - handleRequestAsInboundEndpoint(state); - } - } - - // anything else? - /* - synchronized (_inboundBuildMessages) { - int remaining = _inboundBuildMessages.size(); - return remaining; + _log.debug("Handle took " + (System.currentTimeMillis()-beforeHandle) + "/" + actualTime + + " (" + i + " with " + _inboundBuildMessages.size() + " remaining)"); } - */ + + int remaining = _inboundBuildMessages.size(); if (remaining > 0) _context.statManager().addRateData("tunnel.handleRemaining", remaining, 0); return remaining; } - /** Warning - noop if HANDLE_REPLIES_INLINE == true */ - void handleInboundReplies() { - if (HANDLE_REPLIES_INLINE) - return; - List handled = null; - synchronized (_inboundBuildReplyMessages) { - int toHandle = _inboundBuildReplyMessages.size(); - if (toHandle > 0) { - // always handle all of them - they're replies that we were waiting for! - handled = new ArrayList(_inboundBuildReplyMessages); - _inboundBuildReplyMessages.clear(); - } - } - if (handled != null) { - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Handling " + handled.size() + " replies"); - - for (int i = 0; i < handled.size(); i++) { - BuildReplyMessageState state = (BuildReplyMessageState)handled.get(i); - handleReply(state); - } - } - } - private void handleReply(BuildReplyMessageState state) { // search through the tunnels for a reply long replyMessageId = state.msg.getUniqueId(); @@ -308,7 +223,7 @@ class BuildHandler { _context.messageHistory().tunnelParticipantRejected(peer, "peer rejected after " + rtt + " with " + howBad + ": " + cfg.toString()); } } - _exec.buildComplete(cfg, cfg.getTunnelPool()); + if (allAgree) { // wikked, completely build if (cfg.isInbound()) @@ -316,6 +231,8 @@ class BuildHandler { else _context.tunnelDispatcher().joinOutbound(cfg); cfg.getTunnelPool().addTunnel(cfg); // self.self.self.foo! + // call buildComplete() after addTunnel() so we don't try another build. + _exec.buildComplete(cfg, cfg.getTunnelPool()); _exec.buildSuccessful(cfg); ExpireJob expireJob = new ExpireJob(_context, cfg, cfg.getTunnelPool()); @@ -327,6 +244,7 @@ class BuildHandler { _context.statManager().addRateData("tunnel.buildClientSuccess", rtt, rtt); } else { // someone is no fun + _exec.buildComplete(cfg, cfg.getTunnelPool()); if (cfg.getDestination() == null) _context.statManager().addRateData("tunnel.buildExploratoryReject", rtt, rtt); else @@ -341,7 +259,7 @@ class BuildHandler { } } - /** @return handle time or -1 */ + /** @return handle time or -1 if it wasn't completely handled */ private long handleRequest(BuildMessageState state) { long timeSinceReceived = System.currentTimeMillis()-state.recvTime; if (_log.shouldLog(Log.DEBUG)) @@ -363,7 +281,7 @@ class BuildHandler { BuildRequestRecord req = _processor.decrypt(_context, state.msg, _context.routerHash(), _context.keyManager().getPrivateKey()); long decryptTime = System.currentTimeMillis() - beforeDecrypt; _context.statManager().addRateData("tunnel.decryptRequestTime", decryptTime, decryptTime); - if (decryptTime > 500) + if (decryptTime > 500 && _log.shouldLog(Log.WARN)) _log.warn("Took too long to decrypt the request: " + decryptTime + " for message " + state.msg.getUniqueId() + " received " + (timeSinceReceived+decryptTime) + " ago"); if (req == null) { // no records matched, or the decryption failed. bah @@ -377,7 +295,7 @@ class BuildHandler { long readPeerTime = System.currentTimeMillis()-beforeLookup; RouterInfo nextPeerInfo = _context.netDb().lookupRouterInfoLocally(nextPeer); long lookupTime = System.currentTimeMillis()-beforeLookup; - if (lookupTime > 500) + if (lookupTime > 500 && _log.shouldLog(Log.WARN)) _log.warn("Took too long to lookup the request: " + lookupTime + "/" + readPeerTime + " for message " + state.msg.getUniqueId() + " received " + (timeSinceReceived+decryptTime) + " ago"); if (nextPeerInfo == null) { if (_log.shouldLog(Log.DEBUG)) @@ -414,9 +332,9 @@ class BuildHandler { } private class HandleReq extends JobImpl { - private BuildMessageState _state; - private BuildRequestRecord _req; - private Hash _nextPeer; + private final BuildMessageState _state; + private final BuildRequestRecord _req; + private final Hash _nextPeer; HandleReq(RouterContext ctx, BuildMessageState state, BuildRequestRecord req, Hash nextPeer) { super(ctx); _state = state; @@ -437,9 +355,9 @@ class BuildHandler { } private static class TimeoutReq extends JobImpl { - private BuildMessageState _state; - private BuildRequestRecord _req; - private Hash _nextPeer; + private final BuildMessageState _state; + private final BuildRequestRecord _req; + private final Hash _nextPeer; TimeoutReq(RouterContext ctx, BuildMessageState state, BuildRequestRecord req, Hash nextPeer) { super(ctx); _state = state; @@ -498,6 +416,36 @@ class BuildHandler { long nextId = req.readNextTunnelId(); boolean isInGW = req.readIsInboundGateway(); boolean isOutEnd = req.readIsOutboundEndpoint(); + + // Loop checks + if ((!isOutEnd) && _context.routerHash().equals(nextPeer)) { + // We are 2 hops in a row? Drop it without a reply. + // No way to recognize if we are every other hop, but see below + _log.error("Dropping build request, we the next hop"); + return; + } + // previous test should be sufficient to keep it from getting here but maybe not? + if (!isInGW) { + Hash from = state.fromHash; + if (from == null) + from = state.from.calculateHash(); + if (_context.routerHash().equals(from)) { + _log.error("Dropping build request, we are the previous hop"); + return; + } + } + if ((!isOutEnd) && (!isInGW)) { + Hash from = state.fromHash; + if (from == null) + from = state.from.calculateHash(); + // Previous and next hop the same? Don't help somebody be evil. Drop it without a reply. + // A-B-C-A is not preventable + if (nextPeer.equals(from)) { + _log.error("Dropping build request with the same previous and next hop"); + return; + } + } + // time is in hours, and only for log below - what's the point? // tunnel-alt-creation.html specifies that this is enforced +/- 1 hour but it is not. long time = req.readRequestTime(); @@ -531,7 +479,7 @@ class BuildHandler { _context.statManager().addRateData("tunnel.acceptLoad", recvDelay, recvDelay); } } - + /* * Being a IBGW or OBEP generally leads to more connections, so if we are * approaching our connection limit (i.e. !haveCapacity()), @@ -550,6 +498,28 @@ class BuildHandler { _context.throttle().setTunnelStatus(_x("Rejecting tunnels: Connection limit")); response = TunnelHistory.TUNNEL_REJECT_BANDWIDTH; } + + // Check participating throttle counters for previous and next hops + // This is at the end as it compares to a percentage of created tunnels. + // We may need another counter above for requests. + if (response == 0 && !isInGW) { + Hash from = state.fromHash; + if (from == null) + from = state.from.calculateHash(); + if (from != null && _throttler.shouldThrottle(from)) { + if (_log.shouldLog(Log.WARN)) + _log.warn("Rejecting tunnel (hop throttle), previous hop: " + from); + // no setTunnelStatus() indication + response = TunnelHistory.TUNNEL_REJECT_BANDWIDTH; + } + } + if (response == 0 && (!isOutEnd) && + _throttler.shouldThrottle(nextPeer)) { + if (_log.shouldLog(Log.WARN)) + _log.warn("Rejecting tunnel (hop throttle), next hop: " + nextPeer); + // no setTunnelStatus() indication + response = TunnelHistory.TUNNEL_REJECT_BANDWIDTH; + } if (_log.shouldLog(Log.DEBUG)) _log.debug("Responding to " + state.msg.getUniqueId() + "/" + ourId @@ -581,7 +551,7 @@ class BuildHandler { cfg.setSendTo(null); cfg.setSendTunnelId(null); } else { - cfg.setSendTo(req.readNextIdentity()); + cfg.setSendTo(nextPeer); cfg.setSendTunnelId(DataHelper.toLong(4, nextId)); } @@ -597,7 +567,7 @@ class BuildHandler { _context.tunnelDispatcher().joinParticipant(cfg); } else { _context.statManager().addRateData("tunnel.reject." + response, 1, 1); - _context.messageHistory().tunnelRejected(state.fromHash, new TunnelId(ourId), req.readNextIdentity(), + _context.messageHistory().tunnelRejected(state.fromHash, new TunnelId(ourId), nextPeer, "rejecting for " + response + ": " + state.msg.getUniqueId() + "/" + ourId + "/" + req.readNextTunnelId() + " delay " + recvDelay + " as " + @@ -687,9 +657,7 @@ class BuildHandler { } public int getInboundBuildQueueSize() { - synchronized (_inboundBuildMessages) { return _inboundBuildMessages.size(); - } } /** @@ -712,14 +680,7 @@ class BuildHandler { _log.error("received it, but its not inbound? " + cfg); } BuildEndMessageState state = new BuildEndMessageState(cfg, receivedMessage); - if (HANDLE_REPLIES_INLINE) { - handleRequestAsInboundEndpoint(state); - } else { - synchronized (_inboundBuildEndMessages) { - _inboundBuildEndMessages.add(state); - } - _exec.repoll(); - } + handleRequestAsInboundEndpoint(state); } else { if (_exec.wasRecentlyBuilding(reqId)) { // we are the IBEP but we already gave up? @@ -727,52 +688,53 @@ class BuildHandler { _log.warn("Dropping the reply " + reqId + ", as we used to be building that"); _context.statManager().addRateData("tunnel.buildReplyTooSlow", 1, 0); } else { - synchronized (_inboundBuildMessages) { - boolean removed = false; - int dropped = 0; - for (int i = 0; i < _inboundBuildMessages.size(); i++) { - BuildMessageState cur = (BuildMessageState)_inboundBuildMessages.get(i); - long age = System.currentTimeMillis() - cur.recvTime; - if (age >= BuildRequestor.REQUEST_TIMEOUT/4) { - _inboundBuildMessages.remove(i); - i--; - dropped++; - _context.statManager().addRateData("tunnel.dropLoad", age, _inboundBuildMessages.size()); - } - } - if (dropped > 0) { + int sz = _inboundBuildMessages.size(); + BuildMessageState cur = _inboundBuildMessages.peek(); + boolean accept = true; + if (cur != null) { + long age = System.currentTimeMillis() - cur.recvTime; + if (age >= BuildRequestor.REQUEST_TIMEOUT/4) { + _context.statManager().addRateData("tunnel.dropLoad", age, sz); _context.throttle().setTunnelStatus(_x("Dropping tunnel requests: High load")); // if the queue is backlogged, stop adding new messages - _context.statManager().addRateData("tunnel.dropLoadBacklog", _inboundBuildMessages.size(), _inboundBuildMessages.size()); + _context.statManager().addRateData("tunnel.dropLoadBacklog", sz, sz); + accept = false; + } + } + if (accept) { + int queueTime = estimateQueueTime(sz); + float pDrop = queueTime/((float)BuildRequestor.REQUEST_TIMEOUT*3); + pDrop = (float)Math.pow(pDrop, 16); // steeeep + float f = _context.random().nextFloat(); + //if ( (pDrop > f) && (allowProactiveDrop()) ) { + if (pDrop > f) { + _context.throttle().setTunnelStatus(_x("Dropping tunnel requests: Queue time")); + _context.statManager().addRateData("tunnel.dropLoadProactive", queueTime, sz); } else { - int queueTime = estimateQueueTime(_inboundBuildMessages.size()); - float pDrop = queueTime/((float)BuildRequestor.REQUEST_TIMEOUT*3); - pDrop = (float)Math.pow(pDrop, 16); // steeeep - float f = _context.random().nextFloat(); - if ( (pDrop > f) && (allowProactiveDrop()) ) { - _context.throttle().setTunnelStatus(_x("Dropping tunnel requests: Queue time")); - _context.statManager().addRateData("tunnel.dropLoadProactive", queueTime, _inboundBuildMessages.size()); + accept = _inboundBuildMessages.offer(new BuildMessageState(receivedMessage, from, fromHash)); + if (accept) { + // wake up the Executor to call handleInboundRequests() + _exec.repoll(); } else { - _inboundBuildMessages.add(new BuildMessageState(receivedMessage, from, fromHash)); + _context.throttle().setTunnelStatus(_x("Dropping tunnel requests: High load")); + _context.statManager().addRateData("tunnel.dropLoadBacklog", sz, sz); } } } - _exec.repoll(); } } return _buildMessageHandlerJob; } } +/**** private boolean allowProactiveDrop() { - String allow = _context.getProperty("router.allowProactiveDrop", "true"); - boolean rv = false; - if ( (allow == null) || (Boolean.valueOf(allow).booleanValue()) ) - rv = true; + boolean rv = _context.getBooleanPropertyDefaultTrue("router.allowProactiveDrop"); if (!rv) _context.statManager().addRateData("tunnel.dropLoadProactiveAbort", 1, 0); return rv; } +****/ private int estimateQueueTime(int numPendingMessages) { int decryptTime = 200; @@ -801,24 +763,17 @@ class BuildHandler { if (_log.shouldLog(Log.DEBUG)) _log.debug("Receive tunnel build reply message " + receivedMessage.getUniqueId() + " from " + (fromHash != null ? fromHash.toBase64() : from != null ? from.calculateHash().toBase64() : "a tunnel")); - if (HANDLE_REPLIES_INLINE) { - handleReply(new BuildReplyMessageState(receivedMessage)); - } else { - synchronized (_inboundBuildReplyMessages) { - _inboundBuildReplyMessages.add(new BuildReplyMessageState(receivedMessage)); - } - _exec.repoll(); - } + handleReply(new BuildReplyMessageState(receivedMessage)); return _buildReplyMessageHandlerJob; } } /** normal inbound requests from other people */ private static class BuildMessageState { - TunnelBuildMessage msg; - RouterIdentity from; - Hash fromHash; - long recvTime; + final TunnelBuildMessage msg; + final RouterIdentity from; + final Hash fromHash; + final long recvTime; public BuildMessageState(I2NPMessage m, RouterIdentity f, Hash h) { msg = (TunnelBuildMessage)m; from = f; @@ -828,8 +783,8 @@ class BuildHandler { } /** replies for outbound tunnels that we have created */ private static class BuildReplyMessageState { - TunnelBuildReplyMessage msg; - long recvTime; + final TunnelBuildReplyMessage msg; + final long recvTime; public BuildReplyMessageState(I2NPMessage m) { msg = (TunnelBuildReplyMessage)m; recvTime = System.currentTimeMillis(); @@ -837,9 +792,9 @@ class BuildHandler { } /** replies for inbound tunnels we have created */ private static class BuildEndMessageState { - TunnelBuildMessage msg; - PooledTunnelCreatorConfig cfg; - long recvTime; + final TunnelBuildMessage msg; + final PooledTunnelCreatorConfig cfg; + final long recvTime; public BuildEndMessageState(PooledTunnelCreatorConfig c, I2NPMessage m) { cfg = c; msg = (TunnelBuildMessage)m; @@ -847,13 +802,14 @@ class BuildHandler { } } - // noop + /** noop */ private static class TunnelBuildMessageHandlerJob extends JobImpl { private TunnelBuildMessageHandlerJob(RouterContext ctx) { super(ctx); } public void runJob() {} public String getName() { return "Receive tunnel build message"; } } - // noop + + /** noop */ private static class TunnelBuildReplyMessageHandlerJob extends JobImpl { private TunnelBuildReplyMessageHandlerJob(RouterContext ctx) { super(ctx); } public void runJob() {} @@ -866,7 +822,7 @@ class BuildHandler { * but it affects capacity calculations */ private static class TunnelBuildNextHopFailJob extends JobImpl { - HopConfig _cfg; + final HopConfig _cfg; private TunnelBuildNextHopFailJob(RouterContext ctx, HopConfig cfg) { super(ctx); _cfg = cfg; diff --git a/router/java/src/net/i2p/router/tunnel/pool/BuildRequestor.java b/router/java/src/net/i2p/router/tunnel/pool/BuildRequestor.java index 7a79f927c658e35b5fd60551b8d9111276e5ed08..6d10994100abbc25f7b1a6c076ca02392b88ccf0 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/BuildRequestor.java +++ b/router/java/src/net/i2p/router/tunnel/pool/BuildRequestor.java @@ -22,12 +22,12 @@ import net.i2p.util.Log; import net.i2p.util.VersionComparator; /** - * + * Methods for creating Tunnel Build Messages, i.e. requests */ -class BuildRequestor { - private static final List<Integer> ORDER = new ArrayList(BuildMessageGenerator.ORDER.length); +abstract class BuildRequestor { + private static final List<Integer> ORDER = new ArrayList(TunnelBuildMessage.MAX_RECORD_COUNT); static { - for (int i = 0; i < BuildMessageGenerator.ORDER.length; i++) + for (int i = 0; i < TunnelBuildMessage.MAX_RECORD_COUNT; i++) ORDER.add(Integer.valueOf(i)); } private static final int PRIORITY = 500; @@ -37,7 +37,7 @@ class BuildRequestor { * expl. vs. client, uptime, and network conditions. * Put the expiration in the PTCC. * - * Also, perhaps, save the PTCC even after expiration for an extended time, + * Also, we now save the PTCC even after expiration for an extended time, * so can we use a successfully built tunnel anyway. * */ @@ -49,12 +49,16 @@ class BuildRequestor { /** some randomization is added on to this */ private static final int BUILD_MSG_TIMEOUT = 60*1000; + /** + * "paired tunnels" means using a client's own inbound tunnel to receive the + * reply for an outbound build request, and using a client's own outbound tunnel + * to send an inbound build request. + * This is more secure than using the router's exploratory tunnels, as it + * makes correlation of multiple clients more difficult. + */ private static boolean usePairedTunnels(RouterContext ctx) { - String val = ctx.getProperty("router.usePairedTunnels"); - if ( (val == null) || (Boolean.valueOf(val).booleanValue()) ) - return true; - else - return false; + return true; + //return ctx.getBooleanPropertyDefaultTrue("router.usePairedTunnels"); } /** new style requests need to fill in the tunnel IDs before hand */ @@ -321,9 +325,9 @@ class BuildRequestor { * Can't do this for inbound tunnels since the msg goes out an expl. tunnel. */ private static class TunnelBuildFirstHopFailJob extends JobImpl { - TunnelPool _pool; - PooledTunnelCreatorConfig _cfg; - BuildExecutor _exec; + final TunnelPool _pool; + final PooledTunnelCreatorConfig _cfg; + final BuildExecutor _exec; private TunnelBuildFirstHopFailJob(RouterContext ctx, TunnelPool pool, PooledTunnelCreatorConfig cfg, BuildExecutor exec) { super(ctx); _cfg = cfg; diff --git a/router/java/src/net/i2p/router/tunnel/pool/ClientPeerSelector.java b/router/java/src/net/i2p/router/tunnel/pool/ClientPeerSelector.java index f4042feee9f30014416dc1f96aa1f1f47e432ba2..24e6966a12841eb368e10072bee474dbecb0cff6 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/ClientPeerSelector.java +++ b/router/java/src/net/i2p/router/tunnel/pool/ClientPeerSelector.java @@ -21,20 +21,57 @@ class ClientPeerSelector extends TunnelPeerSelector { return null; if ( (length == 0) && (settings.getLength()+settings.getLengthVariance() > 0) ) return null; - HashSet matches = new HashSet(length); + + List<Hash> rv; if (length > 0) { if (shouldSelectExplicit(settings)) return selectExplicit(ctx, settings, length); - } - Set exclude = getExclude(ctx, settings.isInbound(), settings.isExploratory()); - ctx.profileOrganizer().selectFastPeers(length, exclude, matches, settings.getIPRestriction()); + Set<Hash> exclude = getExclude(ctx, settings.isInbound(), settings.isExploratory()); + Set<Hash> matches = new HashSet(length); + if (length == 1) { + ctx.profileOrganizer().selectFastPeers(length, exclude, matches, 0); + matches.remove(ctx.routerHash()); + rv = new ArrayList(matches); + } else { + // build a tunnel using 4 subtiers. + // For a 2-hop tunnel, the first hop comes from subtiers 0-1 and the last from subtiers 2-3. + // For a longer tunnels, the first hop comes from subtier 0, the middle from subtiers 2-3, and the last from subtier 1. + rv = new ArrayList(length + 1); + // OBEP or IB last hop + // group 0 or 1 if two hops, otherwise group 0 + ctx.profileOrganizer().selectFastPeers(1, exclude, matches, settings.getRandomKey(), length == 2 ? 2 : 4); + matches.remove(ctx.routerHash()); + exclude.addAll(matches); + rv.addAll(matches); + matches.clear(); + if (length > 2) { + // middle hop(s) + // group 2 or 3 + ctx.profileOrganizer().selectFastPeers(length - 2, exclude, matches, settings.getRandomKey(), 3); + matches.remove(ctx.routerHash()); + if (matches.size() > 1) { + // order the middle peers for tunnels >= 4 hops + List<Hash> ordered = new ArrayList(matches); + orderPeers(ordered, settings.getRandomKey()); + rv.addAll(ordered); + } else { + rv.addAll(matches); + } + exclude.addAll(matches); + matches.clear(); + } + // IBGW or OB first hop + // group 2 or 3 if two hops, otherwise group 1 + ctx.profileOrganizer().selectFastPeers(1, exclude, matches, settings.getRandomKey(), length == 2 ? 3 : 5); + matches.remove(ctx.routerHash()); + rv.addAll(matches); + } + } else { + rv = new ArrayList(1); + } - matches.remove(ctx.routerHash()); - ArrayList<Hash> rv = new ArrayList(matches); - if (rv.size() > 1) - orderPeers(rv, settings.getRandomKey()); if (settings.isInbound()) rv.add(0, ctx.routerHash()); else diff --git a/router/java/src/net/i2p/router/tunnel/pool/ExpireJob.java b/router/java/src/net/i2p/router/tunnel/pool/ExpireJob.java index e2271ec90f66529d9c65e839a074c966fd2a4e9c..e82c4a8b0f78e810e72f5b8405d53b5dc9c48f9f 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/ExpireJob.java +++ b/router/java/src/net/i2p/router/tunnel/pool/ExpireJob.java @@ -5,16 +5,21 @@ import net.i2p.router.Router; import net.i2p.router.RouterContext; import net.i2p.router.tunnel.TunnelCreatorConfig; +/** + * This runs twice for each tunnel. + * The first time, remove it from the LeaseSet. + * The second time, stop accepting data for it. + */ class ExpireJob extends JobImpl { - private TunnelPool _pool; - private TunnelCreatorConfig _cfg; + private final TunnelPool _pool; + private final TunnelCreatorConfig _cfg; private boolean _leaseUpdated; - private long _dropAfter; + private final long _dropAfter; + public ExpireJob(RouterContext ctx, TunnelCreatorConfig cfg, TunnelPool pool) { super(ctx); _pool = pool; _cfg = cfg; - _leaseUpdated = false; // we act as if this tunnel expires a random skew before it actually does // so we rebuild out of sync. otoh, we will honor tunnel messages on it // up through the full lifetime of the tunnel, plus a clock skew, since @@ -28,9 +33,11 @@ class ExpireJob extends JobImpl { cfg.setExpiration(expire); getTiming().setStartAfter(expire); } + public String getName() { return "Expire tunnel"; } + public void runJob() { if (!_leaseUpdated) { _pool.removeTunnel(_cfg); diff --git a/router/java/src/net/i2p/router/tunnel/pool/ParticpatingThrottler.java b/router/java/src/net/i2p/router/tunnel/pool/ParticpatingThrottler.java new file mode 100644 index 0000000000000000000000000000000000000000..cf07ec954f925d2325c7e7536672aa7bac911d76 --- /dev/null +++ b/router/java/src/net/i2p/router/tunnel/pool/ParticpatingThrottler.java @@ -0,0 +1,60 @@ +package net.i2p.router.tunnel.pool; + +import net.i2p.data.Hash; +import net.i2p.router.RouterContext; +import net.i2p.util.ObjectCounter; +import net.i2p.util.SimpleScheduler; +import net.i2p.util.SimpleTimer; + +/** + * Count how often we have accepted a tunnel with the peer + * as the previous or next hop. + * We limit each peer to a percentage of all participating tunnels, + * subject to minimum and maximum values for the limit. + * + * This offers basic protection against simple attacks + * but is not a complete solution, as by design, we don't know + * the originator of a tunnel request. + * + * This also effectively limits the number of tunnels between + * any given pair of routers, which probably isn't a bad thing. + * + * Note that the actual limits will be higher than specified + * by up to 1 / LIFETIME_PORTION because the counter window resets. + * + * Note that the counts are of previous + next hops, so the total will + * be higher than the participating tunnel count, and will also grow + * as the network uses more 3-hop tunnels. + * + * @since 0.8.4 + */ +class ParticipatingThrottler { + private final RouterContext context; + private final ObjectCounter<Hash> counter; + + /** portion of the tunnel lifetime */ + private static final int LIFETIME_PORTION = 3; + private static final int MIN_LIMIT = 18 / LIFETIME_PORTION; + private static final int MAX_LIMIT = 66 / LIFETIME_PORTION; + private static final int PERCENT_LIMIT = 12 / LIFETIME_PORTION; + private static final long CLEAN_TIME = 11*60*1000 / LIFETIME_PORTION; + + ParticipatingThrottler(RouterContext ctx) { + this.context = ctx; + this.counter = new ObjectCounter(); + SimpleScheduler.getInstance().addPeriodicEvent(new Cleaner(), CLEAN_TIME); + } + + /** increments before checking */ + boolean shouldThrottle(Hash h) { + int numTunnels = this.context.tunnelManager().getParticipatingCount(); + int limit = Math.max(MIN_LIMIT, Math.min(MAX_LIMIT, numTunnels * PERCENT_LIMIT / 100)); + return this.counter.increment(h) > limit; + } + + private class Cleaner implements SimpleTimer.TimedEvent { + public void timeReached() { + ParticipatingThrottler.this.counter.clear(); + } + } +} diff --git a/router/java/src/net/i2p/router/tunnel/pool/PooledTunnelCreatorConfig.java b/router/java/src/net/i2p/router/tunnel/pool/PooledTunnelCreatorConfig.java index cbe7948150a8897b3b5b26c891ac95504f5d096d..d66bf6f6c6ce7866f57ecca0e0c4bfa7b078cd01 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/PooledTunnelCreatorConfig.java +++ b/router/java/src/net/i2p/router/tunnel/pool/PooledTunnelCreatorConfig.java @@ -26,8 +26,6 @@ class PooledTunnelCreatorConfig extends TunnelCreatorConfig { } public PooledTunnelCreatorConfig(RouterContext ctx, int length, boolean isInbound, Hash destination) { super(ctx, length, isInbound, destination); - _pool = null; - _live = false; } // calls TestJob diff --git a/router/java/src/net/i2p/router/tunnel/pool/TestJob.java b/router/java/src/net/i2p/router/tunnel/pool/TestJob.java index 74910cbcbbc805f0da9e31b7e5f80275c9ce1f3c..e63e681b37cbd83b7eae3cec4eee2b3358e252be 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/TestJob.java +++ b/router/java/src/net/i2p/router/tunnel/pool/TestJob.java @@ -22,9 +22,9 @@ import net.i2p.router.message.PayloadGarlicConfig; import net.i2p.util.Log; class TestJob extends JobImpl { - private Log _log; - private TunnelPool _pool; - private PooledTunnelCreatorConfig _cfg; + private final Log _log; + private final TunnelPool _pool; + private final PooledTunnelCreatorConfig _cfg; private boolean _found; private TunnelInfo _outTunnel; private TunnelInfo _replyTunnel; @@ -39,9 +39,10 @@ class TestJob extends JobImpl { public TestJob(RouterContext ctx, PooledTunnelCreatorConfig cfg, TunnelPool pool) { super(ctx); _log = ctx.logManager().getLog(TestJob.class); - _pool = pool; _cfg = cfg; - if (_pool == null) + if (pool != null) + _pool = pool; + else _pool = cfg.getTunnelPool(); if ( (_pool == null) && (_log.shouldLog(Log.ERROR)) ) _log.error("Invalid tunnel test configuration: no pool for " + cfg, new Exception("origin")); @@ -61,7 +62,9 @@ class TestJob extends JobImpl { ctx.statManager().createRateStat("tunnel.testAborted", "Tunnel test could not occur, since there weren't any tunnels to test with", "Tunnels", RATES); } + public String getName() { return "Test tunnel"; } + public void runJob() { if (_pool == null) return; @@ -144,6 +147,7 @@ class TestJob extends JobImpl { scheduleRetest(); return; } + // can't be a singleton, the SKM modifies it Set encryptTags = new HashSet(1); encryptTags.add(encryptTag); // Register the single tag with the appropriate SKM @@ -245,9 +249,10 @@ class TestJob extends JobImpl { } private class ReplySelector implements MessageSelector { - private RouterContext _context; - private long _id; - private long _expiration; + private final RouterContext _context; + private final long _id; + private final long _expiration; + public ReplySelector(RouterContext ctx, long id, long expiration) { _context = ctx; _id = id; @@ -256,7 +261,9 @@ class TestJob extends JobImpl { } public boolean continueMatching() { return !_found && _context.clock().now() < _expiration; } + public long getExpiration() { return _expiration; } + public boolean isMatch(I2NPMessage message) { if (message instanceof DeliveryStatusMessage) { return ((DeliveryStatusMessage)message).getMessageId() == _id; @@ -279,9 +286,13 @@ class TestJob extends JobImpl { private class OnTestReply extends JobImpl implements ReplyJob { private long _successTime; private OutNetMessage _sentMessage; + public OnTestReply(RouterContext ctx) { super(ctx); } + public String getName() { return "Tunnel test success"; } + public void setSentMessage(OutNetMessage m) { _sentMessage = m; } + public void runJob() { if (_sentMessage != null) getContext().messageRegistry().unregisterPending(_sentMessage); @@ -291,6 +302,7 @@ class TestJob extends JobImpl { testFailed(_successTime); _found = true; } + // who cares about the details... public void setMessage(I2NPMessage message) { _successTime = getContext().clock().now() - ((DeliveryStatusMessage)message).getArrival(); @@ -309,12 +321,15 @@ class TestJob extends JobImpl { * Test failed (boo, hiss) */ private class OnTestTimeout extends JobImpl { - private long _started; + private final long _started; + public OnTestTimeout(RouterContext ctx) { super(ctx); _started = ctx.clock().now(); } + public String getName() { return "Tunnel test timeout"; } + public void runJob() { if (_log.shouldLog(Log.WARN)) _log.warn("Timeout: found? " + _found); diff --git a/router/java/src/net/i2p/router/tunnel/pool/TunnelPeerSelector.java b/router/java/src/net/i2p/router/tunnel/pool/TunnelPeerSelector.java index 083e2501ae05f75dd087e6da942d1f4298be1f91..25b6ed9332bec05f3155ff7ecfa2c7b9c74d8be1 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/TunnelPeerSelector.java +++ b/router/java/src/net/i2p/router/tunnel/pool/TunnelPeerSelector.java @@ -34,13 +34,16 @@ public abstract class TunnelPeerSelector { * Which peers should go into the next tunnel for the given settings? * * @return ordered list of Hash objects (one per peer) specifying what order - * they should appear in a tunnel (endpoint first). This includes + * they should appear in a tunnel (ENDPOINT FIRST). This includes * the local router in the list. If there are no tunnels or peers * to build through, and the settings reject 0 hop tunnels, this will * return null. */ public abstract List<Hash> selectPeers(RouterContext ctx, TunnelPoolSettings settings); + /** + * @return randomized number of hops 0-7, not including ourselves + */ protected int getLength(RouterContext ctx, TunnelPoolSettings settings) { int length = settings.getLength(); int override = settings.getLengthOverride(); @@ -61,8 +64,8 @@ public abstract class TunnelPeerSelector { } if (length < 0) length = 0; - if (length > 8) // as documented in tunnel.html - length = 8; + else if (length > 7) // as documented in tunnel.html + length = 7; /* if ( (ctx.tunnelManager().getOutboundTunnelCount() <= 0) || (ctx.tunnelManager().getFreeTunnelCount() <= 0) ) { diff --git a/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java b/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java index e6f3e599e8bf4c70b16c7f282529b748cdb476c5..00eded47de13045c9ac24da64f455101db2d6069 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java +++ b/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java @@ -22,21 +22,21 @@ import net.i2p.stat.RateStat; import net.i2p.util.Log; /** - * + * A group of tunnels for the router or a particular client, in a single direction. */ public class TunnelPool { - private final List _inProgress = new ArrayList(); - private RouterContext _context; - private Log _log; + private final List<PooledTunnelCreatorConfig> _inProgress = new ArrayList(); + private final RouterContext _context; + private final Log _log; private TunnelPoolSettings _settings; - private final ArrayList<TunnelInfo> _tunnels; - private TunnelPeerSelector _peerSelector; - private TunnelPoolManager _manager; + private final List<TunnelInfo> _tunnels; + private final TunnelPeerSelector _peerSelector; + private final TunnelPoolManager _manager; private boolean _alive; private long _lifetimeProcessed; private TunnelInfo _lastSelected; private long _lastSelectionPeriod; - private int _expireSkew; + private final int _expireSkew; private long _started; private long _lastRateUpdate; private long _lastLifetimeProcessed; @@ -50,14 +50,9 @@ public class TunnelPool { _settings = settings; _tunnels = new ArrayList(settings.getLength() + settings.getBackupQuantity()); _peerSelector = sel; - _alive = false; - _lastSelectionPeriod = 0; - _lastSelected = null; - _lifetimeProcessed = 0; _expireSkew = _context.random().nextInt(90*1000); _started = System.currentTimeMillis(); _lastRateUpdate = _started; - _lastLifetimeProcessed = 0; _rateName = "tunnel.Bps." + (_settings.isExploratory() ? "exploratory" : _settings.getDestinationNickname()) + (_settings.isInbound() ? ".in" : ".out"); @@ -281,9 +276,12 @@ public class TunnelPool { } } - public void addTunnel(TunnelInfo info) { + /** + * Add to the pool. + */ + void addTunnel(TunnelInfo info) { if (_log.shouldLog(Log.DEBUG)) - _log.debug(toString() + ": Adding tunnel " + info, new Exception("Creator")); + _log.debug(toString() + ": Adding tunnel " + info /* , new Exception("Creator") */ ); LeaseSet ls = null; synchronized (_tunnels) { _tunnels.add(info); @@ -295,7 +293,10 @@ public class TunnelPool { _context.clientManager().requestLeaseSet(_settings.getDestination(), ls); } - public void removeTunnel(TunnelInfo info) { + /** + * Remove from the pool. + */ + void removeTunnel(TunnelInfo info) { if (_log.shouldLog(Log.DEBUG)) _log.debug(toString() + ": Removing tunnel " + info); int remaining = 0; @@ -412,11 +413,12 @@ public class TunnelPool { } } + /** noop for outbound */ void refreshLeaseSet() { - if (_log.shouldLog(Log.DEBUG)) - _log.debug(toString() + ": refreshing leaseSet on tunnel expiration (but prior to grace timeout)"); - LeaseSet ls = null; if (_settings.isInbound() && (_settings.getDestination() != null) ) { + if (_log.shouldLog(Log.DEBUG)) + _log.debug(toString() + ": refreshing leaseSet on tunnel expiration (but prior to grace timeout)"); + LeaseSet ls = null; synchronized (_tunnels) { ls = locked_buildNewLeaseSet(); } @@ -427,7 +429,7 @@ public class TunnelPool { } /** - * Return true if a fallback tunnel is built + * @return true if a fallback tunnel is built * */ boolean buildFallback() { @@ -464,15 +466,17 @@ public class TunnelPool { * but we use latest expiration first, since we need to sort them by that anyway. * */ - class LeaseComparator implements Comparator { - public int compare(Object l, Object r) { - return ((Lease)r).getEndDate().compareTo(((Lease)l).getEndDate()); + private static class LeaseComparator implements Comparator<Lease> { + public int compare(Lease l, Lease r) { + return r.getEndDate().compareTo(l.getEndDate()); } } /** - * Build a leaseSet with the required tunnels that aren't about to expire + * Build a leaseSet with the required tunnels that aren't about to expire. + * Caller must synchronize on _tunnels. * + * @return null on failure */ private LeaseSet locked_buildNewLeaseSet() { if (!_alive) @@ -728,8 +732,8 @@ public class TunnelPool { int inProgress = 0; synchronized (_inProgress) { inProgress = _inProgress.size(); - for (int i = 0; i < _inProgress.size(); i++) { - PooledTunnelCreatorConfig cfg = (PooledTunnelCreatorConfig)_inProgress.get(i); + for (int i = 0; i < inProgress; i++) { + PooledTunnelCreatorConfig cfg = _inProgress.get(i); if (cfg.getLength() <= 1) fallback++; } @@ -850,16 +854,25 @@ public class TunnelPool { return rv; } + /** + * @return null on failure + */ PooledTunnelCreatorConfig configureNewTunnel() { return configureNewTunnel(false); } + + /** + * @return null on failure + */ private PooledTunnelCreatorConfig configureNewTunnel(boolean forceZeroHop) { TunnelPoolSettings settings = getSettings(); - List peers = null; - long expiration = _context.clock().now() + settings.getDuration(); + // peers for new tunnel, including us, ENDPOINT FIRST + List<Hash> peers = null; + long expiration = _context.clock().now() + TunnelPoolSettings.DEFAULT_DURATION; if (!forceZeroHop) { peers = _peerSelector.selectPeers(_context, settings); + if ( (peers == null) || (peers.isEmpty()) ) { - // no inbound or outbound tunnels to send the request through, and + // no peers to build the tunnel with, and // the pool is refusing 0 hop tunnels if (peers == null) { if (_log.shouldLog(Log.WARN)) @@ -874,12 +887,13 @@ public class TunnelPool { peers = new ArrayList(1); peers.add(_context.routerHash()); } + PooledTunnelCreatorConfig cfg = new PooledTunnelCreatorConfig(_context, peers.size(), settings.isInbound(), settings.getDestination()); cfg.setTunnelPool(this); - // peers[] is ordered endpoint first, but cfg.getPeer() is ordered gateway first + // peers list is ordered endpoint first, but cfg.getPeer() is ordered gateway first for (int i = 0; i < peers.size(); i++) { int j = peers.size() - 1 - i; - cfg.setPeer(j, (Hash)peers.get(i)); + cfg.setPeer(j, peers.get(i)); HopConfig hop = cfg.getConfig(j); hop.setCreation(_context.clock().now()); hop.setExpiration(expiration); @@ -898,6 +912,9 @@ public class TunnelPool { return cfg; } + /** + * Remove from the _inprogress list + */ void buildComplete(PooledTunnelCreatorConfig cfg) { synchronized (_inProgress) { _inProgress.remove(cfg); } cfg.setTunnelPool(this); diff --git a/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java b/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java index 3a53be55268765cad58df32105b17e70ac0e0dc0..3f289b1657f9b420804721966c1aacbcb64f7a2b 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java +++ b/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java @@ -37,8 +37,8 @@ import net.i2p.util.SimpleTimer; * */ public class TunnelPoolManager implements TunnelManagerFacade { - private RouterContext _context; - private Log _log; + private final RouterContext _context; + private final Log _log; /** Hash (destination) to TunnelPool */ private final Map<Hash, TunnelPool> _clientInboundPools; /** Hash (destination) to TunnelPool */ @@ -61,7 +61,6 @@ public class TunnelPoolManager implements TunnelManagerFacade { _clientInboundPools = new ConcurrentHashMap(4); _clientOutboundPools = new ConcurrentHashMap(4); - _isShutdown = false; _executor = new BuildExecutor(ctx, this); I2PThread execThread = new I2PThread(_executor, "BuildExecutor"); execThread.setDaemon(true); @@ -330,7 +329,6 @@ public class TunnelPoolManager implements TunnelManagerFacade { /** queue a recurring test job if appropriate */ void buildComplete(PooledTunnelCreatorConfig cfg) { - //buildComplete(); if (cfg.getLength() > 1 && (!_context.router().gracefulShutdownInProgress()) && !Boolean.valueOf(_context.getProperty("router.disableTunnelTesting")).booleanValue()) { @@ -358,9 +356,6 @@ public class TunnelPoolManager implements TunnelManagerFacade { } } - /** ?? */ - void buildComplete() {} - public void startup() { _isShutdown = false; if (!_executor.isRunning()) { diff --git a/router/java/src/net/i2p/router/util/RFC822Date.java b/router/java/src/net/i2p/router/util/RFC822Date.java new file mode 100644 index 0000000000000000000000000000000000000000..6635bca8cfa3cc02e0500c8e6447ec7502d5189f --- /dev/null +++ b/router/java/src/net/i2p/router/util/RFC822Date.java @@ -0,0 +1,51 @@ +package net.i2p.router.util; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; + +/** + * Moved from NewsFetcher + * @since 0.8.5 + */ +public abstract class RFC822Date { + + /** + * http://jimyjoshi.com/blog/2007/08/rfc822dateparsinginjava.html + * Apparently public domain + * Probably don't need all of these... + */ + private static final SimpleDateFormat rfc822DateFormats[] = new SimpleDateFormat[] { + new SimpleDateFormat("EEE, d MMM yy HH:mm:ss z", Locale.US), + new SimpleDateFormat("EEE, d MMM yy HH:mm z", Locale.US), + new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z", Locale.US), + new SimpleDateFormat("EEE, d MMM yyyy HH:mm z", Locale.US), + new SimpleDateFormat("d MMM yy HH:mm z", Locale.US), + new SimpleDateFormat("d MMM yy HH:mm:ss z", Locale.US), + new SimpleDateFormat("d MMM yyyy HH:mm z", Locale.US), + new SimpleDateFormat("d MMM yyyy HH:mm:ss z", Locale.US) + }; + + /** + * new Date(String foo) is deprecated, so let's do this the hard way + * + * @param s non-null + * @return -1 on failure + */ + public static long parse822Date(String s) { + for (int i = 0; i < rfc822DateFormats.length; i++) { + try { + Date date = rfc822DateFormats[i].parse(s); + if (date != null) + return date.getTime(); + } catch (ParseException pe) {} + } + return -1; + } + + /** @since 0.8.2 */ + public static String to822Date(long t) { + return (new SimpleDateFormat("d MMM yyyy HH:mm:ss z", Locale.US)).format(new Date(t)); + } +} diff --git a/router/java/src/net/i2p/router/util/RandomIterator.java b/router/java/src/net/i2p/router/util/RandomIterator.java new file mode 100644 index 0000000000000000000000000000000000000000..db8a560b80a3125727953a9864a52f6edfa6dde0 --- /dev/null +++ b/router/java/src/net/i2p/router/util/RandomIterator.java @@ -0,0 +1,178 @@ +package net.i2p.router.util; + +/* + * Modified from: + * http://www.lockergnome.com/awarberg/2007/04/22/random-iterator-in-java/ + * No license, free to use + */ + +//import java.util.ArrayList; +import java.util.BitSet; +import java.util.List; +import java.util.Iterator; +import java.util.NoSuchElementException; +import java.util.Random; + +import net.i2p.util.RandomSource; + +/** + * + * + * This is some Java code I wrote for a school project to save some time when iterating in + * random order over a part of list (until some condition becomes true): + * + * Here is a sample on how to use the code: + * + <pre> + for(Iterator<Object> iter = new RandomIterator<Object>(myObjList); iter.hasNext();){ + Object o = iter.next(); + if(someCondition(o) ) + return o; // iteration stopped early + } + </pre> + * + * I wrote it to replace a Collection.shuffle call and this code gave us an overall increase in program execution speed of about 25%. + * As the javadoc description says, you are better off calling Collection.shuffle if you need to iterate over the entire list. But if you may stop early this class can save you some time, as it did in our case. + * + * Provides a random iteration over the given list. + * + * This effect can be achieved by using Collections.shuffle, + * which shuffles the entire collection in linear time. + * + * If the iteration process may end before all items + * are processed, this class may give a speed increase + * because the shuffling process is performed as items are requested + * rather than in the beginning. + * + * I2P changes: + *<pre> + * - Use BitSet instead of boolean[] + * - Use I2P RandomSource + * - Done check in next(), throw NSEE + * - Ensure lower and upper bounds are always clear + * - Replace unbounded loop in next(). It is now O(N) time, but now + * the iterator will tend to "clump" results and thus is not truly random. + * *** This class is not recommended for small Lists, + * *** or for iterating through a large portion of a List. + * *** Use Collections.shuffle() instead. + * - Add test code + *</pre> + * + */ +public class RandomIterator<E> implements Iterator<E> { + /** + * Mapping indicating which items were served (by index). + * if served[i] then the item with index i in the list + * has already been served. + * + * Note it is possible to save memory here by using + * BitSet rather than a boolean array, however it will + * increase the running time slightly. + */ + private final BitSet served; + + /** The amount of items served so far */ + private int servedCount = 0; + private final List<E> list; + private final int LIST_SIZE; + + /** + * The random number generator has a great influence + * on the running time of this iterator. + * + * See, for instance, + * <a href="http://www.qbrundage.com/michaelb/pubs/essays/random_number_generation" title="http://www.qbrundage.com/michaelb/pubs/essays/random_number_generation" target="_blank">http://www.qbrundage.com/michaelb/pubs/e…</a> + * for some implementations, which are faster than java.util.Random. + */ + private static final Random rand = RandomSource.getInstance(); + + /** Used to narrow the range to take random indexes from */ + private int lower, upper; + + public RandomIterator(List<E> list){ + this.list = list; + LIST_SIZE = list.size(); + served = new BitSet(LIST_SIZE); + upper = LIST_SIZE - 1; + } + + public boolean hasNext() { + return servedCount < LIST_SIZE; + } + + public E next() { + if (!hasNext()) + throw new NoSuchElementException(); + int range = upper - lower + 1; + + // This has unbounded behavior, even with lower/upper + //int index; + //do { + // index = lower + rand.nextInt(range); + //} while (served.get(index)); + + // This tends to "clump" results, escpecially toward the end of the iteration. + // It also tends to leave the first and last few elements until the end. + int start = lower + rand.nextInt(range); + int index; + if ((start % 2) == 0) // coin flip + index = served.nextClearBit(start); + else + index = previousClearBit(start); + if (index < 0) + throw new NoSuchElementException("shouldn't happen"); + servedCount++; + served.set(index); + + // check if the range from which random values + // are taken can be reduced + // I2P - ensure lower and upper are always clear + if (hasNext()) { + if (index == lower) + lower = served.nextClearBit(lower); + else if (index == upper) + upper = previousClearBit(upper - 1); + } + return list.get(index); + } + + /** just like nextClearBit() */ + private int previousClearBit(int n) { + for (int i = n; i >= lower; i--) { + if (!served.get(i)) { + return i; + } + } + return -1; + } + + /** + * @throws UnsupportedOperationException always + */ + public void remove() { + throw new UnsupportedOperationException(); + } + +/***** + public static void main(String[] args) { + System.out.println("\n testing with 0"); + test(0); + System.out.println("\n testing with 1"); + test(1); + System.out.println("\n testing with 2"); + test(2); + System.out.println("\n testing with 1000"); + test(1000); + } + + public static void test(int n) { + List<Integer> l = new ArrayList(n); + for (int i = 0; i < n; i++) { + l.add(Integer.valueOf(i)); + } + for (Iterator<Integer> iter = new RandomIterator(l); iter.hasNext(); ) { + System.out.println(iter.next().toString()); + } + } +*****/ +} diff --git a/router/java/src/net/i2p/router/util/package.html b/router/java/src/net/i2p/router/util/package.html new file mode 100644 index 0000000000000000000000000000000000000000..bf81eb3fafa814d31ee55ea1466b4a707f742fef --- /dev/null +++ b/router/java/src/net/i2p/router/util/package.html @@ -0,0 +1,6 @@ +<html><body> +<p> +These classes define the several useful utilities used +throughout the router. +</p> +</body></html> diff --git a/router/java/src/org/cybergarage/http/HTTPRequest.java b/router/java/src/org/cybergarage/http/HTTPRequest.java index c1c3b50f6ce6ed81c6faa3ead33ff63ad105334d..938450c939e6bea2b9d1d6895166a4eab380ded1 100644 --- a/router/java/src/org/cybergarage/http/HTTPRequest.java +++ b/router/java/src/org/cybergarage/http/HTTPRequest.java @@ -388,10 +388,10 @@ public class HTTPRequest extends HTTPPacket // Set the timeout to be nice and short, the device should be local and fast. // Yeah, the UPnP standard is a minute or something, too bad. // If he can't get back to us in a few seconds, forget it. - // And set the soTimeout to 1 second (for reads). + // And set the soTimeout to 2 second (for reads). //postSocket = new Socket(host, port); postSocket = new Socket(); - postSocket.setSoTimeout(1000); + postSocket.setSoTimeout(2000); SocketAddress sa = new InetSocketAddress(host, port); postSocket.connect(sa, 3000); } diff --git a/router/java/src/org/cybergarage/util/Debug.java b/router/java/src/org/cybergarage/util/Debug.java index 5b01ac43ab2a8cced2cb40ddb5378e195d27fc62..c6415591ef2687966fd99f7af2f5fec345aa9c8a 100644 --- a/router/java/src/org/cybergarage/util/Debug.java +++ b/router/java/src/org/cybergarage/util/Debug.java @@ -52,14 +52,14 @@ public final class Debug } public static final void warning(String s) { if (_log != null) - _log.error(s); + _log.warn(s); } public static final void warning(String m, Exception e) { if (_log != null) - _log.error(m, e); + _log.warn(m, e); } public static final void warning(Exception e) { if (_log != null) - _log.error("", e); + _log.warn("", e); } } diff --git a/router/java/src/org/cybergarage/xml/parser/JaxpParser.java b/router/java/src/org/cybergarage/xml/parser/JaxpParser.java index 8de6b06b89869a47ebda8d4bd68800cdafea753e..7b220ef0c43ad5bf5c5cf7c9aa54572adb8ebc81 100644 --- a/router/java/src/org/cybergarage/xml/parser/JaxpParser.java +++ b/router/java/src/org/cybergarage/xml/parser/JaxpParser.java @@ -17,6 +17,8 @@ package org.cybergarage.xml.parser; +import java.io.FilterInputStream; +import java.io.IOException; import java.io.InputStream; import javax.xml.parsers.DocumentBuilder; @@ -102,7 +104,7 @@ public class JaxpParser extends Parser try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); - InputSource inSrc = new InputSource(inStream); + InputSource inSrc = new InputSource(new NullFilterInputStream(inStream)); Document doc = builder.parse(inSrc); org.w3c.dom.Element docElem = doc.getDocumentElement(); @@ -124,4 +126,27 @@ public class JaxpParser extends Parser return root; } + /** + * I2P - + * Filter out nulls, hopefully to avoid + * SAXParserException "Content not allowed in trailing section", + * which is apparently caused by nulls. + * Alternative is to remove all stuff between '>' and '<', + * which isn't so hard if we assume no CDATA. + */ + private static class NullFilterInputStream extends FilterInputStream { + + public NullFilterInputStream(InputStream is) { + super(is); + } + + @Override + public int read() throws IOException { + int rv; + while ((rv = super.read()) == 0) { + // try again + } + return rv; + } + } } diff --git a/tests/scripts/checkpo.sh b/tests/scripts/checkpo.sh new file mode 100755 index 0000000000000000000000000000000000000000..13f080833bca6a553d6ddf0047905c5251898ce9 --- /dev/null +++ b/tests/scripts/checkpo.sh @@ -0,0 +1,36 @@ +# +# Run 'msgfmt -c' on all .po files +# Returns nonzero on failure +# +# zzz 2011-02 +# public domain +# + +cd `dirname $0`/../.. + +DIRS="\ + apps/routerconsole/locale \ + apps/i2ptunnel/locale \ + apps/i2psnark/locale \ + apps/susidns/locale \ + apps/susimail/locale \ + apps/desktopgui/locale" + +for i in `find $DIRS -maxdepth 1 -type f -name *.po` +do + echo "Checking $i ..." + msgfmt -c $i + if [ $? -ne 0 ] + then + echo "********* FAILED CHECK FOR $i *************" + FAIL=1 + fi +done + +if [ "$FAIL" != "" ] +then + echo "******** At least one file failed check *********" +else + echo "All files passed" +fi +exit $FAIL diff --git a/tests/scripts/checkutf8.sh b/tests/scripts/checkutf8.sh new file mode 100755 index 0000000000000000000000000000000000000000..4753cbd30035084027fcc18f17051eeea7cfc159 --- /dev/null +++ b/tests/scripts/checkutf8.sh @@ -0,0 +1,58 @@ +# +# Check for UTF-8 problems in all files where they might appear +# Also check all Java source files +# Returns nonzero on failure +# +# zzz 2010-12 +# public domain +# + +cd `dirname $0`/../.. + +# apps/routerconsole/jsp/ should only have UTF8 in help_xx.jsp + +DIRS="\ + apps/routerconsole/locale \ + apps/i2ptunnel/locale \ + apps/i2psnark/locale \ + apps/susidns/locale \ + apps/susimail/locale \ + apps/desktopgui/locale \ + installer/resources/eepsite.help/help \ + installer/resources/initialNews \ + installer/resources/proxy \ + installer/resources/readme \ + apps/routerconsole/jsp \ + apps/i2ptunnel/jsp \ + apps/susidns/src/jsp" + +for i in `find $DIRS -maxdepth 1 -type f` +do + echo "Checking $i ..." + iconv -f UTF8 -t UTF8 $i -o /dev/null + if [ $? -ne 0 ] + then + echo "********* FAILED CHECK FOR $i *************" + FAIL=1 + fi +done + +echo "Checking all Java files ..." +for i in `find . -name \*.java -type f` +do + #echo "Checking $i ..." + iconv -f UTF8 -t UTF8 $i -o /dev/null + if [ $? -ne 0 ] + then + echo "********* FAILED CHECK FOR $i *************" + FAIL=1 + fi +done + +if [ "$FAIL" != "" ] +then + echo "******** At least one file failed check *********" +else + echo "All files passed" +fi +exit $FAIL diff --git a/tests/scripts/checkxml.sh b/tests/scripts/checkxml.sh new file mode 100755 index 0000000000000000000000000000000000000000..d6524476d1b247268948a8b75a9cf27125510f67 --- /dev/null +++ b/tests/scripts/checkxml.sh @@ -0,0 +1,144 @@ +# +# Validate XML and HTML files using xmllint +# Returns nonzero on failure +# +# Note that the news.xml and initialNews*.xml files are really HTML +# +# zzz 2011-03 +# public domain +# + +cd `dirname $0`/../.. + +XMLFILES="\ +./android/AndroidManifest.xml \ +./android/build.xml \ +./android/res/layout/main.xml \ +./android/res/values/strings.xml \ +./apps/addressbook/build.xml \ +./apps/addressbook/web.xml \ +./apps/BOB/build.xml \ +./apps/BOB/Demos/echo/echoclient/build.xml \ +./apps/BOB/Demos/echo/echoclient/nbproject/build-impl.xml \ +./apps/BOB/Demos/echo/echoclient/nbproject/private/private.xml \ +./apps/BOB/Demos/echo/echoclient/nbproject/project.xml \ +./apps/BOB/Demos/echo/echoserver/build.xml \ +./apps/BOB/Demos/echo/echoserver/nbproject/build-impl.xml \ +./apps/BOB/Demos/echo/echoserver/nbproject/private/private.xml \ +./apps/BOB/Demos/echo/echoserver/nbproject/project.xml \ +./apps/BOB/nbproject/build-impl.xml \ +./apps/BOB/nbproject/project.xml \ +./apps/desktopgui/build.xml \ +./apps/fortuna/build.xml \ +./apps/i2psnark/java/build.xml \ +./apps/i2psnark/jetty-i2psnark.xml \ +./apps/i2psnark/web.xml \ +./apps/i2ptunnel/java/build.xml \ +./apps/i2ptunnel/jsp/web.xml \ +./apps/jetty/build.xml \ +./apps/ministreaming/java/build.xml \ +./apps/routerconsole/java/build.xml \ +./apps/routerconsole/jsp/web.xml \ +./apps/sam/java/build.xml \ +./apps/streaming/java/build.xml \ +./apps/susidns/src/build.xml \ +./apps/susidns/src/WEB-INF/web-template.xml \ +./apps/susimail/build.xml \ +./apps/susimail/src/WEB-INF/web.xml \ +./apps/systray/java/build.xml \ +./build.xml \ +./core/java/build.xml \ +./core/java/nbproject/project.xml \ +./installer/i2pinstaller.xml \ +./installer/i2pstandalone.xml \ +./installer/install.xml \ +./installer/lib/launch4j/build.xml \ +./installer/resources/jetty.xml \ +./installer/resources/shortcutSpec.xml \ +./router/java/build.xml \ +./Slackware/i2p-base/build.xml \ +./Slackware/i2p/build.xml" + +HTMLFILES="\ +./installer/resources/initialNews/*.xml \ +./installer/resources/news.xml \ +./apps/BOB/src/net/i2p/BOB/package.html \ +./apps/desktopgui/src/net/i2p/desktopgui/package.html \ +./apps/ministreaming/java/src/net/i2p/client/streaming/package.html \ +./apps/routerconsole/jsp/i2psnark/index.html \ +./apps/susidns/src/index.html \ +./apps/susimail/src/index.html \ +./core/java/src/net/i2p/client/datagram/package.html \ +./core/java/src/net/i2p/client/naming/package.html \ +./core/java/src/net/i2p/client/package.html \ +./core/java/src/net/i2p/crypto/package.html \ +./core/java/src/net/i2p/data/i2cp/package.html \ +./core/java/src/net/i2p/data/package.html \ +./core/java/src/net/i2p/internal/package.html \ +./core/java/src/net/i2p/package.html \ +./core/java/src/net/i2p/stat/package.html \ +./core/java/src/net/i2p/time/package.html \ +./core/java/src/net/i2p/util/package.html \ +./installer/resources/eepsite.help/help/index_de.html \ +./installer/resources/eepsite.help/help/index_fr.html \ +./installer/resources/eepsite.help/help/index.html \ +./installer/resources/eepsite.help/help/index_na.html \ +./installer/resources/eepsite.help/help/index_nl.html \ +./installer/resources/eepsite.help/help/index_ru.html \ +./installer/resources/eepsite.help/help/index_sv.html \ +./installer/resources/eepsite.help/help/pagetemplate.html \ +./installer/resources/eepsite.help/index.html \ +./installer/resources/readme/readme_ar.html \ +./installer/resources/readme/readme_de.html \ +./installer/resources/readme/readme_es.html \ +./installer/resources/readme/readme_fr.html \ +./installer/resources/readme/readme.html \ +./installer/resources/readme/readme_nl.html \ +./installer/resources/readme/readme_pt.html \ +./installer/resources/readme/readme_ru.html \ +./installer/resources/readme/readme_sv.html \ +./installer/resources/readme/readme_zh.html \ +./installer/resources/small/toolbar.html \ +./installer/resources/startconsole.html \ +./router/java/src/net/i2p/data/i2np/package.html \ +./router/java/src/net/i2p/router/package.html \ +./router/java/src/net/i2p/router/peermanager/package.html \ +./router/java/src/net/i2p/router/startup/package.html \ +./router/java/src/net/i2p/router/transport/ntcp/package.html \ +./router/java/src/net/i2p/router/transport/package.html \ +./router/java/src/net/i2p/router/transport/udp/package.html \ +./router/java/src/net/i2p/router/util/package.html" + +echo 'Checking XML files....................' +for i in $XMLFILES +do + echo "Checking $i ..." + xmllint --noout $i + if [ $? -ne 0 ] + then + echo "********* FAILED CHECK FOR $i *************" + FAIL=1 + fi +done + +echo 'Checking HTML files....................' +for i in $HTMLFILES +do + echo "Checking $i ..." + xmllint --html --noout $i + # FIXME html mode never exits with an error code + # ... but it does output errors + if [ $? -ne 0 ] + then + echo "********* FAILED CHECK FOR $i *************" + FAIL=1 + fi +done + +if [ "$FAIL" != "" ] +then + echo "******** At least one file failed check *********" +else + echo "All files passed" +fi +exit $FAIL