diff --git a/.mtn-ignore b/.mtn-ignore new file mode 100644 index 000000000..b0fd2e40a --- /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 000000000..060c32625 --- /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 2c689f65d..60bf2b9ff 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 9894530d8..e070826d0 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 + " * 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 a537d942f..0e00f1c50 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 6332c5bcc..30750a231 100644 --- a/apps/addressbook/build.xml +++ b/apps/addressbook/build.xml @@ -38,6 +38,7 @@ @@ -47,27 +48,52 @@ - + + + + + - + - + + + + + + + - - - + + + + + + + + + + + + + + + + + + diff --git a/apps/desktopgui/README b/apps/desktopgui/README new file mode 100644 index 000000000..569ca580a --- /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 000000000..c05b8dcd8 --- /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 8138f14c5..9a2bb13fb 100644 --- a/apps/desktopgui/build.xml +++ b/apps/desktopgui/build.xml @@ -1,119 +1,108 @@ - - - - - - - - - - Builds, tests, and runs the project desktopgui. - - + + + + + + + + - For list of available properties check the imported - nbproject/build-impl.xml file. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - 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: - - - - - - - - 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. - - --> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - - - + + + + + + + + + + + + + + + + + diff --git a/apps/desktopgui/bundle-messages.sh b/apps/desktopgui/bundle-messages.sh new file mode 100644 index 000000000..420fb5945 --- /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 ea1b025c7..000000000 --- a/apps/desktopgui/desktopgui/resources/howto/howto.html +++ /dev/null @@ -1,261 +0,0 @@ - - - Small Guide to I2P - - -

Small Guide to I2P

- -

So, what's this all about?

- -

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

- -

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

- -

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

- -

Filesharing

- -

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

- -

- There are also gnutella and edonkey clients: - i2phex for gnutella (http://echelon.i2p/i2phex) - imule for edonkey (http://echelon.i2p/imule) -

- -

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

- -

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

- -

- I2P is a smaller net (1000 users) which grows slowly. As of which amount of shared - data will slowly rise. -

- -

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

- -

Internet (the websites)

- -

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

- -

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

- -

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

- -

Bandwidth

- -

http://127.0.0.1:7657/config.jsp

- -

Setup your bandwith wisely. Know your linespeed!

- -

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

- -

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

- -

There is no shared bandwith under 16k.

- -

- Limit your participating tunnels (shared bandwith) on: - http://127.0.0.1:7657/configadvanced.jsp - with the line: - router.maxParticipatingTunnels=500 -

- -

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

- -

What is shared bandwidth?

- -

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

- -

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

- -

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

- -

Addressbook

- -

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

- -

Out of Memory errors

- -

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

- -

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

- -

Blocklists

- -

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

- -

(By echelon -- echelon.i2p )

- - diff --git a/apps/desktopgui/lib/appframework.jar b/apps/desktopgui/lib/appframework.jar deleted file mode 100644 index 0b8ff0145..000000000 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 bcdd9d910..000000000 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 000000000..e908adb70 --- /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 , 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 \n" +"Language-Team: duck \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 000000000..7963075df --- /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 , 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 \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 000000000..e92250e67 --- /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 , 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 \n" +"Language-Team: duck \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 000000000..a458f3ad7 --- /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 , 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 \n" +"Language-Team: Spanish (Castilian) \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 000000000..f816891d0 --- /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 , 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 \n" +"Language-Team: duck \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 000000000..26973bd78 --- /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 , 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 \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 000000000..aa5a21a62 --- /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 , 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 \n" +"Language-Team: duck \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 000000000..0cb5229f8 --- /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 328e8e5bc..000000000 --- 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 039f8788f..000000000 --- a/apps/desktopgui/nbproject/build-impl.xml +++ /dev/null @@ -1,642 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must set src.dir - Must set test.src.dir - Must set build.dir - Must set dist.dir - Must set build.classes.dir - Must set dist.javadoc.dir - Must set build.test.classes.dir - Must set build.test.results.dir - Must set build.classes.excludes - Must set dist.jar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must set javac.includes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select some files in the IDE or set javac.includes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - To run this application from the command line without Ant, try: - - - - - - - java -cp "${run.classpath.with.dist.jar}" ${main.class} - - - - - - - - - - - - - - - - - - - - - - - To run this application from the command line without Ant, try: - - java -jar "${dist.jar.resolved}" - - - - - - - - - - - - - - - - - - - Must select one file in the IDE or set run.class - - - - - - - - - - - - - - - - - - - - Must select one file in the IDE or set debug.class - - - - - Must set fix.includes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select some files in the IDE or set javac.includes - - - - - - - - - - - - - - - - - - - - Some tests failed; see details above. - - - - - - - - - Must select some files in the IDE or set test.includes - - - - Some tests failed; see details above. - - - - - Must select one file in the IDE or set test.class - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select one file in the IDE or set applet.url - - - - - - - - - Must select one file in the IDE or set applet.url - - - - - - - - - - - - - - - - - - - diff --git a/apps/desktopgui/nbproject/genfiles.properties b/apps/desktopgui/nbproject/genfiles.properties deleted file mode 100644 index f6b0f837b..000000000 --- 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 a02ea8207..000000000 --- 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 9dba9493c..000000000 --- a/apps/desktopgui/nbproject/project.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - org.netbeans.modules.java.j2seproject - - - desktopgui - 1.6.5 - - - - - - - - - - - - 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 000000000..ad89a9864 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 6cd2ac1fb..000000000 --- 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 000000000..6fea46fef --- /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() { + + @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 000000000..e1247dde6 --- /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() { + + @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() { + + @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() { + + @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() { + + @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 000000000..993970e30 --- /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 000000000..1a29d8871 --- /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 21f0e04cf..000000000 --- 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 c3078163d..000000000 --- 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 fb7218cea..000000000 --- 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 81107aca9..000000000 --- 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 0f07284d5..000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/gui/ClientTunnelWindow.form +++ /dev/null @@ -1,396 +0,0 @@ - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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 b7102b3ce..000000000 --- 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") - // //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(); - }// //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 000000000..ae45bf247 --- /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") + // //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(); + }// //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 589f5cee2..000000000 --- a/apps/desktopgui/src/net/i2p/desktopgui/gui/GeneralConfiguration.form +++ /dev/null @@ -1,645 +0,0 @@ - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - <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 3e4a17fd2..000000000 --- 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 1f62df2c2..000000000 --- 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 ed2441319..000000000 --- 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 1edf85b3b..000000000 --- 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 303f49a7f..000000000 --- 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 765210148..000000000 --- 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 5ee7b94ac..000000000 --- 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 335812e2a..000000000 --- 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 54f5fa726..000000000 --- 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 772d16918..000000000 --- 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 8e4aa5b4e..000000000 --- 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 933ad3ff2..000000000 --- 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 1088f6957..000000000 --- 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 02fb5b2df..000000000 --- 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 32ab90b31..000000000 --- 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 25a38d6b8..000000000 --- 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 ca036e197..000000000 --- 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 d53ac80d0..000000000 --- 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 d4ef5bf0e..000000000 --- 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 683f3caa7..000000000 --- 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 00eb6c973..000000000 --- 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 909518ada..000000000 --- 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 6dca3ca51..000000000 --- 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 c2030bb2d..000000000 --- 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 000000000..e95cbc01f --- /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 000000000..ac1c91503 --- /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 770bd0957..000000000 --- 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 022c5c814..000000000 --- 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 2da95f0c6..000000000 --- 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 000000000..63f6ad588 --- /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 74df2b3d9..000000000 --- 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 8fd675657..000000000 --- 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 51b8b5a6f..000000000 --- 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 e913f5e51..000000000 --- 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 6e28db108..000000000 --- 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 000000000..a5e4f4350 --- /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 000000000..d514f314a --- /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 000000000..ad6e14cb3 --- /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 7cc0fb46a..000000000 --- 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 000000000..3430f2e5a 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 b9d294b32..000000000 --- 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 90f5cd6fe..e500dcc61 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 90feca972..000000000 --- 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 c09aa811f..64fc69f83 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 52099d1d2..b4ba0f299 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 a86afa781..478c17bb5 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 000000000..b3770070f --- /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 fb69b044d..000000000 --- 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 b36c0fdcb..6f35f66bd 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,17 +324,25 @@ public class I2PSnarkUtil { } String getOurIPString() { - if (_manager == null) - return "unknown"; - I2PSession sess = _manager.getSession(); - if (sess != null) { - Destination dest = sess.getMyDestination(); - if (dest != null) - return dest.toBase64(); - } + 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 null; + I2PSession sess = _manager.getSession(); + if (sess != null) + return sess.getMyDestination(); + return null; + } + /** Base64 only - static (no naming service) */ static Destination getDestinationFromBase64(String ip) { if (ip == null) return null; @@ -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 000000000..da89f5577 --- /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 a9d1e23f2..b4344f3ba 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 ad2680045..5889db89e 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); + } - files.add(file); + // 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)); + } + + 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 cd46bbf8b..548914812 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 58ef3ae2d..0adb13d9b 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 aa9cf2187..5d7b6d66d 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 43bb9a712..33da75263 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 38cb29e3b..225edd492 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 8026f34f6..11f0fff86 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 975c12c10..c7650a552 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 5551bc90e..111ddbbe6 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 6855d36a0..dd48508a9 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 31105a269..c43679ed3 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 82d1d80f4..695cd7b7a 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 { } /** - * Warning - does not validate announce URL - use TrackerClient.isValidAnnounce() + * Just remember we have it + * @since 0.8.4 */ - private String locked_validateTorrent(MetaInfo info) throws IOException { + 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 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 38b470a7c..52bef12b4 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 17fae5235..1183e9bf3 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 89815035b..85a39f748 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 360a4f47e..1b829d0ee 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 4c59bcb93..4f394d01e 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 986e45643..4cae2881a 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 b8129f477..9584b0d9d 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 000000000..6a16e4e60 --- /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 cfe95df13..369fd3d2b 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) + 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 (isMultiFile) + icon = "folder"; + else if (isValid) + icon = toIcon(meta.getName()); + else + 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 || isMultiFile) { + StringBuilder buf = new StringBuilder(128); + buf.append("<a href=\"").append(snark.getBaseName()); + if (isMultiFile) buf.append('/'); buf.append("\" title=\""); - if (snark.meta.getFiles() != null) + if (isMultiFile) buf.append(_("View files")); else buf.append(_("Open file")); buf.append("\">"); out.write(buf.toString()); } - String icon; - if (snark.meta.getFiles() != null) - icon = "folder"; - else - icon = toIcon(snark.meta.getName()); - if (remaining == 0 || snark.meta.getFiles() != null) { - out.write(toImg(icon, _("Open"))); - out.write("</a>"); - } else { - out.write(toImg(icon)); - } - out.write("</td><td class=\"snarkTorrentName " + rowClass + "\">"); - if (remaining == 0 || snark.meta.getFiles() != null) - 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 (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) - 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 (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("").append(HEADER_A).append(_themePath).append(HEADER_B).append("" + @@ -1495,13 +1648,70 @@ public class I2PSnarkServlet extends Default { if (parent) // always true buf.append("
"); - boolean showPriority = snark != null && !snark.storage.complete(); + boolean showPriority = ls != null && snark != null && snark.getStorage() != null && !snark.getStorage().complete(); if (showPriority) buf.append("\n"); - buf.append("" + - "\n"); - } else { } - buf.append("\n"); + buf.append("
") + buf.append(""); + if (snark != null) { + // first row - torrent info + // FIXME center + buf.append(""); + } + if (ls == null) { + // We are only showing the torrent info section + buf.append("
") + .append(_("Torrent")).append(": ").append(snark.getBaseName()); + int pieces = snark.getPieces(); + double completion = (pieces - snark.getNeeded()) / (double) pieces; + if (completion < 1.0) + buf.append("
").append(_("Completion")).append(": ").append((new DecimalFormat("0.00%")).format(completion)); + else + buf.append("
").append(_("Complete")); + // else unknown + buf.append("
").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("
").append(_("Files")).append(": ").append(fileCount); + } + buf.append("
").append(_("Pieces")).append(": ").append(pieces); + buf.append("
").append(_("Piece size")).append(": ").append(formatSize(snark.getPieceLength(0))); + + if (meta != null) { + String announce = meta.getAnnounce(); + if (announce != null) { + buf.append("
"); + 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("
").append(toImg("magnet", _("Magnet link"))).append(" ") + .append(MAGNET_FULL).append(hex).append(""); + // We don't have the hash of the torrent file + //buf.append("
").append(_("Maggot link")).append(": ") + // .append(MAGGOT).append(hex).append(':').append(hex).append(""); + buf.append("
"); + return buf.toString(); + } + + // second row - dir info + buf.append("
") .append("\"\" ") - .append(title).append("") + .append(_("Directory")).append(": ").append(directory).append("") .append("\"\" ") .append(_("Size")); buf.append("") @@ -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(""); 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(" 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 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 000000000..f0be3b974 --- /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 , 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 \n" +"Language-Team: duck \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:
\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 ed5934f52..8cb0ab1bf 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 \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 \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" -#: ../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 "" +"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: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:
\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 -msgid "Priority" -msgstr "Priorität" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1672 +msgid "Files" +msgstr "Dateien" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1492 -msgid "Up to higher level directory" -msgstr "Eine Hierarchie nach oben" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1674 +msgid "Pieces" +msgstr "Stücke" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 +#: ../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:1522 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1723 +msgid "Priority" +msgstr "Priorität" + +#: ../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: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 000000000..e88100e85 --- /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 , 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 \n" +"Language-Team: duck \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:
\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 cf863e521..d92024557 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 \n" -"Language-Team: foo \n" +"Language-Team: Spanish (Castilian) \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}" +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:458 -msgid "Invalid URL - must start with http://" -msgstr "Dirección no válida - tiene que comenzar con http://" - -#: ../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:
\n"); -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1134 +#. out.write("From file:
\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 -msgid "Priority" -msgstr "Prioridad" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1672 +msgid "Files" +msgstr "Archivos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1492 -msgid "Up to higher level directory" -msgstr "Subir una herarquía" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1674 +msgid "Pieces" +msgstr "Partes" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 +#: ../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:1522 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1723 +msgid "Priority" +msgstr "Prioridad" + +#: ../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: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 e7981f282..930d9c430 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 \n" +"POT-Creation-Date: 2011-05-02 11:08+0000\n" +"PO-Revision-Date: 2011-05-19 07:39+0100\n" +"Last-Translator: magma \n" "Language-Team: foo \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é" - -#: ../java/src/org/klomp/snark/SnarkManager.java:416 -msgid "Disabled autostart" -msgstr "Le démarrage automatique est désactivé" - -#: ../java/src/org/klomp/snark/SnarkManager.java:422 -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." - -#: ../java/src/org/klomp/snark/SnarkManager.java:424 -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 "Démarrage automatique activé" #: ../java/src/org/klomp/snark/SnarkManager.java:431 -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" +msgid "Disabled autostart" +msgstr "Démarrage automatique désactivé" -#: ../java/src/org/klomp/snark/SnarkManager.java:438 +#: ../java/src/org/klomp/snark/SnarkManager.java:437 +msgid "Enabled open trackers - torrent restart required to take effect." +msgstr "Open trackers activés - redémarrage des torrents requis pour prise en compte." + +#: ../java/src/org/klomp/snark/SnarkManager.java:439 +msgid "Disabled open trackers - torrent restart required to take effect." +msgstr "Open trackers désactivés - redémarrage des torrents requis pour prise en compte." + +#: ../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 - redémarrage des torrents requis pour prise en compte" + +#: ../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}\"" -#: ../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: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 "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 "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: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:596 #, 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 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: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:601 +#, java-format +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: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-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-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-format -msgid "No pieces in \"{0}\", deleting it!" -msgstr "Pas de morceaux dans \"{0}\", suppression!" - -#: ../java/src/org/klomp/snark/SnarkManager.java:740 -#, java-format -msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!" -msgstr "Trop de morceaux dans \"{0}\" , la limite est {1}, suppression!" - -#: ../java/src/org/klomp/snark/SnarkManager.java:742 -#, java-format -msgid "Pieces are too large in \"{0}\" ({1}B), deleting it." -msgstr "Les morceaux sont trop larges dans \"{0}\" ({1}B), suppresion." - -#: ../java/src/org/klomp/snark/SnarkManager.java:743 -#, java-format -msgid "Limit is {0}B" -msgstr "La limite est de \"{0}\"Octets" - -#: ../java/src/org/klomp/snark/SnarkManager.java:751 -#, 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}\"." - -#: ../java/src/org/klomp/snark/SnarkManager.java:767 -#, 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-format -msgid "Torrent stopped: \"{0}\"" -msgstr "Torrent arrêté:\"{0}\"" - -#: ../java/src/org/klomp/snark/SnarkManager.java:814 -#, java-format -msgid "Torrent removed: \"{0}\"" -msgstr "Torrent supprimé:\"{0}\"" - -#: ../java/src/org/klomp/snark/SnarkManager.java:852 -#, java-format -msgid "Download finished: {0}" -msgstr "Téléchargement terminé:\"{0}\"" - -#: ../java/src/org/klomp/snark/SnarkManager.java:880 -msgid "Unable to connect to I2P!" -msgstr "Impossible de se connecter à I2P!" - -#: ../java/src/org/klomp/snark/SnarkManager.java:886 -#, java-format -msgid "Unable to add {0}" -msgstr "Impossible d'ajouter {0}" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:185 -msgid "I2PSnark - Anonymous BitTorrent Client" -msgstr "I2PSnark - Client BitTorrent anonyme" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:198 -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 -msgid "I2PSnark" -msgstr "I2PSnark" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:205 -msgid "Refresh page" -msgstr "Rafraîchir la page" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:210 -msgid "Forum" -msgstr "Forum" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:264 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1483 -msgid "Status" -msgstr "État" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:270 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:272 -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 -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 -msgid "Torrent" -msgstr "Torrent" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:290 -#, fuzzy -msgid "Estimated time remaining" -msgstr "Octets restants" - -# 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 -msgid "ETA" -msgstr " Temps" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:297 -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 -msgid "RX" -msgstr "Reçu" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:304 -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 -msgid "TX" -msgstr "Envoyé" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:312 -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 -msgid "Rate" -msgstr "Vitesse" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:322 -msgid "Up Rate" -msgstr "Taux d'envoi" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:340 -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 -msgid "Stop All" -msgstr "Arrêter tout" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:351 -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 -msgid "Start All" -msgstr "Démarrer tout" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:372 -msgid "No torrents loaded." -msgstr "Aucun torrent chargé." - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:377 -msgid "Totals" -msgstr "Totaux" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:379 -#, 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-format -msgid "1 connected peer" -msgid_plural "{0} connected peers" -msgstr[0] "1 pair connecté" -msgstr[1] "{0} pairs connectés" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:454 +#: ../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/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/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/web/I2PSnarkServlet.java:489 +#: ../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: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:980 +#, java-format +msgid "No pieces in \"{0}\", deleting it!" +msgstr "Pas de tronçon dans \"{0}\", suppression!" + +#: ../java/src/org/klomp/snark/SnarkManager.java:982 +#, java-format +msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!" +msgstr "Trop de tronçons dans \"{0}\" , la limite est {1}, suppression!" + +#: ../java/src/org/klomp/snark/SnarkManager.java:984 +#, java-format +msgid "Pieces are too large in \"{0}\" ({1}B), deleting it." +msgstr "Les tronçons sont trop larges dans \"{0}\" ({1}B), suppression." + +#: ../java/src/org/klomp/snark/SnarkManager.java:985 +#, java-format +msgid "Limit is {0}B" +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: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}\"." + +#: ../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: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:1071 +#, java-format +msgid "Torrent removed: \"{0}\"" +msgstr "Torrent supprimé:\"{0}\"" + +#: ../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: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/web/I2PSnarkServlet.java:509 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:527 +#: ../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:1237 +#, java-format +msgid "Unable to add {0}" +msgstr "Impossible d’ajouter {0}" + +#: ../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:218 +msgid "Torrents" +msgstr "Torrents" + +#: ../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 "Rafraîchir la page" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:230 +msgid "Forum" +msgstr "Forum" + +#: ../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: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: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: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:310 +msgid "Estimated time remaining" +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:313 +msgid "ETA" +msgstr "Temps" + +#: ../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:320 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:334 +msgid "RX" +msgstr "Reçu" + +#: ../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:327 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:344 +msgid "TX" +msgstr "Envoyé" + +#: ../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:337 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:346 +msgid "Rate" +msgstr "Vitesse" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:342 +msgid "Up Rate" +msgstr "Taux d'envoi" + +#: ../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:368 +msgid "Stop All" +msgstr "Arrêter tout" + +#: ../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:379 +msgid "Start All" +msgstr "Démarrer tout" + +#: ../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:403 +msgid "Totals" +msgstr "Totaux" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:405 +#, java-format +msgid "1 torrent" +msgid_plural "{0} torrents" +msgstr[0] "{0} torrent" +msgstr[1] "{0} torrents" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:408 +#, java-format +msgid "1 connected peer" +msgid_plural "{0} connected peers" +msgstr[0] "{0} pair connecté" +msgstr[1] "{0} pairs connectés" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:497 +#, java-format +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:545 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:572 +#, java-format +msgid "Magnet deleted: {0}" +msgstr "Magnet supprimé: {0}" + +#: ../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:
\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 -msgid "Priority" -msgstr "Priorité" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1672 +msgid "Files" +msgstr "Fichiers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1492 -msgid "Up to higher level directory" -msgstr "Vers le répertoire parent" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1674 +msgid "Pieces" +msgstr "Tronçons" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 +#: ../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:1522 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1723 +msgid "Priority" +msgstr "Priorité" + +#: ../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: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 1eebf765e..860e9d7fe 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 \n" -"Language-Team: duck , monkeybrains \n" +"POT-Creation-Date: 2011-03-03 18:28+0000\n" +"PO-Revision-Date: 2011-02-20 12:15+0000\n" +"Last-Translator: ducki2p \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}" +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:458 -msgid "Invalid URL - must start with http://" -msgstr "Ongeldige URL - moet beginnen met http://" - -#: ../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:
\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 -msgid "Priority" -msgstr "Prioriteit" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1672 +msgid "Files" +msgstr "Bestanden" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1492 -msgid "Up to higher level directory" -msgstr "Naar bovenliggende directory" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1674 +msgid "Pieces" +msgstr "Stukken" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 +#: ../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:1522 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1723 +msgid "Priority" +msgstr "Prioriteit" + +#: ../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: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 4c9547c31..ae9ed03c8 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 \n" "Language-Team: foo \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}" -#: ../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}\", 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: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 +#, 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: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:734 -#, 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-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." - -#: ../java/src/org/klomp/snark/SnarkManager.java:738 -#, 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-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-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-format -msgid "Limit is {0}B" -msgstr "O limite são \"{0}\"Bytes" - -#: ../java/src/org/klomp/snark/SnarkManager.java:751 -#, 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}\"." - -#: ../java/src/org/klomp/snark/SnarkManager.java:767 -#, java-format -msgid "Error: Could not remove the torrent {0}" -msgstr "Erro: Não se pode quitar o torrent \"{0}\"." - -#: ../java/src/org/klomp/snark/SnarkManager.java:794 -#, java-format -msgid "Torrent stopped: \"{0}\"" -msgstr "Torrent parado: \"{0}\"" - -#: ../java/src/org/klomp/snark/SnarkManager.java:814 -#, java-format -msgid "Torrent removed: \"{0}\"" -msgstr "Torrent quitado: \"{0}\"" - -#: ../java/src/org/klomp/snark/SnarkManager.java:852 -#, java-format -msgid "Download finished: {0}" -msgstr "Finalizada a descarga de \"{0}\"" - -#: ../java/src/org/klomp/snark/SnarkManager.java:880 -msgid "Unable to connect to I2P!" -msgstr "Impossível de se conectar com I2P" - -#: ../java/src/org/klomp/snark/SnarkManager.java:886 -#, java-format -msgid "Unable to add {0}" -msgstr "Impossível de adicionar {0}" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:185 -msgid "I2PSnark - Anonymous BitTorrent Client" -msgstr "I2PSnark - Cliente de BitTorrent Anônimo" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:198 -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 -msgid "I2PSnark" -msgstr "I2PSnark" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:205 -msgid "Refresh page" -msgstr "Atualizar página" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:210 -msgid "Forum" -msgstr "Foro" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:264 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1483 -msgid "Status" -msgstr "Estado" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:270 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:272 -msgid "Hide Peers" -msgstr "ocultar pares" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:277 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:279 -msgid "Show Peers" -msgstr "mostrar pares" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:286 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1464 -msgid "Torrent" -msgstr "Torrent" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:290 -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 -msgid "ETA" -msgstr "Tempo" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:297 -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 -msgid "RX" -msgstr "Baixado" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:304 -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 -msgid "TX" -msgstr "Subido" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:312 -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 -msgid "Rate" -msgstr "Taça" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:322 -msgid "Up Rate" -msgstr "Taça de subida" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:340 -msgid "Stop all torrents and the I2P tunnel" -msgstr "Parar todos os torrents e o túnel I2P" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:342 -msgid "Stop All" -msgstr "Parar tudos" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:351 -msgid "Start all torrents and the I2P tunnel" -msgstr "Iniciar todos os torrents e o túnel I2P" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:353 -msgid "Start All" -msgstr "Arrancar todos" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:372 -msgid "No torrents loaded." -msgstr "Não carregado nenhum torrent" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:377 -msgid "Totals" -msgstr "Total" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:379 -#, 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-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/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/web/I2PSnarkServlet.java:458 -msgid "Invalid URL - must start with http://" -msgstr "Endereço não válido - tem que começar com http://" +#: ../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/web/I2PSnarkServlet.java:489 +#: ../java/src/org/klomp/snark/SnarkManager.java:679 +#, fuzzy, java-format +msgid "Adding {0}" +msgstr "Buscando {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 "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:974 +#, java-format +msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!" +msgstr "" +"O arquivo de dados do torrente \"{0}\" não pode terminar em \".torrent' e " +"será apagado." + +#: ../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: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: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:981 +#, java-format +msgid "Limit is {0}B" +msgstr "O limite são \"{0}\"Bytes" + +#: ../java/src/org/klomp/snark/SnarkManager.java:989 +#, java-format +msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\"" +msgstr "" +"torrentes maiores que \"{0}\" Bytes ainda não funcionam, se apagará \"{1}\"." + +#: ../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 torrente \"{0}\"." + +#: ../java/src/org/klomp/snark/SnarkManager.java:1026 +#: ../java/src/org/klomp/snark/SnarkManager.java:1044 +#, java-format +msgid "Torrent stopped: \"{0}\"" +msgstr "torrente detido: \"{0}\"" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1065 +#, java-format +msgid "Torrent removed: \"{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:1122 +#, java-format +msgid "Download finished: {0}" +msgstr "Finalizada a descarga de \"{0}\"" + +#: ../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 torrent {0}" +msgstr "Iniciando o torrente {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:509 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:527 +#: ../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:1231 +#, java-format +msgid "Unable to add {0}" +msgstr "Impossível de adicionar {0}" + +#: ../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:218 +msgid "Torrents" +msgstr "torrentes" + +#: ../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 "Atualizar página" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:230 +msgid "Forum" +msgstr "Foro" + +#: ../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:290 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:292 +msgid "Hide Peers" +msgstr "ocultar parceiros" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:297 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:299 +msgid "Show Peers" +msgstr "mostrar parceiros" + +#: ../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 "torrente" + +#: ../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:313 +msgid "ETA" +msgstr "Tempo" + +#: ../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:320 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:334 +msgid "RX" +msgstr "Baixado" + +#: ../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:327 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:344 +msgid "TX" +msgstr "Subido" + +#: ../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:337 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:346 +msgid "Rate" +msgstr "Taça" + +#: ../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:365 +msgid "Stop all torrents and the I2P tunnel" +msgstr "Deter todos os torrentes e o túnel I2P" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:367 +msgid "Stop All" +msgstr "Deter tudos" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:376 +msgid "Start all torrents and the I2P tunnel" +msgstr "Iniciar todos os torrentes e o túnel I2P" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:378 +msgid "Start All" +msgstr "Arrancar todos" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:397 +msgid "No torrents loaded." +msgstr "Não carregado nenhum torrente" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:402 +msgid "Totals" +msgstr "Total" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:404 +#, java-format +msgid "1 torrent" +msgid_plural "{0} torrents" +msgstr[0] "1 torrente" +msgstr[1] "{0} torrentes" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:407 +#, java-format +msgid "1 connected peer" +msgid_plural "{0} connected peers" +msgstr[0] "1 parceiro conectado" +msgstr[1] "{0} parceiros conectados" + +#: ../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: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: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/src/org/klomp/snark/web/I2PSnarkServlet.java:886 +#, fuzzy +msgid "Torrent details" +msgstr "torrentes" + +#: ../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:913 +msgid "View files" +msgstr "mostrar arquivos" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:915 +msgid "Open file" +msgstr "abrir arquivo" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:957 +msgid "Stop the torrent" +msgstr "Deter o torrente" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:959 +msgid "Stop" +msgstr "Deter" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:969 +msgid "Start the torrent" +msgstr "Iniciar o torrente" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:971 +msgid "Start" +msgstr "Iniciar" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:982 +msgid "Remove the torrent from the active list, deleting the .torrent file" +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: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.)" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:990 +msgid "Remove" +msgstr "Quitar" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1001 +msgid "Delete the .torrent file and the associated data file(s)" +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: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 torrente \\''{0}\\'' e todos os " +"dados descarregados deste torrente?" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1009 +msgid "Delete" +msgstr "Apagar" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042 +msgid "Unknown" +msgstr "desconhecido" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1054 +msgid "Seed" +msgstr "Semeador" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1077 +msgid "Uninteresting (The peer has no pieces we need)" +msgstr "não interessante (O parceiro não tem peças que precisamos.)" + +#: ../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 parceiro não está nos permitindo pedir mais peças.c)" + +#: ../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 parceiro quer.)" + +#: ../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 parceiros peçam mais " +"peças)" + +#: ../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:838 -msgid "Info" -msgstr "Info" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:853 -msgid "View files" -msgstr "mostrar arquivos" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:855 -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 -msgid "Stop the torrent" -msgstr "Parar o torrent" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:911 -msgid "Stop" -msgstr "Parar" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:921 -msgid "Start the torrent" -msgstr "Iniciar o torrent" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:923 -msgid "Start" -msgstr "Iniciar" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:933 -msgid "Remove the torrent from the active list, deleting the .torrent file" -msgstr "Retire o torrent 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-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.)" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:941 -msgid "Remove" -msgstr "Quitar" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:950 -msgid "Delete the .torrent file and the associated data file(s)" -msgstr "Apagar o arquivo torrent 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-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?" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 -msgid "Delete" -msgstr "Apagar" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:991 -msgid "Unknown" -msgstr "desconhecido" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1001 -msgid "Seed" -msgstr "Semeador" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1019 -msgid "Uninteresting (The peer has no pieces we need)" -msgstr "não interessante (O par não tem peças que precisamos.)" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1021 -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)" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1035 -msgid "Uninterested (We have no pieces the peer needs)" -msgstr "desinteressado (Não temos as peças que o par quer.)" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1037 -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)" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1092 +#: ../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:
\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 -msgid "or" -msgstr "ou" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1158 -msgid "Specify custom tracker announce URL" -msgstr "Especifique o URL de rastreador personalizado" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1161 -msgid "Create torrent" -msgstr "Criar torrent" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1180 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1317 -msgid "Configuration" -msgstr "Preferências" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1184 -msgid "Data directory" -msgstr "Pasta de dados" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1186 -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 -msgid "Auto start" -msgstr "Iniciar automáticamente" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1194 -msgid "If checked, automatically start torrents that are added" -msgstr "se marcado, os torrents adicionados se iniciarão automaticamente" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1198 -msgid "Theme" -msgstr "Tema" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1211 -msgid "Startup delay" -msgstr "Demora do arranque" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1213 -msgid "minutes" -msgstr "minutos" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237 -msgid "Total uploader limit" -msgstr "Limite global de subidores" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240 -msgid "peers" -msgstr "pares" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1244 -msgid "Up bandwidth limit" -msgstr "Limite de largura de banda para a subida" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1247 -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 -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 -msgid "Use open trackers also" +#. 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 "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" +msgid "or" +msgstr "ou" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1261 +#: ../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:1263 +msgid "Create torrent" +msgstr "Criar torrente" + +#: ../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:1285 +msgid "Data directory" +msgstr "Pasta de dados" + +#: ../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:1291 +msgid "Auto start" +msgstr "Iniciar automáticamente" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1295 +msgid "If checked, automatically start torrents that are added" +msgstr "se marcado, os torrentes adicionados se iniciarão automaticamente" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1299 +msgid "Theme" +msgstr "Tema" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1312 +msgid "Startup delay" +msgstr "Demora do arranque" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1314 +msgid "minutes" +msgstr "minutos" + +#: ../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:1341 +msgid "peers" +msgstr "parceiros" + +#: ../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: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: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:1354 +msgid "Use open trackers also" +msgstr "usar também rastreadores abertos" + +#: ../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: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 -msgid "Priority" -msgstr "Prioridade" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1672 +#, fuzzy +msgid "Files" +msgstr "Arquivo" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1492 -msgid "Up to higher level directory" -msgstr "Subir uma herarquia" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1674 +msgid "Pieces" +msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 +#: ../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:1522 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1723 +msgid "Priority" +msgstr "Prioridade" + +#: ../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: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}" +msgstr "torrente 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}." - -#: ../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 ed82ff35c..582446cde 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 \n" "Language-Team: foo \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}" +msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"" +msgstr "" +"Некорректный URL: должен начинаться с \"http://\", \"{0}\", или \"{1}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:458 -msgid "Invalid URL - must start with http://" -msgstr "Некорректный URL, должен начинаться с http://" - -#: ../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:
\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 -msgid "Priority" -msgstr "Приоритет" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1672 +msgid "Files" +msgstr "Файлов" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1492 -msgid "Up to higher level directory" -msgstr "Перейти в директорию уровнем выше" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1674 +msgid "Pieces" +msgstr "Части" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 +#: ../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:1728 +msgid "Up to higher level 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 b649d8c58..6fb391d1c 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 \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 \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 "Warning - Ignoring non-i2p tracker in \"{0}\", will announce to i2p open trackers only" -msgstr "警告 - 忽略\"{0}\"文件中I2P网络外的Tracker服务器,文件将仅发布至 I2P 内的 Open Tracker 服务器。" +msgid "Torrent with this info hash is already running: {0}" +msgstr "具有相同Hash链接的种子已在下载中:{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:494 +#. 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网络外的Tracker服务器,OpenTracker已禁用,启动此种子前您必须启用OpenTracker。" +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:513 +#. 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 Tracker 服务器,下载此种子请先启用 Open Tracker。" + +#: ../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 "Download finished: \"{0}\"" -msgstr "下载已完成:\"{0}\"" +msgid "Adding torrents in {0}" +msgstr "{0} 分钟内完成添加" -#: ../java/src/org/klomp/snark/SnarkManager.java:729 +#: ../java/src/org/klomp/snark/SnarkManager.java:1122 #, java-format -msgid "size: {0}B" -msgstr "大小:{0}B" +msgid "Download finished: {0}" +msgstr "下载已完成: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:757 +#: ../java/src/org/klomp/snark/SnarkManager.java:1170 +#, java-format +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: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 " 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 "Status" -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:246 -msgid "\"Hide" -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:249 -msgid "\"Show" -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:254 -msgid "Torrent" -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:256 -msgid "ETA" -msgstr "预计剩余时间" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:310 +msgid "Estimated time remaining" +msgstr "预计剩余时间" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:258 -msgid "RX" -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:260 -msgid "TX" -msgstr "上传" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317 +msgid "Downloaded" +msgstr "已下载" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:262 -msgid "Rate" -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:264 -msgid "Rate" -msgstr "上传速度" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324 +msgid "Uploaded" +msgstr "已上传" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:271 +#. 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:273 -msgid "\"Stop" -msgstr "\"全部停止\"" +#: ../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 "\"Start" -msgstr "\"全部开始\"" +#: ../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 "" -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 "\"Stop\"" -msgstr "\"停止\"" +#: ../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 "\"Start\"" -msgstr "\"开始\"" +#: ../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 "\"Remove\"" -msgstr "\"删除种子\"" +#: ../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 "\"Delete\"" -msgstr "\"删除种子" +#: ../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 "Add Torrent" -msgstr "添加种子" +#: ../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: {0}" -msgstr "或者您可以将.torrent文件复制到{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 "Create Torrent" -msgstr "创建种子" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1226 +msgid "Create Torrent" +msgstr "创建种子" #. out.write("From file:
\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:985 +#: ../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 "指定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 "Configuration" -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: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 "完成" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1278 -msgid "\"File\" " -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:1278 -msgid "\"FileSize\"Size" -msgstr "\"文件大小\"大小" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1672 +msgid "Files" +msgstr "文件" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1279 -msgid "Status" -msgstr "状态" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1674 +msgid "Pieces" +msgstr "分块数量" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1301 +#: ../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:1306 -msgid "Torrent not found?" -msgstr "种子未找到" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1723 +msgid "Priority" +msgstr "优先级" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1314 -msgid "File not found in torrent?" -msgstr "种子中没有发现文件?" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1320 -msgid "complete" -msgstr "完成" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1321 -msgid "bytes remaining" -msgstr "剩余字节数" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1373 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1728 msgid "Up to higher level directory" msgstr "上一层文件夹" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1461 +#: ../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: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 "" +#~ "Status" +#~ msgstr "" +#~ "状态" + +#~ msgid "" +#~ "\"Hide" +#~ msgstr "" +#~ "\"隐藏节点\"" + +#~ msgid "" +#~ "\"Show" +#~ msgstr "" +#~ "\"显示节点\"" + +#~ msgid "" +#~ "Torrent" +#~ msgstr "" +#~ "种子" + +#~ msgid "" +#~ "ETA" +#~ msgstr "" +#~ "预计剩余时间" + +#~ msgid "" +#~ "RX" +#~ msgstr "" +#~ "下载" + +#~ msgid "" +#~ "TX" +#~ msgstr "" +#~ "上传" + +#~ msgid "" +#~ "Rate" +#~ msgstr "" +#~ "下载速度" + +#~ msgid "" +#~ "Rate" +#~ msgstr "" +#~ "上传速度" + +#~ msgid "" +#~ "\"Stop" +#~ msgstr "" +#~ "" + +#~ msgid "" +#~ "\"Start" +#~ msgstr "" +#~ "\"全部开始\"" + +#~ msgid "Torrent file {0} does not exist" +#~ msgstr "种子文件{0}不存在" + +#~ msgid "Copying torrent to {0}" +#~ msgstr "正在复制种子到{0}" + +#~ msgid "from {0}" +#~ msgstr "来源{0}" + +#~ msgid "" +#~ "" +#~ 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 "Directory to store torrents and data" +#~ msgstr "种子及被做种文件的保存位置。" + +#~ msgid "" +#~ "\"File\" " +#~ msgstr "" +#~ "\"文件\" " + +#~ msgid "" +#~ "\"FileSize\"Size" +#~ msgstr "" +#~ "\"文件大小\"大小" + +#~ msgid "" +#~ "Status" +#~ msgstr "" +#~ "状态" + #~ 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 b9d294b32..000000000 --- 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 f50fadd3e..56ca6f30b 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" > @@ -36,27 +37,47 @@ - + + + + + + + + + + + + + + + + + + + + + - + - + - - - + + + @@ -70,19 +91,40 @@ - - - + + - + + + + + + + + + + + + + + + + + + + + + + + @@ -110,6 +152,7 @@ @@ -141,6 +184,55 @@ splitindex="true" windowtitle="I2PTunnel" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/i2ptunnel/java/bundle-messages.bat b/apps/i2ptunnel/java/bundle-messages.bat deleted file mode 100644 index 90feca972..000000000 --- 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 236b0ad01..74bbc573e 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 75a276aa0..293703ac9 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 70265a154..1014a986b 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 d4efaa8ea..d44f5539a 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"+ - "503 Service Unavailable<title></head>\n"+ + "<html><head><title>503 Service Unavailable\n"+ "

503 Service Unavailable

\n" + "

This I2P eepsite is unavailable. It may be down or undergoing maintenance.

\n" + "") @@ -94,28 +98,24 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { InputStream in = socket.getInputStream(); StringBuilder command = new StringBuilder(128); - Properties headers = readHeaders(in, command, + Map> 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> 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> 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 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> headers, String key, String value) { + List entry = headers.get(key); + if(entry == null) { + headers.put(key, entry = new ArrayList()); + } + entry.add(value); + } + + /** + * Remove the other matching entries and set this entry as the only one. + */ + private static void setEntry(Map> headers, String key, String value) { + List entry = headers.get(key); + if(entry == null) { + headers.put(key, entry = new ArrayList()); + } + 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> headers, String key) { + List 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> readHeaders(InputStream in, StringBuilder command, String[] skipHeaders, I2PAppContext ctx) throws IOException { + HashMap> headers = new HashMap>(); 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 d5b3dda65..6bfbdedd1 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 5427130bc..babdba976 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 618b035f7..f1e9f7108 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 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 84e66cf72..a19763678 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 2184b434f..63f119bca 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 978707889..eb36a64bc 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 msgs = doSave(); return getMessages(msgs); } - private List doSave() { - _group.saveConfig(); - return _group.clearAllMessages(); + + private List doSave() { + List 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 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 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 000000000..8cd7cf322 --- /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> 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> 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> 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 2da356e9c..e35f23c0f 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 <%@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)) { - %><% + %><% } else { - %><% + %><% } } 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)) { - %><% + %><% } else { - %><% + %><% } } %> diff --git a/apps/i2ptunnel/jsp/editClient.jsp b/apps/i2ptunnel/jsp/editClient.jsp index cabfb2946..b95452b12 100644 --- a/apps/i2ptunnel/jsp/editClient.jsp +++ b/apps/i2ptunnel/jsp/editClient.jsp @@ -400,7 +400,7 @@ - + <%=intl._("(if known)")%> @@ -465,7 +465,7 @@
- +

diff --git a/apps/i2ptunnel/jsp/editServer.jsp b/apps/i2ptunnel/jsp/editServer.jsp index 4f45b8667..45e96f73d 100644 --- a/apps/i2ptunnel/jsp/editServer.jsp +++ b/apps/i2ptunnel/jsp/editServer.jsp @@ -186,9 +186,9 @@ - + <% if (!"".equals(editBean.getDestinationBase64(curTunnel))) { %> - <%=intl._("Add to local addressbook")%> + <%=intl._("Add to local addressbook")%> <% } %>
@@ -334,13 +334,13 @@ - +
- + <%=intl._("(Tunnel must be stopped first)")%>
@@ -365,7 +365,7 @@ - +
@@ -374,7 +374,7 @@
- +
@@ -405,7 +405,7 @@
- +
@@ -453,7 +453,6 @@
class="tickbox" /> -
@@ -465,13 +464,12 @@ - +
class="tickbox" /> -
class="tickbox" /> -
- + <%=intl._("(Tunnel must be stopped first)")%>
diff --git a/apps/i2ptunnel/jsp/index.jsp b/apps/i2ptunnel/jsp/index.jsp index faf904de0..9b4149195 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 -<%@page pageEncoding="UTF-8"%> -<%@page contentType="text/html" import="net.i2p.i2ptunnel.web.IndexBean"%> + +%><%@page pageEncoding="UTF-8" +%><%@page contentType="text/html" import="net.i2p.i2ptunnel.web.IndexBean" +%> @@ -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(""); - out.write(intl._("Hort not set")); + out.write(intl._("Host not set")); out.write(""); } 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 000000000..b67ac63e2 --- /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 , 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 \n" +"Language-Team: duck \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 here. To visit the conflicting addresshelper destination, click here." +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 d253333ae..d9f49c3ad 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 \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 \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 here. To visit the conflicting addresshelper destination, click here." msgstr "Um das Ziel in Ihrer Host-Datenbank zu besuchen, klicken Sie hier, und um das Ziel aus der kollidierenden Adresshelfer-Anfrage zu besuchen, hier!" -#: ../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 000000000..8cfb64f10 --- /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 , 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 \n" +"Language-Team: duck \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 here. To visit the conflicting addresshelper destination, click here." +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 000000000..ce7098182 --- /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 , 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 \n" +"Language-Team: Spanish (Castilian) \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 here. To visit the conflicting addresshelper destination, click here." +msgstr "Para visitar el destino en la base de datos de hosts, haga clic aquí . Para visitar el destino del ayudante de direcciones en conflicto, haga clic aquí ." + +#: ../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 000000000..d35ca8152 --- /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 , 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 \n" +"Language-Team: duck \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 here. To visit the conflicting addresshelper destination, click here." +msgstr "Pour aller à la destination de votre base de données d''hôtes, cliquez here. Pour aller à la destination de l''aide d''adresse en conflit, cliquez ici." + +#: ../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 90e5be16b..e54963955 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 \n" -"Language-Team: duck , monkeybrains \n" +"POT-Creation-Date: 2011-03-03 18:29+0000\n" +"PO-Revision-Date: 2011-02-20 12:14+0000\n" +"Last-Translator: ducki2p \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 here. To visit the conflicting addresshelper destination, click here." +"a>. To visit the conflicting addresshelper destination, click here." msgstr "" -"Om de destination in je host database te bezoeken, klik hier. Om de conflicterende adreshelper destination te bezoeken, klik " -"hier." +"Om de destination in je host database te bezoeken, klik hier. Om de conflicterende adreshelper destination te bezoeken, " +"klik hier." -#: ../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" +msgstr "Verminder tunnel aantal in ruststand" -#: ../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 "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:450 -msgid "(Restrict to these clients only)" -msgstr "(Beperkt tot slechts deze clients)" +#: ../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:466 +#: ../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:459 +msgid "Per hour" +msgstr "Per uur" + +#: ../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 718e82e9f..d9075fa84 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 \n" "Language-Team: foo \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 here. To visit the conflicting addresshelper destination, click here." msgstr "Для перехода по ссылке из локальной адресной книги, нажмите здесь. Для перехода по новой addresshelper-ссылке, нажмите здесь." -#: ../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:466 +#: ../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 "Максимум одновременных соединений (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 f6efbfd3b..e08390836 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 , 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 \n" -"Language-Team: foo \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 here. To visit the conflicting addresshelper destination, click here." -msgstr "" -"域名冲突:要访问您本地【地址簿】中设置的目标主机(相当与IP),请点击这里。要访问【地址助手】返回的目标主机请点这里。" - -#: ../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 , 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 \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 here. To visit the conflicting addresshelper destination, click here." +msgstr "" +"域名冲突:要访问您本地【地址簿】中设置的目标主机(相当与IP),请点击这里。要访问【地址助手】返回的目标主机请点这里。" + +#: ../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 a45f9df62..a4ba71e07 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" > - + + + + + + + + + + + + + + + + + + + + + + + + + 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 5515df226..d1a57159b 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 c22676d26..8fcd2d517 100644 --- a/apps/ministreaming/java/build.xml +++ b/apps/ministreaming/java/build.xml @@ -24,13 +24,40 @@ - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 39249b449..38d96ddb7 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 834c52160..d68270bc6 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 02bef1a0a..1651d40d2 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 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 fb2589b52..e0a5b022f 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 listSockets() { Set sockets = new HashSet(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 b9d294b32..000000000 --- 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 d544e59ac..dc686d29c 100644 --- a/apps/routerconsole/java/build.xml +++ b/apps/routerconsole/java/build.xml @@ -24,6 +24,7 @@ + @@ -45,6 +46,7 @@ @@ -54,45 +56,74 @@ + - + + + + + + + + + + + + + + + + + + - + + + + + - - - + + + - + - + - - - + + + - - + + + + + + + + @@ -103,19 +134,43 @@ - - - + + - + + + + + + + + + + + + + + + + + + + - + + + + + + + + @@ -161,6 +216,7 @@ + @@ -180,6 +236,7 @@ @@ -191,6 +248,7 @@ + @@ -213,14 +271,14 @@ - + 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(""); 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 4ce5c5b99..352df72ee 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 9388d06d2..6dd3aa987 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 ec5337cc5..249f5de59 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 ce4dc8863..7b1d7bc62 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 d3579f17c..419725ee4 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: cannot be inside a + buf.append("\n"); + int cur = 1; + Set clients = _context.clientManager().listClients(); + for (Destination dest : clients) { + buf.append("\n"); + cur++; + } + buf.append("
\n"); TunnelPoolSettings exploratoryIn = _context.tunnelManager().getInboundSettings(); TunnelPoolSettings exploratoryOut = _context.tunnelManager().getOutboundSettings(); - buf.append(""); 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(""); - 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("\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("\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 845bb66a0..cf9a17140 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 8a525180b..47f9eb242 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 2e03ad93f..10b587db6 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("\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 f9fe7377c..b56108be3 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 71089ce73..2f16cd359 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 _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("

"); + buf.append("

"); if (!_errors.isEmpty()) { - buf.append(""); + buf.append("
"); buf.append(render(_errors)); - buf.append(""); + buf.append("
"); } if (!_notices.isEmpty()) { - buf.append(""); + buf.append("
"); buf.append(render(_notices)); - buf.append(""); + buf.append("
"); } - buf.append("

"); + buf.append("
"); 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 8ceec1098..2bee07833 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 3ccd355c2..f4c42a23b 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("
    "); - buf.append("\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("\n"); } - buf.append("
\n"); + buf.append("\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 7bd167a56..15ec90154 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("

Total Leasesets: " + leases.size()); - buf.append("

Published (RAP) Leasesets: " + _context.netDb().getKnownLeaseSets()); - buf.append("

Mod Data: " + HexDump.dump(_context.routingKeyGenerator().getModData()) + "

"); - buf.append("

Network data (only valid if floodfill):"); - buf.append("

Center of Key Space (router hash): " + ourRKey.toBase64() + "

"); + buf.append("

Published (RAP) Leasesets: " + _context.netDb().getKnownLeaseSets()); + buf.append("

Mod Data: " + HexDump.dump(_context.routingKeyGenerator().getModData())); + buf.append("

Network data (only valid if floodfill):"); + buf.append("

Center of Key Space (router hash): " + ourRKey.toBase64()); if (median != null) { double log2 = biLog2(median); - buf.append("

Median distance (bits): " + fmt.format(log2)); + buf.append("

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

Estimated total floodfills: " + total); - buf.append("

Estimated network total leasesets: " + (total * leases.size() / 8)); + buf.append("

Estimated total floodfills: " + total); + buf.append("

Estimated network total leasesets: " + (total * leases.size() / 8)); } + buf.append("

"); } out.write(buf.toString()); out.flush(); @@ -262,7 +262,9 @@ public class NetDbRenderer { } } - buf.append("

").append(_("Network Database Router Statistics")).append("
"); + buf.append("
") + .append(_("Network Database Router Statistics")) + .append("
"); // versions table List versionList = new ArrayList(versions.objects()); if (!versionList.isEmpty()) { @@ -276,7 +278,7 @@ public class NetDbRenderer { } buf.append("
\n"); } - buf.append("
"); + buf.append(""); out.write(buf.toString()); buf.setLength(0); @@ -291,7 +293,7 @@ public class NetDbRenderer { } } buf.append("
\n"); - buf.append("
"); + buf.append(""); out.write(buf.toString()); buf.setLength(0); @@ -343,9 +345,9 @@ public class NetDbRenderer { } else { buf.append("" + _("Peer info for") + ": ").append(hash).append("\n"); if (full) { - buf.append("[Back]
\n"); + buf.append("[Back]
\n"); } else { - buf.append("[").append(_("Full entry")).append("]
\n"); + buf.append("[").append(_("Full entry")).append("]
\n"); } } @@ -391,9 +393,8 @@ public class NetDbRenderer { buf.append(DataHelper.stripHTML(key)).append(" = ").append(DataHelper.stripHTML(val)).append("
\n"); } buf.append("
\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 adb238077..562c3e7ca 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 9e0a0c951..d1835a320 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 59d729ae7..884a20bb5 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(""); 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("" + _("Plugin signature verification of {0} failed", url) + ""); 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("" + _("Plugin signature verification of {0} failed", url) + ""); 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("" + _("Plugin signature verification of {0} failed", url) + ""); 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 f452df2ba..d83720d07 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("

").append(_("Peer Profiles")).append("

\n

"); - 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("").append(_("Hiding {0} standard profiles.", standard)).append("\n"); + buf.append("").append(ngettext("Hiding 1 standard profile.", "Hiding {0} standard profiles.", standard)).append("\n"); buf.append("

"); buf.append(""); buf.append(""); @@ -171,8 +171,10 @@ class ProfileOrganizerRenderer { buf.append(' ').append(fails).append('/').append(total).append(' ').append(_("Test Fails")); } buf.append(" "); - buf.append("\n"); buf.append(""); // let's not build the whole page in memory (~500 bytes per peer) @@ -213,7 +215,6 @@ class ProfileOrganizerRenderer { buf.append(""); else buf.append(""); - buf.append(""); buf.append(""); long time; time = now - prof.getLastHeardAbout(); @@ -261,7 +262,7 @@ class ProfileOrganizerRenderer { buf.append("
  • ").append(_("capacity")).append(": ").append(_("how many tunnels can we ask them to join in an hour?")).append("
  • "); buf.append("
  • ").append(_("integration")).append(": ").append(_("how many new peers have they told us about lately?")).append("
  • "); buf.append("
  • ").append(_("status")).append(": ").append(_("is the peer banned, or unreachable, or failing tunnel tests?")).append("
  • "); - buf.append(""); + buf.append(""); 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 d3b6ecc29..be46bdca0 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 12c667872..967981130 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 entries = new TreeMap(new HashComparator()); entries.putAll(_context.shitlist().getEntries()); + if (entries.isEmpty()) { + buf.append("").append(_("none")).append(""); + out.write(buf.toString()); + return; + } buf.append("
      "); 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 2b7e81fb4..6cfc7bdcf 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 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 6b6a8b616..cd39b4a25 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("

    \n"); } + out.write(""); out.flush(); } @@ -140,7 +141,7 @@ public class StatsGenerator { buf.append("
  • ").append(_("Lifetime average frequency")).append(": "); 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(")

  • \n"); } @@ -167,7 +168,7 @@ public class StatsGenerator { buf.append("
  • "); renderPeriod(buf, periods[i], _("rate")); if (curRate.getLastEventCount() > 0) { - buf.append(_("Average")).append(": "); + 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(" ").append(_("No events")).append(" "); } @@ -230,7 +231,7 @@ public class StatsGenerator { buf.append("
  • ").append(_("Lifetime average value")).append(": "); 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(")
  • " + "" + "
    \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 55c7b009c..e21102c7f 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("

    \n"); + buf.append("\n"); buf.append("\n"); if (_helper.updateAvailable()) { buf.append("\n"); + // Note to translators: parameter is a version, e.g. "0.8.4" + .append(_("Download {0} Update", _helper.getUpdateVersion())) + .append("
    \n"); } if (_helper.unsignedUpdateAvailable()) { buf.append("\n"); + // Note to translators: parameter is a date and time, e.g. "02-Mar 20:34 UTC" + //
    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
    + .append(_("Download Unsigned
    Update {0}", _helper.getUnsignedUpdateVersion())) + .append("
    \n"); } buf.append("\n"); } @@ -251,10 +247,9 @@ public class SummaryBarRenderer { - buf.append("

    ") - .append(ConfigRestartBean.renderStatus(_helper.getRequestURI(), _helper.getAction(), _helper.getConsoleNonce())) + buf.append(ConfigRestartBean.renderStatus(_helper.getRequestURI(), _helper.getAction(), _helper.getConsoleNonce())) - .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 7783bf811..e1c1b8d26 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("

    - + diff --git a/apps/routerconsole/jsp/configpeer.jsp b/apps/routerconsole/jsp/configpeer.jsp index 188ca56d4..f3a7097e6 100644 --- a/apps/routerconsole/jsp/configpeer.jsp +++ b/apps/routerconsole/jsp/configpeer.jsp @@ -29,10 +29,7 @@ %>
    - <% 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()+""); %> - " /> + " > diff --git a/apps/routerconsole/jsp/configreseed.jsp b/apps/routerconsole/jsp/configreseed.jsp index 593e410d3..87707444a 100644 --- a/apps/routerconsole/jsp/configreseed.jsp +++ b/apps/routerconsole/jsp/configreseed.jsp @@ -23,10 +23,7 @@
    -<% 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()+""); %> -" > +" >

    <%=intl._("Reseeding Configuration")%>

    <%=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 f87479a92..21990fc0f 100644 --- a/apps/routerconsole/jsp/configservice.jsp +++ b/apps/routerconsole/jsp/configservice.jsp @@ -19,10 +19,7 @@

    - <% 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()+""); %> - " > + " >

    <%=intl._("Shutdown the router")%>

    <%=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.")%>

    @@ -49,7 +46,8 @@
    " > " > -

    <%=intl._("Run on startup")%>

    +
    +

    <%=intl._("Run on startup")%>

    <%=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 ")%> install_i2p_service_winnt.bat (<%=intl._("or")%> uninstall_i2p_service_winnt.bat).

    diff --git a/apps/routerconsole/jsp/configstats.jsp b/apps/routerconsole/jsp/configstats.jsp index fde10837d..d522f56d8 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) " />
    - <% 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()+""); %> - " > + " >

    <%=intl._("Configure I2P Stat Collection")%>

    <%=intl._("Enable full stats?")%> checked="true" <% } %> > (<%=intl._("change requires restart to take effect")%>)
    <%=intl._("Stat file")%>:
    -<%=intl._("Filter")%>: (<%=intl._("toggle all")%>)

    +<%=intl._("Filter")%>: (<%=intl._("toggle all")%>)

    -

    ").append(_("profile")).append(""); + //buf.append("").append(_("profile")).append(""); + buf.append("").append(_("profile")).append(""); buf.append(" +-
    ").append(DataHelper.stripHTML(info.getCapabilities())).append(" ").append(num(prof.getIntegrationValue())).append(""); - 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 8fcbd65c0..5a52ee883 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 174704ba6..423b9e52a 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 74f1bf465..df605ba1d 100644 --- a/apps/routerconsole/jsp/config.jsp +++ b/apps/routerconsole/jsp/config.jsp @@ -22,10 +22,7 @@
    - <% 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()+""); %> - " > + " >

    <%=intl._("Bandwidth limiter")%>

    <%=intl._("I2P will work best if you configure your rates to match the speed of your internet connection.")%> @@ -168,7 +165,7 @@ > <%=intl._("Specify Port")%>: " >
    -

    <%=intl._("Note")%>: <%=intl._("Changing these settings will restart your router.")%>

    +

    <%=intl._("Notes")%>: <%=intl._("a) Do not reveal your port numbers to anyone! b) Changing these settings will restart your router.")%>


    " > " > diff --git a/apps/routerconsole/jsp/configadvanced.jsp b/apps/routerconsole/jsp/configadvanced.jsp index a327c0290..9acfd65ec 100644 --- a/apps/routerconsole/jsp/configadvanced.jsp +++ b/apps/routerconsole/jsp/configadvanced.jsp @@ -25,10 +25,7 @@
    - <% 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()+""); %> - " > + " >

    <%=intl._("Advanced I2P Configuration")%>



    diff --git a/apps/routerconsole/jsp/configclients.jsp b/apps/routerconsole/jsp/configclients.jsp index ec34b1079..9d74d4990 100644 --- a/apps/routerconsole/jsp/configclients.jsp +++ b/apps/routerconsole/jsp/configclients.jsp @@ -27,18 +27,17 @@ button span.hide{ " /> -
    - <% 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()+""); %> - " > - <% /* set hidden default */ %> - +
    +<% + String pageNonce = formhandler.getNewNonce(); +%>

    <%=intl._("Client Configuration")%>

    <%=intl._("The Java clients listed below are started by the router and run in the same JVM.")%>

    -

    -

    <%=intl._("To change other client options, edit the file")%> + + + +

    <%=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.")%>


    @@ -47,9 +46,12 @@ button span.hide{ " /> <% } %> " /> -
    +
    -

    <%=intl._("Advanced Client Interface Configuration")%>

    +

    <%=intl._("Advanced Client Interface Configuration")%>

    +
    + +

    <%=intl._("External I2CP (I2P Client Protocol) Interface Configuration")%>
    > <%=intl._("Enabled without SSL")%>
    @@ -89,32 +91,41 @@ button span.hide{


    " /> " /> -
    +

    <%=intl._("WebApp Configuration")%>

    <%=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).")%>

    <%=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.")%> -

    +

    +
    + -

    - <%=intl._("All changes require restart to take effect.")%> +

    <%=intl._("All changes require restart to take effect.")%>


    " /> -
    +
    + <% if (clientshelper.showPlugins()) { %>

    <%=intl._("Plugin Configuration")%>

    <%=intl._("The plugins listed below are started by the webConsole client.")%> -

    +

    +
    + -


    +
    " /> -

    <%=intl._("Plugin Installation")%>

    +

    + +

    <%=intl._("Plugin Installation")%>

    <%=intl._("To install a plugin, enter the download URL:")%> -

    +

    +
    + +


    " /> -
    +
    <% } %> -
    + diff --git a/apps/routerconsole/jsp/configkeyring.jsp b/apps/routerconsole/jsp/configkeyring.jsp index 7438f5580..9188f56df 100644 --- a/apps/routerconsole/jsp/configkeyring.jsp +++ b/apps/routerconsole/jsp/configkeyring.jsp @@ -27,10 +27,7 @@

    - <% 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()+""); %> - " > + " >

    <%=intl._("Manual Keyring Addition")%>

    <%=intl._("Enter keys for encrypted remote destinations here.")%> <%=intl._("Keys for local destinations must be entered on the")%> <%=intl._("I2PTunnel page")%>. diff --git a/apps/routerconsole/jsp/configlogging.jsp b/apps/routerconsole/jsp/configlogging.jsp index c87fd367d..4c5904a90 100644 --- a/apps/routerconsole/jsp/configlogging.jsp +++ b/apps/routerconsole/jsp/configlogging.jsp @@ -21,10 +21,7 @@

    - <% 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()+""); %> - " > + " >

    <%=intl._("Configure I2P Logging Options")%>

    @@ -41,7 +38,7 @@
    <%=intl._("('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' = millisecond)")%>
    <%=intl._("Max log file size")%>:" >
    " >
    <%=intl._("Default log level")%>:
    <%=intl._("(DEBUG and INFO are not recommended defaults, as they will drastically slow down your router)")%>
    +
    <% while (statshelper.hasMoreStats()) { while (statshelper.groupRequired()) { %> - @@ -96,11 +97,11 @@ function toggleAll(category) } // end iterating over required groups for the current stat %> <% @@ -113,4 +114,4 @@ function toggleAll(category) " > " > -
    + > <%=statshelper.getCurrentGroupName()%> - (<%=intl._("toggle all")%>) + (<%=intl._("toggle all")%>)
    <%=intl._("Log")%>
    - checked="true" <% } %> > <% if (statshelper.getCurrentCanBeGraphed()) { %> - checked="true" <% } %> ><% } %> <%=statshelper.getCurrentStatName()%>:
    <%=statshelper.getCurrentStatDescription()%>

    + diff --git a/apps/routerconsole/jsp/configtunnels.jsp b/apps/routerconsole/jsp/configtunnels.jsp index 1c1393280..15c266d8c 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.")%>
    - <% 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()+""); %> - " > + " > <%=intl._("Note")%>: <%=intl._("Exploratory tunnel setting changes are stored in the router.config file.")%> @@ -44,4 +41,4 @@ " > " >
    -

    + diff --git a/apps/routerconsole/jsp/configui.jsp b/apps/routerconsole/jsp/configui.jsp index 9f3d32e4f..e67b11340 100644 --- a/apps/routerconsole/jsp/configui.jsp +++ b/apps/routerconsole/jsp/configui.jsp @@ -24,10 +24,16 @@

    <%=uihelper._("Router Console Theme")%>

    - <% 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()+""); %> - " > +<% + /** 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); + } +%> + + " > <% String userAgent = request.getHeader("User-Agent"); diff --git a/apps/routerconsole/jsp/configupdate.jsp b/apps/routerconsole/jsp/configupdate.jsp index 47b8b9310..4b1bf4bc6 100644 --- a/apps/routerconsole/jsp/configupdate.jsp +++ b/apps/routerconsole/jsp/configupdate.jsp @@ -23,10 +23,7 @@
    - <% 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()+""); %> - " > + " > <% /* set hidden default */ %>

    <%=intl._("Check for I2P and news updates")%>

    diff --git a/apps/routerconsole/jsp/css.jsi b/apps/routerconsole/jsp/css.jsi index 613b32a67..8e133a127 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 @@ " /> <% - intl.setLang(request.getParameter("lang")); + String conNonceParam = request.getParameter("consoleNonce"); + if (conNonceParam != null && conNonceParam.equals(System.getProperty("router.consoleNonce"))) { + intl.setLang(request.getParameter("lang")); + } %> console.css" rel="stylesheet" type="text/css"> <% diff --git a/apps/routerconsole/jsp/dumpprofile.jsp b/apps/routerconsole/jsp/dumpprofile.jsp index dfdcc0b6e..af6c8de74 100644 --- a/apps/routerconsole/jsp/dumpprofile.jsp +++ b/apps/routerconsole/jsp/dumpprofile.jsp @@ -1,5 +1,6 @@ <%@page contentType="text/plain" %>" +/>" +/>" /><% helper.storeWriter(out); %> diff --git a/apps/routerconsole/jsp/flags.jsp b/apps/routerconsole/jsp/flags.jsp index c736e8b46..7148782e3 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 636e8800d..d166532de 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. -[Enable graphing]. +First enable all stats to [Enable graphing].
  • Fast: 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 profiles page. @@ -56,7 +56,7 @@ range 8-30. Your fast peers are shown on the 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 profiles page. -[Enable graphing]. +First enable all stats to [Enable graphing].
  • Well Integrated: 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 000000000..b1a4c6f92 --- /dev/null +++ b/apps/routerconsole/jsp/help_ar.jsp @@ -0,0 +1,177 @@ +<%@page contentType="text/html"%> +<%@page pageEncoding="UTF-8"%> + +<% + /* + * Do not tag this file for translation - copy it to help_xx.jsp and translate inline. + */ +%> +I2P مساعدة لوحة التحكم +<%@include file="css.jsi" %> + +<%@include file="summary.jsi" %> +

    I2P مساعدة لوحة التحكم

    +

    +اذا رغبت في المساعدة أو ترجمة الوثائق، أو المساعدة في أشياء أخرى، انظر اسفله + +تطوع +

    المزيد من المساعدة هنا: +

    diff --git a/apps/routerconsole/jsp/help_fr.jsp b/apps/routerconsole/jsp/help_fr.jsp new file mode 100644 index 000000000..cd3c3df9d --- /dev/null +++ b/apps/routerconsole/jsp/help_fr.jsp @@ -0,0 +1,160 @@ +<%@page contentType="text/html"%> +<%@page pageEncoding="UTF-8"%> + +<% + /* + * Do not tag this file for translation - copy it to help_xx.jsp and translate inline. + */ +%> +Console du routeur I2P - Aide +<%@include file="css.jsi" %> + +<%@include file="summary.jsi" %> +Traduction de mars 2011 (magma@mail.i2p) +

    Aide et assistance du routeur I2P

    +

    +Si vous souhaitez améliorer ou traduire la documentation ou d'autres versants du projet, merci de vous reporter à +la page consacrée aux volontaires. +

    D'autres détails sont disponibles ici: +

    +
    Il y a aussi le forum I2P +et l'IRC.

    + +

    Informations du panneau de surveillance

    +Plusieurs des statistiques affichées dans le panneau de surveillance peuvent être +configurées pour être affichées sous forme de graphiques pour +analyse sur la durée. +

    GÉNÉRAL

      +
    • Identité locale: +Cliquez sur "Afficher" pour voir l'empreinte Base64 à 44 caractères (256 bits) de votre routeur. Le hachage +complet est affiché sur votre page d'infos routeur. Ne la divulguez jamais à personne, +car l'info routeur contient votre adresse IP. +
    • Version: +La version d'I2P qui vous affiche actuellement cette page. +
    • Lancé depuis: +Indique depuis combien de temps le routeur tourne. +
    • Réseau: +Statut de joignabilité du routeur par les autres routeurs. +Plus d'infos sur la page de configuration. +

    Pairs

      +
    • Actifs: +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. +[Activer le graphique] (activer auparavant "toutes +les statistiques"). +
    • Rapides: +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 profils. +[Activer le graphique]. +
    • Hautes capacités: +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 profils. +[Activer le graphique] (activer auparavant "toutes les +statistiques"). +
    • Bien intégrés: +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 +profils. +
    • Connus: c'est tous les routeurs dont vous connaissez l'existance. Il sont listés sur la +page base de données du réseau. 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. +

    Bande passante entrée/sortie

    +Ç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 configuration. +Le graphique de bande passante est activé par défaut.
    + +

    Destinations locales

    +C'est le nom I2P des applications qui se connectent par votre routeur. Elles peuvent être des clients lancés depuis +I2PTunnel ou des programmes tiers qui se connectent via SAM, BOB ou directement à +I2CP. +

    TUNNELS:

    +Les tunnels actuels sont affichés sur la page tunnels.
      +
    • Exploratoires: 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.
      +
    • Clients: tunnels créés par votre routeur pour chaque utilisation cliente. +
    • Participants: 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 +configuration. Vous pouvez également limiter ce nombre en définissant la variable +router.maxParticipatingTunnels=nnn dans la configuration avancée. +[Activer le graphique]. +
    • Rapport de partage: 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. +
    + +

    ENCOMBREMENT

    +Indications de base sur la charge du routeur:
      +
    • Retard de tâches: temps d'attente des tâches avant exécution. La file d'attente est +présentée la pages des tâches. 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. +[Activer le graphique]. +
    • Retard de messages: 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. [Activer le graphique] +(transport.sendProcessingTime). +
    • Retard de tunnels: 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. +[Activer le graphique] (tunnel.testSuccessTime). +
    • En attente: 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. +
    • Accepte/Refuse: 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.
    + +

    Informations légales

    Le routeur I2P (router.jar) et le SDK (i2p.jar) sont presque entièrement dans le +domaine public, à quelques notobles exceptions près:

      +
    • Le code ElGamal et DSA, sous licence BSD, écrits par TheCrypto
    • +
    • SHA256 et HMAC-SHA256, sous licence MIT, écrits par the Legion of the Bouncycastle
    • +
    • Le code AES, sous licence Cryptix (MIT), écrit pas l'équipe the Cryptix
    • +
    • Le code SNTP, sous licence BSD, écrit par Adam Buckley
    • +
    • Le reste, directement issu du domaine public, est écrit par jrandom, mihi, hypercubus, oOo, + ugha, duck, shendaras, et d'autres.
    • +
    + +

    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 Jetty (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/).

    + +

    Une autre application visible sur cette page: I2PTunnel +(votre interface web) 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 +susimail disponible dans la console, qui est sous +licence GPL et écrit par susi23. L'application carnet d'adresses, écrite par +Ragnarok gère votre fichier hosts.txt (voir ./addressbook/ pour plus de détails).

    + +

    Le routeur inclu aussi par défaut le pont SAM du domaine public de l'humanité, +que les autres applications clientes (comme le portage bittorrent) 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 GMP, adaptée à diverses architectures +PC. Les lanceurs pour Windows sont faits avec Launch4J, et l'installeur +avec IzPack. Les détails sur les autres applications disponibles comme sur +leurs licences respectives, référez-vous à notre politique de licences. +Les sources du code I2P et de la plupart des applications jointes est sur notre page de +téléchargements. +.

    + +

    Historique des évolutions

    + + <% java.io.File fpath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getBaseDir(), "history.txt"); %> + + + + + +

    Historique complet +


    diff --git a/apps/routerconsole/jsp/index.jsp b/apps/routerconsole/jsp/index.jsp index 6f29573e6..5aeeeea98 100644 --- a/apps/routerconsole/jsp/index.jsp +++ b/apps/routerconsole/jsp/index.jsp @@ -7,9 +7,11 @@ <%=intl.title("home")%> <% -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" %>

    <%=intl._("I2P Router Console")%>

    @@ -26,10 +28,25 @@ if (System.getProperty("router.consoleNonce") == null) {

  • +
    +
    + English + عربية + 中文 + Deutsch + Français + Español + Português + Nederlands + Русский + Svenska +
    + +

    <%=intl._("Welcome to I2P")%>

    +
    <% fpath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getBaseDir(), "docs/readme.html"); %> - " /> " />
    diff --git a/apps/routerconsole/jsp/logs.jsp b/apps/routerconsole/jsp/logs.jsp index da33b9179..c2cbd2f71 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.")%>

    <%=intl._("Please include this information in bug reports")%>:

    -I2P version:
    +I2P version: <%=net.i2p.router.RouterVersion.FULL_VERSION%>
    Java version: <%=System.getProperty("java.vendor")%> <%=System.getProperty("java.version")%> (<%=System.getProperty("java.runtime.name")%> <%=System.getProperty("java.runtime.version")%>)
    Platform: <%=System.getProperty("os.name")%> <%=System.getProperty("os.arch")%> <%=System.getProperty("os.version")%>
    Processor: <%=net.i2p.util.NativeBigInteger.cpuModel()%> (<%=net.i2p.util.NativeBigInteger.cpuType()%>)
    diff --git a/apps/routerconsole/jsp/summary.jsi b/apps/routerconsole/jsp/summary.jsi index 5a81e7af3..46cb366fe 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 %>

    <% - // 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("\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("
    \n"); @@ -34,6 +48,8 @@ out.print(intl._("Enable")); out.print("\n"); out.print("
    \n"); + } else { + out.print("\n"); } %> diff --git a/apps/routerconsole/jsp/summaryframe.jsp b/apps/routerconsole/jsp/summaryframe.jsp index 4b8d6b69e..d0eb8b72a 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(": \n"); out.print("\n"); } else { // this will load in the iframe but subsequent pages will not have the iframe out.print("\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("\n"); } - out.print("\n"); + out.print("\n"); } %> diff --git a/apps/routerconsole/jsp/viewhistory.jsp b/apps/routerconsole/jsp/viewhistory.jsp index 14ee0bbff..aa3ce4d54 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 000000000..36897d4a9 --- /dev/null +++ b/apps/routerconsole/jsp/viewprofile.jsp @@ -0,0 +1,30 @@ +<%@page contentType="text/html"%> +<%@page pageEncoding="UTF-8"%> + + + +<%@include file="css.jsi" %> +<%=intl.title("Peer Profile")%> + +<%@include file="summary.jsi" %> +

    <%=intl._("Peer Profile")%>

    +
    +<% + 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 +%> + +" /> + +<% stathelper.storeWriter(out); %> +

    <%=intl._("Profile for peer {0}", peerB64)%>

    +
    +
    +
    +<% + } +%> +
    diff --git a/apps/routerconsole/jsp/viewtheme.jsp b/apps/routerconsole/jsp/viewtheme.jsp index 723b0ec32..ce1a6fe38 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 000000000..f66b0cd2c --- /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 , 2009. +# Ahmed Mansour , 2011. +# hamada , 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 \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("
    \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("
    \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 Graphs Page" +msgstr " لقد تم تحديث الرسم البياني، يستغرق فترة تصل الى 60s أن تنعكس هنا، وعلىصفحة الرسوم البيانية" + +#. 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("InboundOutbound\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("" + "Plugin contains an invalid key" + ' ' + pubkey + ' ' + signer + ""); +#: ../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(" avg interval between updates: (").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 not private." +msgstr "انها غير خاصة." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:561 +msgid "Also, do not enter a private IP address 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 logs 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 wrapper.log." +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 config clients page 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 logs and if nothing helps, read the FAQ about reseeding manually." +#~ msgstr "" +#~ "تحقق من logs and if nothing " +#~ "helps، read the FAQ 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 4c323cd8e..074daa5aa 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 \n" "Language-Team: echelon , Sperreingang \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 logs and if nothing helps, read the FAQ about reseeding manually." -msgstr "Stellen Sie bitte sicher, dass nichts ausgehenden HTTP-Transfer blockiert, überprüfen Sie die Berichte, und wenn gar nichts hilft, lesen Sie die FAQ ü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("
    \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("
    \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("InboundOutbound\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("" + "Plugin contains an invalid key" + ' ' + pubkey + ' ' + signer + ""); -#: ../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(" avg interval between updates: (").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 "in this period which ended {0} ago." -msgstr "innerhalb dieser Periode, welche vor {0} endete." +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:204 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:203 +#, java-format +msgid "The period ended {0} ago." +msgstr "Die Zeitspanne endete vor {0}." + +#: ../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" +#.
    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
    #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:240 -msgid "Download Unsigned" -msgstr "unsignierte Aktualisierung herunterladen" +#, java-format +msgid "Download Unsigned
    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 not private." msgstr "Sie sind nicht geheim." -#: ../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, do not enter a private IP address like 127.0.0.1 or 192.168.1.1." msgstr "" "Geben Sie auch keine IP-Adresse für den privaten Gebrauch 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 logs may also help diagnose the problem." msgstr "" "Wenn ein Fehler auftritt, können die Berichte 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 -msgid "Advanced Client Interface Configuration" -msgstr "Erweiterte I2P-Einstellungen" - -#: ../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 "" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:351 -msgid "Enabled with SSL required" -msgstr "" - #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:357 -msgid "Disabled - Clients outside this Java process may not connect" -msgstr "" +msgid "Advanced Client Interface Configuration" +msgstr "Erweiterte Einstellungen des Klienten-Interfaces" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:359 -msgid "I2CP Port" -msgstr "" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:361 +msgid "External I2CP (I2P Client Protocol) Interface Configuration" +msgstr "Eintellungen des externen I2CP-Interfaces (I2P-Klienten-Protokoll)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:363 -#, fuzzy -msgid "I2CP Interface" -msgstr "Einstellungen" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:367 +msgid "Enabled without SSL" +msgstr "Aktiviert; ohne SSL" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:373 +msgid "Enabled with SSL required" +msgstr "Aktiviert, SSL erforderlich" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:379 -#, fuzzy -msgid "Authorization" -msgstr "Autor" +msgid "Disabled - Clients outside this Java process may not connect" +msgstr "Deaktiviert - Klienten außerhalb dieses Javaprozesses können sich nicht verbinden" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:381 +msgid "I2CP Port" +msgstr "I2CP-Port" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:385 -msgid "Requre username and password" -msgstr "" +msgid "I2CP Interface" +msgstr "I2CP-Interface" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:387 -#, fuzzy -msgid "Username" -msgstr "Surinam" - -#: ../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:401 +msgid "Authorization" +msgstr "Autorisation" #: ../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:409 +msgid "Username" +msgstr "Benutzername" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:413 +msgid "Password" +msgstr "Passwort" + +#: ../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 hier vorgenommenen Änderungen müssen auch in den externen Klienten vorgenommen werden." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:421 +msgid "Many clients do not support SSL or authorization." +msgstr "Vielle Klienten unterstützen kein SSL und/oder keine Authentifikation." + +#: ../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 wrapper.log." 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 wrapper.log Datei!" -#: ../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 config clients page to start it." msgstr "Bitte besuchen Sie die Klienten-Konfigurations Seite, 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
    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 logs and if nothing helps, read the FAQ about reseeding manually." +#~ msgstr "" +#~ "Stellen Sie bitte sicher, dass nichts ausgehenden HTTP-Transfer " +#~ "blockiert, überprüfen Sie die Berichte, und wenn gar nichts hilft, lesen Sie die FAQ ü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!" #~ 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 000000000..3da36a223 --- /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 , 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 \n" +"Language-Team: duck \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("
    \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("
    \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 Graphs Page" +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("InboundOutbound\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("" + "Plugin contains an invalid key" + ' ' + pubkey + ' ' + signer + ""); +#: ../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(" avg interval between updates: (").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" +#.
    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
    +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:240 +#, java-format +msgid "Download Unsigned
    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 not private." +msgstr "" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:579 +msgid "" +"Also, do not enter a private IP address 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 logs 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 wrapper.log." +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 config clients page 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 77de2b2d4..21a79717d 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 \n" -"Language-Team: foo \n" +"Language-Team: Spanish (Castilian) \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 logs and if nothing helps, read the FAQ 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:519 +msgid "Your transport connection limits are automatically set based on your configured bandwidth." +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:521 -msgid "Your transport connection limits are automatically set based on your configured bandwidth." -msgstr "" +msgid "To override these limits, add the settings i2np.ntcp.maxConnections=nnn and i2np.udp.maxConnections=nnn on the advanced configuration page." +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:523 -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:525 -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:257 +#: ../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:532 +msgid "We offered to introduce them (help other peers traverse their firewall)" +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:533 +msgid "How long since a packet has been received / sent" +msgstr "Cuánto tiempo hace que un paquete ha sido recibido / enviado" + +#: ../../../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 "inactivo" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:534 -msgid "We offered to introduce them (help other peers traverse their firewall)" -msgstr "" - -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535 -msgid "How long since a packet has been received / sent" -msgstr "" - -#: ../../../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 -msgid "Idle" -msgstr "" - -#: ../../../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/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: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 "Subida" + +#: ../../../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 "Desincronización" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536 +msgid "The difference between the peer's clock and your own" +msgstr "La diferencia entre el reloj del par y el tuyo" #: ../../../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 -msgid "Up" -msgstr "" +msgid "The congestion window, which is how many bytes can be sent without an acknowledgement" +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:538 -#: ../../../router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java:740 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1908 -msgid "Skew" -msgstr "" - -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538 -msgid "The difference between the peer's clock and your own" -msgstr "" +msgid "The number of sent messages awaiting acknowledgement" +msgstr "El número de mensajes enviados a la espera de confirmación" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539 -msgid "The congestion window, which is how many bytes can be sent without an acknowledgement" -msgstr "" +msgid "The maximum number of concurrent messages to send" +msgstr "El número máximo de mensajes simultáneos para enviar" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:540 -msgid "The number of sent messages awaiting acknowledgement" -msgstr "" +msgid "The number of pending sends which exceed congestion window" +msgstr "El número de envíos pendientes que superen el rango de congestión" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541 -msgid "The maximum number of concurrent messages to send" -msgstr "" +msgid "The slow start threshold" +msgstr "El umbral de incicio lento" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:542 -msgid "The number of pending sends which exceed congestion window" -msgstr "" +msgid "The round trip time in milliseconds" +msgstr "El tiempo de ida y vuelta en milisegundos" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543 -msgid "The slow start threshold" -msgstr "" +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1917 +msgid "Dev" +msgstr "Dev" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543 +msgid "The standard deviation of the round trip time in milliseconds" +msgstr "La desviación estándar del tiempo de ida y vuelta en milisegundos" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544 -msgid "The round trip time in milliseconds" -msgstr "" +msgid "The retransmit timeout in milliseconds" +msgstr "El tiempo de vencimiento de la retransmisión en milisegundos" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1918 -msgid "Dev" -msgstr "" - -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545 -msgid "The standard deviation of the round trip time in milliseconds" -msgstr "" +msgid "Current maximum send packet size / estimated maximum receive packet size (bytes)" +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:546 -msgid "The retransmit timeout in milliseconds" -msgstr "" +#: ../../../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:546 +msgid "The total number of packets sent to the peer" +msgstr "El número total de paquetes enviados al par" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547 -msgid "Current maximum send packet size / estimated maximum receive packet size (bytes)" -msgstr "" - -#: ../../../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 -msgid "TX" -msgstr "" - -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548 -msgid "The total number of packets sent to the peer" -msgstr "" - -#: ../../../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/udp/UDPTransport.java:1926 msgid "RX" -msgstr "" +msgstr "RX" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:547 +msgid "The total number of packets received from the peer" +msgstr "El número total de paquetes recibidos del par" + +#: ../../../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 "TX dup" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548 +msgid "The total number of packets retransmitted to the peer" +msgstr "El número total de paquetes retransmitidos al par" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:549 -msgid "The total number of packets received from the peer" -msgstr "" - -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:550 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1930 -msgid "Dup TX" -msgstr "" - -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:550 -msgid "The total number of packets retransmitted to the peer" -msgstr "" - -#: ../../../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/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("
    \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("
    \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 -msgid "Stop" -msgstr "" - #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:260 +msgid "Stop" +msgstr "Detener" + +#: ../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" + +#: ../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 "" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:381 +msgid "View console on startup" +msgstr "Mostrar consola al iniciar" + +#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:93 +msgid "Console is to be shown on startup" +msgstr "La consola se mostrará al iniciar" + +#: ../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 "No mostrar consola al iniciar" #: ../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 -msgid "View console on startup" -msgstr "" - -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:117 -msgid "Console is to be shown on startup" -msgstr "" - -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:118 -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:365 -msgid "Do not view console on startup" -msgstr "" - -#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:120 msgid "Console is not to be shown on startup" -msgstr "" +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 Graphs Page" -msgstr "" +msgstr "Lista del gráfico actualizada, puede tardar hasta 60s en reflejarse aquí y en la Página de Gráficos" -#. 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:69 -msgid "ANONYMITY WARNING - Settings include 0-hop tunnels." -msgstr "" +#: ../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:74 +msgid "ANONYMITY WARNING - Settings include 0-hop tunnels." +msgstr "ADVERTENCIA DE ANONIMATO - Los ajustes incluyen túneles de 0 saltos." + +#: ../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("InboundOutbound\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 -msgid "Our info" -msgstr "" - #: ../java/src/net/i2p/router/web/NetDbRenderer.java:344 +msgid "Our info" +msgstr "Nuestra información" + +#: ../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("" + "Plugin contains an invalid key" + ' ' + pubkey + ' ' + signer + ""); -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:200 +#. updateStatus("" + "Plugin contains an invalid key" + ' ' + pubkey + ' ' +#. + signer + ""); +#: ../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 "" - -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:281 -msgid "Downloaded plugin is for new installs only, but the plugin is already installed" -msgstr "" +msgstr "Este complemento requiere la versión {0} o superior de Java." #: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:293 +msgid "Downloaded plugin is for new installs only, but the plugin is already installed" +msgstr "El complemento descargado es sólo para instalaciones nuevas, pero el complemento ya está instalado." + +#: ../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 "" - -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:382 -#, java-format -msgid "Plugin {0} installed but failed to start, check logs" -msgstr "" - -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:384 -#, java-format -msgid "Plugin {0} installed but failed to start" -msgstr "" +msgstr "Complemento {0} instalado e iniciado" #: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:394 #, java-format +msgid "Plugin {0} installed but failed to start, check logs" +msgstr "Complemento {0} instalado pero no funciona, ¡revisa los registros!" + +#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:396 +#, java-format +msgid "Plugin {0} installed but failed to start" +msgstr "Complemento {0} instalado, pero no se pudo iniciar." + +#: ../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 -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 "" +msgid "Last Heard About" +msgstr "sabido por última vez sobre" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:193 -msgid "Last Bad Send" -msgstr "" +msgid "Last Heard From" +msgstr "sabido por última vez de" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:194 -msgid "10m Resp. Time" -msgstr "" +msgid "Last Good Send" +msgstr "Último Enviado Correctamente" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:195 -msgid "1h Resp. Time" -msgstr "" +msgid "Last Bad Send" +msgstr "Último Enviado con Errores" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:196 -msgid "1d Resp. Time" -msgstr "" +msgid "10m Resp. Time" +msgstr "Tiempo resp. 10m" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:197 -msgid "Last Good Lookup" -msgstr "" +msgid "1h Resp. Time" +msgstr "Tiempo resp. 1h" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:198 -msgid "Last Bad Lookup" -msgstr "" +msgid "1d Resp. Time" +msgstr "Tiempo resp. 1d" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:199 -msgid "Last Good Store" -msgstr "" +msgid "Last Good Lookup" +msgstr "Última Buena Búsqueda" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:200 -msgid "Last Bad Store" -msgstr "" +msgid "Last Bad Lookup" +msgstr "Última Mala Búsqueda" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:201 -msgid "1h Fail Rate" -msgstr "" +msgid "Last Good Store" +msgstr "Última Buena Guardada" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:202 +msgid "Last Bad Store" +msgstr "Última Mala Guardada" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:203 +msgid "1h Fail Rate" +msgstr "Tasa de error de 1h" + +#: ../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(" avg interval between updates: (").append(num(curFreq.getAverageInterval())).append("ms, min "); +#. buf.append(" avg interval between updates: +#. (").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: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 evento" +msgstr[1] "{0} eventos" + +#: ../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" +#.
    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
    #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:240 -msgid "Download Unsigned" -msgstr "Descargar de forma no authentificada" +#, java-format +msgid "Download Unsigned
    Update {0}" +msgstr "Descargar actualización
    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 "" +msgstr "configuración de red" -#. 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: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 "" +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: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 "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 -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 "" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:403 -msgid "Ignore local interface IP address" -msgstr "" - -#: ../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:409 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:479 -msgid "Specify hostname or IP" -msgstr "" +msgid "Externally reachable hostname or IP address" +msgstr "Nombre de host o dirección IP accesible externamente" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:413 +msgid "Use all auto-detect methods" +msgstr "Utilizar todos los métodos de detección automática" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:417 -msgid "Select Interface" -msgstr "Elige interfaz" +msgid "Disable UPnP IP address detection" +msgstr "Desactivar detección de direcciones IP por UPnP" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:431 -msgid "Hidden mode - do not publish IP" -msgstr "Modo oculto - no se publica el IP" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:421 +msgid "Ignore local interface IP address" +msgstr "Ingonrar la dirección IP de la interfaz local" -#: ../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:425 +msgid "Use SSU IP address detection only" +msgstr "Utilizar detección de direcciones IP sólo por SSU" + +#: ../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 "Especificar nombre de host o IP" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:435 +msgid "Select Interface" +msgstr "Elegir interfaz" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:449 +msgid "Hidden mode - do not publish IP" +msgstr "Modo oculto - no publicar IP" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:451 +msgid "(prevents participating traffic)" +msgstr "(Evita el tráfico de participantes)" + +#: ../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 "" - -#: ../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 "" +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:555 -msgid "UPnP may be enabled or disabled above, but a change requires a router restart to take effect." -msgstr "" +msgid "UPnP is used to communicate with Internet Gateway Devices (IGDs) to detect the external IP address and forward ports." +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:557 -msgid "Hostnames entered above will be published in the network database." -msgstr "" +msgid "UPnP support is beta, and may not work for any number of reasons" +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:559 -msgid "They are not private." -msgstr "" +msgid "No UPnP-compatible device present" +msgstr "No se encuentra ningún dispositivo compatible con UPnP presente" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:561 -msgid "Also, do not enter a private IP address like 127.0.0.1 or 192.168.1.1." -msgstr "" +msgid "UPnP disabled on the device" +msgstr "UPnP desactivado en el dispositivo" #: ../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 "" +msgid "Software firewall interference with UPnP" +msgstr "Un cortafuegos de software interfiere con UPnP" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:565 -msgid "When in doubt, leave the settings at the defaults." -msgstr "" +msgid "Bugs in the device's UPnP implementation" +msgstr "Errores en la implementación de UPnP del dispositivo" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:567 -msgid "Reachability Help" -msgstr "" +msgid "Multiple firewall/routers in the internet connection path" +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: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:569 +msgid "UPnP device change, reset, or address change" +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:571 +msgid "Review the UPnP status here." +msgstr "Revisar el estado de UPnP aquí." + +#: ../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 "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:575 -msgid "If there is an error, the logs may also help diagnose the problem." -msgstr "" +msgid "Hostnames entered above will be published in the network database." +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:577 +msgid "They are not private." +msgstr "No son privados." #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:579 -msgid "Your UDP port does not appear to be firewalled." -msgstr "" +msgid "Also, do not enter a private IP address like 127.0.0.1 or 192.168.1.1." +msgstr "Además, no se debe introducir una dirección IP privada como 127.0.0.1 o 192.168.1.1." + +#: ../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 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:583 -msgid "Your UDP port appears to be firewalled." -msgstr "" +msgid "When in doubt, leave the settings at the defaults." +msgstr "En caso de duda, deje los ajustes con los valores predeterminados." #: ../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 "" +msgid "Reachability Help" +msgstr "Ayuda de Accesibilidad" -#: ../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: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 "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: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 "" +msgid "If there is an error, the logs may also help diagnose the problem." +msgstr "Si hay un error, el registro también puede ayudar a diagnosticar el problema." -#: ../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:597 +msgid "Your UDP port does not appear to be firewalled." +msgstr "El puerto UDP no parece estar bloqueado por un cortafuegos." -#: ../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:601 +msgid "Your UDP port appears to be firewalled." +msgstr "El puerto UDP parece estar bloqueado por un cortafuegos." #: ../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 "" +msgid "As the firewall detection methods are not 100% reliable, this may occasionally be displayed in error." +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:605 -msgid "WARN - Firewalled and Fast" -msgstr "" +msgid "However, if it appears consistently, you should check whether both your external and internal firewalls are open for your port." +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:607 -msgid "You have configured I2P to share more than 128KBps of bandwidth, but you are firewalled." -msgstr "" +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 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: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 "" +msgid "However, you will get more participating traffic and help the network more if you can open your firewall(s)." +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:611 -msgid "WARN - Firewalled and Floodfill" -msgstr "" +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 "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: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 "" +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 "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: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 "" +msgid "The router is currently testing whether your UDP port is firewalled." +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: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 "" +msgid "The router is not configured to publish its address, therefore it does not expect incoming connections." +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:623 -msgid "Please open your firewall or disable inbound TCP above." -msgstr "" +msgid "WARN - Firewalled and Fast" +msgstr "AVISO - Bloqueado por cortafuegos y rápido" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:625 -msgid "WARN - Firewalled with UDP Disabled" -msgstr "" +msgid "You have configured I2P to share more than 128KBps of bandwidth, but you are firewalled." +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:627 -msgid "You have configured inbound TCP, however you have disabled UDP." -msgstr "" +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 "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:629 -msgid "You appear to be firewalled on TCP, therefore your router cannot accept inbound connections." -msgstr "" +msgid "WARN - Firewalled and Floodfill" +msgstr "AVISO - Bloqueado por cortafuegos y Floodfill" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:631 -msgid "Please open your firewall or enable UDP." -msgstr "" +msgid "You have configured I2P to be a floodfill router, but you are firewalled." +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:633 -msgid "ERR - Clock Skew" -msgstr "" +msgid "For best participation as a floodfill router, you should open your firewall." +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:635 -msgid "Your system's clock is skewed, which will make it difficult to participate in the network." -msgstr "" +msgid "WARN - Firewalled with Inbound TCP Enabled" +msgstr "AVISO - Bloqueado por cortafuegos con TCP entrante activado" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:637 -msgid "Correct your clock setting if this error persists." -msgstr "" +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 "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:639 -msgid "ERR - Private TCP Address" -msgstr "" +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 "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: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 "" +msgid "Please open your firewall or disable inbound TCP above." +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:643 -msgid "Correct the address or disable inbound TCP above." -msgstr "" +msgid "WARN - Firewalled with UDP Disabled" +msgstr "AVISO - Bloqueado por cortafuegos con UDP deshabilitado" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:645 -msgid "ERR - SymmetricNAT" -msgstr "" +msgid "You have configured inbound TCP, however you have disabled UDP." +msgstr "Has configurado TCP entrante, sin embargo has deshabilitado UDP." #: ../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 "" +msgid "You appear to be firewalled on TCP, therefore your router cannot accept inbound connections." +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: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 "" +msgid "Please open your firewall or enable UDP." +msgstr "Por favor, ¡abre el cortafuegos o habilita UDP!" #: ../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 "" +msgid "ERR - Clock Skew" +msgstr "ERR - desviación de reloj" #: ../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 "" +msgid "Your system's clock is skewed, which will make it difficult to participate in the network." +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: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 "" +msgid "Correct your clock setting if this error persists." +msgstr "Corrija su ajuste del reloj, si este error persiste." #: ../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 "" +msgid "ERR - Private TCP Address" +msgstr "ERR - Dirección TCP privada" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:659 -msgid "However, a restart is always required after this error." -msgstr "" +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 "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:661 -msgid "ERR - UDP Disabled and Inbound TCP host/port not set" -msgstr "" +msgid "Correct the address or disable inbound TCP above." +msgstr "Corrija la dirección o desactive TCP entrante arriba." #: ../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 "" +msgid "ERR - SymmetricNAT" +msgstr "ERR - NAT Simétrico" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:665 -msgid "Therefore your router cannot accept inbound connections." -msgstr "" +msgid "I2P detected that you are firewalled by a Symmetric NAT." +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:667 -msgid "Please configure a TCP host and port above or enable UDP." -msgstr "" +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 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:669 -msgid "ERR - Client Manager I2CP Error - check logs" -msgstr "" +msgid "ERR - UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart" +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:671 -msgid "This is usually due to a port 7654 conflict. Check the logs to verify." -msgstr "" +msgid "I2P was unable to bind to port 8887 or other configured port." +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:673 -msgid "Do you have another I2P instance running? Stop the conflicting program and restart I2P." -msgstr "" +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 "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/configadvanced_jsp.java:107 +#: ../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 "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:677 +msgid "However, a restart is always required after this error." +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:679 +msgid "ERR - UDP Disabled and Inbound TCP host/port not set" +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:681 +msgid "You have not configured inbound TCP with a hostname and port above, however you have disabled UDP." +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:683 +msgid "Therefore your router cannot accept inbound connections." +msgstr "Por lo tanto el router no puede aceptar conexiones entrantes." + +#: ../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 "Por favor, configure un host y puerto TCP arriba o permita UDP." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:687 +msgid "ERR - Client Manager I2CP Error - check logs" +msgstr "ERR - Error Client Manager I2CP - verificar los registros" + +#: ../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 "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:691 +msgid "Do you have another I2P instance running? Stop the conflicting program and restart I2P." +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: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 "" - -#: ../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 -#, fuzzy -msgid "Advanced Client Interface Configuration" -msgstr "Guardar la configuración de clientes" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:339 -msgid "External I2CP (I2P Client Protocol) Interface Configuration" -msgstr "" +msgstr "Para cambiar otras opciones clientes, edita el archivo" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:345 -msgid "Enabled without SSL" -msgstr "" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:351 -msgid "Enabled with SSL required" -msgstr "" +#: ../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 "Todos los cambios requieren reiniciar para que surtan efecto." #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:357 -msgid "Disabled - Clients outside this Java process may not connect" -msgstr "" +msgid "Advanced Client Interface Configuration" +msgstr "Configuración avanzada de la interfaz del cliente" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:359 -msgid "I2CP Port" -msgstr "" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:361 +msgid "External I2CP (I2P Client Protocol) Interface Configuration" +msgstr "Configuración de la interfaz I2CP Exterior (I2P Protocolo de clientes)" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:363 -#, fuzzy -msgid "I2CP Interface" -msgstr "Configuración" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:367 +msgid "Enabled without SSL" +msgstr "Habilitado sin SSL" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:373 +msgid "Enabled with SSL required" +msgstr "Habilitado con SSL obligatorio" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:379 -#, fuzzy -msgid "Authorization" -msgstr "Autor" +msgid "Disabled - Clients outside this Java process may not connect" +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:381 +msgid "I2CP Port" +msgstr "Puerto I2CP" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:385 -msgid "Requre username and password" -msgstr "" +msgid "I2CP Interface" +msgstr "Interfaz I2CP" -#: ../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:401 +msgid "Authorization" +msgstr "Autorización" #: ../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:409 +msgid "Username" +msgstr "Nombre de usuario" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:413 +msgid "Password" +msgstr "Contraseña" + +#: ../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 "Cualquier cambio realizado aquí también debe configurarse en el cliente externo." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:421 +msgid "Many clients do not support SSL or authorization." +msgstr "Muchos clientes no soportan SSL o autorización." + +#: ../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 -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 "" - #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:317 +msgid "The router keyring is used to decrypt encrypted leaseSets." +msgstr "El llavero del router se utiliza para descifrar leaseSets encriptados." + +#: ../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 "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:326 +msgid "Manual Keyring Addition" +msgstr "Adición manual al Llavero" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:328 +msgid "Enter keys for encrypted remote destinations here." +msgstr "Introduzca las claves de cifrado para destinos remotos aquí." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:331 +msgid "Keys for local destinations must be entered on the" +msgstr "Las claves para los destinos locales deben introducirse en la" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:333 +msgid "I2PTunnel page" +msgstr "Página de túnelesI2P" + +#: ../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" - -#: ../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 "Hash del Enrutador" - -#: ../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 "" +msgstr "Configuración de los pares I2P" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:323 -msgid "Adjust Profile Bonuses" -msgstr "" +msgid "Manual Peer Controls" +msgstr "Controles Manuales de pares" #: ../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 "" +msgid "Router Hash" +msgstr "Hash del Router" -#: ../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:329 +msgid "Manually Ban / Unban a Peer" +msgstr "Banear / Desbanear manualmente a un par" + +#: ../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 "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:341 +msgid "Adjust Profile Bonuses" +msgstr "Ajustar Perfil de Bonus" + +#: ../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 "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: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/configservice_jsp.java:106 +#: ../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/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 -msgid "Shutdown the router" -msgstr "Apagar el enrutador" - -#: ../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 "" +msgid "Shutdown the router" +msgstr "Apagar el router" #: ../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 "" +msgid "Graceful shutdown lets the router satisfy the agreements it has already made before shutting down, but may take a few minutes." +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:315 -msgid "Systray integration" -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 "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: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 "" +msgid "If you want the router to restart itself after shutting down, you can choose one of the following." +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:319 -msgid "(later on, I2P client applications will be able to integrate their own functionality into the system tray as well)." -msgstr "" +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 "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: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 "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:323 +msgid "After tearing down the router, it will wait 1 minute before starting back up again." +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:333 +msgid "Systray integration" +msgstr "integración con la bandeja del sistema" + +#: ../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 "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:337 +msgid "(later on, I2P client applications will be able to integrate their own functionality into the system tray as well)." +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: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:327 -msgid "Run on startup" -msgstr "Lanzar al iniciar el enrutador" - -#: ../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 "" +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:341 -msgid "If you are running I2P as service right now, removing it will shut down your router immediately." -msgstr "" +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 "You may want to consider shutting down gracefully, as above, then running uninstall_i2p_service_winnt.bat." -msgstr "" +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" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:347 -msgid "Debugging" -msgstr "" +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 "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:349 +msgid "If you prefer the command line, you can also run the " +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:359 +msgid "If you are running I2P as service right now, removing it will shut down your router immediately." +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:361 +msgid "You may want to consider shutting down gracefully, as above, then running uninstall_i2p_service_winnt.bat." +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:365 +msgid "Debugging" +msgstr "Debugging" + +#: ../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 wrapper.log." -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 wrapper.log ." -#: ../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 "" - -#: ../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 "" +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:338 +msgid "High CPU and/or high outbound bandwidth usage may result." +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:341 +msgid "Change these settings with care, and adjust them if you have problems." +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:351 +msgid "Exploratory tunnel setting changes are stored in the router.config file." +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:354 +msgid "Client tunnel changes are temporary and are not saved." +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: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 "" +msgstr "Registros del Router I2P" -#: ../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 "" - -#: ../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 config clients page to start it." -msgstr "" +msgstr "Por favor visita la página de configuración de clientes 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" -#~ 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:111 +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:248 +msgid "Peer Profile" +msgstr "Perfil de pares" + +#: ../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 1d0ae74ea..e5a733652 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 \n" -"Language-Team: foo \n" +"POT-Creation-Date: 2011-05-18 10:29+0000\n" +"PO-Revision-Date: 2011-05-18 13:35+0100\n" +"Last-Translator: magma \n" +"Language-Team: I2P Project \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 logs and if nothing helps, read the FAQ 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 +#: ../../../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:148 +msgid "Reseed failed." +msgstr "Échec de réamorçage" + +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:149 +#, java-format +msgid "See {0} for help." +msgstr "Voir {0} pour l''aide." + +#: ../../../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:293 msgid "Reseeding: fetching seed URL." -msgstr "" +msgstr "Réamorçage: collecte des URL sources." -#: ../../../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:178 -msgid "Last reseed failed fully (no routerInfo URLs at seed URL)." -msgstr "" - -#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:191 +#: ../../../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 "Réamorçage: collecte routerInfo depuis l''URL source ({0} réussie, {1} erreurs)." -#: ../../../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:217 -#, java-format -msgid "Last reseed failed ({0}% of {1})." -msgstr "" - -#: ../../../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/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 -msgid "The remote peer, identified by router hash" -msgstr "" - -#: ../../../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 -msgid "Dir" -msgstr "" - -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:522 -#, fuzzy -msgid "Inbound connection" -msgstr "Options Entrants" - #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:524 -#, fuzzy -msgid "Outbound connection" -msgstr "Options Sortants" +msgid "The remote peer, identified by router hash" +msgstr "Le pair distant, identifié par son hachage routeur" + +#: ../../../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 "Sens" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:526 -msgid "They offered to introduce us (help other peers traverse our firewall)" -msgstr "" +msgid "Inbound connection" +msgstr "Connexion entrante" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:528 -msgid "We offered to introduce them (help other peers traverse their firewall)" -msgstr "" - -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:529 -msgid "How long since a packet has been received / sent" -msgstr "" - -#: ../../../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 -msgid "Idle" -msgstr "" +msgid "Outbound connection" +msgstr "Connexion sortante" #: ../../../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 +msgid "They offered to introduce us (help other peers traverse our firewall)" +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:532 +msgid "We offered to introduce them (help other peers traverse their firewall)" +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:533 +msgid "How long since a packet has been received / sent" +msgstr "Temps écoulé depuis la dernière réception/émission d'un paquet " + +#: ../../../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 "En attente" + +#: ../../../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 -msgid "The smoothed inbound / outbound transfer rate (KBytes per second)" -msgstr "" - -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:531 -msgid "How long ago this connection was established" -msgstr "" - -#: ../../../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 -msgid "Up" -msgstr "" - -#: ../../../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 -msgid "Skew" -msgstr "" - -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:532 -msgid "The difference between the peer's clock and your own" -msgstr "" - -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:533 -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:534 -msgid "The number of sent messages awaiting acknowledgement" -msgstr "" +msgid "The smoothed inbound / outbound transfer rate (KBytes per second)" +msgstr "Taux de transfert entrant/sortant lissé (ko/s)" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:535 -msgid "The maximum number of concurrent messages to send" -msgstr "" +msgid "How long ago this connection was established" +msgstr "Depuis combien de temps cette connexion est établie" + +#: ../../../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 "En marche" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536 -msgid "The number of pending sends which exceed congestion window" -msgstr "" +#: ../../../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 "Dérive" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:536 +msgid "The difference between the peer's clock and your own" +msgstr "Écart de temps entre l'horloge du pair et la votre" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:537 -msgid "The slow start threshold" -msgstr "" +msgid "The congestion window, which is how many bytes can be sent without an acknowledgement" +msgstr "Fenêtre de congestion, en nombre d'octets transmissibles sans acquittement" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:538 -msgid "The round trip time in milliseconds" -msgstr "" +msgid "The number of sent messages awaiting acknowledgement" +msgstr "Nombre de messages en attente d'acquittement" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539 -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1915 -msgid "Dev" -msgstr "" - -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:539 -msgid "The standard deviation of the round trip time in milliseconds" -msgstr "" +msgid "The maximum number of concurrent messages to send" +msgstr "Nombre maximum de messages simultanés à envoyer" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:540 -msgid "The retransmit timeout in milliseconds" -msgstr "" +msgid "The number of pending sends which exceed congestion window" +msgstr "Nombre d'envois en attente qui débordent de la fenêtre de congestion" #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:541 +msgid "The slow start threshold" +msgstr "Seuil de démarrage lent" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:542 +msgid "The round trip time in milliseconds" +msgstr "Aller-retour en ms" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543 +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1917 +msgid "Dev" +msgstr "Deviat." + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:543 +msgid "The standard deviation of the round trip time in milliseconds" +msgstr "Dérive standard d'aller-retour en ms" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544 +msgid "The retransmit timeout in milliseconds" +msgstr "Délai de retransmission en millisecondes" + +#: ../../../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 -msgid "TX" -msgstr "" - -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:542 -msgid "The total number of packets sent to the peer" -msgstr "" - -#: ../../../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/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 "TX" + +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:546 +msgid "The total number of packets sent to the peer" +msgstr "Nombre de paquets envoyés au pair" + +#: ../../../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 -msgid "Dup TX" -msgstr "" - -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:544 -msgid "The total number of packets retransmitted to the peer" -msgstr "" - -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548 #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1929 -msgid "Dup RX" -msgstr "" +msgid "Dup TX" +msgstr "TX dupl." -#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:545 +#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:548 +msgid "The total number of packets retransmitted to the peer" +msgstr "Nombre de paquets retransmis au pair" + +#: ../../../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 "RX dupl." + +#: ../../../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("
    \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 -msgid "Sort by peer hash" -msgstr "" - #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1892 -msgid "Direction/Introduction" -msgstr "" +msgid "Sort by peer hash" +msgstr "Tri par hachage de pair" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1894 -msgid "Sort by idle inbound" -msgstr "" +msgid "Direction/Introduction" +msgstr "Direction/Introduction" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1896 -msgid "Sort by idle outbound" -msgstr "" +msgid "Sort by idle inbound" +msgstr "Tri par entrant inactif" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1899 -msgid "Sort by inbound rate" -msgstr "" +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1898 +msgid "Sort by idle outbound" +msgstr "Tri par sortant inactif" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1901 -msgid "Sort by outbound rate" -msgstr "" +msgid "Sort by inbound rate" +msgstr "Tri par taux entrant" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1904 -msgid "Sort by connection uptime" -msgstr "" +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1903 +msgid "Sort by outbound rate" +msgstr "Tri par taux sortant" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1906 -msgid "Sort by clock skew" -msgstr "" +msgid "Sort by connection uptime" +msgstr "Tri par durée de connexion" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1909 -msgid "Sort by congestion window" -msgstr "" +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1908 +msgid "Sort by clock skew" +msgstr "Tri par décalage d'horloge" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1911 -msgid "Sort by slow start threshold" -msgstr "" +msgid "Sort by congestion window" +msgstr "Tri par fenêtre de congestion" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1914 -msgid "Sort by round trip time" -msgstr "" +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1913 +msgid "Sort by slow start threshold" +msgstr "Tri par seuil de démarrage lent" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1916 -msgid "Sort by round trip time deviation" -msgstr "" +msgid "Sort by round trip time" +msgstr "Tri par durée d'aller-retour" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1918 -msgid "Sort by retransmission timeout" -msgstr "" +msgid "Sort by round trip time deviation" +msgstr "Tri par dérive de durée d'aller-retour" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1921 -msgid "Sort by outbound maximum transmit unit" -msgstr "" +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1920 +msgid "Sort by retransmission timeout" +msgstr "Tri pas dépassement de durée de retransmission" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1923 -msgid "Sort by packets sent" -msgstr "" +msgid "Sort by outbound maximum transmit unit" +msgstr "Tri par MTU sortant" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1925 -msgid "Sort by packets received" -msgstr "" +msgid "Sort by packets sent" +msgstr "Tri par paquets envoyés" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1928 -msgid "Sort by packets retransmitted" -msgstr "" +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1927 +msgid "Sort by packets received" +msgstr "Tri par paquets reçus" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1930 -msgid "Sort by packets received more than once" -msgstr "" +msgid "Sort by packets retransmitted" +msgstr "Tri par paquets renvoyés" -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1951 -msgid "We offered to introduce them" -msgstr "" +#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1932 +msgid "Sort by packets received more than once" +msgstr "Tri par paquet reçus multiples" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1953 +msgid "We offered to introduce them" +msgstr "Propositions de présentation à" + +#: ../../../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 "" - -#: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1965 -msgid "1 fail" -msgstr "" +msgstr "Choqué" #: ../../../router/java/src/net/i2p/router/transport/udp/UDPTransport.java:1967 +msgid "1 fail" +msgstr "1 échec" + +#: ../../../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("
    \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 -#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:392 -#: ../java/src/net/i2p/router/web/SummaryHelper.java:379 -msgid "Client" -msgstr "Client" +msgid "Bad client index." +msgstr "Index client incorrect." -#: ../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: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 "Clients" + +#: ../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/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 "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: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 -msgid "License" -msgstr "" - -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:141 -msgid "Website" -msgstr "" - -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:146 -#, fuzzy -msgid "Update link" -msgstr "Méthode de mise à jour" - -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:194 -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 -msgid "Check for updates" -msgstr "Chercher des mises à jour" - -#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:197 -#: ../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" - #: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:202 +msgid "License" +msgstr "Licence" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:207 +msgid "Website" +msgstr "Site web" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:212 +msgid "Update link" +msgstr "Mise à jour du lien" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:260 +msgid "Stop" +msgstr "Arrêt" + +#: ../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 "Vérifier les mises à jour" + +#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:263 +#: ../java/src/net/i2p/router/web/ConfigNavHelper.java:18 +msgid "Update" +msgstr "Mise à jour" + +#: ../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 Graphs Page" -msgstr "" +msgstr "Liste des graphiques mise à jour. Peut nécessiter jusqu'à 60s pour être répercutée ici et la page des graphiques." #. 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:140 +msgid "Exploratory tunnel configuration saved successfully." +msgstr "Configuration des tunnels exploratoires sauvegardée avec succès." #: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:142 -msgid "Exploratory tunnel configuration saved successfully." -msgstr "Configuration du tunnel exploratoire a été sauvegardé avec succès." - -#: ../java/src/net/i2p/router/web/ConfigTunnelsHandler.java:144 #: ../java/src/net/i2p/router/web/ConfigUIHandler.java:36 msgid "Error saving the configuration (applied but not saved) - please see the error logs." -msgstr "" +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:69 -msgid "ANONYMITY WARNING - Settings include 0-hop tunnels." -msgstr "" +#: ../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:74 +msgid "ANONYMITY WARNING - Settings include 0-hop tunnels." +msgstr "AVERTISSEMENT d'ANONYMAT: les réglages incluent des tunnels à 0 saut!" + +#: ../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("InboundOutbound\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" +msgstr "Actualiser toutes les" -#: ../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" - -#: ../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:107 +msgid "View RouterInfo" +msgstr "Retour synthèse routeurs" #: ../java/src/net/i2p/router/web/NetDbRenderer.java:108 -msgid "View RouterInfo" -msgstr "" - -#: ../java/src/net/i2p/router/web/NetDbRenderer.java:109 -#, fuzzy 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 -msgid "Our info" -msgstr "Notre info" - #: ../java/src/net/i2p/router/web/NetDbRenderer.java:344 +msgid "Our info" +msgstr "Ce routeur" + +#: ../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("" + "Plugin contains an invalid key" + ' ' + pubkey + ' ' + signer + ""); -#: ../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 "" - -#: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:281 -msgid "Downloaded plugin is for new installs only, but the plugin is already installed" -msgstr "" +msgstr "Ce greffon nécessite Java version {0} ou plus récente" #: ../java/src/net/i2p/router/web/PluginUpdateHandler.java:293 +msgid "Downloaded plugin is for new installs only, but the plugin is already installed" +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: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" - -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:188 -#, fuzzy -msgid "Caps" -msgstr "graphes" - -#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:189 -#, fuzzy -msgid "Integ. Value" -msgstr "Intégré" +msgstr "Pairs diffuseurs et intégrés" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:190 -msgid "Last Heard About" -msgstr "" +msgid "Caps" +msgstr "Possib." #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:191 -msgid "Last Heard From" -msgstr "" +msgid "Integ. Value" +msgstr "Valeur intég." #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:192 -msgid "Last Good Send" -msgstr "" +msgid "Last Heard About" +msgstr "Signalé la dernière fois" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:193 -msgid "Last Bad Send" -msgstr "" +msgid "Last Heard From" +msgstr "Entendu depuis" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:194 -msgid "10m Resp. Time" -msgstr "" +msgid "Last Good Send" +msgstr "Dernier envoi OK" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:195 -msgid "1h Resp. Time" -msgstr "" +msgid "Last Bad Send" +msgstr "Dernier envoi KO" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:196 -msgid "1d Resp. Time" -msgstr "" +msgid "10m Resp. Time" +msgstr "Tps de rép.(10mn)" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:197 -msgid "Last Good Lookup" -msgstr "" +msgid "1h Resp. Time" +msgstr "Tps de rép. (1h)" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:198 -msgid "Last Bad Lookup" -msgstr "" +msgid "1d Resp. Time" +msgstr "Tps de rép.(1j)" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:199 -msgid "Last Good Store" -msgstr "" +msgid "Last Good Lookup" +msgstr "Dernière req. OK" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:200 -msgid "Last Bad Store" -msgstr "" +msgid "Last Bad Lookup" +msgstr "Dernière req. KO" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:201 -msgid "1h Fail Rate" -msgstr "" +msgid "Last Good Store" +msgstr "Dernier stk.OK" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:202 +msgid "Last Bad Store" +msgstr "Dernier stk.KO" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:203 +msgid "1h Fail Rate" +msgstr "Taux d'échec (1h)" + +#: ../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" - -#: ../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 "groupes" +msgstr "pairs bien intégrés" #: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259 +msgid "as determined by the profile organizer" +msgstr "tels que définis par le gestionnaire de profils" + +#: ../java/src/net/i2p/router/web/ProfileOrganizerRenderer.java:259 +msgid "groups" +msgstr "Groupes" + +#: ../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:57 +#: ../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: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(" avg interval between updates: (").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:168 -#, fuzzy -msgid "rate" -msgstr "Taux" - -#: ../java/src/net/i2p/router/web/StatsGenerator.java:170 -#, fuzzy -msgid "Average" -msgstr "Tracer les moyennes" - -#: ../java/src/net/i2p/router/web/StatsGenerator.java:173 -#, fuzzy -msgid "Highest average" -msgstr "Tracer les moyennes" - -#: ../java/src/net/i2p/router/web/StatsGenerator.java:202 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:144 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:234 #, java-format -msgid "in this period which ended {0} ago." -msgstr "" +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:204 -#, fuzzy +#: ../java/src/net/i2p/router/web/StatsGenerator.java:169 +msgid "rate" +msgstr "taux" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:171 +msgid "Average" +msgstr "moyenne" + +#: ../java/src/net/i2p/router/web/StatsGenerator.java:174 +msgid "Highest average" +msgstr "Plus haute moyenne" + +#: ../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] "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: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 -msgid "Your unique I2P router identity is" -msgstr "L'identité unique de votre routeur est" - #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:175 +msgid "Your unique I2P router identity is" +msgstr "L'identité unique de votre routeur commence par" + +#: ../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" +#.
    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
    +#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:240 +#, java-format +msgid "Download Unsigned
    Update {0}" +msgstr "Télécharger la version
    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 "" - -#: ../java/src/net/i2p/router/web/SummaryHelper.java:136 -msgid "ERR-No Active Peers, Check Network Connection and Firewall" -msgstr "" - -#: ../java/src/net/i2p/router/web/SummaryHelper.java:139 -msgid "ERR-UDP Disabled and Inbound TCP host/port not set" -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:141 +msgid "ERR-No Active Peers, Check Network Connection and Firewall" +msgstr "ERR-Pas de pair actif, vérifiez votre connexion réseau et votre pare-feu" + +#: ../java/src/net/i2p/router/web/SummaryHelper.java:144 +msgid "ERR-UDP Disabled and Inbound TCP host/port not set" +msgstr "ERR-UDP désactivé, mais port/hôte entrants TCP non renseignés" + +#: ../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 "" - -#: ../java/src/net/i2p/router/web/SummaryHelper.java:400 -msgid "Building tunnels" -msgstr "Création des tunnels en cours" +msgstr "Construction" #: ../java/src/net/i2p/router/web/SummaryHelper.java:405 -#, fuzzy -msgid "none" -msgstr "Connu" +msgid "Building tunnels" +msgstr "Création des tunnels en cours" #. 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" +msgstr "Mise à jour en cours" -#: ../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 +#. 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 "" - -#: ../java/src/net/i2p/router/web/UnsignedUpdateHandler.java:120 -#: ../java/src/net/i2p/router/web/UpdateHandler.java:218 -msgid "Click Shutdown and restart to install" -msgstr "" +msgstr "cliquez sur Redé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/UpdateHandler.java:291 +msgid "Click Shutdown and restart to install" +msgstr "Cliquez sur \"Arrêter\" puis \"Démarrer\" pour installer" + +#: ../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:209 -#, fuzzy +#: ../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: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: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:517 -msgid "Configuration Help" -msgstr "Aide avec 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 -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." - -#: ../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." -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." - -#: ../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 "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." - -#: ../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 "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." - #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:527 -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." +msgid "Notes" +msgstr "Remarques" + +#: ../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:536 -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." +msgid "Configuration Help" +msgstr "Aide à la configuration" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:538 -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 " +#: ../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 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:540 -msgid "No UPnP-compatible device present" -msgstr "Il n'y a pas d'appareil qui est compatible avec UPnP" +msgid "If you can, please poke a hole in your firewall to allow unsolicited UDP and TCP packets to reach you." +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:542 -msgid "UPnP disabled on the device" -msgstr "UPnP est desactivé sur l'appareil" +msgid "If you can't, I2P supports UPnP (Universal Plug and Play) and UDP hole punching with \"SSU introductions\" to relay traffic." +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:544 -msgid "Software firewall interference with UPnP" -msgstr "Il y a de l'intérference entre un pare-feu en software et UPnP" +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 "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:546 +msgid "Certain firewalls such as symmetric NATs may not work well with 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: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 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:557 +msgid "UPnP support is beta, and may not work for any number of reasons" +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:559 +msgid "No UPnP-compatible device present" +msgstr "Aucun appareil compatible UPnP détecté" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:561 +msgid "UPnP disabled on the device" +msgstr "UPnP est désactivé sur l'appareil" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:563 +msgid "Software firewall interference with UPnP" +msgstr "Interférence entre un pare-feu logiciel et UPnP" + +#: ../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 not private." msgstr "Ils ne sont pas privés." -#: ../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, do not enter a private IP address like 127.0.0.1 or 192.168.1.1." -msgstr "En plus, ne saisissez pas une adresse IP privée tel que 127.0.0.1 ou 192.168.1.1." +msgstr "De plus, ne saisissez pas une adresse IP privée 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 "" - -#: ../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 "" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:574 -msgid "If there is an error, the logs may also help diagnose the problem." -msgstr "" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:578 -msgid "Your UDP port does not appear to be firewalled." -msgstr "" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:582 -msgid "Your UDP port appears to be firewalled." -msgstr "" - -#: ../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." -msgstr "" - -#: ../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." -msgstr "" - -#: ../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 "" +msgstr "Aide sur la joignabilité" #: ../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 "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:593 +msgid "If there is an error, the logs may also help diagnose the problem." +msgstr "S'il y a une erreur, les historiques peuvent aider au diagnostic." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:597 +msgid "Your UDP port does not appear to be firewalled." +msgstr "Votre port UDP ne semble pas bloqué par un pare-feu." + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:601 +msgid "Your UDP port appears to be firewalled." +msgstr "Votre port UDP semble bloqué par un pare-feu." + +#: ../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 "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:605 +msgid "However, if it appears consistently, you should check whether both your external and internal firewalls are open for your port." +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: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 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: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:336 +#: ../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: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 "" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:299 -msgid "Configure I2P Logging Options" -msgstr "" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:301 -msgid "Logging filename" -msgstr "" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:305 -msgid "(the symbol '@' will be replaced during log rotation)" -msgstr "" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:307 -msgid "Log record format" -msgstr "" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:311 -msgid "(use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, 'm' = message)" -msgstr "(use 'd' = date, 'c' = classe, 't' = fil d'exécution, 'p' = priorité, 'm' = message)" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:313 -msgid "Log date format" -msgstr "" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:317 -msgid "('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' = millisecond)" -msgstr "('MM' = mois, 'dd' = jour, 'HH' = heure, 'mm' = minute, 'ss' = seconde, 'SSS' = milliseconde)" +msgstr "Configuration des historiques I2P" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:319 -msgid "Max log file size" -msgstr "" +msgid "Configure I2P Logging Options" +msgstr "Configuration des options d'historiques" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:323 -msgid "Default log level" -msgstr "" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:321 +msgid "Logging filename" +msgstr "Nom du fichier des historiques" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:325 +msgid "(the symbol '@' will be replaced during log rotation)" +msgstr "(le caractère \"@\" sera remplacé lors des rotations d'historiques)" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:327 -msgid "(DEBUG and INFO are not recommended defaults, as they will drastically slow down your router)" -msgstr "" +msgid "Log record format" +msgstr "Format des enregistrements d'historiques" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:329 -msgid "Log level overrides" -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 "(utilisez \"d\" = date, \"c\" = classe, \"t\" = tâche, \"p\" = priorité, \"m\" = message)" #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:333 -msgid "New override" -msgstr "" +msgid "Log date format" +msgstr "Format de date des historiques" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:106 +#: ../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)" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:339 +msgid "Max log file size" +msgstr "Taille max des fichiers d'historiques" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:343 +msgid "Default log level" +msgstr "Niveau d'historisation par défaut" + +#: ../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 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:349 +msgid "Log level overrides" +msgstr "Exceptions au niveau d'historisation" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:353 +msgid "New override" +msgstr "Nouvelle exception" + +#: ../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:324 +#: ../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: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" +msgstr "page des profils" -#: ../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: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/configservice_jsp.java:106 +#: ../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/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:326 +#: ../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: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:340 +#: ../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: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 wrapper.log." -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 service Wrapper." -#: ../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" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:309 -msgid "There is a fundamental tradeoff between anonymity and performance." -msgstr "" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:312 -msgid "Tunnels longer than 3 hops (for example 2 hops + 0-2 hops, 3 hops + 0-1 hops, 3 hops + 0-2 hops), or a high quantity + backup quantity, may severely reduce performance or reliability." -msgstr "" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:315 -msgid "High CPU and/or high outbound bandwidth usage may result." -msgstr "" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:318 -msgid "Change these settings with care, and adjust them if you have problems." -msgstr "" +msgstr "La configuration par défaut fonctionne pour la plupart des utilisateurs." #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:332 -msgid "Exploratory tunnel setting changes are stored in the router.config file." -msgstr "" +msgid "There is a fundamental tradeoff between anonymity and performance." +msgstr "Il y a une contradiction fondamentale entre anonymat et performances." #: ../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 "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:338 +msgid "High CPU and/or high outbound bandwidth usage may result." +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:341 +msgid "Change these settings with care, and adjust them if you have problems." +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:351 +msgid "Exploratory tunnel setting changes are stored in the router.config file." +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: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 -msgid "Page Not Found" -msgstr "Page introuvable" +#: ../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/error_jsp.java:243 -msgid "Sorry! You appear to be requesting a non-existent Router Console page or resource." -msgstr "" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:123 +msgid "Router Console" +msgstr "Console du routeur I2P" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:245 -msgid "Error 404" -msgstr "Erreur 404" +#: ../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/error_jsp.java:250 -msgid "not found" -msgstr "pas trouvé" +#: ../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." -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:106 -msgid "graphs" -msgstr "graphes" +#. 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/graphs_jsp.java:228 -msgid "I2P Performance Graphs" -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 "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/index_jsp.java:105 -msgid "home" -msgstr "" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:105 -msgid "job queue" -msgstr "queue des tâches" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:227 -msgid "I2P Router Job Queue" -msgstr "" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:105 -msgid "logs" -msgstr "fichier traces" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:227 -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 trac.i2p2.i2p." -msgstr "" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:233 +#: ../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/logs_jsp.java:274 -msgid "Critical Logs" -msgstr "" +#: ../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/logs_jsp.java:278 -#, fuzzy -msgid "Router Logs" -msgstr "Fichier traces du routeur I2P" +#: ../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/logs_jsp.java:284 -msgid "Service (Wrapper) Logs" -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 "Version d'I2P & environnement d'exécution" -#: ../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/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/netdb_jsp.java:227 -msgid "I2P Network Database Summary" -msgstr "" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:109 -#, fuzzy -msgid "WebApp Not Found" +#: ../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/nowebapp_jsp.java:231 -#, fuzzy +#: ../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 "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:266 +msgid "Error 404" +msgstr "Erreur 404" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:271 +msgid "not found" +msgstr "non trouvé" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:112 +msgid "graphs" +msgstr "graphiques" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:249 +msgid "I2P Performance Graphs" +msgstr "Graphiques de performances I2P" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:111 +msgid "home" +msgstr "accueil" + +#: ../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 "file d'attente" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:248 +msgid "I2P Router Job Queue" +msgstr "File d'attente de travaux du routeur" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:111 +msgid "logs" +msgstr "historiques" + +#: ../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:303 +msgid "Critical Logs" +msgstr "Historiques critiques" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:307 +msgid "Router Logs" +msgstr "Historiques du routeur" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:313 +msgid "Service (Wrapper) Logs" +msgstr "Historique du service Wrapper" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:111 +msgid "network database summary" +msgstr "Résumé base de données" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:248 +msgid "I2P Network Database Summary" +msgstr "Résumé base de données I2P" + +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:115 +msgid "WebApp Not Found" +msgstr "Application web introuvable" + +#: ../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 config clients page to start it." -msgstr "" +msgstr "Pour la lancer, rendez-vous sur configuration des clients." -#: ../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 trac." +#~ "i2p2.i2p." +#~ msgstr "" +#~ "Merci de signaler les bogues sur trac.i2p2.i2p." #~ 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 53ab8ee9d..667d5901b 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 \n" -"Language-Team: duck , monkeybrains \n" +"POT-Creation-Date: 2011-03-21 18:30+0000\n" +"PO-Revision-Date: 2011-03-21 18:26+0000\n" +"Last-Translator: ducki2p \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 logs and if nothing helps, read the FAQ about reseeding manually." -msgstr "" -"Controlleer of uitgaand HTTP verkeer niet geblokkeerd wordt, kijk in de logs en wanneer niets anders helpt, " -"zie de FAQ 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("
    \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("
    \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("InboundOutbound\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("" + "Plugin contains an invalid key" + ' ' + pubkey + ' ' + signer + ""); -#: ../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(" avg interval between updates: (").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 "in this period which ended {0} ago." -msgstr "in deze periode welke {0} geleden eindigde." +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:204 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:203 +#, java-format +msgid "The period ended {0} ago." +msgstr "De periode eindigde {0} geleden." + +#: ../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" +#.
    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
    #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:240 -msgid "Download Unsigned" -msgstr "Download Niet-ondertekend" +#, java-format +msgid "Download Unsigned
    Update {0}" +msgstr "Download Niet-ondertekende
    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 not private." msgstr "Deze zijn niet privé." -#: ../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, do not enter a private IP address like 127.0.0.1 or 192.168.1.1." msgstr "" "Tevens, vul geen privé IP addres in 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 logs may also help " "diagnose the problem." @@ -4534,15 +4615,15 @@ msgstr "" "Indien er een fout is zijn de logs 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 wrapper.log." -#: ../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,67 +5653,35 @@ 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 -msgid "Page Not Found" -msgstr "Pagina Niet Gevonden" +#: ../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/error_jsp.java:242 -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/error500_jsp.java:123 +msgid "Router Console" +msgstr "Router Console" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:244 -msgid "Error 404" -msgstr "Fout 404" +#: ../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/error_jsp.java:249 -msgid "not found" -msgstr "niet gevonden" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:106 -msgid "graphs" -msgstr "grafieken" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:227 -msgid "I2P Performance Graphs" -msgstr "I2P Prestatie Grafieken" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/index_jsp.java:105 -msgid "home" -msgstr "start" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:105 -msgid "job queue" -msgstr "taak wachtrij" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:226 -msgid "I2P Router Job Queue" -msgstr "I2P Router Taak wachtrij" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:105 -msgid "logs" -msgstr "logs" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:226 -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" +#: ../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/logs_jsp.java:232 +#: ../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/logs_jsp.java:236 +#: ../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." @@ -5498,52 +5689,118 @@ 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 +#: ../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/logs_jsp.java:266 +#: ../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." +"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/error_jsp.java:123 +msgid "Page Not Found" +msgstr "Pagina Niet Gevonden" + +#: ../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:266 +msgid "Error 404" +msgstr "Fout 404" + +#: ../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:112 +msgid "graphs" +msgstr "grafieken" + +#: ../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:111 +msgid "home" +msgstr "start" + +#: ../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:248 +msgid "I2P Router Job Queue" +msgstr "I2P Router Taak wachtrij" + +#: ../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:248 +msgid "I2P Router Logs" +msgstr "I2P Router Logs" + +#: ../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 config clients page to start it." @@ -5551,39 +5808,49 @@ msgstr "" "Bezoek de config clients pagina 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 41f73635c..5a7538fba 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 \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 logs and if nothing helps, read the FAQ about reseeding manually." -msgstr "Убедитесь, что исходящие HTTP-запросы ничем не блокируются, загляните в логи и если ничто не помогло, прочтите в FAQ инструкцию по начальной загрузке вручную." - -#: ../../../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 "Congestion Window. Окно насыщения — количество байт, которое мы можем послать до ожидания подтверждения" -#: ../../../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 "Slow Start Threshold. Величина порога медленного старта" -#: ../../../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 "Round-Trip Time. Время между отправкой запроса и получением ответа (миллисекунды)" -#: ../../../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 "Retransmit Time-Out. Время ожидания подтверждения перед повторной посылкой пакета (миллисекунды)" -#: ../../../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 "Maximum Transfer Unit. Текущий максимальный размер исходящего пакета / максимальный размер принятого пакета (байт) " -#: ../../../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("
    \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("
    \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("InboundOutbound\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("" + "Plugin contains an invalid key" + ' ' + pubkey + ' ' + signer + ""); -#: ../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(" avg interval between updates: (").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 "in this period which ended {0} ago." -msgstr "в этом периоде который закончился {0} назад." +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:204 +#: ../java/src/net/i2p/router/web/StatsGenerator.java:203 +#, java-format +msgid "The period 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: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" +#.
    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
    #: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:240 -msgid "Download Unsigned" -msgstr "Скачать неподписанное" +#, java-format +msgid "Download Unsigned
    Update {0}" +msgstr "Скачать неподписанное
    обновление {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 "Интервал автообновления
    панели (сек.)" #. 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 not private." msgstr "Не вводите локальные внутрисетевые имена." -#: ../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, do not enter a private IP address like 127.0.0.1 or 192.168.1.1." msgstr "Также не вводите IP из локальных диапазонов, такие как 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 logs may also help diagnose the problem." msgstr "В случае ошибок логи могут помочь диагностировать проблему." -#: ../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 уже была запущена, при выборе варианта \"Не запускать I2P при старте\" маршрутизатор будет моментально остановлен." -#: ../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 wrapper.log." msgstr "В некоторых случаях для отладки может пригодиться список состояний потоков I2P-маршутизатора. Для получения такого списка нажмите эту кнопку. Список будет сохранен в файле wrapper.log." -#: ../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 -msgid "Page Not Found" -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/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/error500_jsp.java:123 +msgid "Router Console" +msgstr "Консоль маршрутизатора I2P" -#: ../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/error500_jsp.java:127 +msgid "Configuration" +msgstr "Настройки" -#: ../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 "Очередь заданий маршрутизатора I2P" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:105 -msgid "logs" -msgstr "логи" - -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:226 -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 & Информация о среде выполнения" +#: ../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/logs_jsp.java:232 +#: ../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/logs_jsp.java:236 +#: ../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/logs_jsp.java:238 +#: ../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/logs_jsp.java:266 +#: ../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/logs_jsp.java:281 +#: ../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 "Ошибка 404" + +#: ../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 "Графики производительности I2P" + +#: ../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 "Добро пожаловать в 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:248 +msgid "I2P Router Job Queue" +msgstr "Очередь заданий маршрутизатора I2P" + +#: ../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 "Логи маршрутизатора I2P" + +#: ../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 config clients page to start it." msgstr "Пожалуйста, запустите его со страницы настроек веб-апплетов." -#: ../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 logs and if nothing helps, read the FAQ about reseeding manually." +#~ msgstr "" +#~ "Убедитесь, что исходящие HTTP-запросы ничем не блокируются, загляните в " +#~ "логи и если ничто не помогло, прочтите в FAQ инструкцию по " +#~ "начальной загрузке вручную." + +#~ 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 4e7419ac0..8a75c5a3f 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 \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 logs and if nothing helps, read the FAQ about reseeding manually." -msgstr "请保证HTTP通信没有受阻,检查 日志 ,如果问题仍无法解决,请参照 FAQ 进行手动补种。" - -#: ../../../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 +#: ../../../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:135 +msgid "Reseed failed." +msgstr "网络引导失败" + +#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:136 +#, java-format +msgid "See {0} for help." +msgstr "帮助参见 {0}。" + +#: ../../../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:150 -msgid "Last reseed failed fully (failed reading seed URL)." -msgstr "上次补种尝试失败(读取补种URL失败)。" - -#: ../../../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:189 +#: ../../../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)." +msgid "" +"Reseeding: fetching router info from seed URL ({0} successful, {1} errors)." msgstr "正在补种:从补种服务器获取路由信息({0}成功,{1}失败)。" -#: ../../../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:215 -#, java-format -msgid "Last reseed failed ({0}% of {1})." -msgstr "上次补种失败({0}%失败,共{1})" - -#: ../../../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/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("
    \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("
    \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" -msgstr "" +#: ../java/src/net/i2p/router/web/ConfigLoggingHandler.java:82 +msgid "Log overrides updated" +msgstr "日志参数已更新" -#: ../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" -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 "Valid levels are DEBUG, INFO, WARN, ERROR, CRIT" +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:52 +#: ../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 "可用的日志等级包括 DEBUG, INFO, WARN, ERROR, CRIT" + +#: ../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 Graphs Page" -msgstr "曲线图列表已更新,更新后的内容可能需要最多 60s 的时间才能在这里及 统计图表页面中反映出来。" +#: ../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 Graphs Page" +msgstr "" +"曲线图列表已更新,更新后的内容可能需要最多 60s 的时间才能在这里及 统计图表页面中反映出来。" #. 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("" + "Plugin contains an invalid key" + ' ' + pubkey + ' ' + signer + ""); -#: ../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:154 +#: ../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(" avg interval between updates: (").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: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 not private." msgstr "他们并非私有地址。" -#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:560 -msgid "Also, do not enter a private IP address 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, do not enter a private IP address like 127.0.0.1 or 192.168.1.1." msgstr "此外,请勿输入如127.0.0.1或192.168.1.1等私有地址" -#: ../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 logs 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 logs may also help " +"diagnose the problem." msgstr "如果存在错误,日志可以帮助您诊断问题。" -#: ../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 "等级外
    日志项目" +#: ../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:326 +#: ../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: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 wrapper.log." +#: ../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 wrapper.log." 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 trac.i2p2.i2p." -msgstr "如果您发现错误请报告至trac.i2p2.i2p。" - -#: ../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 config clients page to start it." -msgstr "请先在配置客户端页面中启动它。" +#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:234 +msgid "" +"Please visit the config clients page 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: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 logs and if nothing helps, read the FAQ about reseeding manually." +#~ msgstr "" +#~ "请保证HTTP通信没有受阻,检查 日志 ,如果问题仍无法解决,请参照 FAQ 进行手动补种。" + +#~ 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 trac." +#~ "i2p2.i2p." +#~ msgstr "" +#~ "如果您发现错误请报告至trac." +#~ "i2p2.i2p。" + #~ 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 57aeff994..7e62fd27c 100644 --- a/apps/sam/java/build.xml +++ b/apps/sam/java/build.xml @@ -28,6 +28,7 @@ @@ -37,19 +38,42 @@ - + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/streaming/java/build.xml b/apps/streaming/java/build.xml index dff6fbf1d..1351399b7 100644 --- a/apps/streaming/java/build.xml +++ b/apps/streaming/java/build.xml @@ -27,6 +27,7 @@ @@ -36,14 +37,40 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 69ace81a2..10ff38856 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 acb58fe15..71e1dd3ac 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 dfcfacfa1..f8dbe74ea 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 03abafdda..573354e89 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 listSockets() { + Set connections = _connectionManager.listConnections(); + Set 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 4097c568f..632b904b7 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 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 000000000..324d12687 --- /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 000000000..6ba78bfd4 --- /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 000000000..6523a43a4 --- /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 , 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 \n" +"Language-Team: duck \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 subscriptions file." +msgstr "" +"من السهل الانخراط في باقي المواقع فقط أضفه الى الانخراط" + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:119 +msgid "" +"For more information on naming in i2p, see the overview on www.i2p2.i2p." +msgstr "" +"للمزيد من المعلومات حول التسميةلمحة عامة www.i2p2.i2p." + +#: ../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 3e983ffec..d8f2b2e57 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 \n" "Language-Team: foo \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 subscriptions file." -msgstr "Zusätzliche Abonnementquellen hinzuzufügen ist einfach: Geben Sie dazu deren URL in Ihrer Abonnement-Datei an." +msgid "" +"Subscribing to additional sites is easy, just add them to your subscriptions file." +msgstr "" +"Zusätzliche Abonnementquellen hinzuzufügen ist einfach: Geben Sie dazu deren " +"URL in Ihrer Abonnement-Datei an." #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:119 -msgid "For more information on naming in i2p, see the overview on www.i2p2.i2p." -msgstr "Für mehr Informationen über das Namenssystem in I2P konsultieren Sie bitte die Übersichtsseite auf www.i2p2.i2p." +msgid "" +"For more information on naming in i2p, see the overview on www.i2p2.i2p." +msgstr "" +"Für mehr Informationen über das Namenssystem in I2P konsultieren Sie bitte " +"die Übersichtsseite auf www." +"i2p2.i2p." #: ../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 000000000..f907ba154 --- /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 , 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 \n" +"Language-Team: duck \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 subscriptions file." +msgstr "" + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:119 +msgid "" +"For more information on naming in i2p, see the overview on www.i2p2.i2p." +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 000000000..8e1ee29c1 --- /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 , 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 \n" +"Language-Team: Spanish (Castilian) \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 subscriptions file." +msgstr "" +"Suscribirse a otros sitios es fácil, sólo tiene que añadirlos a su archivo " +"de suscripciones." + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:119 +msgid "" +"For more information on naming in i2p, see the overview on www.i2p2.i2p." +msgstr "" +"Para obtener más información sobre los nombres en I2P, consulte la información general en " +"www.i2p2.i2p ." + +#: ../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 000000000..8d2c13c29 --- /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 , 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 \n" +"Language-Team: duck \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 subscriptions file." +msgstr "La souscription à des sites supplémentaires est aisée: ajoutez-les simplement à votre fichier de souscriptions ." + +#: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:119 +msgid "For more information on naming in i2p, see the overview on www.i2p2.i2p." +msgstr "Plus d'infos sur le nommage dans I2P." + +#: ../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 FAQ pour une liste d'URLs de souscriptions." + diff --git a/apps/susidns/locale/messages_nl.po b/apps/susidns/locale/messages_nl.po index 8f1c5b3c0..7664c92c8 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 \n" -"Language-Team: duck , monkeybrains \n" +"POT-Creation-Date: 2011-03-03 18:29+0000\n" +"PO-Revision-Date: 2011-02-20 12:15+0000\n" +"Last-Translator: ducki2p \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 7e689c89a..22752452a 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 \n" "Language-Team: foo \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 subscriptions file." -msgstr "Добавить другие подписки просто, достаточно вписать их URL в файл подписок." +msgid "" +"Subscribing to additional sites is easy, just add them to your subscriptions file." +msgstr "" +"Добавить другие подписки просто, достаточно вписать их URL в файл подписок." #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:119 -msgid "For more information on naming in i2p, see the overview on www.i2p2.i2p." -msgstr "Подробнее о механизме доменных имен в I2P читайте на странице Naming in I2P." +msgid "" +"For more information on naming in i2p, see the overview on www.i2p2.i2p." +msgstr "" +"Подробнее о механизме доменных имен в I2P читайте на странице Naming in I2P." #: ../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 ace16bf4b..52f1c3727 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 , 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 , 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 \n" "Language-Team: foo \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 subscriptions file." -msgstr "订阅其他网站的地址簿也很简单,只需将它们加入 订阅 文件即可。" +msgid "" +"Subscribing to additional sites is easy, just add them to your subscriptions file." +msgstr "" +"订阅其他网站的地址簿也很简单,只需将它们加入 订" +"阅 文件即可。" #: ../src/tmp/i2p/susi/dns/jsp/index_jsp.java:119 -msgid "For more information on naming in i2p, see the overview on www.i2p2.i2p." -msgstr "关于I2P网络域名系统的更多信息,参见 www.i2p2.i2p 网站上的“概述” ." +msgid "" +"For more information on naming in i2p, see the overview on www.i2p2.i2p." +msgstr "" +"关于I2P网络域名系统的更多信息,参见 www.i2p2.i2p 网站上的“概述” ." #: ../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站点的 FAQ" +msgstr "" +"其他来源的订阅链接参见I2P站点的 FAQ" #~ msgid "Delete" #~ msgstr "删除" - diff --git a/apps/susidns/src/bmsg.sh b/apps/susidns/src/bmsg.sh deleted file mode 100644 index b9d294b32..000000000 --- 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 8244d37cf..d2dc2f121 100644 --- a/apps/susidns/src/build.xml +++ b/apps/susidns/src/build.xml @@ -23,13 +23,16 @@ + + @@ -47,6 +50,7 @@ @@ -61,8 +65,20 @@ - - + + + + + + + + + + + + + + @@ -74,21 +90,32 @@ + + + + + + + + + + + - + - + - - - + + + @@ -102,9 +129,8 @@ - - - + + diff --git a/apps/susidns/src/bundle-messages.bat b/apps/susidns/src/bundle-messages.bat deleted file mode 100644 index 90feca972..000000000 --- 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 b1cd377b3..349eb3f1d 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 000000000..43da5d091 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 9ab38ce42..b38edf9b9 100644 --- a/apps/susimail/build.xml +++ b/apps/susimail/build.xml @@ -10,6 +10,7 @@ @@ -20,11 +21,66 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/susimail/bundle-messages.sh b/apps/susimail/bundle-messages.sh new file mode 100644 index 000000000..10b6f150a --- /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 000000000..f00349039 --- /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 , 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 \n" +"Language-Team: mixxy \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 000000000..aac4c983f --- /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 , 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 \n" +"Language-Team: duck \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 000000000..8d930c4e7 --- /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 , 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 \n" +"Language-Team: Spanish (Castilian) \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 000000000..238ebd4e7 --- /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 , 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 \n" +"Language-Team: duck \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 000000000..411a02eb6 --- /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 , 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 \n" +"Language-Team: duck \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 000000000..84b97450e --- /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 b356c73d1..c07947c28 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( "

    " ); - out.println( "Download attachment (" + ident + "). File is packed into a zipfile for security reasons." ); + out.println( "" + _("Download") + " " + _("attachment ({0}).", ident) + " " + _("File is packed into a zipfile for security reasons.") ); out.println( "

    " ); } 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.
    "; + sessionObject.error += _("Need username for authentication.") + "
    "; doContinue = false; } if( pass == null || pass.length() == 0 ) { - sessionObject.error += "Need password for authentication.
    "; + sessionObject.error += _("Need password for authentication.") + "
    "; doContinue = false; } if( host == null || host.length() == 0 ) { - sessionObject.error += "Need hostname for connect.
    "; + sessionObject.error += _("Need hostname for connect.") + "
    "; doContinue = false; } int pop3PortNo = 0; if( pop3Port == null || pop3Port.length() == 0 ) { - sessionObject.error += "Need port number for pop3 connect.
    "; + sessionObject.error += _("Need port number for pop3 connect.") + "
    "; doContinue = false; } else { try { pop3PortNo = Integer.parseInt( pop3Port ); if( pop3PortNo < 0 || pop3PortNo > 65535 ) { - sessionObject.error += "POP3 port number is not in range 0..65535.
    "; + sessionObject.error += _("POP3 port number is not in range 0..65535.") + "
    "; doContinue = false; } } catch( NumberFormatException nfe ) { - sessionObject.error += "POP3 port number is invalid.
    "; + sessionObject.error += _("POP3 port number is invalid.") + "
    "; doContinue = false; } } int smtpPortNo = 0; if( smtpPort == null || smtpPort.length() == 0 ) { - sessionObject.error += "Need port number for smtp connect.
    "; + sessionObject.error += _("Need port number for smtp connect.") + "
    "; doContinue = false; } else { try { smtpPortNo = Integer.parseInt( smtpPort ); if( smtpPortNo < 0 || smtpPortNo > 65535 ) { - sessionObject.error += "SMTP port number is not in range 0..65535.
    "; + sessionObject.error += _("SMTP port number is not in range 0..65535.") + "
    "; doContinue = false; } } catch( NumberFormatException nfe ) { - sessionObject.error += "SMTP port number is invalid.
    "; + sessionObject.error += _("SMTP port number is invalid.") + "
    "; doContinue = false; } } @@ -667,11 +668,11 @@ public class WebMail extends HttpServlet sessionObject.mailbox.close(); sessionObject.mailbox = null; } - sessionObject.info += "User logged out.
    "; + sessionObject.info += _("User logged out.") + "
    "; sessionObject.state = STATE_AUTH; } else if( sessionObject.mailbox == null ) { - sessionObject.error += "Internal error, lost connection.
    "; + sessionObject.error += _("Internal error, lost connection.") + "
    "; 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.
    "; + sessionObject.error += _("Could not fetch mail body.") + "
    "; } } } @@ -871,7 +872,7 @@ public class WebMail extends HttpServlet } catch( NumberFormatException nfe ) { - sessionObject.error += "Message id not valid.
    "; + sessionObject.error += _("Message id not valid.") + "
    "; } } } @@ -954,16 +955,16 @@ public class WebMail extends HttpServlet sessionObject.attachments.add( attachment ); } else { - sessionObject.error += "No Encoding found for " + encodeTo + "
    "; + sessionObject.error += _("No Encoding found for {0}", encodeTo) + "
    "; } } 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() + "
    "; + sessionObject.error += _("Error reading uploaded file: {0}", e.getMessage()) + "
    "; } } } @@ -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.
    "; + sessionObject.error += _("Invalid pagesize number, resetting to default value.") + "
    "; } } 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.
    "; + sessionObject.error += _("No messages marked for deletion.") + "
    "; } else { int numberDeleted = 0; @@ -1129,7 +1130,7 @@ public class WebMail extends HttpServlet numberDeleted++; } else - sessionObject.error += "Error deleting message: " + sessionObject.mailbox.lastError() + "
    "; + sessionObject.error += _("Error deleting message: {0}", sessionObject.mailbox.lastError()) + "
    "; } } } @@ -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( "\n" ); @@ -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() + "
    "; + sessionObject.error += _("Error decoding content: {0}", e.getMessage()) + "
    "; 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.
    "; + sessionObject.error += _("Found no valid sender address.") + "
    "; } else { sender = Mail.getAddress( from ); if( sender == null || sender.length() == 0 ) { ok = false; - sessionObject.error += "Found no valid address in '" + quoteHTML( from ) + "'.
    "; + sessionObject.error += _("Found no valid address in \\''{0}\\''.", quoteHTML( from )) + "
    "; } } @@ -1415,19 +1416,19 @@ public class WebMail extends HttpServlet if( recipients.isEmpty() ) { ok = false; - sessionObject.error += "No recipients found.
    "; + sessionObject.error += _("No recipients found.") + "
    "; } 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( "\n" + "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + "\n" + - "" ); + "" ); if( sessionObject.attachments != null && !sessionObject.attachments.isEmpty() ) { boolean wroteHeader = false; for( Iterator it = sessionObject.attachments.iterator(); it.hasNext(); ) { if( !wroteHeader ) { - out.println( "" ); + out.println( "" ); 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( "

    From:
    To:
    Cc:
    Bcc:
    Subject:
     Bcc to self
    " + _("From:") + "
    " + _("To:") + "
    " + _("Cc:") + "
    " + _("Bcc:") + "
    " + _("Subject:") + "
     " + _("Bcc to self") + "
    " + "

    New Attachment:
    " + _("New Attachment:") + "
    Attachments:
    " + _("Attachments:") + "
    \n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + "
    User
    Pass
    Host
    POP3-Port
    SMTP-Port
    Create Account " + button( LOGIN, "Login" ) + "
    " + _("User") + "
    " + _("Pass") + "
    " + _("Host") + "
    " + _("POP3-Port") + "
    " + _("SMTP-Port") + "
    " + _("Create Account") + " " + button( LOGIN, _("Login") ) + "
    "); } /** @@ -1595,21 +1596,21 @@ public class WebMail extends HttpServlet private void showFolder( PrintWriter out, SessionObject sessionObject, RequestWrapper request ) { if( sessionObject.reallyDelete ) { - out.println( "

    Really delete the marked messages? " + button( REALLYDELETE, "Yes, really delete them!" ) + "

    " ); + out.println( "

    " + _("Really delete the marked messages?") + " " + button( REALLYDELETE, _("Yes, really delete them!") ) + "

    " ); } - 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" ) + "\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") ) + "
    \n" + "\n" + - thSpacer + "" + - thSpacer + "" + - thSpacer + "" + - thSpacer + "" ); + thSpacer + "" + + thSpacer + "" + + thSpacer + "" + + thSpacer + "" ); 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( "" ); + ( idChecked ? "checked" : "" ) + ">" + ( RELEASE ? "" : "" + i ) + "" ); bg = 1 - bg; i++; } out.println( "\n

    " + sortHeader( SORT_SENDER, "Sender" ) + "" + sortHeader( SORT_SUBJECT, "Subject" ) + "" + sortHeader( SORT_DATE, "Date" ) + sortHeader( SORT_ID, "" ) + "" + sortHeader( SORT_SIZE, "Size" ) + "
    " + sortHeader( SORT_SENDER, _("Sender") ) + "" + sortHeader( SORT_SUBJECT, _("Subject") ) + "" + sortHeader( SORT_DATE, _("Date") ) + sortHeader( SORT_ID, "" ) + "" + sortHeader( SORT_SIZE, _("Size") ) + "
    " + ( RELEASE ? "" : "" + i ) + "" + link + mail.shortSender + " " + link + mail.shortSubject + " " + mail.formattedDate + " " + mail.size + " Bytes
    " + link + mail.shortSender + " " + link + mail.shortSubject + " " + mail.formattedDate + " " + ngettext("1 Byte", "{0} Bytes", mail.size) + "

    " + - button( MARKALL, "Mark All" ) + - button( INVERT, "Invert Selection" ) + - button( CLEAR, "Clear" ) + + button( MARKALL, _("Mark All") ) + + button( INVERT, _("Invert Selection") ) + + button( CLEAR, _("Clear") ) + "
    " + ( 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") ) ) + "
    " + - "Pagesize: " + - button( SETPAGESIZE, "Set" ) ); + _("Pagesize:") + " " + + button( SETPAGESIZE, _("Set") ) ); } /** * @@ -1664,7 +1665,7 @@ public class WebMail extends HttpServlet private void showMessage( PrintWriter out, SessionObject sessionObject ) { if( sessionObject.reallyDelete ) { - out.println( "

    Really delete this messages? " + button( REALLYDELETE, "Yes, really delete it!" ) + "

    " ); + out.println( "

    " + _("Really delete this message?") + " " + button( REALLYDELETE, _("Yes, really delete it!") ) + "

    " ); } 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( "\n" + "\n" + - "\n" + - "\n" + - "\n" + + "\n" + + "\n" + + "\n" + "" ); if( mail.body != null ) { showPart( out, mail.part, 0, SHOW_HTML ); } else { - out.println( "" ); + out.println( "" ); } } else { - out.println( "" ); + out.println( "" ); } out.println( "\n

    From:" + quoteHTML( mail.formattedSender ) + "
    Date:" + mail.quotedDate + "
    Subject:" + quoteHTML( mail.formattedSubject ) + "
    " + _("From:") + "" + quoteHTML( mail.formattedSender ) + "
    " + _("Date:") + "" + mail.quotedDate + "
    " + _("Subject:") + "" + quoteHTML( mail.formattedSubject ) + "

    Could not fetch mail body.

    " + _("Could not fetch mail body.") + "

    Could not fetch mail.

    " + _("Could not fetch mail.") + "


    " ); } + + /** 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 9d48f902c..dc8f08afb 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" >
    - - - - - - + + + + + + + + + + + + + + + + + - - - - + + + + + diff --git a/build.xml b/build.xml index 6a96b143c..51fd85ff5 100644 --- a/build.xml +++ b/build.xml @@ -32,6 +32,7 @@ + @@ -40,12 +41,9 @@ - - - - - + + @@ -64,15 +62,14 @@ - + - - + @@ -100,11 +97,18 @@ - + + + + + + - + @@ -126,11 +130,21 @@ - + + + + + + + + + + + @@ -164,11 +178,13 @@ - + - + + + @@ -196,6 +212,8 @@ + + @@ -218,11 +236,15 @@ - + + + + + @@ -268,6 +290,7 @@ + @@ -277,6 +300,7 @@ + @@ -323,6 +347,7 @@ + @@ -403,6 +428,7 @@ + @@ -448,6 +474,7 @@ + @@ -490,7 +517,10 @@ - + + + + @@ -550,6 +580,8 @@ + + @@ -618,6 +650,7 @@ + @@ -680,17 +713,43 @@ - + + + + + + + + + + + + - + + + + + + - + + + + + + - + + + + + + - + + - + - + - + - + + - + @@ -791,6 +852,7 @@ + @@ -802,34 +864,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -984,7 +1018,7 @@ - + @@ -1001,7 +1035,7 @@ - + diff --git a/core/java/build.xml b/core/java/build.xml index 2ae9d655f..60f1a4dcc 100644 --- a/core/java/build.xml +++ b/core/java/build.xml @@ -21,20 +21,51 @@ - + + - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -43,15 +74,35 @@ - - + + + + + + + + + + + + + + + + + + + + + + - + - + @@ -60,24 +111,11 @@ - - - - - - - - - - - - - - - - - - + + + + + @@ -87,28 +125,8 @@ - - - - - - - - - - - - - - - - - - - - + - diff --git a/core/java/src/freenet/support/CPUInformation/CPUID.java b/core/java/src/freenet/support/CPUInformation/CPUID.java index e3712e4ad..921f497dd 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 860747c76..6005a7348 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 e6df37e6f..5cfc37ac5 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; /** *

    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 8d5527d59..2207a56c5 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 0fa35d8cf..336c858ca 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 cd20cfc2d..567c9e521 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; /** *

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

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

    * @@ -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 8b4389e47..dc7e875d9 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 f0000b68c..3af551eaa 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 342b05d26..fcf11d0da 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 e984b6d30..e108fc008 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 4748e7495..be88bdb53 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 0b3baf5b4..7d711492b 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 97756a776..e64bfb38e 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 ea2338003..350821e35 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 192bde062..160cc1354 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 6160caf5b..df4867574 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 8d5b6957b..87955646b 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 165749a7c..ef8546e2f 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 3071e0bc0..cbcb93515 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 fe730af6b..52d59002d 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 7369a27d1..9f460fe47 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 522200098..c6d7c61b2 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 bd6bf260d..9eab8649e 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 sortStructures(Collection dataStructures) { if (dataStructures == null) return Collections.EMPTY_LIST; - ArrayList rv = new ArrayList(dataStructures.size()); - TreeMap 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 rv = new ArrayList(dataStructures.size()); + //TreeMap tm = new TreeMap(); + //for (DataStructure struct : dataStructures) { + // tm.put(struct.calculateHash().toString(), struct); + //} + //for (DataStructure struct : tm.values()) { + // rv.add(struct); + //} + ArrayList rv = new ArrayList(dataStructures); + Collections.sort(rv, new DataStructureComparator()); return rv; } + /** + * See sortStructures() comments. + * @since 0.8.3 + */ + private static class DataStructureComparator implements Comparator { + 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 000000000..0810cddca --- /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 bf415bdc9..5b0a5e4bb 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 0c752f9d6..4f4af3cf9 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 1b4d6438f..647104574 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 9c6db01f9..7d6ff8a8e 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 _addresses; - private final Set _peers; + /** may be null to save memory, no longer final */ + private Set _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 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 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 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) 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 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) 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 562c49c79..8698f6a78 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 { 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 0017e567c..01ca5443f 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 2e625e606..0e1c815f6 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 788fb36a0..f4d44a3ae 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 9bcabe2fb..08b31a6e7 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 d713b678d..4b14d5ed8 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 dfa7bcfe6..d18a469db 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 d8c1312d4..1d5c6a466 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 fd0fae49f..8bf5bcf47 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 79ddec519..fded9b019 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 531138d1a..868e18402 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 a84882215..2c798bab6 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 3ef72ca10..2d3eb482d 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 4fc5eaff0..ee43af44c 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 3610c54b9..6c6d8bfb6 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 extends AbstractSet implements Set { private static final Object DUMMY = new Object(); - private Map _map; + private final Map _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 4179edd38..ff564b265 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 a72b6b9e2..f090cf727 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 _current; private ConcurrentHashSet _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 f055ce98c..955ae8238 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 _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 5c0d9c8fc..bb8304a39 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 615361e20..2e7836f62 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 8092d7ac4..3c81d46f1 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 b5bb48a43..de9d354aa 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 a9f027cae..811108355 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 000000000..e943f561f --- /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 _callbacks = new CopyOnWriteArrayList(); + + 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 9b76b8fc9..90c95d381 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 b22325adb..6ce320c9d 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 49eaf291f..a57512d4d 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 52583b63c..58d08af74 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 51108e18b..c141cc243 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 7b23d26ae..d9a1d9f93 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 5b18bc761..1b44fce25 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 c7c87239c..fe0429152 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 e3ba43ae7..d35545ae7 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 12b668f67..bb0aec5f8 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 f764debe9..61e2e66b3 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 0b5430711..b19b5d691 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 bda41e621..955f8faa3 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 2c532c5cd..000000000 --- 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 9778887db..4e6d1a032 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 c6ec05326..0641db6ab 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 61c3b73c6..30fb8c11f 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 cb3c3124d..9d25fb449 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 8ca6282cc..8fed332bd 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 65a44f921..aab4a88bb 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 bafc3bdac..baa038812 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 f976e53da..b97099e6e 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 000000000..4cf823342 --- /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 471e7bb8f..82235a785 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 aaf157c1a..7bb162604 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 face45725..529190a77 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") - ); + 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(); + } - System.setOut(systemOut); } @@ -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") - ); + 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(); + } - System.setOut(systemOut); } @@ -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 187b3623a..b552cc43e 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 5b685f0a3..4c0e9057e 100644 --- a/installer/install.xml +++ b/installer/install.xml @@ -4,7 +4,7 @@ i2p - 0.8.2 + 0.8.6 @@ -105,13 +105,14 @@ + - + @@ -178,6 +179,32 @@ + + + Automatically start I2P in the background + + + + + + + + + + + + + + + + + + + + + + diff --git a/installer/resources/blocklist.txt b/installer/resources/blocklist.txt index 99570520c..6108d1782 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 +The Team Cymru Bogon List v6.8 03 FEB 2011:0.0.0.0/8 +The Team Cymru Bogon List v6.8 03 FEB 2011:10.0.0.0/8 +The Team Cymru Bogon List v6.8 03 FEB 2011:127.0.0.0/8 +The Team Cymru Bogon List v6.8 03 FEB 2011:169.254.0.0/16 +The Team Cymru Bogon List v6.8 03 FEB 2011:172.16.0.0/12 +The Team Cymru Bogon List v6.8 03 FEB 2011:192.0.0.0/24 +The Team Cymru Bogon List v6.8 03 FEB 2011:192.0.2.0/24 +The Team Cymru Bogon List v6.8 03 FEB 2011:192.168.0.0/16 +The Team Cymru Bogon List v6.8 03 FEB 2011:198.18.0.0/15 +The Team Cymru Bogon List v6.8 03 FEB 2011:198.51.100.0/24 +The Team Cymru Bogon List v6.8 03 FEB 2011:203.0.113.0/24 +The Team Cymru Bogon List v6.8 03 FEB 2011: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 000000000..e28b1cc59 --- /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 891441462..000000000 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 ac4a97736..000000000 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 c2de2d711..000000000 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 8332c4ec2..000000000 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 c5fd136ae..000000000 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 89692f74f..000000000 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 325fbad3f..000000000 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 fe44791e3..000000000 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 47da4214f..000000000 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 1994653da..000000000 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 10f451fe8..000000000 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 3af233776..594d4d8d6 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 ecb45b206..0a7f3fe40 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 4e6fa9641..3fe13cab5 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 000000000..f9dee3585 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 000000000..e21ae5cb8 --- /dev/null +++ b/installer/resources/initialNews/initialNews_ar.xml @@ -0,0 +1,20 @@ +

    +

    Congratulations on getting I2P installed!

    +

    + !I2P مرحبا بك في شبكة +انتظر قليلا بينما يتم ربط الإتصال بباقي أعضاء الشبكة. +

    +

    + +بسنما يتم الإتصال بتغير بيانات سرعة الشبكة في قم +صفحة الخيارات. +

    +

    +عندما تظهر عبارة "shared clients" على اليسار يمكنك حينها زيارة +الأسئلة الشائعة. +

    +

    IRC اتصل بخادم الدردشة الفورية على + localhost:6668 +#i2p-help or #i2p. +

    +
    diff --git a/installer/resources/initialNews/initialNews_fr.xml b/installer/resources/initialNews/initialNews_fr.xml new file mode 100644 index 000000000..8f027c270 --- /dev/null +++ b/installer/resources/initialNews/initialNews_fr.xml @@ -0,0 +1,20 @@ +
    +

    Merci d'utiliser I2P !

    +

    +Bienvenue sur I2P ! +Merci de patienter le temps qu'I2P démarre et trouve des pairs. +

    +

    +Pendant ce temps, merci d'adjuster vos réglages de bande passante sur la page de +configuration. +

    +

    +Une fois que vous avez une indication "clients partagés…" listée sur la gauche, +merci de jeter un œil à la FAQ. +

    +

    +Pointez votre client IRC sur localhost:6668 et venez nous faire coucou sur +#i2p-help, #i2p-fr +ou #i2p. +

    +
    diff --git a/installer/resources/install_i2p_service_winnt.bat b/installer/resources/install_i2p_service_winnt.bat index fb668c64a..a6eb0495d 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 29900cb6b..a5072d8d7 100644 --- a/installer/resources/jetty.xml +++ b/installer/resources/jetty.xml @@ -12,7 +12,9 @@ - + + + @@ -23,7 +25,7 @@ - + @@ -57,13 +59,12 @@ 7658 - 3 - 10 + 1 + 16 60000 1000 8443 8443 - main @@ -90,9 +91,7 @@ 8443 main ./eepsite/keystore.ks - changeit - myKeyPassword MSIE 5 diff --git a/installer/resources/news.xml b/installer/resources/news.xml index e542e7a24..e978528c5 100644 --- a/installer/resources/news.xml +++ b/installer/resources/news.xml @@ -1,17 +1,13 @@
    -

    2010-12-22: 0.8.2 Released

    +

    2011-05-16: 0.8.6 Released

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

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

    Please help grow the network. Say hello to the volunteers on the #i2p-help IRC channel. @@ -20,6 +16,6 @@ spread the word, and donate! If you find a bug, please enter a report on trac. We are still looking for volunteers to work on new and existing translations. -Please volunteer on IRC #i2p. +Please volunteer on IRC #i2p-dev.

    diff --git a/installer/resources/news_fr.xml b/installer/resources/news_fr.xml new file mode 100644 index 000000000..ab045e4bf --- /dev/null +++ b/installer/resources/news_fr.xml @@ -0,0 +1,21 @@ + +
    +

    2011-03-02: La version 0.8.4 est sortie

    +

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

    +Merci de participer à la croissance du réseau. +Venez nous encourager sur le canal IRC #i2p-help. +Impliquez-vous, +passez le mot, +et un petit don! +Si vous trouvez un bogue, merci d'entrer un rapport sur trac. +Nous cherchons toujours des volontaires pour travailler sur les traductions existantes et des nouvelles. +Merci de vous manifester sur l'IRC #i2p-dev. +

    +
    diff --git a/installer/resources/proxy/ahelper-conflict-header.ht b/installer/resources/proxy/ahelper-conflict-header.ht index 670a64693..e15e0f57e 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 - - -I2P Warning: Destination key conflict - - - - - -
    -

    Warning: Destination Key Conflict

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

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

    +HTTP/1.1 409 Conflict +Content-Type: text/html; charset=UTF-8 +Cache-control: no-cache +Connection: close +Proxy-Connection: close + + +I2P Warning: Destination key conflict + + + + +

    +
    +

    Warning: Destination Key Conflict

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

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

    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 000000000..d3a4d8380 --- /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 + + +I2P Warning: Destination key conflict + + + + +

    +
    +

    Warning: Destination Key Conflict

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

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

    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 000000000..071bf7ab8 --- /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 + + +Avertissement I2P: conflit de clef de destination + + + + +

    +
    +

    Avertissement: conflit de clef de destination

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

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

    diff --git a/installer/resources/proxy/auth-header_fr.ht b/installer/resources/proxy/auth-header_fr.ht new file mode 100644 index 000000000..cace47865 --- /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 + + +Autorisation Proxy requise + + + +

    +

    Autorisation I2P HTTP Proxy requise

    +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 +configuration de votre routeur, +ou du +I2PTunnel. +Pour désactiver le contrôle d'accès, supprimez la configuration +i2ptunnel.proxy.auth=basic, puis redémarrez le tunnel proxy HTTP. +
    diff --git a/installer/resources/proxy/denied-header_ar.ht b/installer/resources/proxy/denied-header_ar.ht new file mode 100644 index 000000000..9e9d83a83 --- /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 + + +تحذير: لم يحدد بروكسي خارجي + + + + + +
    +

    تحذير : رفض طلب

    +حاولت الدخول الى موقع I2P خارج الشبكة. +
    diff --git a/installer/resources/proxy/denied-header_fr.ht b/installer/resources/proxy/denied-header_fr.ht new file mode 100644 index 000000000..0f05e5a61 --- /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 + + +Avertissement I2P: Requête refusée + + + + + +
    +

    Avertissement I2P: Requête refusée

    +Vous avez tenté de vous connecter a un site ou emplacement non-I2P. +
    diff --git a/installer/resources/proxy/dnf-header_fr.ht b/installer/resources/proxy/dnf-header_fr.ht new file mode 100644 index 000000000..e0dea2799 --- /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 + + +Avertissement I2P: site eep non joignable + + + + + +
    +

    Avertissement I2P: site eep non joignable

    +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 +réessayer. +
    Destination injoignable:

    diff --git a/installer/resources/proxy/dnfb-header_ar.ht b/installer/resources/proxy/dnfb-header_ar.ht new file mode 100644 index 000000000..1ceb0d102 --- /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 + + + +تحذير: عنوان eepsite خاطئ + + + + + + +
    +

    +تحذير: عنوان eepsite خاطئ +

    +عنوان الموقع eepsite خاطئ، أو ربما قمت بلصق عنوان غير موجود، أو الموقع متوقف. يمكنك + +اعادة المحاولة. +
    لم يتم الوصول الى هذا العنوان:

    diff --git a/installer/resources/proxy/dnfb-header_fr.ht b/installer/resources/proxy/dnfb-header_fr.ht new file mode 100644 index 000000000..c7ed858f4 --- /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 + + +Avertissement I2P: destination eep site incorrecte + + + + + +
    +

    Avertissement I2P: destination eep site incorrecte

    +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 réessayer. +
    Destination non trouvée:

    diff --git a/installer/resources/proxy/dnfh-header_fr.ht b/installer/resources/proxy/dnfh-header_fr.ht new file mode 100644 index 000000000..157173973 --- /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 + + +Avertissement I2P: site eep inconnu + + + + + +
    +

    Avertissement I2P: site eep non trouvé dans le carnet d'adresses

    +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 +SusiDNS, +utilisez un lien d'adresse BASE64, ou un service de saut (jump) en lien ci-dessous.

    +Si vous voyez cette page souvent: lisez la faq pour obtenir +de l'aide sur l'ajout de quelques souscrptions à votre carnet +d'adresses.
    +Destination introuvable:

    diff --git a/installer/resources/proxy/dnfp-header_ar.ht b/installer/resources/proxy/dnfp-header_ar.ht new file mode 100644 index 000000000..b194b1266 --- /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 + + +تحذير: لابوجد بروكسي خارجي + + + + + +
    +

    تحذير: لابوجد بروكسي خارجي

    +لم يتم ايجاد بروكسي خارجي www +خارج الشبكة أو غير متصل جيدا بباقي المستخدمين. +يمكنك +اعادة المحاولة +لإختيار بروكسي خارجي جديد +هنا +(اذا كان لديك اكثر من واحد). +اذا استمر المشكل قم بتحرير قائمة البروكسي الخارجية +هنا. +
    لم يستطع الوصول الى هذا العنوان

    diff --git a/installer/resources/proxy/dnfp-header_fr.ht b/installer/resources/proxy/dnfp-header_fr.ht new file mode 100644 index 000000000..40e9ad82f --- /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 + + +Avertissement I2P: Proxy sortant non trouvé + + + + + +
    +

    Avertissement I2P: Proxy sortant non trouvé

    +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 +retenter +car il se produira une sélection aléatoire de mandataire dans le groupe que vous avez défini +ici +(si vous en avez plus d'un de défini). +Si vous avez toujours des problèmes vous pouvez modifier votre liste de +mandataires ici. +
    Destination suivante introuvable:

    diff --git a/installer/resources/proxy/localhost-header_ar.ht b/installer/resources/proxy/localhost-header_ar.ht new file mode 100644 index 000000000..dc6b0304e --- /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 + + +خطأ: تم رفض الطلب + + + + + +
    +

    خطـأ: عنوان محلي

    +خطأ في اعدادات المتصفح. لا تستعمل بروكسي للوصول الى شاشة التحكم، localhost او الشبكة المحلية LAN. + +
    diff --git a/installer/resources/proxy/localhost-header_fr.ht b/installer/resources/proxy/localhost-header_fr.ht new file mode 100644 index 000000000..c38f220b8 --- /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 + + +Erreur I2P: Requête refusée + + + + + +
    +

    Erreur: Accès local

    +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. +
    diff --git a/installer/resources/proxy/noproxy-header_ar.ht b/installer/resources/proxy/noproxy-header_ar.ht new file mode 100644 index 000000000..0f6f1ba64 --- /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 + + +تحذير: لم يحدد بروكسي خارجي + + + + + +
    +

    تحذير: لم يحدد بروكسي خارجي

    +قمت بطلب موقع خارج عن شبكة I2P، لكن لم تقم بتحديد بروكسي خارجي. قم يتحديد بروكسي خارجي في اعدادات I2PTunnel. +
    diff --git a/installer/resources/proxy/noproxy-header_fr.ht b/installer/resources/proxy/noproxy-header_fr.ht new file mode 100644 index 000000000..96e9f3e78 --- /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 + + +Avertissement I2P: Mandataire non configuré + + + + + +
    +

    Avertissement I2P: Mandataire non configuré

    +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. +
    diff --git a/installer/resources/proxy/protocol-header_ar.ht b/installer/resources/proxy/protocol-header_ar.ht new file mode 100644 index 000000000..d31c75791 --- /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 + + +HTTP تحذير: استعمال بروتوكول غير متوافق مع + + + + + +
    +

    HTTP تحذير: استعمال بروتوكول غير متوافق مع

    +تم استعمال بروتوكول غير متوافق. +بروكسي I2P يدعم طلبات http:// فقط. باقي البروتوكولات مثل https:// و ftp:// غير مدعومة. +
    diff --git a/installer/resources/proxy/protocol-header_fr.ht b/installer/resources/proxy/protocol-header_fr.ht new file mode 100644 index 000000000..47fdc9fa9 --- /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 + + +Avertissement I2P: Protocole Non-HTTP + + + + + +
    +

    Avertissement I2P: Protocole Non-HTTP

    +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. +
    diff --git a/installer/resources/readme/readme.html b/installer/resources/readme/readme.html index 00667aea2..bf0f5d6a1 100644 --- a/installer/resources/readme/readme.html +++ b/installer/resources/readme/readme.html @@ -1,21 +1,8 @@
    -
    -
    - English - 中文 - Deutsch - Français - Español - Português - Nederlands - Русский - Svenska
    -
    -
    -

    Welcome to the Invisible Internet

    + +
  • Network integration
    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 Local Destinations 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 Local Destinations, there is a wide variety of things you can do with I2P, and below we introduce you to some of them.
  • Services on I2P

    Anonymous Encrypted Web Hosting on I2P

    @@ -44,9 +41,9 @@ and can be installed as a plugin. any standard JSP/Servlet .war files under eepsite/webapps, or standard CGI scripts under eepsite/cgi-bin) 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. -
  • Start Your Tunnel
    +
  • Start Your Tunnel
    After starting up, your pre-configured I2P Webserver Tunnel, -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 http://127.0.0.1:7658/help/.
  • @@ -74,38 +71,56 @@ your eepsite will be visible (but not discoverable) to others. Detailed instruct

    Troubleshooting & Further Assistance

    - + + +

    Document updated: February 2011
    +
    diff --git a/installer/resources/readme/readme_ar.html b/installer/resources/readme/readme_ar.html new file mode 100644 index 000000000..67ef0d0ed --- /dev/null +++ b/installer/resources/readme/readme_ar.html @@ -0,0 +1,34 @@ +
    + +

    عندما تقوم بتشغيل I2P ستبدأ الأرقام على يسار الشاشة في الازدياد خلال الدقائق التالية وستظهر عبارة Shared Clients (ان لم تظهر، انظر التعليمات اسفله). عندها يمكنك الحصول على عدة خدمات مثل تورنت، البريد الإلكتروني السري، وخدمات أخرى:

    +
      +
    • يمكنك الوصول الى مواقع مجهولة (تسمى eepsites) و خدمات أخرى ( ssh على I2P Jabber،IRC الخ...) زيادة على امكانية استضافة ونشر موقعك الخاص : +لتصفح مواقع (eepsites) على شبكة I2P عليك تغيير اعدادات المتصفح HTTP proxy الى عنوان 127.0.0.1 و port الى 4444، ثم يمكنك تصفح مواقع
      + + هناك العديد من eepsites، فقط اتبع هذه الروابط لإكتشاف المزيد!
    • + +
    • تحميل الملفات يمكن استعمال برنامج Snark الموجود ضمن حزمة برامج I2P لتحميل ملفات BitTorrent.
    • + +
    • البريد الالكتروني المجهول: يمكن استعمال شبكة I2P لإرسال واستقبال البريد الالكتروني بطريقة متوافقة مع بروتوكول (POP3 / SMTP) الشيء الذي يمكن من ارسال واستقبال البريد الالكتروني المجهول و المشفر داخل الشبكة وايضا عن طريق الإنترنت العادية. يمكن زيارة hq.postman.i2p للحصول على حساب. . + +
    • الدردشة بطريقة مجهولة استعمل برنامج الدردشة IRC مثل (Chatzilla, Pidgin, XChat) واتصل بالسيرفر على عنوان 127.0.0.1 وبورت 6668 ليتم الإتصال باحدى السيرفرات IRC المجهولة والمشقرة بحيث لا يستطيع مزود الانترنت او الحكومة او أي شخص آخر التنصت على محادثتك! ثم قم بالدخول الى احدى الغرف i2p-help,#i2p,#i2p-chat# او غرف أخرى. +
    + +

    استضافة موقع مجهول ومشفر على شبكة I2P

    + +

    يمكنك استضافة موقعك على الشبكة بوضع ملفاتك في مجلد eepsite/docroot (كما يمكن وضع تطبيقات JSP/Servlet ايضا) او استعمال سكريبتات CGI في eepsite/cgi-bin +

    + +

    المساعدة

    + +

    يمكن ان يستغرق I2P بعض الوقت في البداية لأنه يقوم بالبحث عن نظائر ليتم الإتضال بالشبكة. اذا استمر الوضع بعد 30 دقيقة، وعدد النظائر المتصلين أقل من 10، تأكد من فتح بورت 8887 على برنامج الجدار الناري. +اذا لم تستطع الوصول الى اي موقع على الشيكة (مثل www.i2p2.i2p) تأكد من وجود البروكسي 127.0.0.1 وبوورت 4444 في اعدادات متصفح.


    +
    diff --git a/installer/resources/readme/readme_de.html b/installer/resources/readme/readme_de.html index 02f35947e..0edc7751e 100644 --- a/installer/resources/readme/readme_de.html +++ b/installer/resources/readme/readme_de.html @@ -1,18 +1,5 @@
    -
    -
    - English - 中文 - Deutsch - Français - Español - Português - Nederlands - Русский - Svenska -
    -
    -

    Willkommen im I2P!

    +

    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, siehe unten). Sobald dieses erscheint, kannst Du:

    • "Eepseiten" besuchen - In I2P gibt es anonym gehostete Websites: @@ -28,7 +15,7 @@
    • paste.i2p2.i2p: anonymer Pastebin

    Es gibt viele andere Eepseiten - folge einfach den Links, die du findest, - setze Lesezeichen für Deine Favoriten, und besuche sie oft!
    + setze Lesezeichen für Deine Favoriten, und besuche sie oft!
  • Im Internet surfen - 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 #i2p oder in #i2p-chat auf irc.postman.i2p - bzw. irc.freshcoffee.i2p chatten. (Beide unter irc://localhost:6668 erreichbar; die Server sind verbunden.) Wenn Du keinen Zugriff auf I2P hast, kannst du #i2p, #i2p-help und #i2p-de auch auf irc.freenode.net erreichen, dann allerdings nicht anonym.


    + bzw. irc.freshcoffee.i2p chatten. (Beide unter irc://localhost:6668 erreichbar; die Server sind verbunden.) Wenn Du keinen Zugriff auf I2P hast, kannst du #i2p, #i2p-help und #i2p-de auch auf irc.freenode.net erreichen, dann allerdings nicht anonym.

  • diff --git a/installer/resources/readme/readme_es.html b/installer/resources/readme/readme_es.html index b04baaf91..f6f2cd544 100644 --- a/installer/resources/readme/readme_es.html +++ b/installer/resources/readme/readme_es.html @@ -1,17 +1,5 @@
    -
    -
    - English - 中文 - Deutsch - Français - Español - Português - Nederlands - Русский - Svenska
    -
    -

    ¡Bienvenido a I2P!

    +

    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, ¡mira abajo!)
    Apenas aparezca esto, puedes:

    • visitar páginas I2P ("Eepsites") - En I2P hay páginas web anónimas: @@ -26,8 +14,7 @@
    • echelon.i2p: archivo de software e informaciones sobre I2P (con aplicaciones de BitTorrent, iMule, I2PFox, I2P-Messenger, ...)
    • paste.i2p2.i2p: pastebin anónimo

    - Hay muchas páginas I2P más - simplemente ¡sigue los enlaces que encuentres, pon marcadores para tus favoritos y visítalos frecuentemente!
    + Hay muchas páginas I2P más - simplemente ¡sigue los enlaces que encuentres, pon marcadores para tus favoritos y visítalos frecuentemente!
  • navegar en internet - 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.
  • intercambiar datos - Hay una adaptación para I2P de la aplicación BitTorrent Snark.
  • @@ -75,5 +62,5 @@ , todos en los servidores irc.postman.i2p y irc.freshcoffee.i2p. (Puedes acceder a ambos bajo irc://localhost:6668; 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 irc.freenode.net - - entonces de forma no anónima.


    + entonces de forma no anónima.

    diff --git a/installer/resources/readme/readme_fr.html b/installer/resources/readme/readme_fr.html index dea15fa7e..9f2122dd9 100644 --- a/installer/resources/readme/readme_fr.html +++ b/installer/resources/readme/readme_fr.html @@ -1,55 +1,277 @@
    -
    -
    - English - 中文 - Deutsch - Français - Español - Português - Nederlands - Русский - Svenska
    -
    -

    Bienvenu sur I2P!

    -

    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, voir plus bas). Une fois qu'ils apparaissent, vous pouvez:

    -
      -
    • Parcourir les "eepsites" - sur I2P il y a des sites web anonymes hébergés - dites à votre navigateur d'utiliser le HTTP proxy a l'adresse 127.0.0.1 port 4444, ensuite vous pouvez naviguer sur les eepsites:
      - - 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!

    • -
    • Parcourir le web - 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.
    • -
    • Transfer de fichiers - Il y a un port intégré de Snark le client BitTorrent.
    • -
    • Utiliser le service de mail anonyme - 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 à hq.postman.i2p. - Nous fournissons dans la version de base de i2p susimail, - un client web pop3/smtp orienté sur l'anonymat qui est configuré pour accéder aux services email de postman. -
      Alternativement, vous pouvez essayer le nouveau système de courrier sans serveur et crypté de bout-en-bout - I2P-Bote (avec une interface web), installable comme un plugin.
    • -
    • Chatter de manière anonyme - Activez votre client IRC et connectez-le sur le serveur 127.0.0.1 port 6668. Ceci pointe vers l'un des deux serveur IRC anonyme, mais ni vous ni eux ne savent qui est l'autre
    • -
    • Créez-vous un blog anonyme - Renseignez-vous chez Syndie
    • -
    • Et bien d'autres
    • +(traduction de mars 2011 - cliquez sur le drapeau ci-dessus pour l'original en anglais) + + +

      Les services sur I2P

      + -

      Vous voulez votre propre eepsite?

      +

      Hébergement crypté anonyme sur I2P

      + + + +

      Sites I2P intéressants

      + -

      Dépannage

      -

      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 www.i2p2.i2p), 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 site web I2P, poster des message sur le forum de discussion, - ou passer par - #i2p-help, #i2p-fr, #i2p ou #i2p-chat - sur IRC sur le serveur irc.freenode.net, irc.postman.i2p ou irc.freshcoffee.i2p (ils sont liés).


      +

      Résolution de problèmes & assistance supplémentaire

      + + + + +

      Document mis à jour en février 2011
    diff --git a/installer/resources/readme/readme_nl.html b/installer/resources/readme/readme_nl.html index bd5938ef2..beb580c92 100644 --- a/installer/resources/readme/readme_nl.html +++ b/installer/resources/readme/readme_nl.html @@ -1,71 +1,94 @@
    -
    -
    - English - 中文 - Deutsch - Français - Español - Português - Nederlands - Русский - Svenska
    -
    -

    Welkom bij I2P!

    -

    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, zie hieronder). Eenmaal je deze bestemming ziet, kan je:

    -
      -
    • surfen naar "eepsites" - op I2P zijn er anonieme websites - stel je browser in om de HTTP proxy op 127.0.0.1, poort 4444 te gebruiken, en surf vervolgens naar een eepsite:
      -
      - 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!
    • -
      • surfen op het web - 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.
      • -
      • bestanden versturen - er is een geintegreerde aangepaste versie van de - Snark BitTorrent - client.
      • -
      • anonieme e-mail gebruiken - 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 hq.postman.i2p. - In i2p zit een gebundelde susimail, - een webgebaseerde anonimiteits-georienteerde pop3/smtp-client ingesteld om postman zijn e-mailservices te gebruiken.
      • -
      • anoniem chatten - start je eigen IRC-client op en verbind met - de server op 127.0.0.1 poort 6668. Dit wijst naar een of twee anoniem gehoste - IRC servers, maar zowel jij als zei weten niet waar de andere is.
      • -
      • anoniem bloggen - neem een kijkje bij Syndie
      • -
      • en veel meer
      • + + + +

        Diensten op I2P

        + -

        Wil je je eigen eepsite?

        +

        Anoniem en versleutelde Web Hosting op I2P

        + -

        Problemen

        + +

        I2P-Hosted Sites of Interest

        + -

        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 www.i2p2.i2p 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 -I2P website, of plaats een bericht op het -I2P discussie forum, of kom langs bij - #i2p-help, #i2p-nl, #i2p of #i2p-chat - op IRC bij de kanalen irc.freenode.net, irc.postman.i2p of irc.freshcoffee.i2p (ze linken allemaal door naar elkaar).


        +

        Problemen oplossen & Verdere hulp

        + +

        Document geupdate: December 2010
    diff --git a/installer/resources/readme/readme_pt.html b/installer/resources/readme/readme_pt.html index 333ae6ba4..6522ea8a9 100644 --- a/installer/resources/readme/readme_pt.html +++ b/installer/resources/readme/readme_pt.html @@ -1,17 +1,5 @@
    -
    -
    - English - 中文 - Deutsch - Français - Español - Português - Nederlands - Русский - Svenska
    -
    -

    Bem-vindo a I2P!

    +

    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, veija embaixo!)
    Assim que apareça isto, você pode:

    • visitar páginas I2P ("Eepsites") - Na rede I2P tem páginas web anônimas: @@ -26,8 +14,7 @@
    • echelon.i2p: arquivo de software e informações sobre I2P (com aplicações de BitTorrent, iMule, I2PFox, I2P-Messenger, ...)
    • paste.i2p2.i2p: pastebin anônimo

    - Ha muitas mais páginas I2P - simplesmente segue os links que encontre, ponhe marcadores para os seus favoritos e visíte-los freqüentemente!
    + Ha muitas mais páginas I2P - simplesmente segue os links que encontre, ponhe marcadores para os seus favoritos e visíte-los freqüentemente!
  • navegar na internet - 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.
  • trocar dados - Ha uma adaptação para I2P da aplicação BitTorrent Snark.
  • @@ -75,5 +62,5 @@ todos nos servidores irc.postman.i2p e irc.freshcoffee.i2p. (A ambos pode acessar baixo irc://localhost:6668; 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 irc.freenode.net - - mas então de forma não anônima.


    + mas então de forma não anônima.

    diff --git a/installer/resources/readme/readme_ru.html b/installer/resources/readme/readme_ru.html index ffa8c435e..85ebd6ca1 100644 --- a/installer/resources/readme/readme_ru.html +++ b/installer/resources/readme/readme_ru.html @@ -1,21 +1,7 @@
    -
    -
    - English - 中文 - Deutsch - Français - Español - Português - Nederlands - Русский - Svenska
    -
    -
    -

    Добро пожаловать в Невидимый Интернет

    - +

    Сервисы в I2P

    Анонимный шифрованный веб-хостинг в I2P

    @@ -89,7 +75,7 @@
  • Проверьте логи
    Логи могут помочь решить проблему. У вас может возникнуть желание запостить часть логов на форум, чтобы получить помощь, или, может быть, на pastebin, чтобы дать ссылку на IRC.
  • -
  • Проверьте свежесть Java
    Убедитесь, что у вас достаточно свежая Java [версия 1.6 рекомендуется и необходима для функционирования некоторых возможностей]. Если у вас не установлена Java, скорее всего, вам требуется какая-нибудь реализация JRE (Java Runtime Engine); если вы программист, SDK так же может быть интересен, и, возможно, Apache Ant, который мы используем для сборки бинарников I2P. +
  • Проверьте свежесть Java
    Убедитесь, что у вас достаточно свежая Java [версия 1.6 рекомендуется и необходима для функционирования некоторых возможностей]. Если у вас не установлена Java, скорее всего, вам требуется какая-нибудь реализация JRE (Java Runtime Environment); если вы программист, SDK так же может быть интересен, и, возможно, Apache Ant, который мы используем для сборки бинарников I2P.
  • Проблемы использования на устаревшем железе
    [Linux/Unix/Solaris] Если вы не можете запустить роутер с помощью i2p/i2prouter start, попробуйте воспользоваться скриптом runplain.sh, который находится в той же директории. Root-привилегии обычно не требуются для запуска I2P. Если вам нужно скомпилировать библиотеку jBigi (что необходимо в редких случаях), изучите соответствующую документацию, посетите форумы, или приходите на наш IRC-канал для разработчиков. @@ -109,3 +95,4 @@
  • Вовлекайтесь!
    I2P разрабатывается и сопровождается в основном за счёт неоплачиваемого, добровольного участия членов сообщества. Мы рады принимать пожертвования, которые идут на необходимые административные затраты и хостинг. Для разработчиков, ищущих материальные стимулы, у нас есть денежные премии за работу над некоторыми аспектами I2P, и мы всегда ищем Java программистов, переводчиков, популяризаторов и пользователей, помогающих I2P расширяться. Чем больше I2P-сеть, тем больше общая выгода, поэтому простой рассказ об I2P своим друзьям (и помощь с установкой и настройкой если нужно) - уже большая помощь. Для получения дальнейшей информации о том, как вы можете принять участие, посетите страницу для добровольцев на официальном сайте.

  • Документ обновлён: декабрь 2010.
    +
    diff --git a/installer/resources/readme/readme_sv.html b/installer/resources/readme/readme_sv.html index e5c3b9ecd..64beb5882 100644 --- a/installer/resources/readme/readme_sv.html +++ b/installer/resources/readme/readme_sv.html @@ -1,17 +1,5 @@
    -
    -
    - English - 中文 - Deutsch - Français - Español - Português - Nederlands - Русский - Svenska
    -
    -

    Welcome to I2P!

    +

    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 se @@ -38,7 +26,7 @@ Freenet proxy

  • paste.i2p2.i2p: anonym och säker pastebin

  • Det finns många fler eepsidor - följ bara länkarna från dom du ser, - spara dina favoriter och besök dom ofta!
    + spara dina favoriter och besök dom ofta!
  • surfa på nätet - 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 #i2p-help, #i2p eller #i2p-chat på IRC på irc.freenode.net, irc.postman.i2p -eller irc.freshcoffee.i2p (de är alla sammankopplade).


    +eller irc.freshcoffee.i2p (de är alla sammankopplade).

  • diff --git a/installer/resources/readme/readme_zh.html b/installer/resources/readme/readme_zh.html index 8e2d7968f..bc083dc81 100644 --- a/installer/resources/readme/readme_zh.html +++ b/installer/resources/readme/readme_zh.html @@ -1,15 +1,5 @@
    -
    -
    English - 中文 - Deutsch - Français - Español - Nederlands - Русский - Svenska
    -
    -

    欢迎使用 I2P!

    +

    I2P 运行后的几分钟里控制台左侧的【活动节点】数量会逐渐增加, 在【本地目标】中出现【共享客户端】后,表示I2P已建立连接(没有出现?见 疑难解答)。 然后您可以:

    @@ -23,7 +13,7 @@
  • echelon.i2p:软件存档及有关I2P的相关文档 (例如 I2P Messenger 基于I2P的匿名聊天工具等) 
  • paste.i2p2.i2p:安全匿名的公共剪贴板

  • - I2P网络中还有很多其他站点 - 访问上面的网站你会找到更多,别忘了收藏你喜爱的 I2P 网站方便访问。
    + I2P网络中还有很多其他站点 - 访问上面的网站你会找到更多,别忘了收藏你喜爱的 I2P 网站方便访问。
  • 浏览 Web 网页 - 目前 IP2 网络中的出口代理("Outproxy")只有一个,它的HTTP代理映射在本机的4444端口上。- 将浏览器的代理设置指向为上述地址(127.0.0.1:4444)后,访问任何普通链接即可 - 您的HTTP请求将在 I2P 网络内部传递。
  • 文件交换 - I2P的其中一个本地 端口 用于内置的 Snark BitTorrent 客户端。
  • 匿名电邮 - 由POSTMAN维护的邮件系统支持普通邮件客户端(POP3 / SMTP),这个系统可以在 I2P 网络内部收发 Email 也可以收发来自外部 Internet 的邮件!建立I2P邮件帐户请到 hq.postman.i2p 申请。I2P中集成有Web界面的pop3/stmp邮件客户端 SUSIMail,并配置为使用POSTMAN 的邮件服务。
  • @@ -42,5 +32,5 @@ #i2p-help, #i2p 或 #i2p-chat -这两个 IRC 频道上询问。 (这些服务器上的这两个频道是相通的)。


    +这两个 IRC 频道上询问。 (这些服务器上的这两个频道是相通的)。

    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 000000000..adbabdad7 --- /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 0d301a879..d7484ad14 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 5bc3cb86b..add6dae6e 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 8921b88c9..b1af23e74 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 fe8b61cb2..426086518 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; + background: url("images/header.png") repeat scroll center center #eef; + letter-spacing: 0em !important; } -/* -.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; -} - -.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 ebc83a598..8f3e3a346 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 cbe675c2b..0c1250863 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 f54cacfca..050c7b28a 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 fbb7006f1..def9fad6d 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 aa9f29f9f..55c8c8f17 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 e36af92a1..6dfee7474 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 6eac37842..000000000 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 1574f5fa2..000000000 --- a/router/doc/techintro.html +++ /dev/null @@ -1,994 +0,0 @@ - - - Introducing I2P - a scalable framework for anonymous communication - - - - -
    -Introducing I2P
    -a scalable framework for anonymous communication
    -$Id: techintro.html,v 1.8.2.1 2006/02/13 07:13:35 jrandom Exp $ -
    -
    - - - - - -
    -
    -* Introduction
    -* Operation
    -  * Overview
    -  * Tunnels
    -  * Network Database
    -  * Transport protocols
    -  * Cryptography
    -
    -
    -
    -* Future
    -  * Restricted routes
    -  * Variable latency
    -  * Open questions
    -
    -
    -
    -* Similar systems
    -  * Tor
    -  * Freenet
    -* Appendix A: Application layer
    -
    -
    -
    - -
    - -

    Introduction

    -

    -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 Syndie), -anonymous chat (via IRC or Jabber), anonymous swarming file transfers (with i2p-bt, I2PSnark, and -Azureus), anonymous file sharing (with -I2Phex), anonymous email (with I2Pmail -and susimail), anonymous newsgroups, as well as several -other applications under development. Unlike web sites hosted within content -distribution networks like Freenet or -GNUnet, 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. -

    - -

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

    - - - - -

    -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 website, 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 (I2PTunnel, -susimail, I2PSnark, Azureus, -I2Phex). Funding -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. -

    - -

    Operation

    -

    Overview

    - -

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

    - -

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

    - -

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

    - - - -

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

    - -

    -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 -"garlic encryption" 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. -

    - -

    -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 streaming library to view I2P as a streams -based network. -

    - -

    Tunnels

    - -

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

    - -

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

    - -

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

    - -

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

    - -

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

    - -

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

    - -

    -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 -tunnel spec. -

    - -

    Network Database

    - -

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

    - -

    -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 pool.ntp.org round robin by default) -and detecting skew between routers at the transport layer. -

    - -

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

    - -

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

    - -

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

    - -

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

    - -

    -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 publishing a given key even more so), all netDb -messages are transmitted through the router's exploratory tunnels. -

    - -

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

    - -

    Transport protocols

    - -

    -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 -SSU spec:

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

    Cryptography

    - -

    -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. -Tunnel 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). -

    - -

    Garlic messages

    - -

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

    - -

    -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 -nontrivial delays 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. -

    - -

    Session tags

    - -

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

    - -

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

    - -

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

    - -

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

    - -

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

    - -

    Future

    -

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

    - -

    Restricted route operation

    - -

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

    - -

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

    - -

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

    - -

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

    - -

    Variable latency

    - -

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

    - -

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

    - -

    Open questions

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

    Similar systems

    -

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

    - -

    Tor

    -

    website

    - -

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

    - -

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

    - -

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

    - -

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

    - -

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

    - -

    Freenet

    -

    website

    - -

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

    - -

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

    - -

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

    - -

    Appendix A: Application layer

    - -

    -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 streaming library as -an implementation of an anonymous and secure TCP layer on top of it. Beyond that, -I2PTunnel 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. -

    - -

    Streaming library

    - -

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

    - -

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

    - -

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

    - -

    Naming library and addressbook

    -

    Developed by: mihi, Ragnarok

    - -

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

    - -

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

    - -

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

    - -

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

    - -

    Syndie

    - -

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

    - -

    I2PTunnel

    -

    Developed by: mihi

    - -

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

    - -

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

    - -

    -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 -I2Pmail's 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. -

    - -

    i2p-bt

    -

    Developed by: duck, et al

    - -

    -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 -streaming lib connection to query them for blocks. -

    - -

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

    - -

    I2PSnark

    -

    I2PSnark developed: jrandom, et al, ported from mjw's Snark client

    - -

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

    - -

    Azureus/azneti2p

    -

    Developed by: parg, et al

    - -

    -The developers of the Azureus 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. -

    - -

    I2Phex

    -

    Developed by: sirup

    - -

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

    - -

    I2Pmail/susimail

    -

    Developed by: postman, susi23, mastiejaner

    - -

    -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 -hq.postman.i2p. -

    - - - diff --git a/router/doc/tunnel-alt-creation.html b/router/doc/tunnel-alt-creation.html deleted file mode 100644 index 0eb4a5d90..000000000 --- a/router/doc/tunnel-alt-creation.html +++ /dev/null @@ -1,163 +0,0 @@ -$Id: tunnel-alt-creation.html,v 1.1.2.1 2006/02/01 20:28:34 jrandom Exp $ -
    -1) Tunnel creation
    -1.1) Tunnel creation request record
    -1.2) Hop processing
    -1.3) Tunnel creation reply record
    -1.4) Request preparation
    -1.5) Request delivery
    -1.6) Endpoint handling
    -1.7) Reply processing
    -2) Notes
    -
    - -

    1) Tunnel creation encryption:

    - -

    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.

    - -

    1.1) Tunnel creation request record

    - -

    Cleartext of the record, visible only to the hop being asked:

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

    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.

    - -

    The flags field currently has two bits defined:

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

    That cleartext record is ElGamal 2048 encrypted with the hop's -public encryption key and formatted into a 528 byte record:

    -  bytes   0-15: SHA-256-128 of the current hop's router identity
    -  bytes 16-527: ElGamal-2048 encrypted request record
    - -

    Since the cleartext uses the full field, there is no need for -additional padding beyond SHA256(cleartext) + cleartext.

    - -

    1.2) Hop processing

    - -

    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.

    - -

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

    - -

    1.3) Tunnel creation reply record

    - -

    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:

    -  AES-256-CBC(SHA-256(padding+status) + padding + status, key, IV)
    - -

    1.4) Request preparation

    - -

    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.

    - -

    The excess records not needed for individual requests are simply -filled with random data by the creator.

    - -

    1.5) Request delivery

    - -

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

    - -

    1.6) Endpoint handling

    - -

    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.

    - -

    When the request reaches the inbound endpoint (also known as the -tunnel creator), the router processes each of the replies, as below.

    - -

    1.7) Reply processing

    - -

    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.

    - -

    2) Notes

    -
      -
    • 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.
    • -
    • 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.
    • -
    • 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?
    • -
    • Are there any nonfatal methods of tagging the request?
    • -
    • 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:
    • -
    diff --git a/router/doc/tunnel-alt.html b/router/doc/tunnel-alt.html deleted file mode 100644 index 2d5f2be2f..000000000 --- a/router/doc/tunnel-alt.html +++ /dev/null @@ -1,467 +0,0 @@ -$Id: tunnel-alt.html,v 1.9 2005/07/27 14:04:07 jrandom Exp $ -
    -1) Tunnel overview
    -2) Tunnel operation
    -2.1) Message preprocessing
    -2.2) Gateway processing
    -2.3) Participant processing
    -2.4) Endpoint processing
    -2.5) Padding
    -2.6) Tunnel fragmentation
    -2.7) Alternatives
    -2.7.1) Adjust tunnel processing midstream
    -2.7.2) Use bidirectional tunnels
    -2.7.3) Backchannel communication
    -2.7.4) Variable size tunnel messages
    -3) Tunnel building
    -3.1) Peer selection
    -3.1.1) Exploratory tunnel peer selection
    -3.1.2) Client tunnel peer selection
    -3.2) Request delivery
    -3.3) Pooling
    -3.4) Alternatives
    -3.4.1) Telescopic building
    -3.4.2) Non-exploratory tunnels for management
    -4) Tunnel throttling
    -5) Mixing/batching
    -
    - -

    1) Tunnel overview

    - -

    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.

    - -

    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.

    - -

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

    - -

    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.

    - -

    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.

    - -

    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.

    - -

    2) Tunnel operation

    - -

    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.

    - -

    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.

    - -

    2.1) Message preprocessing

    - -

    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:

    -
      -
    • 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).
    • -
    • 0 or more bytes containing random nonzero integers
    • -
    • 1 byte containing 0x00
    • -
    • a series of zero or more { instructions, message } pairs
    • -
    - -

    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.

    - -

    With the first bit being 0, the instructions are:

    -
      -
    • 1 byte control byte:
      -      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
    • -
    • if the delivery type was TUNNEL, a 4 byte tunnel ID
    • -
    • if the delivery type was TUNNEL or ROUTER, a 32 byte router hash
    • -
    • if the delay included flag is true, a 1 byte value:
      -      bit 0: type (0 = strict, 1 = randomized)
      -   bits 1-7: delay exponent (2^value minutes)
    • -
    • if the fragmented flag is true, a 4 byte message ID
    • -
    • if the extended options flag is true:
      -   = a 1 byte option size (in bytes)
      -   = that many bytes
    • -
    • 2 byte size of the I2NP message or this fragment
    • -
    - -

    If the first bit being 1, the instructions are:

    -
      -
    • 1 byte control byte:
      -      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)
    • -
    • 4 byte message ID (same one defined in the first fragment)
    • -
    • 2 byte size of this fragment
    • -
    - -

    The I2NP message is encoded in its standard form, and the -preprocessed payload must be padded to a multiple of 16 bytes.

    - -

    2.2) Gateway processing

    - -

    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.

    - -

    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.

    - -

    2.3) Participant processing

    - -

    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.

    - -

    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.

    - -

    2.4) Endpoint processing

    - -

    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.

    - -

    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.

    - -

    2.5) Padding

    - -

    Several tunnel padding strategies are possible, each with their own merits:

    - -
      -
    • No padding
    • -
    • Padding to a random size
    • -
    • Padding to a fixed size
    • -
    • Padding to the closest KB
    • -
    • Padding to the closest exponential size (2^n bytes)
    • -
    - -

    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 statistics -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).

    - -

    2.6) Tunnel fragmentation

    - -

    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.

    - -

    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.

    - -

    2.7) Alternatives

    - -

    2.7.1) Adjust tunnel processing midstream

    - -

    While the simple tunnel routing algorithm should be sufficient for most cases, -there are three alternatives that can be explored:

    -
      -
    • 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.
    • -
    • 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.
    • -
    • Implement code for the tunnel creator to redefine a peer's "next hop" in -the tunnel, allowing further dynamic redirection.
    • -
    - -

    2.7.2) Use bidirectional tunnels

    - -

    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.

    - -

    2.7.3) Backchannel communication

    - -

    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)

    - -

    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.

    - -

    2.7.4) Variable size tunnel messages

    - -

    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.

    - -

    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.

    - -

    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.

    - -

    3) Tunnel building

    - -

    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.

    - -

    3.1) Peer selection

    - -

    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.

    - -

    3.1.1) Exploratory tunnel peer selection

    - -

    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.

    - -

    3.1.2) Client tunnel peer selection

    - -

    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.

    - -

    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.

    - -

    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.

    - -

    3.2) Request delivery

    - -

    A new tunnel request preparation, delivery, and response method has been -devised, 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 alternative.

    - -

    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.

    - -

    3.3) Pooling

    - -

    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.

    - -

    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.

    - -

    3.4) Alternatives

    - -

    3.4.1) Telescopic building

    - -

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

    - -

    3.4.2) Non-exploratory tunnels for management

    - -

    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.

    - -

    3.4.3) Exploratory request delivery

    - -

    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.

    - -

    4) Tunnel throttling

    - -

    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.

    - -

    5) Mixing/batching

    - -

    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 -I2P 3.0

    diff --git a/router/doc/tunnel.html b/router/doc/tunnel.html deleted file mode 100644 index a15d19c12..000000000 --- a/router/doc/tunnel.html +++ /dev/null @@ -1,529 +0,0 @@ -Note: NOT used! see tunnel-alt.html - -$Id: tunnel.html,v 1.10 2005/01/16 01:07:07 jrandom Exp $ -
    -1) Tunnel overview
    -2) Tunnel operation
    -2.1) Message preprocessing
    -2.2) Gateway processing
    -2.3) Participant processing
    -2.4) Endpoint processing
    -2.5) Padding
    -2.6) Tunnel fragmentation
    -2.7) Alternatives
    -2.7.1) Don't use a checksum block
    -2.7.2) Adjust tunnel processing midstream
    -2.7.3) Use bidirectional tunnels
    -2.7.4) Use smaller hashes
    -3) Tunnel building
    -3.1) Peer selection
    -3.1.1) Exploratory tunnel peer selection
    -3.1.2) Client tunnel peer selection
    -3.2) Request delivery
    -3.3) Pooling
    -3.4) Alternatives
    -3.4.1) Telescopic building
    -3.4.2) Non-exploratory tunnels for management
    -4) Tunnel throttling
    -5) Mixing/batching
    -
    - -

    1) Tunnel overview

    - -

    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.

    - -

    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.

    - -

    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.

    - -

    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.

    - -

    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.

    - -

    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.

    - -

    2) Tunnel operation

    - -

    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.

    - -

    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.

    - -

    2.1) Message preprocessing

    - -

    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:

    -
      -
    • 2 byte unsigned integer specifying the # of padding bytes
    • -
    • that many random bytes
    • -
    • a series of zero or more { instructions, message } pairs
    • -
    - -

    The instructions are encoded as follows:

    -
      -
    • 1 byte value:
      -   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
    • -
    • if the delivery type was TUNNEL, a 4 byte tunnel ID
    • -
    • if the delivery type was TUNNEL or ROUTER, a 32 byte router hash
    • -
    • if the delay included flag is true, a 1 byte value:
      -      bit 0: type (0 = strict, 1 = randomized)
      -   bits 1-7: delay exponent (2^value minutes)
    • -
    • if the fragmented flag is true, a 4 byte message ID, and a 1 byte value:
      -   bits 0-6: fragment number
      -      bit 7: is last?  (1 = true, 0 = false)
    • -
    • if the extended options flag is true:
      -   = a 1 byte option size (in bytes)
      -   = that many bytes
    • -
    • 2 byte size of the I2NP message
    • -
    - -

    The I2NP message is encoded in its standard form, and the -preprocessed payload must be padded to a multiple of 16 bytes.

    - -

    2.2) Gateway processing

    - -

    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.

    - -

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

    - -

    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:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    IVPayloadeH[0]eH[1]eH[2]eH[3]eH[4]eH[5]eH[6]eH[7]V
    peer0
    key=K[0]
    recv
    sendIV[0]P[0]H(P[0])V[0]
    peer1
    key=K[1]
    recv
    sendIV[1]P[1]H(P[1])V[1]
    peer2
    key=K[2]
    recv
    sendIV[2]P[2]H(P[2])V[2]
    peer3
    key=K[3]
    recv
    sendIV[3]P[3]H(P[3])V[3]
    peer4
    key=K[4]
    recv
    sendIV[4]P[4]H(P[4])V[4]
    peer5
    key=K[5]
    recv
    sendIV[5]P[5]H(P[5])V[5]
    peer6
    key=K[6]
    recv
    sendIV[6]P[6]H(P[6])V[6]
    peer7
    key=K[7]
    recv
    sendIV[7]P[7]H(P[7])V[7]
    - -

    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.

    - -

    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]).

    - -

    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.

    - -

    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.

    - -

    2.3) Participant processing

    - -

    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.

    - -

    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.

    - -

    2.4) Endpoint processing

    - -

    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.

    - -

    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.

    - -

    2.5) Padding

    - -

    Several tunnel padding strategies are possible, each with their own merits:

    - -
      -
    • No padding
    • -
    • Padding to a random size
    • -
    • Padding to a fixed size
    • -
    • Padding to the closest KB
    • -
    • Padding to the closest exponential size (2^n bytes)
    • -
    - -

    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?

    - -

    2.6) Tunnel fragmentation

    - -

    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.

    - -

    2.7) Alternatives

    - -

    2.7.1) Don't use a checksum block

    - -

    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.

    - -

    2.7.2) Adjust tunnel processing midstream

    - -

    While the simple tunnel routing algorithm should be sufficient for most cases, -there are three alternatives that can be explored:

    -
      -
    • 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.
    • -
    • 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.
    • -
    • Implement code for the tunnel creator to redefine a peer's "next hop" in -the tunnel, allowing further dynamic redirection.
    • -
    - -

    2.7.3) Use bidirectional tunnels

    - -

    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.

    - -

    2.7.4) Use smaller blocksize

    - -

    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.

    - -

    3) Tunnel building

    - -

    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.

    - -

    3.1) Peer selection

    - -

    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.

    - -

    3.1.1) Exploratory tunnel peer selection

    - -

    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.

    - -

    3.1.2) Client tunnel peer selection

    - -

    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.

    - -

    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.

    - -

    3.2) Request delivery

    - -

    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.

    - -

    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.

    - -

    3.3) Pooling

    - -

    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.

    - -

    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.

    - -

    3.4) Alternatives

    - -

    3.4.1) Telescopic building

    - -

    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 TOR. 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 2.7.2) for a random -number of messages before continuing on to build the next hop.

    - -

    3.4.2) Non-exploratory tunnels for management

    - -

    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.

    - -

    4) Tunnel throttling

    - -

    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.

    - -

    5) Mixing/batching

    - -

    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 -I2P 3.0

    diff --git a/router/doc/udp.html b/router/doc/udp.html deleted file mode 100644 index 4a855ece9..000000000 --- a/router/doc/udp.html +++ /dev/null @@ -1,759 +0,0 @@ -$Id: udp.html,v 1.19 2006/02/15 00:33:32 jrandom Exp $ - -

    Secure Semireliable UDP (SSU)

    -DRAFT - -

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

    - -

    Addressing and introduction

    - -

    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.

    - -
    -    Direct: ssu://host:port/introKey[?opts=[A-Z]*]
    -  Indirect: ssu://tag@relayhost:port/relayIntroKey/targetIntroKey[?opts=[A-Z]*]
    -
    - -

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

    - -

    Each of the addresses may also expose a series of options - special -capabilities of that particular peer. For a list of available -capabilities, see below.

    - -

    Header

    - -

    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:

    -
    -  HMAC-MD5(payload || IV || (payloadLength ^ protocolVersion), macKey)
    -
    - -

    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.

    - -

    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.

    - -

    Payload

    - -

    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:

    -
    -  bits 0-3: payload type
    -     bit 4: rekey?
    -     bit 5: extended options included
    -  bits 6-7: reserved
    -
    - -

    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.

    - -

    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.

    - -
    - Header: 37+ bytes
    - +----+----+----+----+----+----+----+----+
    - |                  MAC                  |
    - |                                       |
    - +----+----+----+----+----+----+----+----+
    - |                   IV                  |
    - |                                       |
    - +----+----+----+----+----+----+----+----+
    - |flag|        time       | (optionally  |
    - +----+----+----+----+----+              |
    - | this may have 64 byte keying material |
    - | and/or a one+N byte extended options) |
    - +---------------------------------------|
    -
    - -

    Messages

    - -

    SessionRequest (type 0)

    - - - - - - - -
    Peer:Alice to Bob
    Data:
      -
    • 256 byte X, to begin the DH agreement
    • -
    • 1 byte IP address size
    • -
    • that many byte representation of Bob's IP address
    • -
    • N bytes, currently uninterpreted (later, for challenges)
    • -
    Key used:introKey
    - -
    - +----+----+----+----+----+----+----+----+
    - |         X, as calculated from DH      |
    - |                                       |
    -                 .   .   .               
    - |                                       |
    - +----+----+----+----+----+----+----+----+
    - |size| that many byte IP address (4-16) |
    - +----+----+----+----+----+----+----+----+
    - |           arbitrary amount            |
    - |        of uninterpreted data          |
    -                 .   .   .               
    - |                                       |
    - +----+----+----+----+----+----+----+----+
    -
    - -

    SessionCreated (type 1)

    - - - - - - - -
    Peer:Bob to Alice
    Data:
      -
    • 256 byte Y, to complete the DH agreement
    • -
    • 1 byte IP address size
    • -
    • that many byte representation of Alice's IP address
    • -
    • 2 byte port number (unsigned, big endian 2s complement)
    • -
    • 4 byte relay tag which Alice can publish (else 0x0)
    • -
    • 4 byte timestamp (seconds from the epoch) for use in the DSA - signature
    • -
    • 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.
    • -
    • 8 bytes padding, encrypted with an additional layer of encryption - using the negotiated session key as part of the DSA block
    • -
    • N bytes, currently uninterpreted (later, for challenges)
    • -
    Key used:introKey, with an additional layer of encryption over the 40 byte - signature and the following 8 bytes padding.
    - -
    - +----+----+----+----+----+----+----+----+
    - |         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          |
    -                 .   .   .               
    - |                                       |
    - +----+----+----+----+----+----+----+----+
    -
    - -

    SessionConfirmed (type 2)

    - - - - - - - -
    Peer:Alice to Bob
    Data:
      -
    • 1 byte identity fragment info:
      -bits 0-3: current identity fragment #
      -bits 4-7: total identity fragments
    • -
    • 2 byte size of the current identity fragment
    • -
    • that many byte fragment of Alice's identity.
    • -
    • 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)
    • -
    Key used:sessionKey
    - -
    - Fragment 1 through N-1
    - +----+----+----+----+----+----+----+----+
    - |info| cursize |                        |
    - +----+----+----+                        |
    - |      fragment of Alice's full         |
    - |            identity keys              |
    -                 .   .   .               
    - |                                       |
    - +----+----+----+----+----+----+----+----+
    - 
    - Fragment N:
    - +----+----+----+----+----+----+----+----+
    - |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                         |
    - |                                       |
    - |                                       |
    - |                                       |
    - |                                       |
    - +----+----+----+----+----+----+----+----+
    -
    - -

    RelayRequest (type 3)

    - - - - - - - -
    Peer:Alice to Bob
    Data:
      -
    • 4 byte relay tag
    • -
    • 1 byte IP address size
    • -
    • that many byte representation of Alice's IP address
    • -
    • 2 byte port number (of Alice)
    • -
    • 1 byte challenge size
    • -
    • that many bytes to be relayed to Charlie in the intro
    • -
    • Alice's intro key (so Bob can reply with Charlie's info)
    • -
    • 4 byte nonce of alice's relay request
    • -
    • N bytes, currently uninterpreted
    • -
    Key used:introKey (or sessionKey, if Alice/Bob is established)
    - -
    - +----+----+----+----+----+----+----+----+
    - |      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|
    - +----+----+----+----+----+----+----+----+
    -
    - -

    RelayResponse (type 4)

    - - - - - - - -
    Peer:Bob to Alice
    Data:
      -
    • 1 byte IP address size
    • -
    • that many byte representation of Charlie's IP address
    • -
    • 2 byte port number
    • -
    • 1 byte IP address size
    • -
    • that many byte representation of Alice's IP address
    • -
    • 2 byte port number
    • -
    • 4 byte nonce sent by Alice
    • -
    • N bytes, currently uninterpreted
    • -
    Key used:introKey (or sessionKey, if Alice/Bob is established)
    - -
    - +----+----+----+----+----+----+----+----+
    - |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|
    - +----+----+----+----+----+----+----+----+
    -
    - -

    RelayIntro (type 5)

    - - - - - - - -
    Peer:Bob to Charlie
    Data:
      -
    • 1 byte IP address size
    • -
    • that many byte representation of Alice's IP address
    • -
    • 2 byte port number (of Alice)
    • -
    • 1 byte challenge size
    • -
    • that many bytes relayed from Alice
    • -
    • N bytes, currently uninterpreted
    • -
    Key used:sessionKey
    - -
    - +----+----+----+----+----+----+----+----+
    - |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|
    - +----+----+----+----+----+----+----+----+
    -
    - -

    Data (type 6)

    - - - - - - - -
    Peer:Any
    Data:
      -
    • 1 byte flags:
      -   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
    • -
    • if explicit ACKs are included:
        -
      • a 1 byte number of ACKs
      • -
      • that many 4 byte MessageIds being fully ACKed
      • -
    • -
    • if ACK bitfields are included:
        -
      • a 1 byte number of ACK bitfields
      • -
      • 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:
        -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)
      • -
    • -
    • If extended data included:
        -
      • 1 byte data size
      • -
      • that many bytes of extended data (currently uninterpreted)
      • -
      • 1 byte number of fragments
      • -
      • that many message fragments:
          -
        • 4 byte messageId
        • -
        • 3 byte fragment info:
          -  bits 0-6: fragment #
          -     bit 7: isLast (1 = true)
          -  bits 8-9: unused
          -bits 10-23: fragment size
        • -
        • that many bytes
        -
      • N bytes padding, uninterpreted
      • -
    Key used:sessionKey
    - -
    - +----+----+----+----+----+----+----+----+
    - |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|
    - +----+----+----+----+----+----+----+----+
    -
    - -

    PeerTest (type 7)

    - - - - - - - -
    Peer:Any
    Data:
      -
    • 4 byte nonce
    • -
    • 1 byte IP address size
    • -
    • that many byte representation of Alice's IP address
    • -
    • 2 byte port number
    • -
    • Alice's introduction key
    • -
    • N bytes, currently uninterpreted
    • -
    Key used:introKey (or sessionKey if the connection has already been established)
    - -
    - +----+----+----+----+----+----+----+----+
    - |    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                    |
    - +----+----+----+----+----+----+----+----+
    -
    - -

    Congestion control

    - -

    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.

    - -

    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.

    - -

    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.

    - -

    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.

    - -

    Keys

    - -

    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.

    - -

    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.

    - -

    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.

    - -

    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.

    - -

    For the DH key agreement, -RFC3526 2048bit -MODP group (#14) is used:

    -
    -  p = 2^2048 - 2^1984 - 1 + 2^64 * { [2^1918 pi] + 124476 }
    -  g = 2
    -
    - -

    The DSA p, q, and g are shared according to the scope of the -identity which created them.

    - -

    Replay prevention

    - -

    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.

    - -

    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.

    - -

    Introduction

    - -

    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.

    - - - -

    Peer testing

    - -

    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:

    - -
    -        Alice                  Bob                  Charlie
    -    PeerTest ------------------->
    -                             PeerTest-------------------->
    -                                <-------------------PeerTest
    -         <-------------------PeerTest
    -         <------------------------------------------PeerTest
    -    PeerTest------------------------------------------>
    -         <------------------------------------------PeerTest
    -
    - -

    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:

    - -
      -
    • 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.
    • - -
    • 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).
    • - -
    • 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.
    • - -
    • 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.
    • -
    - -

    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.

    - -

    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.

    - -

    Message sequences

    - -

    Connection establishment (direct)

    - -
    -        Alice                         Bob
    -    SessionRequest--------------------->
    -          <---------------------SessionCreated
    -    SessionConfirmed------------------->
    -    SessionConfirmed------------------->
    -    SessionConfirmed------------------->
    -    SessionConfirmed------------------->
    -          <--------------------------Data
    -
    - -

    Connection establishment (indirect)

    - -
    -        Alice                         Bob                  Charlie
    -    RelayRequest ---------------------->
    -         <--------------RelayResponse    RelayIntro----------->
    -         <--------------------------------------------Data (ignored)
    -    SessionRequest-------------------------------------------->
    -         <--------------------------------------------SessionCreated
    -    SessionConfirmed------------------------------------------>
    -    SessionConfirmed------------------------------------------>
    -    SessionConfirmed------------------------------------------>
    -    SessionConfirmed------------------------------------------>
    -         <---------------------------------------------------Data
    -
    - -

    Sample datagrams

    - -Minimal data message (no fragments, no ACKs, no NACKs, etc)
    -(Size: 39 bytes) - -
    - +----+----+----+----+----+----+----+----+
    - |                  MAC                  |
    - |                                       |
    - +----+----+----+----+----+----+----+----+
    - |                   IV                  |
    - |                                       |
    - +----+----+----+----+----+----+----+----+
    - |flag|        time       |flag|#frg|    |
    - +----+----+----+----+----+----+----+    |
    - |  padding to fit a full AES256 block   |
    - +----+----+----+----+----+----+----+----+
    -
    - -Minimal data message with payload
    -(Size: 46+fragmentSize bytes) - -
    - +----+----+----+----+----+----+----+----+
    - |                  MAC                  |
    - |                                       |
    - +----+----+----+----+----+----+----+----+
    - |                   IV                  |
    - |                                       |
    - +----+----+----+----+----+----+----+----+
    - |flag|        time       |flag|#frg| 
    - +----+----+----+----+----+----+----+----+
    -   messageId    |   frag info  |         |
    - +----+----+----+----+----+----+         |
    - | that many bytes of fragment data      |
    -                  .  .  .                                       
    - |                                       |
    - +----+----+----+----+----+----+----+----+
    -
    - -

    Peer capabilities

    - -
    -
    B
    -
    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'.
    -
    C
    -
    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.
    -
    diff --git a/router/doc/udp.png b/router/doc/udp.png deleted file mode 100644 index b4fd6241a..000000000 Binary files a/router/doc/udp.png and /dev/null differ diff --git a/router/java/build.xml b/router/java/build.xml index 69f6b4109..e157dd255 100644 --- a/router/java/build.xml +++ b/router/java/build.xml @@ -35,20 +35,51 @@ - + + - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/router/java/src/net/i2p/data/i2np/DatabaseStoreMessage.java b/router/java/src/net/i2p/data/i2np/DatabaseStoreMessage.java index 0a2ee498b..b0a4cfc6d 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 6b4ab71f4..eebb05f7e 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 * + *
          *  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)
    +     *
    * * @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 + * + *
    +     *  Specifically:
    +     *    1 byte type (if caller didn't read already, as specified by the type param
    +     *    4 byte ID
    +     *    8 byte expiration
    +     *    2 byte size
    +     *    1 byte checksum
    +     *    size bytes of payload (read by readMessage() in implementation)
    +     *
    + * + * @param type the message type or -1 if we should read it here + * @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 1ac01d0a6..ef4930594 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 d401f1532..8027ac007 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 ec7820d69..5b5a228a1 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 f4dfd0e44..750c76915 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 6031cf630..0f06f507c 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 47b799da5..d6067b2b3 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 f56b25f9e..7f5cb008f 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 _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 _readyJobs; + private final BlockingQueue _readyJobs; /** list of jobs that are scheduled for running in the future */ - private List _timedJobs; + private final List _timedJobs; /** job name to JobStat for that job */ private final Map _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 { * false 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 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 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 ca0ee3f1b..e9b0d08fb 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 19362cff3..f9cfdc9cc 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 d979074a6..fd410f131 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 fd0e85a9e..0e0b4e5d6 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 _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 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 b673702a1..b61916612 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 d8d316ae8..43f618bc2 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 50b9d5364..741f94953 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 findNearestRouters(Hash key, int maxNumRouters, Set 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 72f262cc5..07fd8259c 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 _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 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 8e057ff49..6b5ddfaab 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 5904d04ea..eee3ac866 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 06337f5a6..3f7b62960 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 cb3c63662..4ac21fce5 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 _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 d3d3129af..777cc1a6a 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 f2522cd4e..a411b0099 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 14dc01c1e..482f3b3ed 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 f675d1056..a5c1c1c42 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 _entries; + private final Log _log; + private final RouterContext _context; + private final Map _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 5a00f154c..86cbef8fe 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 ae894cf14..64fa30d0d 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 8bef2776d..88c1a8ede 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 _messages; + private final Map _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 _acceptedPending; + private final Set _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 a534bdfb1..6f4d4414f 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("Local destinations
    "); @@ -479,6 +486,7 @@ class ClientManager { buf.append("\n
    \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 e4b6b2a36..35492936c 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 758e8221e..aac9b68e0 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 0dc053a33..8d423ef0b 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 8c414edcd..5df375256 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 b23d4ac9a..93af2714c 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 1db82eddb..9f435c3bd 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 31192dbcf..b56ed291c 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 5013ab409..def373cf7 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 32959b3a4..d879cb5fc 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 9025fd22b..0ba55213e 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 bfa094199..fc22cadfa 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 a5e8368d3..fb92898c8 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 c67eeaa4a..5ded790ab 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 ce907ae71..8cdc87e6f 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 a61f947a5..183d1da04 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 b4b55f3f8..ab064e2b0 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 getKeys(); + /** @since 0.8.3 */ + public Collection getEntries(); + /** @since 0.8.3 */ + public Set> 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 7d4be1336..6ea401d66 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 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 selectKeysToExpire() { + Set toExpire = new HashSet(128); + for (Map.Entry 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 1d7de0138..60bfb6e3a 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 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 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 20572667e..34b0e4e2b 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 bfa5c59ea..1cecc2074 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 3964b3a1e..04683309a 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 540173ed6..5ba670135 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 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 4eb4e4825..9c4093899 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 selectNearestExplicitThin(Hash key, int maxNumRouters, Set 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 selectFloodfillParticipants(KBucketSet kbuckets) { - Set ignore = new HashSet(1); - ignore.add(_context.routerHash()); + Set ignore = Collections.singleton(_context.routerHash()); return selectFloodfillParticipants(ignore, kbuckets); } @@ -104,6 +107,8 @@ class FloodfillPeerSelector extends PeerSelector { */ private List selectFloodfillParticipants(Set 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 selectFloodfillParticipants(Hash key, int maxNumRouters, KBucketSet kbuckets) { - Set ignore = new HashSet(1); - ignore.add(_context.routerHash()); + Set ignore = Collections.singleton(_context.routerHash()); return selectFloodfillParticipants(key, maxNumRouters, ignore, kbuckets); } @@ -147,8 +151,7 @@ class FloodfillPeerSelector extends PeerSelector { */ List selectFloodfillParticipants(Hash key, int howMany, Set 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 get(int howMany, boolean preferConnected) { - Collections.shuffle(_floodfillMatches, _context.random()); List rv = new ArrayList(howMany); List badff = new ArrayList(howMany); List 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 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 14969df83..babd35dd2 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 toSkip) { + public FloodfillStoreJob(RouterContext context, FloodfillNetworkDatabaseFacade facade, Hash key, DatabaseEntry data, Job onSuccess, Job onFailure, long timeoutMs, Set 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 fa944f384..c7dca1271 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 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 4e3c9c30c..1409ecc2a 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 ea53c1566..a546ad7a2 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 7ced65ed0..48ddc4f2c 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 568a283f9..bd7c62fde 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 f576d967c..c630e2e9d 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 0ae718104..7a3b7741a 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 getAllRouters() { if (!_initialized) return Collections.EMPTY_SET; - Set keys = _ds.getKeys(); - Set 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> entries = _ds.getMapEntries(); + Set rv = new HashSet(entries.size()); + for (Map.Entry 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 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 b4cef3621..3c82810e1 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 2a6d88900..49dbc8b8f 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 429489cf0..ad938e7ed 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_keys; + private final Map_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> iter = _keys.entrySet().iterator(); + Iterator> iter = _keys.entrySet().iterator(); try { - Map.Entry entry = iter.next(); + Map.Entry 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 223dd70f8..239fd4772 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 9400a17f6..739a7c148 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 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 6fe5831dd..25d86acf1 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 b5a824472..22602b497 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 ad8217c6a..c1a849429 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 toSkip) { + DatabaseEntry data, Job onSuccess, Job onFailure, long timeoutMs, Set 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 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 eb131fdfc..9666c09be 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 _pendingPeers; private Map _pendingPeerTimes; private Map _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 toSkip) { + public StoreState(RouterContext ctx, Hash key, DatabaseEntry data, Set 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 getPending() { synchronized (_pendingPeers) { return (Set)_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 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 d5e10738c..e0a3a2a63 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 _data; + private ConcurrentHashMap _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 getEntries() { + return _data.values(); + } + + /** + * @return not a copy + * @since 0.8.3 + */ + public Set> 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 e : _data.entrySet()) { + for (Map.Entry 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 3c2b9d2d2..71dbefc6e 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 { 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 dd11c4ae2..6bb816985 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 4f225ec97..3e1c0b075 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 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 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 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 iter = urlList.iterator(); iter.hasNext() && fetched < 200; ) { + for (Iterator 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 99fb99fd8..000000000 --- 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 891ca88c4..96570260c 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 36b9bc9a3..3c5eb077e 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 f306b1995..14437e4bf 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; +class IntegrationCalculator { - public IntegrationCalculator(RouterContext context) { - _context = context; - _log = context.logManager().getLog(IntegrationCalculator.class); - } - - @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 bfe038e8c..8a7ea723d 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 _peersByCapability[]; + private final Log _log; + private final RouterContext _context; + private final ProfileOrganizer _organizer; + private final ProfilePersistenceHelper _persistenceHelper; + private final Set _peersByCapability[]; private final Map _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 selectPeers(PeerSelectionCriteria criteria) { Set peers = new HashSet(criteria.getMinimumRequired()); + // not a singleton, SANFP adds to it Set 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 6f7fe54bb..034f559ae 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 11e8cacb8..1d5fe3a84 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 712a3cba6..5a0a69f0b 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 03b49269f..a63dd9769 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 _fastPeers; + private final Map _fastPeers; /** H(routerIdentity) to PeerProfile for all peers that have high capacities */ - private Map _highCapacityPeers; + private final Map _highCapacityPeers; /** H(routerIdentity) to PeerProfile for all peers that well integrated into the network and not failing horribly */ - private Map _wellIntegratedPeers; + private final Map _wellIntegratedPeers; /** H(routerIdentity) to PeerProfile for all peers that are not failing horribly */ - private Map _notFailingPeers; + private final Map _notFailingPeers; /** H(routerIdnetity), containing elements in _notFailingPeers */ - private List _notFailingPeersList; + private final List _notFailingPeersList; /** H(routerIdentity) to PeerProfile for all peers that ARE failing horribly (but that we haven't dropped reference to yet) */ - private Map _failingPeers; + private final Map _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 _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 exclude, Set 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 exclude, Set 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: + *
    +     *    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
    +     *
    + */ + public void selectFastPeers(int howMany, Set exclude, Set 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 exclude, Set 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 exclude, Set 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 exclude, Set 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 exclude, Set 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 exclude, Set matches) { selectNotFailingPeers(howMany, exclude, matches, false, 0); } + + /** + * @param mask ignored, should call locked_selectPeers, to be fixed + */ public void selectNotFailingPeers(int howMany, Set exclude, Set matches, int mask) { selectNotFailingPeers(howMany, exclude, matches, false, mask); } + public void selectNotFailingPeers(int howMany, Set exclude, Set 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 exclude, Set 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 exclude, Set matches, int mask) { if (matches.size() < howMany) { @@ -442,6 +528,7 @@ public class ProfileOrganizer { public void selectAllNotFailingPeers(int howMany, Set exclude, Set 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 peers, int howMany, Set toExclude, Set 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 peers, int howMany, Set toExclude, Set 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 all = new ArrayList(peers.keySet()); Set 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 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: + *
    +     *    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
    +     *
    + */ + private void locked_selectPeers(Map peers, int howMany, Set toExclude, Set matches, Hash randomKey, int subTierMode) { + List all = new ArrayList(peers.keySet()); + // use RandomIterator to avoid shuffling the whole thing + for (Iterator 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 e012fab49..af0167f20 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 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 files = selectFiles(); + Set 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 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 c5ac1c3c5..cf1b7f069 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 { +class SpeedCalculator { - public SpeedCalculator(RouterContext context) { - } - - @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 208415ca0..63f3741d4 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 1a8249798..a1f414ac2 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 false if a directory is empty, or contains nothing besides a subdirectory named plugins */ + /** + * Tests if dir has been set up as a I2P working directory.
    + * Returns false if a directory is empty, or contains nothing besides + * subdirectories named plugins and/or logs.
    + * Returns true if the directory contains something not named + * plugins or logs.
    + * 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 094f526c7..780a25d6b 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(""); boolean found = _context.netDb().lookupRouterInfoLocally(peer) != null; if (found) - buf.append(""); + buf.append(""); buf.append(h); if (found) buf.append(""); diff --git a/router/java/src/net/i2p/router/transport/FIFOBandwidthLimiter.java b/router/java/src/net/i2p/router/transport/FIFOBandwidthLimiter.java index 112d36601..c02454783 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 _pendingInboundRequests; private final List _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 satisfiedBuffer; + final List 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 2065cdc28..bc8dd1852 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 85a89b3c6..1593487cf 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 _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 55f8cdb79..e014cc641 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 7ac7d05b2..fef585022 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 a682840b1..81cf89340 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 _transports; - private RouterContext _context; - private UPnPManager _upnpManager; + private final Map _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 d13a51cec..fe3ad0377 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 portsToForward; /** List of ports we have actually forwarded */ - private Set portsForwarded; + private final Set 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; iService: "); + sb.append("
  • ").append(_("Service")).append(": "); if("urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1".equals(serv.getServiceType())){ - sb.append("WAN Common Interface Config
      "); - sb.append("
    • Status: " + toString("GetCommonLinkProperties", "NewPhysicalLinkStatus", serv)); - sb.append("
    • Type: " + toString("GetCommonLinkProperties", "NewWANAccessType", serv)); - sb.append("
    • Upstream: " + toString("GetCommonLinkProperties", "NewLayer1UpstreamMaxBitRate", serv)); - sb.append("
    • Downstream: " + toString("GetCommonLinkProperties", "NewLayer1DownstreamMaxBitRate", serv) + "
      "); + sb.append(_("WAN Common Interface Configuration")); + sb.append("
      • ").append(_("Status")).append(": " + toString("GetCommonLinkProperties", "NewPhysicalLinkStatus", serv)); + sb.append("
      • ").append(_("Type")).append(": " + toString("GetCommonLinkProperties", "NewWANAccessType", serv)); + sb.append("
      • ").append(_("Upstream")).append(": " + toString("GetCommonLinkProperties", "NewLayer1UpstreamMaxBitRate", serv)); + sb.append("
      • ").append(_("Downstream")).append(": " + toString("GetCommonLinkProperties", "NewLayer1DownstreamMaxBitRate", serv) + "
        "); }else if("urn:schemas-upnp-org:service:WANPPPConnection:1".equals(serv.getServiceType())){ - sb.append("WAN PPP Connection
          "); - sb.append("
        • Status: " + toString("GetStatusInfo", "NewConnectionStatus", serv)); - sb.append("
        • Type: " + toString("GetConnectionTypeInfo", "NewConnectionType", serv)); - sb.append("
        • Upstream: " + toString("GetLinkLayerMaxBitRates", "NewUpstreamMaxBitRate", serv)); - sb.append("
        • Downstream: " + toString("GetLinkLayerMaxBitRates", "NewDownstreamMaxBitRate", serv) + "
          "); - sb.append("
        • External IP: " + toString("GetExternalIPAddress", "NewExternalIPAddress", serv) + "
          "); + sb.append(_("WAN PPP Connection")); + sb.append("
          • ").append(_("Status")).append(": " + toString("GetStatusInfo", "NewConnectionStatus", serv)); + sb.append("
          • ").append(_("Type")).append(": " + toString("GetConnectionTypeInfo", "NewConnectionType", serv)); + sb.append("
          • ").append(_("Upstream")).append(": " + toString("GetLinkLayerMaxBitRates", "NewUpstreamMaxBitRate", serv)); + sb.append("
          • ").append(_("Downstream")).append(": " + toString("GetLinkLayerMaxBitRates", "NewDownstreamMaxBitRate", serv) + "
            "); + sb.append("
          • ").append(_("External IP")).append(": " + toString("GetExternalIPAddress", "NewExternalIPAddress", serv) + "
            "); }else if("urn:schemas-upnp-org:service:Layer3Forwarding:1".equals(serv.getServiceType())){ - sb.append("Layer 3 Forwarding
              "); - sb.append("
            • Default Connection Service: " + toString("GetDefaultConnectionService", "NewDefaultConnectionService", serv)); + sb.append(_("Layer 3 Forwarding")); + sb.append("
              • ").append(_("Default Connection Service")).append(": " + toString("GetDefaultConnectionService", "NewDefaultConnectionService", serv)); }else if(WAN_IP_CONNECTION.equals(serv.getServiceType())){ - sb.append("WAN IP Connection
                  "); - sb.append("
                • Status: " + toString("GetStatusInfo", "NewConnectionStatus", serv)); - sb.append("
                • Type: " + toString("GetConnectionTypeInfo", "NewConnectionType", serv)); - sb.append("
                • External IP: " + toString("GetExternalIPAddress", "NewExternalIPAddress", serv) + "
                  "); + sb.append(_("WAN IP Connection")); + sb.append("
                  • ").append(_("Status")).append(": " + toString("GetStatusInfo", "NewConnectionStatus", serv)); + sb.append("
                  • ").append(_("Type")).append(": " + toString("GetConnectionTypeInfo", "NewConnectionType", serv)); + sb.append("
                  • ").append(_("External IP")).append(": " + toString("GetExternalIPAddress", "NewExternalIPAddress", serv) + "
                    "); }else if("urn:schemas-upnp-org:service:WANEthernetLinkConfig:1".equals(serv.getServiceType())){ - sb.append("WAN Ethernet Link Config
                      "); - sb.append("
                    1. Status: " + toString("GetEthernetLinkStatus", "NewEthernetLinkStatus", serv) + "
                      "); + sb.append(_("WAN Ethernet Link Configuration")); + sb.append("
                      • ").append(_("Status")).append(": " + toString("GetEthernetLinkStatus", "NewEthernetLinkStatus", serv) + "
                        "); }else sb.append("~~~~~~~ "+serv.getServiceType() + "
                          "); //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("

                          ").append(_("Found Device")).append(": "); else - sb.append("

                        • Subdevice: "); + sb.append("
                        • ").append(_("Subdevice")).append(": "); sb.append(dev.getFriendlyName()); + if (prefix == null) + sb.append("

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

                          UPnP Status

                          "); + sb.append("

                          ").append(_("UPnP Status")).append("

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

                          Found "); listSubDev(null, _router, sb); String addr = getNATAddress(); + sb.append("

                          "); if (addr != null) - sb.append("
                          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("
                          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("
                          UPnP reports the max downstream bit rate is : " + downstreamMaxBitRate+ " bits/sec\n"); + sb.append("
                          ").append(_("UPnP reports the maximum downstream bit rate is {0}bits/sec", DataHelper.formatSize2(downstreamMaxBitRate))); if(upstreamMaxBitRate > 0) - sb.append("
                          UPnP reports the max upstream bit rate is : " + upstreamMaxBitRate+ " bits/sec\n"); + sb.append("
                          ").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("
                          " + protoToString(port.protocol) + " port " + port.portNumber + " for " + port.name); + sb.append("
                          "); 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 ports, ForwardPortCallback cb) { Set portsToDumpNow = null; Set 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 7996a4556..40829c1e5 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 forwards = new HashSet(ports.size()); - for (String style : ports.keySet()) { - int port = ports.get(style).intValue(); + for (Map.Entry 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 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 "

                          UPnP is not enabled

                          \n"; + return "

                          " + _("UPnP is not enabled") + "

                          \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 8de07fe6e..3dfc1b893 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 29592bf52..eeeef56c1 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 3fb4c6b37..a24b3d972 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; * * */ -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 _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 374c7a5ba..630036204 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 62d57810e..326f659ef 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 d6035766d..33fd401df 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 d19f929c2..24e0efe87 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 bc0ddc5f5..f685c9e78 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 326c43f15..b39f44de9 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 4988a0685..dede98ef7 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 98daaecf9..cc43c4b2e 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 2c0138228..824f4a928 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 a3211a5a6..46b1e4666 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 510d712a0..837a50268 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 6db0b1c6c..bcee07605 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 0a1937db1..ded71f8a2 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 _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 b55d845ad..b8f1d35ee 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 { + 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 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 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 da169db75..179066989 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 7948c5387..a0a2f2eda 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 532bdfe20..3ac96bf28 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 205339d7f..eac1f71da 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 fcdb77ea9..82fdc47c6 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 c9b28b856..ae120c18f 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 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 messageIds, String msg) {} - /* - * @deprecated unused except by above - */ - private byte[][] preprocess(TunnelGateway.Pending msg) { - List 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 99b612dd2..497e8ddcd 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 _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 c8424d853..8669f8cb5 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 3ec567098..a7673f1b6 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 7f29f5743..38c72dfaf 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 8b08b6ec8..62e47bfe5 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 _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 _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 { + 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 7be46e0c7..ad6805002 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. + * + * 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 _inboundBuildMessages; - /** list of BuildReplyMessageState, oldest first - unused unless HANDLE_REPLIES_INLINE == false */ - private final List _inboundBuildReplyMessages; - /** list of BuildEndMessageState, oldest first - unused unless HANDLE_REPLIES_INLINE == false */ - private final List _inboundBuildEndMessages; - private BuildMessageProcessor _processor; + private final RouterContext _context; + private final Log _log; + private final BuildExecutor _exec; + private final Job _buildMessageHandlerJob; + private final Job _buildReplyMessageHandlerJob; + private final LinkedBlockingQueue _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; - private static final boolean HANDLE_REPLIES_INLINE = true; - public BuildHandler(RouterContext ctx, BuildExecutor exec) { _context = ctx; _log = ctx.logManager().getLog(getClass()); _exec = exec; - _inboundBuildMessages = new ArrayList(16); - 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")); + 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; + } - // 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) { + i++; + long beforeHandle = System.currentTimeMillis(); + long actualTime = handleRequest(state); 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(); + _log.debug("Handle took " + (System.currentTimeMillis()-beforeHandle) + "/" + actualTime + + " (" + i + " with " + _inboundBuildMessages.size() + " remaining)"); } - 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) { - 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; - } - */ + + 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 7a79f927c..6d1099410 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 ORDER = new ArrayList(BuildMessageGenerator.ORDER.length); +abstract class BuildRequestor { + private static final List 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 f4042feee..24e6966a1 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 rv; if (length > 0) { if (shouldSelectExplicit(settings)) return selectExplicit(ctx, settings, length); + + Set exclude = getExclude(ctx, settings.isInbound(), settings.isExploratory()); + Set 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 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); } - Set exclude = getExclude(ctx, settings.isInbound(), settings.isExploratory()); - ctx.profileOrganizer().selectFastPeers(length, exclude, matches, settings.getIPRestriction()); - - matches.remove(ctx.routerHash()); - ArrayList 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 e2271ec90..e82c4a8b0 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 000000000..cf07ec954 --- /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 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 cbe794815..d66bf6f6c 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 74910cbcb..e63e681b3 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 083e2501a..25b6ed933 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 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 e6f3e599e..00eded47d 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 _inProgress = new ArrayList(); + private final RouterContext _context; + private final Log _log; private TunnelPoolSettings _settings; - private final ArrayList _tunnels; - private TunnelPeerSelector _peerSelector; - private TunnelPoolManager _manager; + private final List _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 { + 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 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 3a53be552..3f289b165 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 _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 000000000..6635bca8c --- /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 000000000..db8a560b8 --- /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: + * +
                          +        for(Iterator iter = new RandomIterator(myObjList); iter.hasNext();){
                          +            Object o = iter.next();
                          +            if(someCondition(o) )
                          +                return o; // iteration stopped early
                          +        }
                          +    
                          + *
                          + * 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:
                          + *
                          + *   - 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
                          + *
                          + * + */ +public class RandomIterator implements Iterator { + /** + * 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 list; + private final int LIST_SIZE; + + /** + * The random number generator has a great influence + * on the running time of this iterator. + * + * See, for instance, + * http://www.qbrundage.com/michaelb/pubs/e… + * 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 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 l = new ArrayList(n); + for (int i = 0; i < n; i++) { + l.add(Integer.valueOf(i)); + } + for (Iterator 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 000000000..bf81eb3fa --- /dev/null +++ b/router/java/src/net/i2p/router/util/package.html @@ -0,0 +1,6 @@ + +

                          +These classes define the several useful utilities used +throughout the router. +

                          + diff --git a/router/java/src/org/cybergarage/http/HTTPRequest.java b/router/java/src/org/cybergarage/http/HTTPRequest.java index c1c3b50f6..938450c93 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 5b01ac43a..c6415591e 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 8de6b06b8..7b220ef0c 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 000000000..13f080833 --- /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 000000000..4753cbd30 --- /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 000000000..d6524476d --- /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