diff --git a/.tx/config b/.tx/config
index 01bd7def7..ae6bbab9e 100644
--- a/.tx/config
+++ b/.tx/config
@@ -10,6 +10,7 @@ trans.fr = apps/i2ptunnel/locale/messages_fr.po
trans.hu = apps/i2ptunnel/locale/messages_hu.po
trans.it = apps/i2ptunnel/locale/messages_it.po
trans.nl = apps/i2ptunnel/locale/messages_nl.po
+trans.pt = apps/i2ptunnel/locale/messages_pt.po
trans.ru = apps/i2ptunnel/locale/messages_ru.po
trans.sv_SE = apps/i2ptunnel/locale/messages_sv.po
trans.uk_UA = apps/i2ptunnel/locale/messages_uk.po
@@ -32,6 +33,7 @@ trans.hu = apps/routerconsole/locale/messages_hu.po
trans.it = apps/routerconsole/locale/messages_it.po
trans.nl = apps/routerconsole/locale/messages_nl.po
trans.pl = apps/routerconsole/locale/messages_pl.po
+trans.pt = apps/routerconsole/locale/messages_pt.po
trans.ru = apps/routerconsole/locale/messages_ru.po
trans.sv_SE = apps/routerconsole/locale/messages_sv.po
trans.uk_UA = apps/routerconsole/locale/messages_uk.po
@@ -70,6 +72,7 @@ trans.hu = apps/susidns/locale/messages_hu.po
trans.it = apps/susidns/locale/messages_it.po
trans.nl = apps/susidns/locale/messages_nl.po
trans.pl = apps/susidns/locale/messages_pl.po
+trans.pt = apps/susidns/locale/messages_pt.po
trans.ru = apps/susidns/locale/messages_ru.po
trans.sv_SE = apps/susidns/locale/messages_sv.po
trans.uk_UA = apps/susidns/locale/messages_uk.po
diff --git a/Slackware/i2p/i2p.SlackBuild b/Slackware/i2p/i2p.SlackBuild
index 07c91659c..325f19c84 100755
--- a/Slackware/i2p/i2p.SlackBuild
+++ b/Slackware/i2p/i2p.SlackBuild
@@ -128,7 +128,7 @@ cat $CWD/slack-desc > $PKG/install/slack-desc
cd $PKG
#
-# requiredbuilder fucks up REALLY bad, and thinks java is perl?!
+# requiredbuilder messes up REALLY bad, and thinks java is perl?!
# It also did not catch the shell requirements! BOOOOOOOOOOO! HISSSSSSSS!
#
# requiredbuilder -v -y -s $CWD $PKG
diff --git a/apps/BOB/Demos/echo/echoclient/src/net/i2p/BOB/Demos/echo/echoclient/Main.java b/apps/BOB/Demos/echo/echoclient/src/net/i2p/BOB/Demos/echo/echoclient/Main.java
index d3398caaa..ca7b82889 100644
--- a/apps/BOB/Demos/echo/echoclient/src/net/i2p/BOB/Demos/echo/echoclient/Main.java
+++ b/apps/BOB/Demos/echo/echoclient/src/net/i2p/BOB/Demos/echo/echoclient/Main.java
@@ -1,17 +1,9 @@
/**
- * DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
+ * WTFPL
* Version 2, December 2004
*
* Copyright (C) sponge
* Planet Earth
- * Everyone is permitted to copy and distribute verbatim or modified
- * copies of this license document, and changing it is allowed as long
- * as the name is changed.
- *
- * DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
- * TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
- *
- * 0. You just DO WHAT THE FUCK YOU WANT TO.
*
* See...
*
@@ -19,7 +11,7 @@
* and
* http://en.wikipedia.org/wiki/WTFPL
*
- * ...for any additional details and liscense questions.
+ * ...for any additional details and license questions.
*/
package net.i2p.BOB.Demos.echo.echoclient;
@@ -55,7 +47,7 @@ public class Main {
// exit on anything not legal
break;
}
- c = (char)(b & 0x7f); // We only really give a fuck about ASCII
+ c = (char)(b & 0x7f); // We only care about ASCII
S = new String(S + c);
}
return S;
diff --git a/apps/BOB/Demos/echo/echoserver/src/net/i2p/BOB/Demos/echo/echoserver/Main.java b/apps/BOB/Demos/echo/echoserver/src/net/i2p/BOB/Demos/echo/echoserver/Main.java
index 86344b1a8..6b7be2518 100644
--- a/apps/BOB/Demos/echo/echoserver/src/net/i2p/BOB/Demos/echo/echoserver/Main.java
+++ b/apps/BOB/Demos/echo/echoserver/src/net/i2p/BOB/Demos/echo/echoserver/Main.java
@@ -1,17 +1,9 @@
/**
- * DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
+ * WTFPL
* Version 2, December 2004
*
* Copyright (C) sponge
* Planet Earth
- * Everyone is permitted to copy and distribute verbatim or modified
- * copies of this license document, and changing it is allowed as long
- * as the name is changed.
- *
- * DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
- * TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
- *
- * 0. You just DO WHAT THE FUCK YOU WANT TO.
*
* See...
*
@@ -19,7 +11,7 @@
* and
* http://en.wikipedia.org/wiki/WTFPL
*
- * ...for any additional details and liscense questions.
+ * ...for any additional details and license questions.
*/
package net.i2p.BOB.Demos.echo.echoserver;
@@ -52,7 +44,7 @@ public class Main {
if(b < 20) {
break;
}
- c = (char)(b & 0x7f); // We only really give a fuck about ASCII
+ c = (char)(b & 0x7f); // We only care about ASCII
S = new String(S + c);
}
return S;
diff --git a/apps/BOB/src/net/i2p/BOB/BOB.java b/apps/BOB/src/net/i2p/BOB/BOB.java
index 0b55eb532..517146dac 100644
--- a/apps/BOB/src/net/i2p/BOB/BOB.java
+++ b/apps/BOB/src/net/i2p/BOB/BOB.java
@@ -1,17 +1,9 @@
/**
- * DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
+ * WTFPL
* Version 2, December 2004
*
* Copyright (C) sponge
* Planet Earth
- * Everyone is permitted to copy and distribute verbatim or modified
- * copies of this license document, and changing it is allowed as long
- * as the name is changed.
- *
- * DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
- * TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
- *
- * 0. You just DO WHAT THE FUCK YOU WANT TO.
*
* See...
*
@@ -19,7 +11,7 @@
* and
* http://en.wikipedia.org/wiki/WTFPL
*
- * ...for any additional details and liscense questions.
+ * ...for any additional details and license questions.
*/
package net.i2p.BOB;
diff --git a/apps/BOB/src/net/i2p/BOB/DoCMDS.java b/apps/BOB/src/net/i2p/BOB/DoCMDS.java
index 38bb60ca6..85be6e9ea 100644
--- a/apps/BOB/src/net/i2p/BOB/DoCMDS.java
+++ b/apps/BOB/src/net/i2p/BOB/DoCMDS.java
@@ -1,17 +1,9 @@
/**
- * DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
+ * WTFPL
* Version 2, December 2004
*
* Copyright (C) sponge
* Planet Earth
- * Everyone is permitted to copy and distribute verbatim or modified
- * copies of this license document, and changing it is allowed as long
- * as the name is changed.
- *
- * DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
- * TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
- *
- * 0. You just DO WHAT THE FUCK YOU WANT TO.
*
* See...
*
@@ -19,7 +11,7 @@
* and
* http://en.wikipedia.org/wiki/WTFPL
*
- * ...for any additional details and liscense questions.
+ * ...for any additional details and license questions.
*/
package net.i2p.BOB;
diff --git a/apps/BOB/src/net/i2p/BOB/I2Plistener.java b/apps/BOB/src/net/i2p/BOB/I2Plistener.java
index 861a1fbca..05b12fcd3 100644
--- a/apps/BOB/src/net/i2p/BOB/I2Plistener.java
+++ b/apps/BOB/src/net/i2p/BOB/I2Plistener.java
@@ -1,17 +1,9 @@
/**
- * DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
+ * WTFPL
* Version 2, December 2004
*
* Copyright (C) sponge
* Planet Earth
- * Everyone is permitted to copy and distribute verbatim or modified
- * copies of this license document, and changing it is allowed as long
- * as the name is changed.
- *
- * DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
- * TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
- *
- * 0. You just DO WHAT THE FUCK YOU WANT TO.
*
* See...
*
@@ -19,7 +11,7 @@
* and
* http://en.wikipedia.org/wiki/WTFPL
*
- * ...for any additional details and liscense questions.
+ * ...for any additional details and license questions.
*/
package net.i2p.BOB;
@@ -94,7 +86,7 @@ public class I2Plistener implements Runnable {
}
} catch (I2PException e) {
- // bad shit
+ // bad stuff
System.out.println("Exception " + e);
}
} finally {
diff --git a/apps/BOB/src/net/i2p/BOB/I2PtoTCP.java b/apps/BOB/src/net/i2p/BOB/I2PtoTCP.java
index 4c186700f..bf699db60 100644
--- a/apps/BOB/src/net/i2p/BOB/I2PtoTCP.java
+++ b/apps/BOB/src/net/i2p/BOB/I2PtoTCP.java
@@ -1,17 +1,9 @@
/**
- * DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
+ * WTFPL
* Version 2, December 2004
*
* Copyright (C) sponge
* Planet Earth
- * Everyone is permitted to copy and distribute verbatim or modified
- * copies of this license document, and changing it is allowed as long
- * as the name is changed.
- *
- * DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
- * TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
- *
- * 0. You just DO WHAT THE FUCK YOU WANT TO.
*
* See...
*
@@ -19,7 +11,7 @@
* and
* http://en.wikipedia.org/wiki/WTFPL
*
- * ...for any additional details and liscense questions.
+ * ...for any additional details and license questions.
*/
package net.i2p.BOB;
diff --git a/apps/BOB/src/net/i2p/BOB/Lifted.java b/apps/BOB/src/net/i2p/BOB/Lifted.java
index fbd23cba5..472682436 100644
--- a/apps/BOB/src/net/i2p/BOB/Lifted.java
+++ b/apps/BOB/src/net/i2p/BOB/Lifted.java
@@ -1,17 +1,9 @@
/**
- * DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
+ * WTFPL
* Version 2, December 2004
*
* Copyright (C) sponge
* Planet Earth
- * Everyone is permitted to copy and distribute verbatim or modified
- * copies of this license document, and changing it is allowed as long
- * as the name is changed.
- *
- * DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
- * TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
- *
- * 0. You just DO WHAT THE FUCK YOU WANT TO.
*
* See...
*
@@ -19,7 +11,7 @@
* and
* http://en.wikipedia.org/wiki/WTFPL
*
- * ...for any additional details and liscense questions.
+ * ...for any additional details and license questions.
*/
package net.i2p.BOB;
diff --git a/apps/BOB/src/net/i2p/BOB/MUXlisten.java b/apps/BOB/src/net/i2p/BOB/MUXlisten.java
index 7d1e6478f..faaf2899a 100644
--- a/apps/BOB/src/net/i2p/BOB/MUXlisten.java
+++ b/apps/BOB/src/net/i2p/BOB/MUXlisten.java
@@ -1,17 +1,9 @@
/**
- * DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
+ * WTFPL
* Version 2, December 2004
*
* Copyright (C) sponge
* Planet Earth
- * Everyone is permitted to copy and distribute verbatim or modified
- * copies of this license document, and changing it is allowed as long
- * as the name is changed.
- *
- * DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
- * TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
- *
- * 0. You just DO WHAT THE FUCK YOU WANT TO.
*
* See...
*
@@ -19,7 +11,7 @@
* and
* http://en.wikipedia.org/wiki/WTFPL
*
- * ...for any additional details and liscense questions.
+ * ...for any additional details and license questions.
*/
package net.i2p.BOB;
@@ -302,14 +294,14 @@ public class MUXlisten implements Runnable {
// Hopefully nuke stuff here...
{
- String boner = tg.getName();
+ String groupName = tg.getName();
try {
- _log.warn("destroySocketManager " + boner);
+ _log.warn("destroySocketManager " + groupName);
socketManager.destroySocketManager();
- _log.warn("destroySocketManager Successful" + boner);
+ _log.warn("destroySocketManager Successful" + groupName);
} catch (Exception e) {
// nop
- _log.warn("destroySocketManager Failed" + boner);
+ _log.warn("destroySocketManager Failed" + groupName);
_log.warn(e.toString());
}
}
@@ -333,25 +325,25 @@ public class MUXlisten implements Runnable {
// Wait around till all threads are collected.
if (tg != null) {
- String boner = tg.getName();
- // System.out.println("BOB: MUXlisten: Starting thread collection for: " + boner);
- _log.warn("BOB: MUXlisten: Starting thread collection for: " + boner);
+ String groupName = tg.getName();
+ // System.out.println("BOB: MUXlisten: Starting thread collection for: " + groupName);
+ _log.warn("BOB: MUXlisten: Starting thread collection for: " + groupName);
if (tg.activeCount() + tg.activeGroupCount() != 0) {
- // visit(tg, 0, boner);
+ // visit(tg, 0, groupName);
int foo = tg.activeCount() + tg.activeGroupCount();
// hopefully no longer needed!
// int bar = lives;
- // System.out.println("BOB: MUXlisten: Waiting on threads for " + boner);
- // System.out.println("\nBOB: MUXlisten: ThreadGroup dump BEGIN " + boner);
- // visit(tg, 0, boner);
- // System.out.println("BOB: MUXlisten: ThreadGroup dump END " + boner + "\n");
+ // System.out.println("BOB: MUXlisten: Waiting on threads for " + groupName);
+ // System.out.println("\nBOB: MUXlisten: ThreadGroup dump BEGIN " + groupName);
+ // visit(tg, 0, groupName);
+ // System.out.println("BOB: MUXlisten: ThreadGroup dump END " + groupName + "\n");
// Happily spin forever :-(
while (foo != 0) {
foo = tg.activeCount() + tg.activeGroupCount();
// if (lives != bar && lives != 0) {
- // System.out.println("\nBOB: MUXlisten: ThreadGroup dump BEGIN " + boner);
- // visit(tg, 0, boner);
- // System.out.println("BOB: MUXlisten: ThreadGroup dump END " + boner + "\n");
+ // System.out.println("\nBOB: MUXlisten: ThreadGroup dump BEGIN " + groupName);
+ // visit(tg, 0, groupName);
+ // System.out.println("BOB: MUXlisten: ThreadGroup dump END " + groupName + "\n");
// }
// bar = lives;
try {
@@ -361,8 +353,8 @@ public class MUXlisten implements Runnable {
}
}
}
- // System.out.println("BOB: MUXlisten: Threads went away. Success: " + boner);
- _log.warn("BOB: MUXlisten: Threads went away. Success: " + boner);
+ // System.out.println("BOB: MUXlisten: Threads went away. Success: " + groupName);
+ _log.warn("BOB: MUXlisten: Threads went away. Success: " + groupName);
tg.destroy();
// Zap reference to the ThreadGroup so the JVM can GC it.
tg = null;
diff --git a/apps/BOB/src/net/i2p/BOB/Main.java b/apps/BOB/src/net/i2p/BOB/Main.java
index 099d01636..89fd95489 100644
--- a/apps/BOB/src/net/i2p/BOB/Main.java
+++ b/apps/BOB/src/net/i2p/BOB/Main.java
@@ -1,17 +1,9 @@
/**
- * DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
+ * WTFPL
* Version 2, December 2004
*
* Copyright (C) sponge
* Planet Earth
- * Everyone is permitted to copy and distribute verbatim or modified
- * copies of this license document, and changing it is allowed as long
- * as the name is changed.
- *
- * DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
- * TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
- *
- * 0. You just DO WHAT THE FUCK YOU WANT TO.
*
* See...
*
@@ -19,7 +11,7 @@
* and
* http://en.wikipedia.org/wiki/WTFPL
*
- * ...for any additional details and liscense questions.
+ * ...for any additional details and license questions.
*/
package net.i2p.BOB;
diff --git a/apps/BOB/src/net/i2p/BOB/NamedDB.java b/apps/BOB/src/net/i2p/BOB/NamedDB.java
index b5189647b..46796136d 100644
--- a/apps/BOB/src/net/i2p/BOB/NamedDB.java
+++ b/apps/BOB/src/net/i2p/BOB/NamedDB.java
@@ -1,17 +1,9 @@
/**
- * DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
+ * WTFPL
* Version 2, December 2004
*
* Copyright (C) sponge
* Planet Earth
- * Everyone is permitted to copy and distribute verbatim or modified
- * copies of this license document, and changing it is allowed as long
- * as the name is changed.
- *
- * DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
- * TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
- *
- * 0. You just DO WHAT THE FUCK YOU WANT TO.
*
* See...
*
@@ -19,7 +11,7 @@
* and
* http://en.wikipedia.org/wiki/WTFPL
*
- * ...for any additional details and liscense questions.
+ * ...for any additional details and license questions.
*/
package net.i2p.BOB;
diff --git a/apps/BOB/src/net/i2p/BOB/TCPio.java b/apps/BOB/src/net/i2p/BOB/TCPio.java
index ca3e5c833..e684d5327 100644
--- a/apps/BOB/src/net/i2p/BOB/TCPio.java
+++ b/apps/BOB/src/net/i2p/BOB/TCPio.java
@@ -1,17 +1,9 @@
/**
- * DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
+ * WTFPL
* Version 2, December 2004
*
* Copyright (C) sponge
* Planet Earth
- * Everyone is permitted to copy and distribute verbatim or modified
- * copies of this license document, and changing it is allowed as long
- * as the name is changed.
- *
- * DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
- * TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
- *
- * 0. You just DO WHAT THE FUCK YOU WANT TO.
*
* See...
*
@@ -19,7 +11,7 @@
* and
* http://en.wikipedia.org/wiki/WTFPL
*
- * ...for any additional details and liscense questions.
+ * ...for any additional details and license questions.
*/
package net.i2p.BOB;
diff --git a/apps/BOB/src/net/i2p/BOB/TCPlistener.java b/apps/BOB/src/net/i2p/BOB/TCPlistener.java
index 35227481a..90fff5917 100644
--- a/apps/BOB/src/net/i2p/BOB/TCPlistener.java
+++ b/apps/BOB/src/net/i2p/BOB/TCPlistener.java
@@ -1,17 +1,9 @@
/**
- * DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
+ * WTFPL
* Version 2, December 2004
*
* Copyright (C) sponge
* Planet Earth
- * Everyone is permitted to copy and distribute verbatim or modified
- * copies of this license document, and changing it is allowed as long
- * as the name is changed.
- *
- * DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
- * TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
- *
- * 0. You just DO WHAT THE FUCK YOU WANT TO.
*
* See...
*
@@ -19,7 +11,7 @@
* and
* http://en.wikipedia.org/wiki/WTFPL
*
- * ...for any additional details and liscense questions.
+ * ...for any additional details and license questions.
*/
package net.i2p.BOB;
diff --git a/apps/BOB/src/net/i2p/BOB/TCPtoI2P.java b/apps/BOB/src/net/i2p/BOB/TCPtoI2P.java
index 05d3f5b65..d83c061a0 100644
--- a/apps/BOB/src/net/i2p/BOB/TCPtoI2P.java
+++ b/apps/BOB/src/net/i2p/BOB/TCPtoI2P.java
@@ -1,17 +1,9 @@
/**
- * DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
+ * WTFPL
* Version 2, December 2004
*
* Copyright (C) sponge
* Planet Earth
- * Everyone is permitted to copy and distribute verbatim or modified
- * copies of this license document, and changing it is allowed as long
- * as the name is changed.
- *
- * DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
- * TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
- *
- * 0. You just DO WHAT THE FUCK YOU WANT TO.
*
* See...
*
@@ -19,7 +11,7 @@
* and
* http://en.wikipedia.org/wiki/WTFPL
*
- * ...for any additional details and liscense questions.
+ * ...for any additional details and license questions.
*/
package net.i2p.BOB;
@@ -94,7 +86,7 @@ public class TCPtoI2P implements Runnable {
// exit on anything not legal
break;
}
- c = (char) (b & 0x7f); // We only really give a fuck about ASCII
+ c = (char) (b & 0x7f); // We only care about ASCII
S = new String(S + c);
}
return S;
diff --git a/apps/BOB/src/net/i2p/BOB/UDPIOthread.java b/apps/BOB/src/net/i2p/BOB/UDPIOthread.java
index b421a6a94..e5c753f5e 100644
--- a/apps/BOB/src/net/i2p/BOB/UDPIOthread.java
+++ b/apps/BOB/src/net/i2p/BOB/UDPIOthread.java
@@ -1,17 +1,9 @@
/**
- * DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
+ * WTFPL
* Version 2, December 2004
*
* Copyright (C) sponge
* Planet Earth
- * Everyone is permitted to copy and distribute verbatim or modified
- * copies of this license document, and changing it is allowed as long
- * as the name is changed.
- *
- * DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
- * TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
- *
- * 0. You just DO WHAT THE FUCK YOU WANT TO.
*
* See...
*
@@ -19,7 +11,7 @@
* and
* http://en.wikipedia.org/wiki/WTFPL
*
- * ...for any additional details and liscense questions.
+ * ...for any additional details and license questions.
*/
package net.i2p.BOB;
diff --git a/apps/fortuna/build.xml b/apps/fortuna/build.xml
deleted file mode 100644
index 50fdf2465..000000000
--- a/apps/fortuna/build.xml
+++ /dev/null
@@ -1,106 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/apps/i2psnark/java/src/net/i2p/kademlia/KBucketSet.java b/apps/i2psnark/java/src/net/i2p/kademlia/KBucketSet.java
index c242ab9b7..b84cdc66c 100644
--- a/apps/i2psnark/java/src/net/i2p/kademlia/KBucketSet.java
+++ b/apps/i2psnark/java/src/net/i2p/kademlia/KBucketSet.java
@@ -209,10 +209,10 @@ public class KBucketSet {
int s1, e1, s2, e2;
s1 = b0.getRangeBegin();
e2 = b0.getRangeEnd();
- if (B_FACTOR > 1 &&
- (s1 & (B_FACTOR - 1)) == 0 &&
- ((e2 + 1) & (B_FACTOR - 1)) == 0 &&
- e2 > s1 + B_FACTOR) {
+ if (B_VALUE == 1 ||
+ ((s1 & (B_FACTOR - 1)) == 0 &&
+ ((e2 + 1) & (B_FACTOR - 1)) == 0 &&
+ e2 > s1 + B_FACTOR)) {
// The bucket is a "whole" kbucket with a range > B_FACTOR,
// so it should be split into two "whole" kbuckets each with
// a range >= B_FACTOR.
@@ -529,7 +529,10 @@ public class KBucketSet {
getReadLock();
try {
for (KBucket b : _buckets) {
- if (b.getLastChanged() < old || b.getKeyCount() < BUCKET_SIZE * 3 / 4)
+ int curSize = b.getKeyCount();
+ // Always explore the closest bucket
+ if ((b.getRangeBegin() == 0) ||
+ (b.getLastChanged() < old || curSize < BUCKET_SIZE * 3 / 4))
rv.add(generateRandomKey(b));
}
} finally { releaseReadLock(); }
@@ -759,8 +762,8 @@ public class KBucketSet {
public String toString() {
StringBuilder buf = new StringBuilder(1024);
buf.append("Bucket set rooted on: ").append(_us.toString())
- .append(" K= ").append(BUCKET_SIZE)
- .append(" B= ").append(B_VALUE)
+ .append(" K=").append(BUCKET_SIZE)
+ .append(" B=").append(B_VALUE)
.append(" with ").append(size())
.append(" keys in ").append(_buckets.size()).append(" buckets:\n");
getReadLock();
diff --git a/apps/i2psnark/java/src/org/klomp/snark/BitField.java b/apps/i2psnark/java/src/org/klomp/snark/BitField.java
index 3f16deb68..d18ef1343 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/BitField.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/BitField.java
@@ -59,7 +59,6 @@ public class BitField
// cleared or clear them explicitly ourselves.
System.arraycopy(bitfield, 0, this.bitfield, 0, arraysize);
- this.count = 0;
for (int i = 0; i < size; i++)
if (get(i))
this.count++;
diff --git a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java
index 1ef8cd302..6cef36f67 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java
@@ -58,7 +58,7 @@ public class I2PSnarkUtil {
private volatile I2PSocketManager _manager;
private boolean _configured;
private volatile boolean _connecting;
- private final Set _shitlist;
+ private final Set _banlist;
private int _maxUploaders;
private int _maxUpBW;
private int _maxConnections;
@@ -86,7 +86,7 @@ public class I2PSnarkUtil {
_opts = new HashMap();
//setProxy("127.0.0.1", 4444);
setI2CPConfig("127.0.0.1", 7654, null);
- _shitlist = new ConcurrentHashSet();
+ _banlist = new ConcurrentHashSet();
_maxUploaders = Snark.MAX_TOTAL_UPLOADERS;
_maxUpBW = DEFAULT_MAX_UP_BW;
_maxConnections = MAX_CONNECTIONS;
@@ -244,6 +244,8 @@ public class I2PSnarkUtil {
opts.setProperty("i2p.streaming.maxConnsPerHour", "20");
if (opts.getProperty("i2p.streaming.enforceProtocol") == null)
opts.setProperty("i2p.streaming.enforceProtocol", "true");
+ if (opts.getProperty("i2p.streaming.disableRejectLogging") == null)
+ opts.setProperty("i2p.streaming.disableRejectLogging", "true");
_manager = I2PSocketManagerFactory.createManager(_i2cpHost, _i2cpPort, opts);
_connecting = false;
}
@@ -283,7 +285,7 @@ public class I2PSnarkUtil {
I2PSocketManager mgr = _manager;
// FIXME this can cause race NPEs elsewhere
_manager = null;
- _shitlist.clear();
+ _banlist.clear();
if (mgr != null) {
if (_log.shouldLog(Log.DEBUG))
_log.debug("Disconnecting from I2P", new Exception("I did it"));
@@ -306,24 +308,24 @@ public class I2PSnarkUtil {
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");
+ if (_banlist.contains(dest))
+ throw new IOException("Not trying to contact " + dest.toBase64() + ", as they are banlisted");
try {
I2PSocket rv = _manager.connect(addr);
if (rv != null)
- _shitlist.remove(dest);
+ _banlist.remove(dest);
return rv;
} catch (I2PException ie) {
- _shitlist.add(dest);
- _context.simpleScheduler().addEvent(new Unshitlist(dest), 10*60*1000);
+ _banlist.add(dest);
+ _context.simpleScheduler().addEvent(new Unbanlist(dest), 10*60*1000);
throw new IOException("Unable to reach the peer " + peer + ": " + ie.getMessage());
}
}
- private class Unshitlist implements SimpleTimer.TimedEvent {
+ private class Unbanlist implements SimpleTimer.TimedEvent {
private Hash _dest;
- public Unshitlist(Hash dest) { _dest = dest; }
- public void timeReached() { _shitlist.remove(_dest); }
+ public Unbanlist(Hash dest) { _dest = dest; }
+ public void timeReached() { _banlist.remove(_dest); }
}
/**
diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java
index 08c7109ef..f1ef08eb1 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java
@@ -377,7 +377,10 @@ class PeerCoordinator implements PeerListener
public boolean needOutboundPeers() {
//return wantedBytes != 0 && needPeers();
// minus one to make it a little easier for new peers to get in on large swarms
- return wantedBytes != 0 && !halted && peers.size() < getMaxConnections() - 1;
+ return wantedBytes != 0 &&
+ !halted &&
+ peers.size() < getMaxConnections() - 1 &&
+ (storage == null || !storage.isChecking());
}
/**
@@ -741,7 +744,19 @@ class PeerCoordinator implements PeerListener
break;
if (havePieces.get(p.getId()) && !p.isRequested())
{
- piece = p;
+ // never ever choose one that's in partialPieces, or we
+ // will create a second one and leak
+ boolean hasPartial = false;
+ for (PartialPiece pp : partialPieces) {
+ if (pp.getPiece() == p.getId()) {
+ if (_log.shouldLog(Log.INFO))
+ _log.info("wantPiece() skipping partial for " + peer + ": piece = " + pp);
+ hasPartial = true;
+ break;
+ }
+ }
+ if (!hasPartial)
+ piece = p;
}
else if (p.isRequested())
{
@@ -943,13 +958,11 @@ class PeerCoordinator implements PeerListener
*/
public boolean gotPiece(Peer peer, PartialPiece pp)
{
- if (metainfo == null || storage == null)
+ if (metainfo == null || storage == null || storage.isChecking() || halted) {
+ pp.release();
return true;
- int piece = pp.getPiece();
- if (halted) {
- _log.info("Got while-halted piece " + piece + "/" + metainfo.getPieces() +" from " + peer + " for " + metainfo.getName());
- return true; // We don't actually care anymore.
}
+ int piece = pp.getPiece();
synchronized(wantedPieces)
{
@@ -962,12 +975,15 @@ class PeerCoordinator implements PeerListener
// Assume we got a good piece, we don't really care anymore.
// Well, this could be caused by a change in priorities, so
// only return true if we already have it, otherwise might as well keep it.
- if (storage.getBitField().get(piece))
+ if (storage.getBitField().get(piece)) {
+ pp.release();
return true;
+ }
}
try
{
+ // this takes forever if complete, as it rechecks
if (storage.putPiece(pp))
{
if (_log.shouldLog(Log.INFO))
@@ -1173,6 +1189,8 @@ class PeerCoordinator implements PeerListener
public PartialPiece getPartialPiece(Peer peer, BitField havePieces) {
if (metainfo == null)
return null;
+ if (storage != null && storage.isChecking())
+ return null;
synchronized(wantedPieces) {
// sorts by remaining bytes, least first
Collections.sort(partialPieces);
@@ -1277,6 +1295,7 @@ class PeerCoordinator implements PeerListener
PartialPiece pp = iter.next();
if (pp.getPiece() == piece) {
iter.remove();
+ pp.release();
// there should be only one but keep going to be sure
}
}
diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerState.java b/apps/i2psnark/java/src/org/klomp/snark/PeerState.java
index 95bef3c4f..8add00d2b 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/PeerState.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/PeerState.java
@@ -592,6 +592,7 @@ class PeerState implements DataLoader
// Send cancel even when we are choked to make sure that it is
// really never ever send.
out.sendCancel(req);
+ req.getPartialPiece().release();
}
}
}
@@ -741,6 +742,10 @@ class PeerState implements DataLoader
out.sendRequest(r);
lastRequest = r;
return true;
+ } else {
+ if (_log.shouldLog(Log.WARN))
+ _log.warn("Got dup from coord: " + pp);
+ pp.release();
}
}
diff --git a/apps/i2psnark/java/src/org/klomp/snark/Storage.java b/apps/i2psnark/java/src/org/klomp/snark/Storage.java
index ddead3a58..a42001ba8 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/Storage.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/Storage.java
@@ -985,6 +985,8 @@ public class Storage
/**
* Put the piece in the Storage if it is correct.
+ * Warning - takes a LONG time if complete as it does the recheck here.
+ * TODO thread the recheck?
*
* @return true if the piece was correct (sha metainfo hash
* matches), otherwise false.
diff --git a/apps/i2psnark/java/src/org/klomp/snark/dht/DHTNodes.java b/apps/i2psnark/java/src/org/klomp/snark/dht/DHTNodes.java
index 5e2569e2d..21d394a80 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/dht/DHTNodes.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/dht/DHTNodes.java
@@ -69,6 +69,9 @@ class DHTNodes {
// begin ConcurrentHashMap methods
+ /**
+ * @return known nodes, not total net size
+ */
public int size() {
return _nodeMap.size();
}
@@ -86,8 +89,13 @@ class DHTNodes {
* @return the old value if present, else null
*/
public NodeInfo putIfAbsent(NodeInfo nInfo) {
- _kad.add(nInfo.getNID());
- return _nodeMap.putIfAbsent(nInfo.getNID(), nInfo);
+ NodeInfo rv = _nodeMap.putIfAbsent(nInfo.getNID(), nInfo);
+ // ensure same object in both places
+ if (rv != null)
+ _kad.add(rv.getNID());
+ else
+ _kad.add(nInfo.getNID());
+ return rv;
}
public NodeInfo remove(NID nid) {
@@ -128,11 +136,19 @@ class DHTNodes {
return _kad.getExploreKeys(MAX_BUCKET_AGE);
}
+ /**
+ * Debug info, HTML formatted
+ * @since 0.9.4
+ */
+ public void renderStatusHTML(StringBuilder buf) {
+ buf.append(_kad.toString().replace("\n", " \n"));
+ }
+
/** */
private class Cleaner extends SimpleTimer2.TimedEvent {
public Cleaner() {
- super(SimpleTimer2.getInstance(), CLEAN_TIME);
+ super(SimpleTimer2.getInstance(), 5 * CLEAN_TIME);
}
public void timeReached() {
diff --git a/apps/i2psnark/java/src/org/klomp/snark/dht/DHTTracker.java b/apps/i2psnark/java/src/org/klomp/snark/dht/DHTTracker.java
index 5e8b3a952..0f030a207 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/dht/DHTTracker.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/dht/DHTTracker.java
@@ -39,6 +39,8 @@ class DHTTracker {
private static final long DELTA_EXPIRE_TIME = 3*60*1000;
private static final int MAX_PEERS = 2000;
private static final int MAX_PEERS_PER_TORRENT = 150;
+ private static final int ABSOLUTE_MAX_PER_TORRENT = MAX_PEERS_PER_TORRENT * 2;
+ private static final int MAX_TORRENTS = 400;
DHTTracker(I2PAppContext ctx) {
_context = ctx;
@@ -62,17 +64,29 @@ class DHTTracker {
_log.debug("Announce " + hash + " for " + ih);
Peers peers = _torrents.get(ih);
if (peers == null) {
+ if (_torrents.size() >= MAX_TORRENTS)
+ return;
peers = new Peers();
Peers peers2 = _torrents.putIfAbsent(ih, peers);
if (peers2 != null)
peers = peers2;
}
- Peer peer = new Peer(hash.getData());
- Peer peer2 = peers.putIfAbsent(peer, peer);
- if (peer2 != null)
- peer = peer2;
- peer.setLastSeen(_context.clock().now());
+ if (peers.size() < ABSOLUTE_MAX_PER_TORRENT) {
+ Peer peer = new Peer(hash.getData());
+ Peer peer2 = peers.putIfAbsent(peer, peer);
+ if (peer2 != null)
+ peer = peer2;
+ peer.setLastSeen(_context.clock().now());
+ } else {
+ // We could update setLastSeen if he is already
+ // in there, but that would tend to keep
+ // the same set of peers.
+ // So let it expire so new ones can come in.
+ //Peer peer = peers.get(hash);
+ //if (peer != null)
+ // peer.setLastSeen(_context.clock().now());
+ }
}
void unannounce(InfoHash ih, Hash hash) {
@@ -113,7 +127,7 @@ class DHTTracker {
private class Cleaner extends SimpleTimer2.TimedEvent {
public Cleaner() {
- super(SimpleTimer2.getInstance(), CLEAN_TIME);
+ super(SimpleTimer2.getInstance(), 2 * CLEAN_TIME);
}
public void timeReached() {
@@ -122,6 +136,7 @@ class DHTTracker {
long now = _context.clock().now();
int torrentCount = 0;
int peerCount = 0;
+ boolean tooMany = false;
for (Iterator iter = _torrents.values().iterator(); iter.hasNext(); ) {
Peers p = iter.next();
int recent = 0;
@@ -136,6 +151,7 @@ class DHTTracker {
}
if (recent > MAX_PEERS_PER_TORRENT) {
// too many, delete at random
+ // TODO sort and remove oldest?
// TODO per-torrent adjustable expiration?
for (Iterator iterp = p.values().iterator(); iterp.hasNext() && p.size() > MAX_PEERS_PER_TORRENT; ) {
iterp.next();
@@ -143,6 +159,7 @@ class DHTTracker {
peerCount--;
}
torrentCount++;
+ tooMany = true;
} else if (recent <= 0) {
iter.remove();
} else {
@@ -151,6 +168,8 @@ class DHTTracker {
}
if (peerCount > MAX_PEERS)
+ tooMany = true;
+ if (tooMany)
_expireTime = Math.max(_expireTime - DELTA_EXPIRE_TIME, MIN_EXPIRE_TIME);
else
_expireTime = Math.min(_expireTime + DELTA_EXPIRE_TIME, MAX_EXPIRE_TIME);
@@ -162,7 +181,7 @@ class DHTTracker {
DataHelper.formatDuration(_expireTime) + " expiration");
_peerCount = peerCount;
_torrentCount = torrentCount;
- schedule(CLEAN_TIME);
+ schedule(tooMany ? CLEAN_TIME / 3 : CLEAN_TIME);
}
}
}
diff --git a/apps/i2psnark/java/src/org/klomp/snark/dht/KRPC.java b/apps/i2psnark/java/src/org/klomp/snark/dht/KRPC.java
index 01a63a259..55521a787 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/dht/KRPC.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/dht/KRPC.java
@@ -613,6 +613,7 @@ public class KRPC implements I2PSessionMuxedListener, DHT {
"Rcvd tokens: ").append(_incomingTokens.size()).append(" " +
"Pending queries: ").append(_sentQueries.size()).append(" ");
_tracker.renderStatusHTML(buf);
+ _knownNodes.renderStatusHTML(buf);
return buf.toString();
}
@@ -1107,8 +1108,12 @@ public class KRPC implements I2PSessionMuxedListener, DHT {
if (nInfo.equals(_myNodeInfo))
return _myNodeInfo;
NodeInfo rv = _knownNodes.putIfAbsent(nInfo);
- if (rv == null)
+ if (rv == null) {
rv = nInfo;
+ // if we didn't know about it before, set the timestamp
+ // so it isn't immediately removed by the DHTNodes cleaner
+ rv.getNID().setLastSeen();
+ }
return rv;
}
@@ -1518,7 +1523,7 @@ public class KRPC implements I2PSessionMuxedListener, DHT {
private class Cleaner extends SimpleTimer2.TimedEvent {
public Cleaner() {
- super(SimpleTimer2.getInstance(), CLEAN_TIME);
+ super(SimpleTimer2.getInstance(), 7 * CLEAN_TIME);
}
public void timeReached() {
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 e96eefe0b..ea5d751e5 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
@@ -995,14 +995,16 @@ public class I2PSnarkServlet extends DefaultServlet {
} else if (snark.isAllocating()) {
statusString = "" +
"
\n"
"Language-Team: German (http://www.transifex.com/projects/p/I2P/language/"
@@ -25,181 +25,187 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-#: ../java/src/org/klomp/snark/SnarkManager.java:434
+#: ../java/src/org/klomp/snark/MagnetURI.java:42
+#: ../java/src/org/klomp/snark/MagnetURI.java:52
+#: ../java/src/org/klomp/snark/SnarkManager.java:1549
+msgid "Magnet"
+msgstr "Magnet"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:459
#, java-format
msgid "Total uploaders limit changed to {0}"
msgstr "Gesamtanzahl der Uploadslots geändert auf {0}"
-#: ../java/src/org/klomp/snark/SnarkManager.java:436
+#: ../java/src/org/klomp/snark/SnarkManager.java:461
#, java-format
msgid "Minimum total uploaders limit is {0}"
msgstr "Minimale Anzahl derUploadslots ist {0}"
-#: ../java/src/org/klomp/snark/SnarkManager.java:448
+#: ../java/src/org/klomp/snark/SnarkManager.java:473
#, 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:450
+#: ../java/src/org/klomp/snark/SnarkManager.java:475
#, 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:462
+#: ../java/src/org/klomp/snark/SnarkManager.java:487
#, java-format
msgid "Startup delay changed to {0}"
msgstr "Startverzögerung auf {0} gesetzt"
-#: ../java/src/org/klomp/snark/SnarkManager.java:473
+#: ../java/src/org/klomp/snark/SnarkManager.java:498
#, java-format
msgid "Refresh time changed to {0}"
msgstr "Auffrischungsrate auf {0} gesetzt"
-#: ../java/src/org/klomp/snark/SnarkManager.java:475
+#: ../java/src/org/klomp/snark/SnarkManager.java:500
msgid "Refresh disabled"
msgstr "Auffrischung abgeschaltet"
-#: ../java/src/org/klomp/snark/SnarkManager.java:530
+#: ../java/src/org/klomp/snark/SnarkManager.java:555
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"
-#: ../java/src/org/klomp/snark/SnarkManager.java:534
+#: ../java/src/org/klomp/snark/SnarkManager.java:559
#, java-format
msgid "I2CP options changed to {0}"
msgstr "I2CP-Optionen auf {0} gesetzt"
-#: ../java/src/org/klomp/snark/SnarkManager.java:539
+#: ../java/src/org/klomp/snark/SnarkManager.java:564
msgid "Disconnecting old I2CP destination"
msgstr "Trenne das alte I2CP-Ziel"
-#: ../java/src/org/klomp/snark/SnarkManager.java:541
+#: ../java/src/org/klomp/snark/SnarkManager.java:566
#, java-format
msgid "I2CP settings changed to {0}"
msgstr "I2CP-Einstellungen geändert auf {0}"
-#: ../java/src/org/klomp/snark/SnarkManager.java:546
+#: ../java/src/org/klomp/snark/SnarkManager.java:571
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:550
+#: ../java/src/org/klomp/snark/SnarkManager.java:575
msgid "Unable to reconnect with the old settings!"
msgstr "Verbinden mit den alten Einstellungen nicht möglich!"
-#: ../java/src/org/klomp/snark/SnarkManager.java:552
+#: ../java/src/org/klomp/snark/SnarkManager.java:577
msgid "Reconnected on the new I2CP destination"
msgstr "Verbunden auf dem neuem I2CP-Ziel"
-#: ../java/src/org/klomp/snark/SnarkManager.java:559
+#: ../java/src/org/klomp/snark/SnarkManager.java:584
#, java-format
msgid "I2CP listener restarted for \"{0}\""
msgstr "I2CP-Verbindung neu gestartet für \"{0}\""
-#: ../java/src/org/klomp/snark/SnarkManager.java:571
+#: ../java/src/org/klomp/snark/SnarkManager.java:596
msgid "New files will be publicly readable"
msgstr "Neu angelegte Dateien werden allgemein lesbar sein."
-#: ../java/src/org/klomp/snark/SnarkManager.java:573
+#: ../java/src/org/klomp/snark/SnarkManager.java:598
msgid "New files will not be publicly readable"
msgstr "Neu angelegte Dateien werden nicht allgemein lesbar sein."
-#: ../java/src/org/klomp/snark/SnarkManager.java:580
+#: ../java/src/org/klomp/snark/SnarkManager.java:605
msgid "Enabled autostart"
msgstr "Aktiviere Autostart"
-#: ../java/src/org/klomp/snark/SnarkManager.java:582
+#: ../java/src/org/klomp/snark/SnarkManager.java:607
msgid "Disabled autostart"
msgstr "Deaktiviere Autostart"
-#: ../java/src/org/klomp/snark/SnarkManager.java:588
+#: ../java/src/org/klomp/snark/SnarkManager.java:613
msgid "Enabled open trackers - torrent restart required to take effect."
msgstr ""
"OpenTracker aktiviert - Um dies anzuwenden, müssen die Torrents neu "
"gestartet werden."
-#: ../java/src/org/klomp/snark/SnarkManager.java:590
+#: ../java/src/org/klomp/snark/SnarkManager.java:615
msgid "Disabled open trackers - torrent restart required to take effect."
msgstr ""
"OpenTracker deaktiviert - Um dies anzuwenden, müssen die Torrents neu "
"gestartet werden."
-#: ../java/src/org/klomp/snark/SnarkManager.java:597
+#: ../java/src/org/klomp/snark/SnarkManager.java:622
msgid "Enabled DHT."
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:599
+#: ../java/src/org/klomp/snark/SnarkManager.java:624
msgid "Disabled DHT."
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:601
+#: ../java/src/org/klomp/snark/SnarkManager.java:626
msgid "DHT change requires tunnel shutdown and reopen"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:608
+#: ../java/src/org/klomp/snark/SnarkManager.java:633
#, 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!"
-#: ../java/src/org/klomp/snark/SnarkManager.java:615
+#: ../java/src/org/klomp/snark/SnarkManager.java:640
msgid "Configuration unchanged."
msgstr "Konfiguration nicht geändert."
-#: ../java/src/org/klomp/snark/SnarkManager.java:647
+#: ../java/src/org/klomp/snark/SnarkManager.java:672
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"
-#: ../java/src/org/klomp/snark/SnarkManager.java:657
+#: ../java/src/org/klomp/snark/SnarkManager.java:682
msgid "Private tracker list changed - affects newly created torrents only."
msgstr "Liste privater Tracker geändert - betrifft nur neu erstellte Torrents"
-#: ../java/src/org/klomp/snark/SnarkManager.java:703
+#: ../java/src/org/klomp/snark/SnarkManager.java:728
#, java-format
msgid "Unable to save the config to {0}"
msgstr "Konnte Konfiguration nicht in {0} speichern"
-#: ../java/src/org/klomp/snark/SnarkManager.java:768
+#: ../java/src/org/klomp/snark/SnarkManager.java:801
msgid "Connecting to I2P"
msgstr "Verbinde mit I2P"
-#: ../java/src/org/klomp/snark/SnarkManager.java:771
+#: ../java/src/org/klomp/snark/SnarkManager.java:804
msgid "Error connecting to I2P - check your I2CP settings!"
msgstr ""
"Fehler beim Verbinden mit I2P - Kontrollieren Sie die I2CP-Einstellungen!"
-#: ../java/src/org/klomp/snark/SnarkManager.java:780
+#: ../java/src/org/klomp/snark/SnarkManager.java:813
#, 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:802
+#: ../java/src/org/klomp/snark/SnarkManager.java:835
#, java-format
msgid "Cannot open \"{0}\""
msgstr "Kann dies nicht öffnen: \"{0}\""
#. TODO - if the existing one is a magnet, delete it and add the metainfo instead?
-#: ../java/src/org/klomp/snark/SnarkManager.java:821
-#: ../java/src/org/klomp/snark/SnarkManager.java:899
-#: ../java/src/org/klomp/snark/SnarkManager.java:980
+#: ../java/src/org/klomp/snark/SnarkManager.java:854
+#: ../java/src/org/klomp/snark/SnarkManager.java:952
+#: ../java/src/org/klomp/snark/SnarkManager.java:1034
#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:159
#, java-format
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:827
+#: ../java/src/org/klomp/snark/SnarkManager.java:860
#, java-format
msgid "ERROR - No I2P trackers in private torrent \"{0}\""
msgstr "Fehler - Keine I2P-Tracker im privaten Torrent {0}"
-#: ../java/src/org/klomp/snark/SnarkManager.java:829
+#: ../java/src/org/klomp/snark/SnarkManager.java:862
#, fuzzy, java-format
msgid ""
"Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and "
@@ -208,7 +214,7 @@ msgstr ""
"Warnung - keine I2P-Tracker in \"{0}\", werde nur bei I2P-OpenTrackern "
"bekanntgeben"
-#: ../java/src/org/klomp/snark/SnarkManager.java:832
+#: ../java/src/org/klomp/snark/SnarkManager.java:865
#, fuzzy, java-format
msgid ""
"Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will "
@@ -217,7 +223,7 @@ msgstr ""
"Warnung - keine I2P-Tracker in \"{0}\", werde nur bei I2P-OpenTrackern "
"bekanntgeben"
-#: ../java/src/org/klomp/snark/SnarkManager.java:834
+#: ../java/src/org/klomp/snark/SnarkManager.java:867
#, fuzzy, java-format
msgid ""
"Warning - No I2P trackers in \"{0}\", and DHT and open trackers are "
@@ -226,12 +232,12 @@ 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:856
+#: ../java/src/org/klomp/snark/SnarkManager.java:889
#, java-format
msgid "Torrent in \"{0}\" is invalid"
msgstr "Torrent in \"{0}\" ist nicht gültig"
-#: ../java/src/org/klomp/snark/SnarkManager.java:861
+#: ../java/src/org/klomp/snark/SnarkManager.java:894
#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:181
#, java-format
msgid "ERROR - Out of memory, cannot create torrent from {0}"
@@ -239,23 +245,23 @@ msgstr ""
"Fehler - unzureichender Arbeitsspeicher, kann keinen Torrent von {0} "
"erstellen."
-#: ../java/src/org/klomp/snark/SnarkManager.java:873
+#: ../java/src/org/klomp/snark/SnarkManager.java:906
#, java-format
msgid "Torrent added and started: \"{0}\""
msgstr "Torrent hinzugefügt und gestartet: \"{0}\""
-#: ../java/src/org/klomp/snark/SnarkManager.java:875
+#: ../java/src/org/klomp/snark/SnarkManager.java:908
#, java-format
msgid "Torrent added: \"{0}\""
msgstr "Torrent hinzugefügt: \"{0}\""
-#: ../java/src/org/klomp/snark/SnarkManager.java:910
+#: ../java/src/org/klomp/snark/SnarkManager.java:963
#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:87
#, java-format
msgid "Fetching {0}"
msgstr "Hole {0}"
-#: ../java/src/org/klomp/snark/SnarkManager.java:916
+#: ../java/src/org/klomp/snark/SnarkManager.java:969
#, fuzzy, java-format
msgid ""
"Open trackers are disabled and we have no DHT peers. Fetch of {0} may not "
@@ -265,140 +271,139 @@ msgstr ""
"Das Herunterladen von {0} kann nicht erfolgen, solange du keinen anderen "
"Torrent startest."
-#: ../java/src/org/klomp/snark/SnarkManager.java:920
+#: ../java/src/org/klomp/snark/SnarkManager.java:973
#, java-format
msgid "Adding {0}"
msgstr "Hinzufügen {0}"
-#: ../java/src/org/klomp/snark/SnarkManager.java:951
+#: ../java/src/org/klomp/snark/SnarkManager.java:1005
#, java-format
msgid "Download already running: {0}"
msgstr "Download läuft bereits: {0}"
-#: ../java/src/org/klomp/snark/SnarkManager.java:990
-#: ../java/src/org/klomp/snark/SnarkManager.java:1013
-#: ../java/src/org/klomp/snark/SnarkManager.java:1449
+#: ../java/src/org/klomp/snark/SnarkManager.java:1044
+#: ../java/src/org/klomp/snark/SnarkManager.java:1067
+#: ../java/src/org/klomp/snark/SnarkManager.java:1505
#, 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:1240
+#: ../java/src/org/klomp/snark/SnarkManager.java:1294
#, 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:1242
+#: ../java/src/org/klomp/snark/SnarkManager.java:1296
#, 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:1244
+#: ../java/src/org/klomp/snark/SnarkManager.java:1298
#, java-format
msgid "No pieces in \"{0}\", deleting it!"
msgstr "Keine Teile in \"{0}\", wird entfernt!"
-#: ../java/src/org/klomp/snark/SnarkManager.java:1246
+#: ../java/src/org/klomp/snark/SnarkManager.java:1300
#, 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:1248
+#: ../java/src/org/klomp/snark/SnarkManager.java:1302
#, 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:1249
+#: ../java/src/org/klomp/snark/SnarkManager.java:1303
#, java-format
msgid "Limit is {0}B"
msgstr "Limit ist \"{0}\"Bytes"
-#: ../java/src/org/klomp/snark/SnarkManager.java:1251
+#: ../java/src/org/klomp/snark/SnarkManager.java:1305
#, java-format
msgid "Torrent \"{0}\" has no data, deleting it!"
msgstr "Torrent \"{0}\" enthält keine Daten und wird gelöscht!"
-#: ../java/src/org/klomp/snark/SnarkManager.java:1259
+#: ../java/src/org/klomp/snark/SnarkManager.java:1313
#, 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}\"."
-#: ../java/src/org/klomp/snark/SnarkManager.java:1275
+#: ../java/src/org/klomp/snark/SnarkManager.java:1329
#, 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:1296
-#: ../java/src/org/klomp/snark/SnarkManager.java:1314
+#: ../java/src/org/klomp/snark/SnarkManager.java:1350
+#: ../java/src/org/klomp/snark/SnarkManager.java:1368
#, java-format
msgid "Torrent stopped: \"{0}\""
msgstr "Torrent angehalten: \"{0}\""
-#: ../java/src/org/klomp/snark/SnarkManager.java:1335
+#: ../java/src/org/klomp/snark/SnarkManager.java:1389
#, java-format
msgid "Torrent removed: \"{0}\""
msgstr "Torrent entfernt: \"{0}\""
-#: ../java/src/org/klomp/snark/SnarkManager.java:1343
+#: ../java/src/org/klomp/snark/SnarkManager.java:1397
#, java-format
msgid "Adding torrents in {0}"
msgstr "Füge Torrents in {0} hinzu ..."
-#: ../java/src/org/klomp/snark/SnarkManager.java:1394
+#: ../java/src/org/klomp/snark/SnarkManager.java:1428
+#, fuzzy, java-format
+msgid "Up bandwidth limit is {0} KBps"
+msgstr "Minimales Limit der Upload-Bandbreite ist {0} kbyte/s."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1450
#, java-format
msgid "Download finished: {0}"
msgstr "vollständig heruntergeladen:\"{0}\""
-#: ../java/src/org/klomp/snark/SnarkManager.java:1445
+#: ../java/src/org/klomp/snark/SnarkManager.java:1501
#, java-format
msgid "Metainfo received for {0}"
msgstr "Metainfo für {0} erhalten"
-#: ../java/src/org/klomp/snark/SnarkManager.java:1446
-#: ../java/src/org/klomp/snark/SnarkManager.java:1669
+#: ../java/src/org/klomp/snark/SnarkManager.java:1502
+#: ../java/src/org/klomp/snark/SnarkManager.java:1731
#, java-format
msgid "Starting up torrent {0}"
msgstr "Starte Torrent {0} ..."
-#: ../java/src/org/klomp/snark/SnarkManager.java:1461
+#: ../java/src/org/klomp/snark/SnarkManager.java:1517
#, java-format
msgid "Error on torrent {0}"
msgstr "Fehler bei Torrent {0}"
-#: ../java/src/org/klomp/snark/SnarkManager.java:1487
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1785
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1795
-msgid "Magnet"
-msgstr "Magnet"
-
-#: ../java/src/org/klomp/snark/SnarkManager.java:1518
+#: ../java/src/org/klomp/snark/SnarkManager.java:1580
msgid "Unable to connect to I2P!"
msgstr "Konnte keine Verbindung zu I2P herstellen!"
-#: ../java/src/org/klomp/snark/SnarkManager.java:1524
+#: ../java/src/org/klomp/snark/SnarkManager.java:1586
#, java-format
msgid "Unable to add {0}"
msgstr "Konnte {0} nicht hinzufügen."
-#: ../java/src/org/klomp/snark/SnarkManager.java:1668
+#: ../java/src/org/klomp/snark/SnarkManager.java:1730
#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:124
msgid "Opening the I2P tunnel"
msgstr "I2P Tunnel öffnen ..."
-#: ../java/src/org/klomp/snark/SnarkManager.java:1692
+#: ../java/src/org/klomp/snark/SnarkManager.java:1754
msgid "Opening the I2P tunnel and starting all torrents."
msgstr "Öffne den I2P-Tunnel und starte alle Torrents ..."
-#: ../java/src/org/klomp/snark/SnarkManager.java:1747
+#: ../java/src/org/klomp/snark/SnarkManager.java:1809
msgid "Stopping all torrents and closing the I2P tunnel."
msgstr "Stoppe alle Torrents und beende den I2P-Tunnel."
-#: ../java/src/org/klomp/snark/SnarkManager.java:1766
+#: ../java/src/org/klomp/snark/SnarkManager.java:1828
msgid "Closing I2P tunnel after notifying trackers."
msgstr "Der I2P-Tunnel wird nach Benachrichtigung der Tracker geschlossen."
-#: ../java/src/org/klomp/snark/SnarkManager.java:1773
-#: ../java/src/org/klomp/snark/SnarkManager.java:1784
+#: ../java/src/org/klomp/snark/SnarkManager.java:1835
+#: ../java/src/org/klomp/snark/SnarkManager.java:1846
msgid "I2P tunnel closed."
msgstr "I2P-Tunnel geschlossen."
@@ -407,6 +412,17 @@ msgstr "I2P-Tunnel geschlossen."
msgid "No valid trackers for {0} - enable opentrackers or DHT?"
msgstr ""
+#: ../java/src/org/klomp/snark/UpdateHandler.java:49
+#: ../java/src/org/klomp/snark/UpdateRunner.java:227
+#, fuzzy
+msgid "Updating"
+msgstr "Starten"
+
+#: ../java/src/org/klomp/snark/UpdateRunner.java:114
+#, java-format
+msgid "Updating from {0}"
+msgstr ""
+
#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:75
#, java-format
msgid "Download torrent file from {0}"
@@ -437,205 +453,210 @@ msgstr "Torrent ist schon in der Warteschlange: {0}"
msgid "Torrent at {0} was not valid"
msgstr "Torrent in {0} war nicht gültig"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:222
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:218
msgid "I2PSnark - Anonymous BitTorrent Client"
msgstr "I2PSnark - Anonymer BitTorrent-Klient"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:235
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:231
msgid "Router is down"
msgstr "Router ist Offline"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:250
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:246
msgid "Torrents"
msgstr "Torrents"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:253
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:260
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1247
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:249
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:256
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1265
msgid "I2PSnark"
msgstr "I2PSnark"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:257
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:253
msgid "Refresh page"
msgstr "Aktualisiere Seite"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:262
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:258
msgid "Forum"
msgstr "Forum"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:271
msgid "Click \"Add torrent\" button to fetch torrent"
msgstr "Drücke den \"Torrent Hinzufügen\" Button um den Torrent zu laden"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:310
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:311
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:307
msgid "clear messages"
msgstr "Lösche Nachrichten"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:337
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:339
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2241
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2243
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:333
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:335
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2109
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2111
msgid "Status"
msgstr "Zustand"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:346
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:348
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:342
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:344
msgid "Hide Peers"
msgstr "Teilnehmer ausblenden"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:353
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:355
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:349
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:351
msgid "Show Peers"
msgstr "Teilnehmer einblenden"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:362
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:364
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2096
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2111
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:358
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:360
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1964
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1979
msgid "Torrent"
msgstr "Torrent"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:369
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:365
msgid "Estimated time remaining"
msgstr "geschätzte verbleibende Zeit"
#. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:372
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:368
msgid "ETA"
msgstr "Dauer"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:377
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:373
msgid "Downloaded"
msgstr "heruntergeladen"
#. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:380
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:376
msgid "RX"
msgstr " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:385
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:381
msgid "Uploaded"
msgstr "hochgeladen"
#. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:388
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:384
msgid "TX"
msgstr " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:394
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:390
msgid "Down Rate"
msgstr "eingehend"
#. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:397
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:393
msgid "RX Rate"
msgstr "Downloadgeschwindigkeit"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:403
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:399
msgid "Up Rate"
msgstr "ausgehend"
#. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:406
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:402
msgid "TX Rate"
msgstr "Uploadgeschwindigkeit"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:429
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:425
msgid "Stop all torrents and the I2P tunnel"
msgstr "Stoppe alle Torrents und den I2P-Tunnel"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:431
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:427
msgid "Stop All"
msgstr "Stoppe alle"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:440
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:436
msgid "Start all torrents and the I2P tunnel"
msgstr "Starte alle Torrents und den I2P-Tunnel"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:442
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:438
msgid "Start All"
msgstr "Starte alle"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:462
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:458
msgid "No torrents loaded."
msgstr "keine Torrents geladen"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:467
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:463
msgid "Totals"
msgstr "Gesamt"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:469
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:465
#, 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:472
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:468
#, 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:478
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:474
#, fuzzy, java-format
msgid "1 DHT peer"
msgid_plural "{0} DHT peers"
msgstr[0] "1 Teilnehmer"
msgstr[1] "{0} Teilnehmern"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567
#, java-format
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:612
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:639
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:610
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:640
#, java-format
msgid "Magnet deleted: {0}"
msgstr "Magnetlink wurde gelöscht: {0}"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:620
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:645
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:618
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:646
#, java-format
msgid "Torrent file deleted: {0}"
msgstr "Torrentdatei gelöscht: {0}"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:651
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:638
+#, fuzzy, java-format
+msgid "Download deleted: {0}"
+msgstr "vollständig heruntergeladen:\"{0}\""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:652
#, java-format
msgid "Data file deleted: {0}"
msgstr "Daten gelöscht: {0}"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:653
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:664
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:654
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:665
#, 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:679
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:688
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:689
#, java-format
msgid "Directory could not be deleted: {0}"
msgstr "Das Verzeichnis {0} konnte nicht gelöscht werden."
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:686
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:687
#, java-format
msgid "Directory deleted: {0}"
msgstr "Verzeichnis gelöscht: {0}"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:733
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:734
msgid "Error creating torrent - you must select a tracker"
msgstr ""
"Fehler beim Erstellen des Torrents - Sie müssen einen Tracker auswählen!"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:749
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:751
#, java-format
msgid "Torrent created for \"{0}\""
msgstr "Torrent erstellt für \"{0}\""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:751
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:753
#, java-format
msgid ""
"Many I2P trackers require you to register new torrents before seeding - "
@@ -644,149 +665,157 @@ 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:753
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:755
#, 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:756
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:758
#, 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:759
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:761
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."
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:774
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1751
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:776
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1769
msgid "Delete selected"
msgstr "Lösche ausgewähltes"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:774
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1752
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:776
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1770
msgid "Save tracker configuration"
msgstr "Trackereinstellungen speichern"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:791
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:793
msgid "Removed"
msgstr "Entfernt"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:820
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1750
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1755
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:822
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1768
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1773
msgid "Add tracker"
msgstr "Füge Tracker hinzu"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:843
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:846
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:845
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:848
msgid "Enter valid tracker name and URLs"
msgstr "Gib einen gültigen Tracker-Namen sowie die URLs an!"
#. "\n" +
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:848
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1754
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:850
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1772
msgid "Restore defaults"
msgstr "Auf Default zurücksetzen"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:851
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:853
msgid "Restored default trackers"
msgstr "Auf Default Tracker zurückgesetzt"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:987
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:993
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1000
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:994
+msgid "Checking"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:996
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:997
+msgid "Allocating"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1009
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1016
msgid "Tracker Error"
msgstr "Trackerfehler"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:990
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:995
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1023
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1028
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1011
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1039
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1044
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1050
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1055
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1060
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1066
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1071
#, 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:1003
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1004
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1019
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1020
msgid "Starting"
msgstr "Starten"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1012
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1028
msgid "Seeding"
msgstr "Verteile"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1016
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1030
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1031
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2183
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2298
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1032
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1046
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1047
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2051
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2166
msgid "Complete"
msgstr "vollständig"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1035
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1036
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1041
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1051
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1052
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1057
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1058
msgid "OK"
msgstr "OK"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1046
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1047
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1052
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1053
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1062
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1063
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1068
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1069
msgid "Stalled"
msgstr "Stillstand"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1057
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1058
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1061
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1062
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1073
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1074
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1077
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1078
msgid "No Peers"
msgstr "keine Teilnehmer"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1064
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1065
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1080
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1081
msgid "Stopped"
msgstr "angehalten"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1098
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1114
msgid "Torrent details"
msgstr "Details"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1127
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1143
msgid "View files"
msgstr "Zeige Dateien"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1129
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1145
msgid "Open file"
msgstr "Öffne Datei"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1172
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190
msgid "Stop the torrent"
msgstr "Torrent stoppen"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1174
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1192
msgid "Stop"
msgstr "Stopp"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1186
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1204
msgid "Start the torrent"
msgstr "Torrent starten"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1188
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1206
msgid "Start"
msgstr "Start"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1200
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1218
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"
@@ -794,7 +823,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 quote must be escaped
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1205
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1223
#, java-format
msgid ""
"Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded "
@@ -803,18 +832,18 @@ 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:1208
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1226
msgid "Remove"
msgstr "Entfernen"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1220
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1238
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 quote must be escaped
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1225
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1243
#, java-format
msgid ""
"Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded "
@@ -823,53 +852,53 @@ msgstr ""
"Sind Sie sicher, dass Sie die Torrentdatei \\''{0}\\'' und alle "
"heruntergeladenen Daten löschen wollen?"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1228
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1718
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1246
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1736
msgid "Delete"
msgstr "Löschen"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1263
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1281
msgid "Unknown"
msgstr "Unbekannt"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1275
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293
msgid "Seed"
msgstr "Quelle"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1298
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1316
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:1300
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1318
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:1320
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1338
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:1322
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1340
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:1376
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1394
#, java-format
msgid "Details at {0} tracker"
msgstr "Details beim Tracker {0}"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1392
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1410
msgid "Info"
msgstr "Info"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1420
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1438
msgid "Add Torrent"
msgstr "Torrent hinzufügen"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1422
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1440
msgid "From URL"
msgstr "Quell-URL"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1425
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1443
msgid ""
"Enter the torrent file download URL (I2P only), magnet link, maggot link, or "
"info hash"
@@ -877,126 +906,126 @@ msgstr ""
"Gib die URL einer Torrentdatei (I2P-Link), einen Magnet- / Maggot-Link oder "
"einen Info-Hash ein!"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1430
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1448
msgid "Add torrent"
msgstr "Füge Torrent hinzu"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1433
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1451
#, 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:1435
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1453
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:1458
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1476
msgid "Create Torrent"
msgstr "Torrent erstellen"
#. out.write("From file: \n");
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1461
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1479
msgid "Data to seed"
msgstr "Daten zum Verteilen"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1465
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1483
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:1467
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2133
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1485
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2001
msgid "Tracker"
msgstr "Tracker"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1469
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1487
msgid "Select a tracker"
msgstr "Wähle einen Tracker"
#. out.write(_("Open trackers and DHT only"));
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1474
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1492
msgid "Open trackers only"
msgstr "Benutze nur OpenTracker"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1491
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1509
msgid "Create torrent"
msgstr "Erstelle Torrent"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1515
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1764
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1533
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1782
msgid "Configuration"
msgstr "Einstellungen"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1519
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1537
msgid "Data directory"
msgstr "Datenverzeichnis"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1521
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1539
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:1525
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1543
msgid "Files readable by all"
msgstr "Dateien von allen lesbar"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1529
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1547
msgid "If checked, other users may access the downloaded files"
msgstr ""
"Ist dies markiert, können andere Benutzer auf die heruntergeladenen Dateien "
"zugreifen."
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1533
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1551
msgid "Auto start"
msgstr "Autostart"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1537
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1555
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:1541
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1559
msgid "Theme"
msgstr "Aufmachung"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1554
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1572
msgid "Refresh time"
msgstr "Auffrischungsintervall"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1567
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1585
msgid "Never"
msgstr "Nie"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1573
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1591
msgid "Startup delay"
msgstr "Startverzögerung"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1575
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1593
msgid "minutes"
msgstr "Minuten"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1599
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1617
msgid "Total uploader limit"
msgstr "Gesamtlimit an Hochladern"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1602
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1620
msgid "peers"
msgstr "Teilnehmer"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1606
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1624
msgid "Up bandwidth limit"
msgstr "Bandbreitenbegrenzung beim Hochladen"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1609
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1627
msgid "Half available bandwidth recommended."
msgstr "Halbe verfügbare Bandbreite wird empfohlen."
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1611
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1629
msgid "View or change router bandwidth"
msgstr "Routerbandbreite ansehen oder ändern"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1615
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1633
msgid "Use open trackers also"
msgstr "Benutze auch OpenTracker"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1619
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1637
msgid ""
"If checked, announce torrents to open trackers as well as the tracker listed "
"in the torrent file"
@@ -1004,173 +1033,171 @@ msgstr ""
"Wenn markiert, wird der Torrent neben dem angegebenen Tracker auch bei den "
"OpenTrackern bekanntgegeben."
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1623
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1641
msgid "Enable DHT"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1627
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1645
msgid "If checked, use DHT"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1661
msgid "Inbound Settings"
msgstr "Einstellungen eingehend"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1649
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1667
msgid "Outbound Settings"
msgstr "Einstellungen ausgehend"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1657
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1675
msgid "I2CP host"
msgstr "I2CP-Host"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1662
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1680
msgid "I2CP port"
msgstr "I2CP-Port"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1677
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1695
msgid "I2CP options"
msgstr "I2CP-Optionen"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1682
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1700
msgid "Save configuration"
msgstr "Einstellungen speichern"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1696
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714
msgid "Trackers"
msgstr "Trackers"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1701
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1719
msgid "Name"
msgstr "Name"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1703
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1721
msgid "Website URL"
msgstr "Webseiten-URL"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1705
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2336
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1723
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2204
msgid "Open"
msgstr "offen"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1707
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1725
msgid "Private"
msgstr "privat"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1709
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1727
msgid "Announce URL"
msgstr "Ankündigungs-URL"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1743
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1761
msgid "Add"
msgstr "Hinzufügen"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1780
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1798
#, java-format
msgid "Invalid magnet URL {0}"
msgstr "ungültige Magnet-URL {0}"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1814
-#, 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:1938
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806
#, 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:1939
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1807
#, 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:2120
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1988
msgid "Torrent file"
msgstr "Torrent Datei"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2155
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2023
msgid "Magnet link"
msgstr "Magnetlink"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2162
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2030
msgid "Private torrent"
msgstr "privater Torrent"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2171
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2235
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2237
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2039
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2105
msgid "Size"
msgstr "Größe"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2178
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2046
msgid "Completion"
msgstr "Fortschritt"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2188
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2056
msgid "Remaining"
msgstr "Verbleibend"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2195
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2063
msgid "Files"
msgstr "Dateien"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2200
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2068
msgid "Pieces"
msgstr "Stücke"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2204
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2072
msgid "Piece size"
msgstr "Stückgröße"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2227
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2231
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2281
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2095
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2099
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2149
msgid "Directory"
msgstr "Verzeichnis"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2248
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2250
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2116
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2118
msgid "Priority"
msgstr "Priorität"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2256
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2124
msgid "Up to higher level directory"
msgstr "Eine Hierarchie nach oben"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2286
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2154
msgid "Torrent not found?"
msgstr "Torrentdatei nicht gefunden?"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2295
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2163
msgid "File not found in torrent?"
msgstr "Datei nicht gefunden im Torrent?"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2308
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2176
msgid "complete"
msgstr "vollständig"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2309
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2177
msgid "remaining"
msgstr "verbleibend"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2363
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2231
msgid "High"
msgstr "hoch"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2368
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2236
msgid "Normal"
msgstr "normal"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2373
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2241
msgid "Skip"
msgstr "auslassen"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2382
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2250
msgid "Save priorities"
msgstr "Prioritäten speichern"
+
+#~ msgid "Invalid info hash in magnet URL {0}"
+#~ msgstr "ungültiger Infohash im Magnetlink {0}"
diff --git a/apps/i2psnark/locale/messages_en.po b/apps/i2psnark/locale/messages_en.po
index 9d75bde3c..0e2fb6b06 100644
--- a/apps/i2psnark/locale/messages_en.po
+++ b/apps/i2psnark/locale/messages_en.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: I2P i2psnark\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-10-12 00:38+0000\n"
+"POT-Creation-Date: 2012-11-02 19:51+0000\n"
"PO-Revision-Date: 2010-06-15 14:09+0100\n"
"Last-Translator: duck \n"
"Language-Team: duck \n"
@@ -18,360 +18,360 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-#: ../java/src/org/klomp/snark/SnarkManager.java:434
+#: ../java/src/org/klomp/snark/MagnetURI.java:42
+#: ../java/src/org/klomp/snark/MagnetURI.java:52
+#: ../java/src/org/klomp/snark/SnarkManager.java:1549
+msgid "Magnet"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:459
#, java-format
msgid "Total uploaders limit changed to {0}"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:436
+#: ../java/src/org/klomp/snark/SnarkManager.java:461
#, java-format
msgid "Minimum total uploaders limit is {0}"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:448
+#: ../java/src/org/klomp/snark/SnarkManager.java:473
#, java-format
msgid "Up BW limit changed to {0}KBps"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:450
+#: ../java/src/org/klomp/snark/SnarkManager.java:475
#, java-format
msgid "Minimum up bandwidth limit is {0}KBps"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:462
+#: ../java/src/org/klomp/snark/SnarkManager.java:487
#, java-format
msgid "Startup delay changed to {0}"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:473
+#: ../java/src/org/klomp/snark/SnarkManager.java:498
#, java-format
msgid "Refresh time changed to {0}"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:475
+#: ../java/src/org/klomp/snark/SnarkManager.java:500
msgid "Refresh disabled"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:530
+#: ../java/src/org/klomp/snark/SnarkManager.java:555
msgid "I2CP and tunnel changes will take effect after stopping all torrents"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:534
-#, java-format
-msgid "I2CP options changed to {0}"
-msgstr ""
-
-#: ../java/src/org/klomp/snark/SnarkManager.java:539
-msgid "Disconnecting old I2CP destination"
-msgstr ""
-
-#: ../java/src/org/klomp/snark/SnarkManager.java:541
-#, java-format
-msgid "I2CP settings changed to {0}"
-msgstr ""
-
-#: ../java/src/org/klomp/snark/SnarkManager.java:546
-msgid ""
-"Unable to connect with the new settings, reverting to the old I2CP settings"
-msgstr ""
-
-#: ../java/src/org/klomp/snark/SnarkManager.java:550
-msgid "Unable to reconnect with the old settings!"
-msgstr ""
-
-#: ../java/src/org/klomp/snark/SnarkManager.java:552
-msgid "Reconnected on the new I2CP destination"
-msgstr ""
-
#: ../java/src/org/klomp/snark/SnarkManager.java:559
#, java-format
-msgid "I2CP listener restarted for \"{0}\""
+msgid "I2CP options changed to {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:564
+msgid "Disconnecting old I2CP destination"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:566
+#, java-format
+msgid "I2CP settings changed to {0}"
msgstr ""
#: ../java/src/org/klomp/snark/SnarkManager.java:571
+msgid ""
+"Unable to connect with the new settings, reverting to the old I2CP settings"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:575
+msgid "Unable to reconnect with the old settings!"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:577
+msgid "Reconnected on the new I2CP destination"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:584
+#, java-format
+msgid "I2CP listener restarted for \"{0}\""
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:596
msgid "New files will be publicly readable"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:573
+#: ../java/src/org/klomp/snark/SnarkManager.java:598
msgid "New files will not be publicly readable"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:580
+#: ../java/src/org/klomp/snark/SnarkManager.java:605
msgid "Enabled autostart"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:582
+#: ../java/src/org/klomp/snark/SnarkManager.java:607
msgid "Disabled autostart"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:588
+#: ../java/src/org/klomp/snark/SnarkManager.java:613
msgid "Enabled open trackers - torrent restart required to take effect."
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:590
+#: ../java/src/org/klomp/snark/SnarkManager.java:615
msgid "Disabled open trackers - torrent restart required to take effect."
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:597
+#: ../java/src/org/klomp/snark/SnarkManager.java:622
msgid "Enabled DHT."
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:599
+#: ../java/src/org/klomp/snark/SnarkManager.java:624
msgid "Disabled DHT."
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:601
+#: ../java/src/org/klomp/snark/SnarkManager.java:626
msgid "DHT change requires tunnel shutdown and reopen"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:608
+#: ../java/src/org/klomp/snark/SnarkManager.java:633
#, java-format
msgid "{0} theme loaded, return to main i2psnark page to view."
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:615
+#: ../java/src/org/klomp/snark/SnarkManager.java:640
msgid "Configuration unchanged."
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:647
+#: ../java/src/org/klomp/snark/SnarkManager.java:672
msgid "Open Tracker list changed - torrent restart required to take effect."
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:657
+#: ../java/src/org/klomp/snark/SnarkManager.java:682
msgid "Private tracker list changed - affects newly created torrents only."
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:703
+#: ../java/src/org/klomp/snark/SnarkManager.java:728
#, java-format
msgid "Unable to save the config to {0}"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:768
+#: ../java/src/org/klomp/snark/SnarkManager.java:801
msgid "Connecting to I2P"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:771
+#: ../java/src/org/klomp/snark/SnarkManager.java:804
msgid "Error connecting to I2P - check your I2CP settings!"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:780
+#: ../java/src/org/klomp/snark/SnarkManager.java:813
#, 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:802
+#: ../java/src/org/klomp/snark/SnarkManager.java:835
#, 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:821
-#: ../java/src/org/klomp/snark/SnarkManager.java:899
-#: ../java/src/org/klomp/snark/SnarkManager.java:980
+#: ../java/src/org/klomp/snark/SnarkManager.java:854
+#: ../java/src/org/klomp/snark/SnarkManager.java:952
+#: ../java/src/org/klomp/snark/SnarkManager.java:1034
#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:159
#, java-format
msgid "Torrent with this info hash is already running: {0}"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:827
+#: ../java/src/org/klomp/snark/SnarkManager.java:860
#, java-format
msgid "ERROR - No I2P trackers in private torrent \"{0}\""
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:829
+#: ../java/src/org/klomp/snark/SnarkManager.java:862
#, java-format
msgid ""
"Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and "
"DHT only."
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:832
+#: ../java/src/org/klomp/snark/SnarkManager.java:865
#, java-format
msgid ""
"Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will "
"announce to DHT only."
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:834
+#: ../java/src/org/klomp/snark/SnarkManager.java:867
#, java-format
msgid ""
"Warning - No I2P trackers in \"{0}\", and DHT and open trackers are "
"disabled, you should enable open trackers or DHT before starting the torrent."
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:856
+#: ../java/src/org/klomp/snark/SnarkManager.java:889
#, java-format
msgid "Torrent in \"{0}\" is invalid"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:861
+#: ../java/src/org/klomp/snark/SnarkManager.java:894
#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:181
#, java-format
msgid "ERROR - Out of memory, cannot create torrent from {0}"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:873
+#: ../java/src/org/klomp/snark/SnarkManager.java:906
#, java-format
msgid "Torrent added and started: \"{0}\""
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:875
+#: ../java/src/org/klomp/snark/SnarkManager.java:908
#, java-format
msgid "Torrent added: \"{0}\""
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:910
+#: ../java/src/org/klomp/snark/SnarkManager.java:963
#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:87
#, java-format
msgid "Fetching {0}"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:916
+#: ../java/src/org/klomp/snark/SnarkManager.java:969
#, java-format
msgid ""
"Open trackers are disabled and we have no DHT peers. Fetch of {0} may not "
"succeed until you start another torrent, enable open trackers, or enable DHT."
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:920
+#: ../java/src/org/klomp/snark/SnarkManager.java:973
#, java-format
msgid "Adding {0}"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:951
+#: ../java/src/org/klomp/snark/SnarkManager.java:1005
#, java-format
msgid "Download already running: {0}"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:990
-#: ../java/src/org/klomp/snark/SnarkManager.java:1013
-#: ../java/src/org/klomp/snark/SnarkManager.java:1451
+#: ../java/src/org/klomp/snark/SnarkManager.java:1044
+#: ../java/src/org/klomp/snark/SnarkManager.java:1067
+#: ../java/src/org/klomp/snark/SnarkManager.java:1505
#, java-format
msgid "Failed to copy torrent file to {0}"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:1240
+#: ../java/src/org/klomp/snark/SnarkManager.java:1294
#, java-format
msgid "Too many files in \"{0}\" ({1}), deleting it!"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:1242
+#: ../java/src/org/klomp/snark/SnarkManager.java:1296
#, java-format
msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:1244
+#: ../java/src/org/klomp/snark/SnarkManager.java:1298
#, java-format
msgid "No pieces in \"{0}\", deleting it!"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:1246
+#: ../java/src/org/klomp/snark/SnarkManager.java:1300
#, java-format
msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:1248
+#: ../java/src/org/klomp/snark/SnarkManager.java:1302
#, java-format
msgid "Pieces are too large in \"{0}\" ({1}B), deleting it."
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:1249
+#: ../java/src/org/klomp/snark/SnarkManager.java:1303
#, java-format
msgid "Limit is {0}B"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:1251
+#: ../java/src/org/klomp/snark/SnarkManager.java:1305
#, java-format
msgid "Torrent \"{0}\" has no data, deleting it!"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:1259
+#: ../java/src/org/klomp/snark/SnarkManager.java:1313
#, java-format
msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\""
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:1275
+#: ../java/src/org/klomp/snark/SnarkManager.java:1329
#, java-format
msgid "Error: Could not remove the torrent {0}"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:1296
-#: ../java/src/org/klomp/snark/SnarkManager.java:1314
+#: ../java/src/org/klomp/snark/SnarkManager.java:1350
+#: ../java/src/org/klomp/snark/SnarkManager.java:1368
#, java-format
msgid "Torrent stopped: \"{0}\""
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:1335
+#: ../java/src/org/klomp/snark/SnarkManager.java:1389
#, java-format
msgid "Torrent removed: \"{0}\""
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:1343
+#: ../java/src/org/klomp/snark/SnarkManager.java:1397
#, java-format
msgid "Adding torrents in {0}"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:1374
+#: ../java/src/org/klomp/snark/SnarkManager.java:1428
#, java-format
msgid "Up bandwidth limit is {0} KBps"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:1396
+#: ../java/src/org/klomp/snark/SnarkManager.java:1450
#, java-format
msgid "Download finished: {0}"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:1447
+#: ../java/src/org/klomp/snark/SnarkManager.java:1501
#, java-format
msgid "Metainfo received for {0}"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:1448
-#: ../java/src/org/klomp/snark/SnarkManager.java:1671
+#: ../java/src/org/klomp/snark/SnarkManager.java:1502
+#: ../java/src/org/klomp/snark/SnarkManager.java:1731
#, java-format
msgid "Starting up torrent {0}"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:1463
+#: ../java/src/org/klomp/snark/SnarkManager.java:1517
#, java-format
msgid "Error on torrent {0}"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:1489
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1805
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1815
-msgid "Magnet"
-msgstr ""
-
-#: ../java/src/org/klomp/snark/SnarkManager.java:1520
+#: ../java/src/org/klomp/snark/SnarkManager.java:1580
msgid "Unable to connect to I2P!"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:1526
+#: ../java/src/org/klomp/snark/SnarkManager.java:1586
#, java-format
msgid "Unable to add {0}"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:1670
+#: ../java/src/org/klomp/snark/SnarkManager.java:1730
#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:124
msgid "Opening the I2P tunnel"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:1694
+#: ../java/src/org/klomp/snark/SnarkManager.java:1754
msgid "Opening the I2P tunnel and starting all torrents."
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:1749
+#: ../java/src/org/klomp/snark/SnarkManager.java:1809
msgid "Stopping all torrents and closing the I2P tunnel."
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:1768
+#: ../java/src/org/klomp/snark/SnarkManager.java:1828
msgid "Closing I2P tunnel after notifying trackers."
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:1775
-#: ../java/src/org/klomp/snark/SnarkManager.java:1786
+#: ../java/src/org/klomp/snark/SnarkManager.java:1835
+#: ../java/src/org/klomp/snark/SnarkManager.java:1846
msgid "I2P tunnel closed."
msgstr ""
@@ -380,6 +380,16 @@ msgstr ""
msgid "No valid trackers for {0} - enable opentrackers or DHT?"
msgstr ""
+#: ../java/src/org/klomp/snark/UpdateHandler.java:49
+#: ../java/src/org/klomp/snark/UpdateRunner.java:227
+msgid "Updating"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/UpdateRunner.java:114
+#, java-format
+msgid "Updating from {0}"
+msgstr ""
+
#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:75
#, java-format
msgid "Download torrent file from {0}"
@@ -410,739 +420,732 @@ msgstr ""
msgid "Torrent at {0} was not valid"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:223
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:218
msgid "I2PSnark - Anonymous BitTorrent Client"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:236
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:231
msgid "Router is down"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:251
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:246
msgid "Torrents"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:254
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:261
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1267
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:249
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:256
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1265
msgid "I2PSnark"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:258
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:253
msgid "Refresh page"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:263
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:258
msgid "Forum"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:276
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:271
msgid "Click \"Add torrent\" button to fetch torrent"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:311
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:312
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:307
msgid "clear messages"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:338
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:340
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2261
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2263
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:333
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:335
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2109
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2111
msgid "Status"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:347
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:349
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:342
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:344
msgid "Hide Peers"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:354
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:356
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:349
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:351
msgid "Show Peers"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:363
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:365
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2116
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2131
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:358
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:360
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1964
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1979
msgid "Torrent"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:370
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:365
msgid "Estimated time remaining"
msgstr ""
#. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:373
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:368
msgid "ETA"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:378
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:373
msgid "Downloaded"
msgstr ""
#. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:381
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:376
msgid "RX"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:386
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:381
msgid "Uploaded"
msgstr ""
#. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:389
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:384
msgid "TX"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:395
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:390
msgid "Down Rate"
msgstr ""
#. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:398
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:393
msgid "RX Rate"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:404
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:399
msgid "Up Rate"
msgstr ""
#. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:407
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:402
msgid "TX Rate"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:430
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:425
msgid "Stop all torrents and the I2P tunnel"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:432
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:427
msgid "Stop All"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:441
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:436
msgid "Start all torrents and the I2P tunnel"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:443
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:438
msgid "Start All"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:463
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:458
msgid "No torrents loaded."
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:468
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:463
msgid "Totals"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:470
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:465
#, java-format
msgid "1 torrent"
msgid_plural "{0} torrents"
msgstr[0] ""
msgstr[1] ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:473
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:468
#, java-format
msgid "1 connected peer"
msgid_plural "{0} connected peers"
msgstr[0] ""
msgstr[1] ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:479
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:474
#, java-format
msgid "1 DHT peer"
msgid_plural "{0} DHT peers"
msgstr[0] ""
msgstr[1] ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:572
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567
#, java-format
msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\""
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:614
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:644
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:610
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:640
#, java-format
msgid "Magnet deleted: {0}"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:622
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:650
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:618
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:646
#, java-format
msgid "Torrent file deleted: {0}"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:642
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:638
#, java-format
msgid "Download deleted: {0}"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:656
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:652
#, java-format
msgid "Data file deleted: {0}"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:658
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:669
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:654
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:665
#, java-format
msgid "Data file could not be deleted: {0}"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:684
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:693
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:689
#, java-format
msgid "Directory could not be deleted: {0}"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:691
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:687
#, java-format
msgid "Directory deleted: {0}"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:738
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:734
msgid "Error creating torrent - you must select a tracker"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:755
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:751
#, java-format
msgid "Torrent created for \"{0}\""
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:757
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:753
#, 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:759
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:755
#, java-format
msgid "Error creating a torrent for \"{0}\""
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:762
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:758
#, java-format
msgid "Cannot create a torrent for the nonexistent data: {0}"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:765
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:761
msgid "Error creating torrent - you must enter a file or directory"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:780
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1771
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:776
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1769
msgid "Delete selected"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:780
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1772
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:776
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1770
msgid "Save tracker configuration"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:797
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:793
msgid "Removed"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:826
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1770
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1775
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:822
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1768
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1773
msgid "Add tracker"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:849
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:852
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:845
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:848
msgid "Enter valid tracker name and URLs"
msgstr ""
#. "\n" +
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1774
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:850
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1772
msgid "Restore defaults"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:857
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:853
msgid "Restored default trackers"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:997
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:998
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:993
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:994
msgid "Checking"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1000
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1001
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:996
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:997
msgid "Allocating"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1005
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1011
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1018
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1009
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1016
msgid "Tracker Error"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1008
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1013
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1041
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1046
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1057
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1062
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1068
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1073
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1011
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1039
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1044
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1055
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1060
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1066
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1071
#, java-format
msgid "1 peer"
msgid_plural "{0} peers"
msgstr[0] ""
msgstr[1] ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1021
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1022
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1019
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1020
msgid "Starting"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1030
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1028
msgid "Seeding"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1034
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1048
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1049
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2203
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2318
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1032
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1046
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1047
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2051
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2166
msgid "Complete"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1053
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1054
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1059
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1060
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1051
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1052
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1057
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1058
msgid "OK"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1064
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1065
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1070
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1071
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1062
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1063
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1068
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1069
msgid "Stalled"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1075
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1076
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1079
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1080
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1073
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1074
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1077
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1078
msgid "No Peers"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1082
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1083
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1080
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1081
msgid "Stopped"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1116
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1114
msgid "Torrent details"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1145
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1143
msgid "View files"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1147
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1145
msgid "Open file"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1192
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190
msgid "Stop the torrent"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1194
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1192
msgid "Stop"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1206
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1204
msgid "Start the torrent"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1208
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1206
msgid "Start"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1220
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1218
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 quote must be escaped
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1225
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1223
#, 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:1228
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1226
msgid "Remove"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1238
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 quote must be escaped
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1245
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1243
#, 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:1248
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1738
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1246
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1736
msgid "Delete"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1283
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1281
msgid "Unknown"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1295
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293
msgid "Seed"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1318
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1316
msgid "Uninteresting (The peer has no pieces we need)"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1320
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1318
msgid "Choked (The peer is not allowing us to request pieces)"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1340
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1338
msgid "Uninterested (We have no pieces the peer needs)"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1342
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1340
msgid "Choking (We are not allowing the peer to request pieces)"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1396
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1394
#, java-format
msgid "Details at {0} tracker"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1412
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1410
msgid "Info"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1440
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1438
msgid "Add Torrent"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1442
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1440
msgid "From URL"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1445
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1443
msgid ""
"Enter the torrent file download URL (I2P only), magnet link, maggot link, or "
"info hash"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1450
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1448
msgid "Add torrent"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1453
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1451
#, java-format
msgid "You can also copy .torrent files to: {0}."
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1455
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1453
msgid "Removing a .torrent will cause it to stop."
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1478
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1476
msgid "Create Torrent"
msgstr ""
#. out.write("From file: \n");
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1481
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1479
msgid "Data to seed"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1485
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1483
msgid "File or directory to seed (must be within the specified path)"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1487
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2153
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1485
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2001
msgid "Tracker"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1487
msgid "Select a tracker"
msgstr ""
#. out.write(_("Open trackers and DHT only"));
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1494
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1492
msgid "Open trackers only"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1511
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1509
msgid "Create torrent"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1535
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1784
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1533
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1782
msgid "Configuration"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1539
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1537
msgid "Data directory"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1541
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1539
msgid "Edit i2psnark.config and restart to change"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1545
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1543
msgid "Files readable by all"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1549
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1547
msgid "If checked, other users may access the downloaded files"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1553
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1551
msgid "Auto start"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1557
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1555
msgid "If checked, automatically start torrents that are added"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1561
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1559
msgid "Theme"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1574
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1572
msgid "Refresh time"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1587
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1585
msgid "Never"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1593
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1591
msgid "Startup delay"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1595
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1593
msgid "minutes"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1619
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1617
msgid "Total uploader limit"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1622
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1620
msgid "peers"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1626
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1624
msgid "Up bandwidth limit"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1629
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1627
msgid "Half available bandwidth recommended."
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1631
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1629
msgid "View or change router bandwidth"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1635
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1633
msgid "Use open trackers also"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1639
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1637
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:1643
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1641
msgid "Enable DHT"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1647
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1645
msgid "If checked, use DHT"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1663
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1661
msgid "Inbound Settings"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1669
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1667
msgid "Outbound Settings"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1677
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1675
msgid "I2CP host"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1682
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1680
msgid "I2CP port"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1695
msgid "I2CP options"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1702
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1700
msgid "Save configuration"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1716
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714
msgid "Trackers"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1721
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1719
msgid "Name"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1723
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1721
msgid "Website URL"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1725
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2356
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1723
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2204
msgid "Open"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1727
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1725
msgid "Private"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1729
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1727
msgid "Announce URL"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1763
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1761
msgid "Add"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1800
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1798
#, java-format
msgid "Invalid magnet URL {0}"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1834
-#, java-format
-msgid "Invalid info hash in magnet URL {0}"
-msgstr ""
-
#. * dummies for translation
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1958
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806
#, java-format
msgid "1 hop"
msgid_plural "{0} hops"
msgstr[0] ""
msgstr[1] ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1959
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1807
#, java-format
msgid "1 tunnel"
msgid_plural "{0} tunnels"
msgstr[0] ""
msgstr[1] ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2140
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1988
msgid "Torrent file"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2175
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2023
msgid "Magnet link"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2182
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2030
msgid "Private torrent"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2191
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2255
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2257
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2039
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2105
msgid "Size"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2198
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2046
msgid "Completion"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2208
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2056
msgid "Remaining"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2215
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2063
msgid "Files"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2220
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2068
msgid "Pieces"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2224
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2072
msgid "Piece size"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2247
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2251
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2301
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2095
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2099
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2149
msgid "Directory"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2268
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2270
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2116
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2118
msgid "Priority"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2276
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2124
msgid "Up to higher level directory"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2306
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2154
msgid "Torrent not found?"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2315
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2163
msgid "File not found in torrent?"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2328
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2176
msgid "complete"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2329
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2177
msgid "remaining"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2383
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2231
msgid "High"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2388
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2236
msgid "Normal"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2393
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2241
msgid "Skip"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2402
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2250
msgid "Save priorities"
msgstr ""
diff --git a/apps/i2psnark/locale/messages_it.po b/apps/i2psnark/locale/messages_it.po
index ff5ede7cf..e0da9dc49 100644
--- a/apps/i2psnark/locale/messages_it.po
+++ b/apps/i2psnark/locale/messages_it.po
@@ -12,9 +12,9 @@ msgid ""
msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-10-12 00:46+0000\n"
-"PO-Revision-Date: 2012-10-12 00:39+0000\n"
-"Last-Translator: kytv \n"
+"POT-Creation-Date: 2012-10-15 17:57+0000\n"
+"PO-Revision-Date: 2012-10-12 00:54+0000\n"
+"Last-Translator: BadCluster \n"
"Language-Team: Italian (http://www.transifex.com/projects/p/I2P/language/"
"it/)\n"
"Language: it\n"
@@ -342,7 +342,7 @@ msgstr "Torrent in aggiunta in {0}"
#: ../java/src/org/klomp/snark/SnarkManager.java:1374
#, java-format
msgid "Up bandwidth limit is {0} KBps"
-msgstr ""
+msgstr "La banda di Upload massima è {0} KBps"
#: ../java/src/org/klomp/snark/SnarkManager.java:1396
#, java-format
@@ -606,7 +606,7 @@ msgstr "File torrent eliminato: {0}"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:642
#, java-format
msgid "Download deleted: {0}"
-msgstr ""
+msgstr "Downloads cancellati: {0}"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:656
#, java-format
@@ -701,12 +701,12 @@ msgstr "Ripristina tracker di default"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:997
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:998
msgid "Checking"
-msgstr ""
+msgstr "Controllo (Check)"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1000
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1001
msgid "Allocating"
-msgstr ""
+msgstr "Allocando"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1005
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1011
diff --git a/apps/i2psnark/locale/messages_pt.po b/apps/i2psnark/locale/messages_pt.po
index a88e4d85e..9ab15f233 100644
--- a/apps/i2psnark/locale/messages_pt.po
+++ b/apps/i2psnark/locale/messages_pt.po
@@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: I2P\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-10-07 14:00+0000\n"
+"POT-Creation-Date: 2012-11-02 19:48+0000\n"
"PO-Revision-Date: 2011-09-23 20:17+0000\n"
"Last-Translator: kytv \n"
"Language-Team: duck \n"
@@ -20,482 +20,640 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-#: ../java/src/org/klomp/snark/SnarkManager.java:355
+#: ../java/src/org/klomp/snark/MagnetURI.java:42
+#: ../java/src/org/klomp/snark/MagnetURI.java:52
+#: ../java/src/org/klomp/snark/SnarkManager.java:1549
+#, fuzzy
+msgid "Magnet"
+msgstr "URL magnet"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:459
#, java-format
msgid "Total uploaders limit changed to {0}"
msgstr "Limite total de subidores mudado a {0}"
-#: ../java/src/org/klomp/snark/SnarkManager.java:357
+#: ../java/src/org/klomp/snark/SnarkManager.java:461
#, java-format
msgid "Minimum total uploaders limit is {0}"
msgstr "O limite mínimo de subidores é {0}"
-#: ../java/src/org/klomp/snark/SnarkManager.java:369
+#: ../java/src/org/klomp/snark/SnarkManager.java:473
#, 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:371
+#: ../java/src/org/klomp/snark/SnarkManager.java:475
#, 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:383
+#: ../java/src/org/klomp/snark/SnarkManager.java:487
#, java-format
msgid "Startup delay changed to {0}"
msgstr "Demora do arranque mudado a {0}."
-#: ../java/src/org/klomp/snark/SnarkManager.java:394
+#: ../java/src/org/klomp/snark/SnarkManager.java:498
#, java-format
msgid "Refresh time changed to {0}"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:396
+#: ../java/src/org/klomp/snark/SnarkManager.java:500
msgid "Refresh disabled"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:451
+#: ../java/src/org/klomp/snark/SnarkManager.java:555
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 deter todos os torrentes"
-#: ../java/src/org/klomp/snark/SnarkManager.java:455
+#: ../java/src/org/klomp/snark/SnarkManager.java:559
#, java-format
msgid "I2CP options changed to {0}"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:460
+#: ../java/src/org/klomp/snark/SnarkManager.java:564
msgid "Disconnecting old I2CP destination"
msgstr "Desconectando anterior Destinação I2CP"
-#: ../java/src/org/klomp/snark/SnarkManager.java:462
+#: ../java/src/org/klomp/snark/SnarkManager.java:566
#, java-format
msgid "I2CP settings changed to {0}"
msgstr "Preferências de I2CP mudadas a {0}"
-#: ../java/src/org/klomp/snark/SnarkManager.java:467
+#: ../java/src/org/klomp/snark/SnarkManager.java:571
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:471
+#: ../java/src/org/klomp/snark/SnarkManager.java:575
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:473
+#: ../java/src/org/klomp/snark/SnarkManager.java:577
msgid "Reconnected on the new I2CP destination"
msgstr "Conectado com a nova Destinação I2CP"
-#: ../java/src/org/klomp/snark/SnarkManager.java:480
+#: ../java/src/org/klomp/snark/SnarkManager.java:584
#, java-format
msgid "I2CP listener restarted for \"{0}\""
msgstr "Conexão I2CP re-estabelecida para \"{0}\""
-#: ../java/src/org/klomp/snark/SnarkManager.java:492
+#: ../java/src/org/klomp/snark/SnarkManager.java:596
msgid "New files will be publicly readable"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:494
+#: ../java/src/org/klomp/snark/SnarkManager.java:598
msgid "New files will not be publicly readable"
msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:501
+#: ../java/src/org/klomp/snark/SnarkManager.java:605
msgid "Enabled autostart"
msgstr "Ativado o iniciar automáticamente"
-#: ../java/src/org/klomp/snark/SnarkManager.java:503
+#: ../java/src/org/klomp/snark/SnarkManager.java:607
msgid "Disabled autostart"
msgstr "Desativado o iniciar automáticamente"
-#: ../java/src/org/klomp/snark/SnarkManager.java:509
+#: ../java/src/org/klomp/snark/SnarkManager.java:613
msgid "Enabled open trackers - torrent restart required to take effect."
msgstr ""
"Uso de rastreadores abertos ativado - Para ter efeito é necesário reiniciar "
"os torrentes."
-#: ../java/src/org/klomp/snark/SnarkManager.java:511
+#: ../java/src/org/klomp/snark/SnarkManager.java:615
msgid "Disabled open trackers - torrent restart required to take effect."
msgstr ""
"Uso dos rastreadores abertos desativado - Para ter efeito é necesário "
"reiniciar os torrentes."
-#: ../java/src/org/klomp/snark/SnarkManager.java:519
+#: ../java/src/org/klomp/snark/SnarkManager.java:622
+msgid "Enabled DHT."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:624
+msgid "Disabled DHT."
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:626
+msgid "DHT change requires tunnel shutdown and reopen"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:633
+#, 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:640
+msgid "Configuration unchanged."
+msgstr "Configuração não mudada."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:672
msgid "Open Tracker list changed - torrent restart required to take effect."
msgstr ""
"Listado de rastreadores abertos mudado - Para ter efeito é necesário "
"reiniciar os torrentes."
-#: ../java/src/org/klomp/snark/SnarkManager.java:526
-#, 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:682
+msgid "Private tracker list changed - affects newly created torrents only."
+msgstr ""
-#: ../java/src/org/klomp/snark/SnarkManager.java:533
-msgid "Configuration unchanged."
-msgstr "Configuração não mudada."
-
-#: ../java/src/org/klomp/snark/SnarkManager.java:543
+#: ../java/src/org/klomp/snark/SnarkManager.java:728
#, 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:608
+#: ../java/src/org/klomp/snark/SnarkManager.java:801
msgid "Connecting to I2P"
msgstr "Conectando com I2P"
-#: ../java/src/org/klomp/snark/SnarkManager.java:611
+#: ../java/src/org/klomp/snark/SnarkManager.java:804
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:620
+#: ../java/src/org/klomp/snark/SnarkManager.java:813
#, java-format
msgid "Error: Could not add the 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:642
+#: ../java/src/org/klomp/snark/SnarkManager.java:835
#, java-format
msgid "Cannot open \"{0}\""
msgstr "Não pode se abrir \"{0}\""
#. TODO - if the existing one is a magnet, delete it and add the metainfo instead?
-#: ../java/src/org/klomp/snark/SnarkManager.java:661
-#: ../java/src/org/klomp/snark/SnarkManager.java:737
-#: ../java/src/org/klomp/snark/SnarkManager.java:792
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2015
+#: ../java/src/org/klomp/snark/SnarkManager.java:854
+#: ../java/src/org/klomp/snark/SnarkManager.java:952
+#: ../java/src/org/klomp/snark/SnarkManager.java:1034
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:159
#, java-format
msgid "Torrent with this info hash is already running: {0}"
msgstr "torrente com este info hash já em marcha: {0}"
-#. addMessage(_("Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and DHT only.", info.getName()));
-#: ../java/src/org/klomp/snark/SnarkManager.java:668
-#, java-format
+#: ../java/src/org/klomp/snark/SnarkManager.java:860
+#, fuzzy, java-format
+msgid "ERROR - No I2P trackers in private torrent \"{0}\""
+msgstr ""
+"ERRO - Não ha espaço suficente, não se pode crear um torrente desde {0}."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:862
+#, fuzzy, java-format
msgid ""
-"Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers "
-"only."
+"Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and "
+"DHT only."
msgstr ""
"Aviso - Se ignorarão rastreadores fora de I2P em \"{0}\", anunciando só aos "
"rastreadores abertos do I2P."
-#. 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:673
-#, java-format
+#: ../java/src/org/klomp/snark/SnarkManager.java:865
+#, fuzzy, java-format
msgid ""
-"Warning - No I2P Trackers found in \"{0}\". Make sure Open Tracker is "
-"enabled before starting this torrent."
+"Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will "
+"announce to DHT only."
+msgstr ""
+"Aviso - Se ignorarão rastreadores fora de I2P em \"{0}\", anunciando só aos "
+"rastreadores abertos do I2P."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:867
+#, fuzzy, java-format
+msgid ""
+"Warning - No I2P trackers in \"{0}\", and DHT and open trackers are "
+"disabled, you should enable open trackers or DHT before starting the torrent."
msgstr ""
"Aviso - Se ignorará rastreador não I2P no \"{0}\". Tens que ativá os "
"rastreadores abertos antes de iniciar o torrente!"
-#: ../java/src/org/klomp/snark/SnarkManager.java:694
+#: ../java/src/org/klomp/snark/SnarkManager.java:889
#, 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:699
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2037
+#: ../java/src/org/klomp/snark/SnarkManager.java:894
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:181
#, java-format
msgid "ERROR - Out of memory, cannot create torrent from {0}"
msgstr ""
"ERRO - Não ha espaço suficente, não se pode crear um torrente desde {0}."
-#: ../java/src/org/klomp/snark/SnarkManager.java:711
+#: ../java/src/org/klomp/snark/SnarkManager.java:906
#, java-format
msgid "Torrent added and started: \"{0}\""
msgstr "torrente adicionado e iniciado: \"{0}\""
-#: ../java/src/org/klomp/snark/SnarkManager.java:713
+#: ../java/src/org/klomp/snark/SnarkManager.java:908
#, java-format
msgid "Torrent added: \"{0}\""
msgstr "torrente adicionado: \"{0}\""
-#: ../java/src/org/klomp/snark/SnarkManager.java:748
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:493
+#: ../java/src/org/klomp/snark/SnarkManager.java:963
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:87
#, java-format
msgid "Fetching {0}"
msgstr "Buscando {0}"
-#: ../java/src/org/klomp/snark/SnarkManager.java:751
-#, java-format
+#: ../java/src/org/klomp/snark/SnarkManager.java:969
+#, fuzzy, 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."
+"Open trackers are disabled and we have no DHT peers. Fetch of {0} may not "
+"succeed until you start another torrent, enable open trackers, or enable DHT."
msgstr ""
"Não temos pare guardados nem estão ativo outros torrentes. Receber {0} não "
"vai dar certo até começa outro torrente."
-#: ../java/src/org/klomp/snark/SnarkManager.java:755
+#: ../java/src/org/klomp/snark/SnarkManager.java:973
#, java-format
msgid "Adding {0}"
msgstr "Adicionando {0}"
-#: ../java/src/org/klomp/snark/SnarkManager.java:802
-#: ../java/src/org/klomp/snark/SnarkManager.java:825
-#: ../java/src/org/klomp/snark/SnarkManager.java:1260
+#: ../java/src/org/klomp/snark/SnarkManager.java:1005
+#, fuzzy, java-format
+msgid "Download already running: {0}"
+msgstr "torrente já em marcha: {0}"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1044
+#: ../java/src/org/klomp/snark/SnarkManager.java:1067
+#: ../java/src/org/klomp/snark/SnarkManager.java:1505
#, 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:1052
+#: ../java/src/org/klomp/snark/SnarkManager.java:1294
#, 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:1054
+#: ../java/src/org/klomp/snark/SnarkManager.java:1296
#, 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:1056
+#: ../java/src/org/klomp/snark/SnarkManager.java:1298
#, 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:1058
+#: ../java/src/org/klomp/snark/SnarkManager.java:1300
#, 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:1060
+#: ../java/src/org/klomp/snark/SnarkManager.java:1302
#, 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:1061
+#: ../java/src/org/klomp/snark/SnarkManager.java:1303
#, java-format
msgid "Limit is {0}B"
msgstr "O limite são \"{0}\"Bytes"
-#: ../java/src/org/klomp/snark/SnarkManager.java:1063
+#: ../java/src/org/klomp/snark/SnarkManager.java:1305
#, java-format
msgid "Torrent \"{0}\" has no data, deleting it!"
msgstr "O torrente \"{0}\" não contem dados e será apagado."
-#: ../java/src/org/klomp/snark/SnarkManager.java:1071
+#: ../java/src/org/klomp/snark/SnarkManager.java:1313
#, 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:1087
+#: ../java/src/org/klomp/snark/SnarkManager.java:1329
#, 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:1108
-#: ../java/src/org/klomp/snark/SnarkManager.java:1126
+#: ../java/src/org/klomp/snark/SnarkManager.java:1350
+#: ../java/src/org/klomp/snark/SnarkManager.java:1368
#, java-format
msgid "Torrent stopped: \"{0}\""
msgstr "torrente detido: \"{0}\""
-#: ../java/src/org/klomp/snark/SnarkManager.java:1147
+#: ../java/src/org/klomp/snark/SnarkManager.java:1389
#, java-format
msgid "Torrent removed: \"{0}\""
msgstr "torrente quitado: \"{0}\""
-#: ../java/src/org/klomp/snark/SnarkManager.java:1155
+#: ../java/src/org/klomp/snark/SnarkManager.java:1397
#, java-format
msgid "Adding torrents in {0}"
msgstr "Os torrentes serão adicionados em {0} ..."
-#: ../java/src/org/klomp/snark/SnarkManager.java:1208
+#: ../java/src/org/klomp/snark/SnarkManager.java:1428
+#, fuzzy, java-format
+msgid "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:1450
#, java-format
msgid "Download finished: {0}"
msgstr "Finalizada a descarga de \"{0}\""
-#: ../java/src/org/klomp/snark/SnarkManager.java:1256
+#: ../java/src/org/klomp/snark/SnarkManager.java:1501
#, java-format
msgid "Metainfo received for {0}"
msgstr "Metainfo recibido para {0}"
-#: ../java/src/org/klomp/snark/SnarkManager.java:1257
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:528
+#: ../java/src/org/klomp/snark/SnarkManager.java:1502
+#: ../java/src/org/klomp/snark/SnarkManager.java:1731
#, java-format
msgid "Starting up torrent {0}"
msgstr "Iniciando o torrente {0}"
-#: ../java/src/org/klomp/snark/SnarkManager.java:1313
+#: ../java/src/org/klomp/snark/SnarkManager.java:1517
+#, fuzzy, java-format
+msgid "Error on torrent {0}"
+msgstr "Erro: Não se pode adicionar o torrente {0}."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1580
msgid "Unable to connect to I2P!"
msgstr "Impossível de se conectar com I2P"
-#: ../java/src/org/klomp/snark/SnarkManager.java:1319
+#: ../java/src/org/klomp/snark/SnarkManager.java:1586
#, java-format
msgid "Unable to add {0}"
msgstr "Impossível de adicionar {0}"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:204
+#: ../java/src/org/klomp/snark/SnarkManager.java:1730
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:124
+#, fuzzy
+msgid "Opening the I2P tunnel"
+msgstr "Deter todos os torrentes e o túnel I2P"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1754
+msgid "Opening the I2P tunnel and starting all torrents."
+msgstr "Abrendo o túnel I2P e iniciando os torrentes ..."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1809
+msgid "Stopping all torrents and closing the I2P tunnel."
+msgstr "Detindo todos os torrentes e fechando o túnel I2P"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1828
+#, fuzzy
+msgid "Closing I2P tunnel after notifying trackers."
+msgstr "Abrendo o túnel I2P e iniciando os torrentes ..."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1835
+#: ../java/src/org/klomp/snark/SnarkManager.java:1846
+msgid "I2P tunnel closed."
+msgstr "Túnel I2P fechado"
+
+#: ../java/src/org/klomp/snark/TrackerClient.java:227
+#, java-format
+msgid "No valid trackers for {0} - enable opentrackers or DHT?"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/UpdateHandler.java:49
+#: ../java/src/org/klomp/snark/UpdateRunner.java:227
+#, fuzzy
+msgid "Updating"
+msgstr "Iniciar"
+
+#: ../java/src/org/klomp/snark/UpdateRunner.java:114
+#, java-format
+msgid "Updating from {0}"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:75
+#, fuzzy, java-format
+msgid "Download torrent file from {0}"
+msgstr "torrente obtido de {0}"
+
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:97
+#, java-format
+msgid "Torrent was not retrieved from {0}"
+msgstr "Não se pode obter torrente de {0}"
+
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:150
+#, java-format
+msgid "Torrent fetched from {0}"
+msgstr "torrente obtido de {0}"
+
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:171
+#, java-format
+msgid "Torrent already running: {0}"
+msgstr "torrente já em marcha: {0}"
+
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:173
+#, java-format
+msgid "Torrent already in the queue: {0}"
+msgstr "torrente já na cola: {0}"
+
+#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:179
+#, java-format
+msgid "Torrent at {0} was not valid"
+msgstr "torrente em {0} não foi válido"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:218
msgid "I2PSnark - Anonymous BitTorrent Client"
msgstr "I2PSnark - Cliente de BitTorrent Anônimo"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:220
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:231
+msgid "Router is down"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:246
msgid "Torrents"
msgstr "torrentes"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:223
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:230
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1033
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:249
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:256
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1265
msgid "I2PSnark"
msgstr "I2PSnark"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:227
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:253
msgid "Refresh page"
msgstr "Atualizar página"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:232
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:258
msgid "Forum"
msgstr "Foro"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:286
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:271
+msgid "Click \"Add torrent\" button to fetch torrent"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:307
+msgid "clear messages"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:333
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:335
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2109
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2111
msgid "Status"
msgstr "Estado"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:292
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:294
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:342
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:344
msgid "Hide Peers"
msgstr "ocultar parceiros"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:299
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:301
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:349
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:351
msgid "Show Peers"
msgstr "mostrar parceiros"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:308
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1682
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1698
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:358
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:360
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1964
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1979
msgid "Torrent"
msgstr "torrente"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:312
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:365
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:315
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:368
msgid "ETA"
msgstr "Tempo"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:319
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:373
msgid "Downloaded"
msgstr "Descarregado"
#. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:322
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:336
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:376
msgid "RX"
msgstr "Baixado"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:381
msgid "Uploaded"
msgstr "Subido"
#. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:329
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:346
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:384
msgid "TX"
msgstr "Subido"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:334
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:390
msgid "Down Rate"
msgstr "Taça de descarga"
#. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:339
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:348
-msgid "Rate"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:393
+#, fuzzy
+msgid "RX Rate"
msgstr "Taça"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:344
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:399
msgid "Up Rate"
msgstr "Taça de subida"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:368
+#. Translators: Please keep short or translate as " "
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:402
+#, fuzzy
+msgid "TX Rate"
+msgstr "Taça"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:425
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:370
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:427
msgid "Stop All"
msgstr "Deter tudos"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:379
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:436
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:381
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:438
msgid "Start All"
msgstr "Arrancar todos"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:400
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:458
msgid "No torrents loaded."
msgstr "Não carregado nenhum torrente"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:405
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:463
msgid "Totals"
msgstr "Total"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:407
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:465
#, 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:410
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:468
#, 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:499
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:474
+#, fuzzy, java-format
+msgid "1 DHT peer"
+msgid_plural "{0} DHT peers"
+msgstr[0] "1 parceiro"
+msgstr[1] "{0} parceiros"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567
#, 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://\", \"{0}\", ou \"{1}\"."
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:547
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:574
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:610
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:640
#, java-format
msgid "Magnet deleted: {0}"
msgstr "Apagada o magnet: {0}"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:555
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:580
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:618
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:646
#, java-format
msgid "Torrent file deleted: {0}"
msgstr "Apagado o arquivo torrente: {0}"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:586
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:596
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:638
+#, fuzzy, java-format
+msgid "Download deleted: {0}"
+msgstr "Apagada a pasta de dados: {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:652
#, java-format
msgid "Data file deleted: {0}"
msgstr "Apagado o arquivo de dados: {0}"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:588
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:654
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:665
#, 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:607
-#, java-format
-msgid "Data dir deleted: {0}"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:689
+#, fuzzy, java-format
+msgid "Directory could not be deleted: {0}"
+msgstr "Não se pode apagar o arquivo de dados: {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:687
+#, fuzzy, java-format
+msgid "Directory deleted: {0}"
msgstr "Apagada a pasta de dados: {0}"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:644
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:734
msgid "Error creating torrent - you must select a tracker"
msgstr "Erro ao criar o torrente - Tens que elegir um rastreador."
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:659
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:751
#, java-format
msgid "Torrent created for \"{0}\""
msgstr "torrente criado para \"{0}\""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:661
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:753
#, java-format
msgid ""
"Many I2P trackers require you to register new torrents before seeding - "
@@ -504,124 +662,167 @@ 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:663
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:755
#, java-format
msgid "Error creating a torrent for \"{0}\""
msgstr "Erro ao criar o torrente \"{0}\""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:666
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:758
#, java-format
msgid "Cannot create a torrent for the nonexistent data: {0}"
msgstr "Não se pode criar um torrente para dados que não existam: {0}"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:669
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:761
msgid "Error creating torrent - you must enter a file or directory"
msgstr ""
"Erro ao criar o torrente - Tens que especificar um arquivo ou uma pasta."
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:672
-msgid "Stopping all torrents and closing the I2P tunnel."
-msgstr "Detindo todos os torrentes e fechando o túnel I2P"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:776
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1769
+msgid "Delete selected"
+msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:683
-msgid "I2P tunnel closed."
-msgstr "Túnel I2P fechado"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:776
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1770
+#, fuzzy
+msgid "Save tracker configuration"
+msgstr "Guardar configuração"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:686
-msgid "Opening the I2P tunnel and starting all torrents."
-msgstr "Abrendo o túnel I2P e iniciando os torrentes ..."
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:793
+#, fuzzy
+msgid "Removed"
+msgstr "Quitar"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:808
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:813
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:819
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:822
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1768
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1773
+#, fuzzy
+msgid "Add tracker"
+msgstr "Rastreador"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:845
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:848
+msgid "Enter valid tracker name and URLs"
+msgstr ""
+
+#. "\n" +
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:850
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1772
+msgid "Restore defaults"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:853
+msgid "Restored default trackers"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:993
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:994
+msgid "Checking"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:996
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:997
+msgid "Allocating"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1009
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1016
msgid "Tracker Error"
msgstr "Erro do rastreador"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:815
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:827
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:831
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:839
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:843
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:848
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:852
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1011
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1039
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1044
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1055
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1060
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1066
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1071
#, java-format
msgid "1 peer"
msgid_plural "{0} peers"
msgstr[0] "1 parceiro"
msgstr[1] "{0} parceiros"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:824
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:829
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1019
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1020
+#, fuzzy
+msgid "Starting"
+msgstr "Iniciar"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1028
msgid "Seeding"
msgstr "semeando"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:833
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1704
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1809
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1032
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1046
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1047
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2051
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2166
msgid "Complete"
msgstr "completo"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:836
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:841
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1051
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1052
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1057
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1058
msgid "OK"
msgstr "bem"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:845
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:850
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1062
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1063
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1068
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1069
msgid "Stalled"
msgstr "estancado"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:857
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1073
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1074
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1077
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1078
msgid "No Peers"
msgstr "sem parceiros"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:859
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1080
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1081
msgid "Stopped"
msgstr "detenido"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:891
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1114
msgid "Torrent details"
msgstr "Detalhes do torrente"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:903
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1167
-msgid "Info"
-msgstr "Info"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:918
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1143
msgid "View files"
msgstr "mostrar arquivos"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:920
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1145
msgid "Open file"
msgstr "abrir arquivo"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:962
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190
msgid "Stop the torrent"
msgstr "Deter o torrente"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:964
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1192
msgid "Stop"
msgstr "Deter"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:974
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1204
msgid "Start the torrent"
msgstr "Iniciar o torrente"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:976
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1206
msgid "Start"
msgstr "Iniciar"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:987
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1218
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:992
+#. Then the remaining single quote must be escaped
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1223
#, java-format
msgid ""
"Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded "
@@ -630,18 +831,18 @@ 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:995
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1226
msgid "Remove"
msgstr "Quitar"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1006
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1238
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:1011
+#. Then the remaining single quote must be escaped
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1243
#, java-format
msgid ""
"Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded "
@@ -650,181 +851,180 @@ 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:1014
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1246
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1736
msgid "Delete"
msgstr "Apagar"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1049
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1281
msgid "Unknown"
msgstr "desconhecido"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1061
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293
msgid "Seed"
msgstr "Semeador"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1084
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1316
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:1086
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1318
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:1106
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1338
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:1108
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1340
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:1166
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1394
#, java-format
msgid "Details at {0} tracker"
msgstr "Detalhes no rastreador {0}"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1195
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1410
+msgid "Info"
+msgstr "Info"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1438
msgid "Add Torrent"
msgstr "Adicionar um torrente"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1197
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1440
msgid "From URL"
msgstr "URL fonte:"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1200
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1443
+#, fuzzy
msgid ""
-"Enter the torrent file download URL (I2P only), magnet link, or maggot link"
+"Enter the torrent file download URL (I2P only), magnet link, maggot link, or "
+"info hash"
msgstr "Entre aqui a URL do .torrent (só I2P), a URL magnet ou uma URL maggot."
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1205
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1448
msgid "Add torrent"
msgstr "Adicionar torrente"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1208
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1451
#, java-format
msgid "You can also copy .torrent files to: {0}."
msgstr "Também pode copiar arquivos torrentes a {0}."
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1210
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1453
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:1233
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1476
msgid "Create Torrent"
msgstr "Criar um torrente"
#. out.write("From file: \n");
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1236
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1479
msgid "Data to seed"
msgstr "Dados para semear"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1483
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:1242
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1723
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1485
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2001
msgid "Tracker"
msgstr "Rastreador"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1244
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1487
msgid "Select a tracker"
msgstr "Selecione um rastreador"
#. out.write(_("Open trackers and DHT only"));
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1249
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1492
msgid "Open trackers only"
msgstr "só rastreadores abertos"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1264
-msgid "or"
-msgstr "ou"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1267
-msgid "Specify custom tracker announce URL"
-msgstr "Especifique o URL de rastreador personalizado"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1270
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1509
msgid "Create torrent"
msgstr "Criar torrente"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1459
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1533
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1782
msgid "Configuration"
msgstr "Preferências"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1295
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1537
msgid "Data directory"
msgstr "Pasta de dados"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1297
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1539
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:1301
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1543
msgid "Files readable by all"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1305
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1547
msgid "If checked, other users may access the downloaded files"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1309
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1551
msgid "Auto start"
msgstr "Iniciar automáticamente"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1313
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1555
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:1317
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1559
msgid "Theme"
msgstr "Tema"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1330
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1572
msgid "Refresh time"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1343
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1585
msgid "Never"
msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1349
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1591
msgid "Startup delay"
msgstr "Demora do arranque"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1351
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1593
msgid "minutes"
msgstr "minutos"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1375
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1617
msgid "Total uploader limit"
msgstr "Limite global de subidores"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1378
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1620
msgid "peers"
msgstr "parceiros"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1382
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1624
msgid "Up bandwidth limit"
msgstr "Limite de largura de banda para a subida"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1385
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1627
msgid "Half available bandwidth recommended."
msgstr "Se recomenda a metade da largura de banda disponível."
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1387
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1629
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:1391
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1633
msgid "Use open trackers also"
msgstr "usar também rastreadores abertos"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1395
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1637
msgid ""
"If checked, announce torrents to open trackers as well as the tracker listed "
"in the torrent file"
@@ -832,155 +1032,185 @@ 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:1399
-msgid "Open tracker announce URLs"
-msgstr "URL(s) para anunciar aos rastreadores abertos"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1641
+msgid "Enable DHT"
+msgstr ""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1411
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1645
+msgid "If checked, use DHT"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1661
msgid "Inbound Settings"
msgstr "Preferências de entrada"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1417
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1667
msgid "Outbound Settings"
msgstr "Preferências de saida"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1425
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1675
msgid "I2CP host"
msgstr "Anfitrião I2CP"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1430
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1680
msgid "I2CP port"
msgstr "Porto I2CP"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1445
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1695
msgid "I2CP options"
msgstr "Opções I2CP"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1450
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1700
msgid "Save configuration"
msgstr "Guardar configuração"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1475
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714
+#, fuzzy
+msgid "Trackers"
+msgstr "Rastreador"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1719
+msgid "Name"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1721
+msgid "Website URL"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1723
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2204
+msgid "Open"
+msgstr "abrir"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1725
+msgid "Private"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1727
+msgid "Announce URL"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1761
+msgid "Add"
+msgstr ""
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1798
#, java-format
msgid "Invalid magnet URL {0}"
msgstr "URL magnet {0} não válida"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1509
-#, java-format
-msgid "Invalid info hash in magnet URL {0}"
-msgstr "Info hash não válido na URL magnet {0}"
-
#. * dummies for translation
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1539
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806
#, 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:1540
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1807
#, 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:1702
-msgid "Completion"
-msgstr "Finalização"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1988
+#, fuzzy
+msgid "Torrent file"
+msgstr "Detalhes do torrente"
-#. else unknown
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1706
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1755
-msgid "Size"
-msgstr "Tamanho"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1711
-msgid "Files"
-msgstr "Arquivos"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1713
-msgid "Pieces"
-msgstr "Peças"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714
-msgid "Piece size"
-msgstr "Tamanho das peças"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1736
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2023
msgid "Magnet link"
msgstr "URL magnet"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1753
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1792
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2030
+#, fuzzy
+msgid "Private torrent"
+msgstr "Criar torrente"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2039
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2105
+msgid "Size"
+msgstr "Tamanho"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2046
+msgid "Completion"
+msgstr "Finalização"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2056
+#, fuzzy
+msgid "Remaining"
+msgstr "Bytes faltando"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2063
+msgid "Files"
+msgstr "Arquivos"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2068
+msgid "Pieces"
+msgstr "Peças"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2072
+msgid "Piece size"
+msgstr "Tamanho das peças"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2095
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2099
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2149
msgid "Directory"
msgstr "Pasta"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1762
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2116
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2118
msgid "Priority"
msgstr "Prioridade"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1767
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2124
msgid "Up to higher level directory"
msgstr "Subir uma herarquia"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1797
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2154
msgid "Torrent not found?"
msgstr "Não achei o arquivo torrente?"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2163
msgid "File not found in torrent?"
msgstr "Arquivo não achado no torrente?"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1819
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2176
msgid "complete"
msgstr "completo"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1820
-msgid "bytes remaining"
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2177
+#, fuzzy
+msgid "remaining"
msgstr "Bytes faltando"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1845
-msgid "Open"
-msgstr "abrir"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1871
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2231
msgid "High"
msgstr "alta"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1876
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2236
msgid "Normal"
msgstr "normal"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1881
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2241
msgid "Skip"
msgstr "Ignorar"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1890
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2250
msgid "Save priorities"
msgstr "Guardar prioridades"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2006
-#, java-format
-msgid "Torrent fetched from {0}"
-msgstr "torrente obtido de {0}"
+#~ msgid "Invalid info hash in magnet URL {0}"
+#~ msgstr "Info hash não válido na URL magnet {0}"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2027
-#, java-format
-msgid "Torrent already running: {0}"
-msgstr "torrente já em marcha: {0}"
+#~ msgid "or"
+#~ msgstr "ou"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2029
-#, java-format
-msgid "Torrent already in the queue: {0}"
-msgstr "torrente já na cola: {0}"
+#~ msgid "Specify custom tracker announce URL"
+#~ msgstr "Especifique o URL de rastreador personalizado"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2035
-#, java-format
-msgid "Torrent at {0} was not valid"
-msgstr "torrente em {0} não foi válido"
-
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2042
-#, java-format
-msgid "Torrent was not retrieved from {0}"
-msgstr "Não se pode obter torrente de {0}"
+#~ msgid "Open tracker announce URLs"
+#~ msgstr "URL(s) para anunciar aos rastreadores abertos"
diff --git a/apps/i2psnark/locale/messages_sv.po b/apps/i2psnark/locale/messages_sv.po
index e8bee1dea..dc7a00092 100644
--- a/apps/i2psnark/locale/messages_sv.po
+++ b/apps/i2psnark/locale/messages_sv.po
@@ -2,379 +2,393 @@
# 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
-#
+#
# Translators:
# 123hund123 , 2011.
# , 2011.
# hottuna , 2011.
# , 2011.
-# Martin Svensson , 2011, 2012.
+# Martin Svensson , 2011-2012.
+# , 2012.
msgid ""
msgstr ""
"Project-Id-Version: I2P\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-07-26 19:10+0000\n"
-"PO-Revision-Date: 2012-07-25 19:21+0000\n"
+"Report-Msgid-Bugs-To: https://trac.i2p2.de/\n"
+"POT-Creation-Date: 2012-10-12 00:38+0000\n"
+"PO-Revision-Date: 2012-10-15 14:54+0000\n"
"Last-Translator: Martin Svensson \n"
-"Language-Team: Swedish (Sweden) (http://www.transifex.com/projects/p/I2P/"
-"language/sv_SE/)\n"
-"Language: sv_SE\n"
+"Language-Team: Swedish (Sweden) (http://www.transifex.com/projects/p/I2P/language/sv_SE/)\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"
+"Language: sv_SE\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: ../java/src/org/klomp/snark/SnarkManager.java:407
+#: ../java/src/org/klomp/snark/SnarkManager.java:434
#, java-format
msgid "Total uploaders limit changed to {0}"
msgstr "Gräns för totalt antal uppladdare är bytt till {0}"
-#: ../java/src/org/klomp/snark/SnarkManager.java:409
+#: ../java/src/org/klomp/snark/SnarkManager.java:436
#, java-format
msgid "Minimum total uploaders limit is {0}"
msgstr "Gräns för totalt minsta antal uppladdare är bytt till {0}"
-#: ../java/src/org/klomp/snark/SnarkManager.java:421
+#: ../java/src/org/klomp/snark/SnarkManager.java:448
#, java-format
msgid "Up BW limit changed to {0}KBps"
msgstr "Uppladdnings bandbredd bytt till {0}KBps"
-#: ../java/src/org/klomp/snark/SnarkManager.java:423
+#: ../java/src/org/klomp/snark/SnarkManager.java:450
#, java-format
msgid "Minimum up bandwidth limit is {0}KBps"
msgstr "Minsta uppladdnings bandbredd bytt till {0}KBps"
-#: ../java/src/org/klomp/snark/SnarkManager.java:435
+#: ../java/src/org/klomp/snark/SnarkManager.java:462
#, java-format
msgid "Startup delay changed to {0}"
msgstr "Fördröjning vid uppstart bytt till {0}"
-#: ../java/src/org/klomp/snark/SnarkManager.java:446
+#: ../java/src/org/klomp/snark/SnarkManager.java:473
#, java-format
msgid "Refresh time changed to {0}"
msgstr "Uppdateringstiden ändrad till {0}"
-#: ../java/src/org/klomp/snark/SnarkManager.java:448
+#: ../java/src/org/klomp/snark/SnarkManager.java:475
msgid "Refresh disabled"
msgstr "Uppdatering inaktiverad"
-#: ../java/src/org/klomp/snark/SnarkManager.java:503
+#: ../java/src/org/klomp/snark/SnarkManager.java:530
msgid "I2CP and tunnel changes will take effect after stopping all torrents"
-msgstr ""
-"I2CP och tunnel förändringar kommer träda i kraft efter alla torrentar "
-"stoppats."
+msgstr "I2CP och tunnel förändringar kommer träda i kraft efter alla torrentar stoppats."
-#: ../java/src/org/klomp/snark/SnarkManager.java:507
+#: ../java/src/org/klomp/snark/SnarkManager.java:534
#, java-format
msgid "I2CP options changed to {0}"
msgstr "I2CP valet ändrad till {0}"
-#: ../java/src/org/klomp/snark/SnarkManager.java:512
+#: ../java/src/org/klomp/snark/SnarkManager.java:539
msgid "Disconnecting old I2CP destination"
msgstr "Kopplat från gammal I2CP destination"
-#: ../java/src/org/klomp/snark/SnarkManager.java:514
+#: ../java/src/org/klomp/snark/SnarkManager.java:541
#, java-format
msgid "I2CP settings changed to {0}"
msgstr "I2CP-inställningar ändrade till {0}"
-#: ../java/src/org/klomp/snark/SnarkManager.java:519
+#: ../java/src/org/klomp/snark/SnarkManager.java:546
msgid ""
"Unable to connect with the new settings, reverting to the old I2CP settings"
-msgstr ""
-"Misslyckades med anslutningsförsök med nya inställningar, återställer de "
-"gamla I2CP inställningarna"
+msgstr "Misslyckades med anslutningsförsök med nya inställningar, återställer de gamla I2CP inställningarna"
-#: ../java/src/org/klomp/snark/SnarkManager.java:523
+#: ../java/src/org/klomp/snark/SnarkManager.java:550
msgid "Unable to reconnect with the old settings!"
msgstr "Misslyckades med anslutningsförsök med gamla inställningar!"
-#: ../java/src/org/klomp/snark/SnarkManager.java:525
+#: ../java/src/org/klomp/snark/SnarkManager.java:552
msgid "Reconnected on the new I2CP destination"
msgstr "Återanslöt mot den nya I2CP destinationen"
-#: ../java/src/org/klomp/snark/SnarkManager.java:532
+#: ../java/src/org/klomp/snark/SnarkManager.java:559
#, java-format
msgid "I2CP listener restarted for \"{0}\""
msgstr "I2CP-lyssnar omstartad på grund av \"{0}\""
-#: ../java/src/org/klomp/snark/SnarkManager.java:544
+#: ../java/src/org/klomp/snark/SnarkManager.java:571
msgid "New files will be publicly readable"
msgstr "Nya filer kommer vara publikt läsbara"
-#: ../java/src/org/klomp/snark/SnarkManager.java:546
+#: ../java/src/org/klomp/snark/SnarkManager.java:573
msgid "New files will not be publicly readable"
msgstr "Nya filer kommer inte vara publikt läsbara"
-#: ../java/src/org/klomp/snark/SnarkManager.java:553
+#: ../java/src/org/klomp/snark/SnarkManager.java:580
msgid "Enabled autostart"
msgstr "Aktiverade automatisk start"
-#: ../java/src/org/klomp/snark/SnarkManager.java:555
+#: ../java/src/org/klomp/snark/SnarkManager.java:582
msgid "Disabled autostart"
msgstr "Avaktiverade automatisk start"
-#: ../java/src/org/klomp/snark/SnarkManager.java:561
+#: ../java/src/org/klomp/snark/SnarkManager.java:588
msgid "Enabled open trackers - torrent restart required to take effect."
-msgstr ""
-"Aktiverade öppna trackers - torrent måste startas om för att inställningen "
-"ska träda i kraft"
+msgstr "Aktiverade öppna trackers - torrent måste startas om för att inställningen ska träda i kraft"
-#: ../java/src/org/klomp/snark/SnarkManager.java:563
+#: ../java/src/org/klomp/snark/SnarkManager.java:590
msgid "Disabled open trackers - torrent restart required to take effect."
-msgstr ""
-"Avaktiverade öppna trackers - torrent måste startas om för att inställningen "
-"ska träda i kraft"
+msgstr "Avaktiverade öppna trackers - torrent måste startas om för att inställningen ska träda i kraft"
-#: ../java/src/org/klomp/snark/SnarkManager.java:570
+#: ../java/src/org/klomp/snark/SnarkManager.java:597
+msgid "Enabled DHT."
+msgstr "Aktivera DHT."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:599
+msgid "Disabled DHT."
+msgstr "Avaktivera DHT."
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:601
+msgid "DHT change requires tunnel shutdown and reopen"
+msgstr "Förändringar i DHT kräver att tunneln stängs och öppnas igen "
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:608
#, java-format
msgid "{0} theme loaded, return to main i2psnark page to view."
msgstr "{0} tema laddat, återgå till huvudvyn för i2psnark."
-#: ../java/src/org/klomp/snark/SnarkManager.java:577
+#: ../java/src/org/klomp/snark/SnarkManager.java:615
msgid "Configuration unchanged."
msgstr "Inställningar oförändrade"
-#: ../java/src/org/klomp/snark/SnarkManager.java:609
+#: ../java/src/org/klomp/snark/SnarkManager.java:647
msgid "Open Tracker list changed - torrent restart required to take effect."
-msgstr ""
-"Öppen tracker-lista förändrad - torrent måste startas om för att "
-"inställningen ska träda i kraft"
+msgstr "Öppen tracker-lista förändrad - torrent måste startas om för att inställningen ska träda i kraft"
-#: ../java/src/org/klomp/snark/SnarkManager.java:619
+#: ../java/src/org/klomp/snark/SnarkManager.java:657
msgid "Private tracker list changed - affects newly created torrents only."
msgstr "Privat trackerlista ändrad - påverkar bara nyligen skapade torrents"
-#: ../java/src/org/klomp/snark/SnarkManager.java:665
+#: ../java/src/org/klomp/snark/SnarkManager.java:703
#, java-format
msgid "Unable to save the config to {0}"
msgstr "Misslyckades med att spara inställningar till {0}"
-#: ../java/src/org/klomp/snark/SnarkManager.java:730
+#: ../java/src/org/klomp/snark/SnarkManager.java:768
msgid "Connecting to I2P"
msgstr "Ansluter till I2P"
-#: ../java/src/org/klomp/snark/SnarkManager.java:733
+#: ../java/src/org/klomp/snark/SnarkManager.java:771
msgid "Error connecting to I2P - check your I2CP settings!"
msgstr "Problem vid anslutning till I2P - kontrollera dina I2CP-inställningar!"
-#: ../java/src/org/klomp/snark/SnarkManager.java:742
+#: ../java/src/org/klomp/snark/SnarkManager.java:780
#, java-format
msgid "Error: Could not add the torrent {0}"
msgstr "Problem: Kunda in lägga till torrent {0}"
#. catch this here so we don't try do delete it below
-#: ../java/src/org/klomp/snark/SnarkManager.java:764
+#: ../java/src/org/klomp/snark/SnarkManager.java:802
#, java-format
msgid "Cannot open \"{0}\""
msgstr "Kan inte öppna \"{0}\""
-#. TODO - if the existing one is a magnet, delete it and add the metainfo instead?
-#: ../java/src/org/klomp/snark/SnarkManager.java:783
-#: ../java/src/org/klomp/snark/SnarkManager.java:861
-#: ../java/src/org/klomp/snark/SnarkManager.java:939
+#. TODO - if the existing one is a magnet, delete it and add the metainfo
+#. instead?
+#: ../java/src/org/klomp/snark/SnarkManager.java:821
+#: ../java/src/org/klomp/snark/SnarkManager.java:899
+#: ../java/src/org/klomp/snark/SnarkManager.java:980
#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:159
#, java-format
msgid "Torrent with this info hash is already running: {0}"
msgstr "Torrent med denna infohash körs redan: {0}"
-#: ../java/src/org/klomp/snark/SnarkManager.java:789
+#: ../java/src/org/klomp/snark/SnarkManager.java:827
#, java-format
msgid "ERROR - No I2P trackers in private torrent \"{0}\""
msgstr "FEL - Inga I2P trackers den i privata torrenten \"{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:792
+#: ../java/src/org/klomp/snark/SnarkManager.java:829
#, java-format
msgid ""
-"Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers "
-"only."
-msgstr ""
-"Varning - Inga I2P trackers i \"{0}\", kommer enbart anmäla til öppna "
-"trackers i I2P."
+"Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and"
+" DHT only."
+msgstr "Varning - Ingen I2P tracker i \"{0}\", kommer enbart att annonseras till I2P öppna trackers och DHT."
-#. 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:797
+#: ../java/src/org/klomp/snark/SnarkManager.java:832
#, java-format
msgid ""
-"Warning - No I2P Trackers found in \"{0}\". Make sure Open Tracker is "
-"enabled before starting this torrent."
-msgstr ""
-"Varning - Inga I2P trackers i \"{0}\". Kontrollera att öppna trackers är "
-"påslagna innan denhär torrenten startas."
+"Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will "
+"announce to DHT only."
+msgstr "Varning - Ingen I2P tracker i \"{0}\" och öppna trakers är avaktiverade, kommer enbart att annonseras till DHT"
-#: ../java/src/org/klomp/snark/SnarkManager.java:818
+#: ../java/src/org/klomp/snark/SnarkManager.java:834
+#, java-format
+msgid ""
+"Warning - No I2P trackers in \"{0}\", and DHT and open trackers are "
+"disabled, you should enable open trackers or DHT before starting the "
+"torrent."
+msgstr "Varning - Ingen I2P tracker i \"{0}\" och både DHT och öppna trakers är avaktiverade, du bör aktivera öppna trackers eller DHT innan du startar torrenten. "
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:856
#, java-format
msgid "Torrent in \"{0}\" is invalid"
msgstr "Torrent i \"{0}\" är ogiltig"
-#: ../java/src/org/klomp/snark/SnarkManager.java:823
+#: ../java/src/org/klomp/snark/SnarkManager.java:861
#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:181
#, java-format
msgid "ERROR - Out of memory, cannot create torrent from {0}"
msgstr "Problem: Minnet har tagit slut, kan inte skapa torrent från {0}"
-#: ../java/src/org/klomp/snark/SnarkManager.java:835
+#: ../java/src/org/klomp/snark/SnarkManager.java:873
#, java-format
msgid "Torrent added and started: \"{0}\""
msgstr "Torrent tillagd och startad: \"{0}\""
-#: ../java/src/org/klomp/snark/SnarkManager.java:837
+#: ../java/src/org/klomp/snark/SnarkManager.java:875
#, java-format
msgid "Torrent added: \"{0}\""
msgstr "Torrent tillagd: \"{0}\""
-#: ../java/src/org/klomp/snark/SnarkManager.java:872
+#: ../java/src/org/klomp/snark/SnarkManager.java:910
#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:87
#, java-format
msgid "Fetching {0}"
msgstr "Hämtar {0}"
-#: ../java/src/org/klomp/snark/SnarkManager.java:875
+#: ../java/src/org/klomp/snark/SnarkManager.java:916
#, 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 ""
-"Vi har inga sparade nerladdare och inga andra torrents kör. Hämtning av {0} "
-"kommer inte lyckas för en annan torrent startas."
+"Open trackers are disabled and we have no DHT peers. Fetch of {0} may not "
+"succeed until you start another torrent, enable open trackers, or enable "
+"DHT."
+msgstr "Öppna trackers är avaktiverade och det finns inga DHT peers. Hämtningen av {0} kan inte genomföras innan du startar en annan torrent eller aktiverar öppna trackers eller DHT "
-#: ../java/src/org/klomp/snark/SnarkManager.java:879
+#: ../java/src/org/klomp/snark/SnarkManager.java:920
#, java-format
msgid "Adding {0}"
msgstr "Lägger till {0}"
-#: ../java/src/org/klomp/snark/SnarkManager.java:910
+#: ../java/src/org/klomp/snark/SnarkManager.java:951
#, java-format
msgid "Download already running: {0}"
msgstr "nerladdning körs: {0}"
-#: ../java/src/org/klomp/snark/SnarkManager.java:949
-#: ../java/src/org/klomp/snark/SnarkManager.java:972
-#: ../java/src/org/klomp/snark/SnarkManager.java:1408
+#: ../java/src/org/klomp/snark/SnarkManager.java:990
+#: ../java/src/org/klomp/snark/SnarkManager.java:1013
+#: ../java/src/org/klomp/snark/SnarkManager.java:1451
#, java-format
msgid "Failed to copy torrent file to {0}"
msgstr "Misslyckades att kopiera torrentfil till {0}"
-#: ../java/src/org/klomp/snark/SnarkManager.java:1199
+#: ../java/src/org/klomp/snark/SnarkManager.java:1240
#, java-format
msgid "Too many files in \"{0}\" ({1}), deleting it!"
msgstr "För många filer i \"{0}\" ({1}), tar bort den!"
-#: ../java/src/org/klomp/snark/SnarkManager.java:1201
+#: ../java/src/org/klomp/snark/SnarkManager.java:1242
#, java-format
msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!"
msgstr "Torrenten \"{0}\" får inte sluta med \".torrent\", tar bort den."
-#: ../java/src/org/klomp/snark/SnarkManager.java:1203
+#: ../java/src/org/klomp/snark/SnarkManager.java:1244
#, java-format
msgid "No pieces in \"{0}\", deleting it!"
msgstr "Inga delar i \"{0}\", tar bort den."
-#: ../java/src/org/klomp/snark/SnarkManager.java:1205
+#: ../java/src/org/klomp/snark/SnarkManager.java:1246
#, java-format
msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!"
msgstr "För många delar i \"{0}\", gränden är {1}, raderar den!"
-#: ../java/src/org/klomp/snark/SnarkManager.java:1207
+#: ../java/src/org/klomp/snark/SnarkManager.java:1248
#, java-format
msgid "Pieces are too large in \"{0}\" ({1}B), deleting it."
msgstr "För stora delar i \"{0}\" ({1}B), raderar den."
-#: ../java/src/org/klomp/snark/SnarkManager.java:1208
+#: ../java/src/org/klomp/snark/SnarkManager.java:1249
#, java-format
msgid "Limit is {0}B"
msgstr "Gränsen är {0}B"
-#: ../java/src/org/klomp/snark/SnarkManager.java:1210
+#: ../java/src/org/klomp/snark/SnarkManager.java:1251
#, java-format
msgid "Torrent \"{0}\" has no data, deleting it!"
msgstr "Torrenten \"{0}\" har ingen data, tar bort den!"
-#: ../java/src/org/klomp/snark/SnarkManager.java:1218
+#: ../java/src/org/klomp/snark/SnarkManager.java:1259
#, java-format
msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\""
msgstr "Torrentar större än {0}B stöds ännu ej, tar bort \"{1}\""
-#: ../java/src/org/klomp/snark/SnarkManager.java:1234
+#: ../java/src/org/klomp/snark/SnarkManager.java:1275
#, java-format
msgid "Error: Could not remove the torrent {0}"
msgstr "Problem: Kunde ej ta bort torrent {0}"
-#: ../java/src/org/klomp/snark/SnarkManager.java:1255
-#: ../java/src/org/klomp/snark/SnarkManager.java:1273
+#: ../java/src/org/klomp/snark/SnarkManager.java:1296
+#: ../java/src/org/klomp/snark/SnarkManager.java:1314
#, java-format
msgid "Torrent stopped: \"{0}\""
msgstr "Torrent stannad: \"{0}\""
-#: ../java/src/org/klomp/snark/SnarkManager.java:1294
+#: ../java/src/org/klomp/snark/SnarkManager.java:1335
#, java-format
msgid "Torrent removed: \"{0}\""
msgstr "Torrent borttagen: \"{0}\""
-#: ../java/src/org/klomp/snark/SnarkManager.java:1302
+#: ../java/src/org/klomp/snark/SnarkManager.java:1343
#, java-format
msgid "Adding torrents in {0}"
msgstr "Torrents tillagda i {0}"
-#: ../java/src/org/klomp/snark/SnarkManager.java:1353
+#: ../java/src/org/klomp/snark/SnarkManager.java:1374
+#, java-format
+msgid "Up bandwidth limit is {0} KBps"
+msgstr "Upp bandbredds gräns är {0} KBps"
+
+#: ../java/src/org/klomp/snark/SnarkManager.java:1396
#, java-format
msgid "Download finished: {0}"
msgstr "Nerladdning klar: {0}"
-#: ../java/src/org/klomp/snark/SnarkManager.java:1404
+#: ../java/src/org/klomp/snark/SnarkManager.java:1447
#, java-format
msgid "Metainfo received for {0}"
msgstr "Metainfo mottagen till {0}"
-#: ../java/src/org/klomp/snark/SnarkManager.java:1405
-#: ../java/src/org/klomp/snark/SnarkManager.java:1620
+#: ../java/src/org/klomp/snark/SnarkManager.java:1448
+#: ../java/src/org/klomp/snark/SnarkManager.java:1671
#, java-format
msgid "Starting up torrent {0}"
msgstr "Startar torrent {0}"
-#: ../java/src/org/klomp/snark/SnarkManager.java:1420
+#: ../java/src/org/klomp/snark/SnarkManager.java:1463
#, java-format
msgid "Error on torrent {0}"
msgstr "Fel på torrent {0}"
-#: ../java/src/org/klomp/snark/SnarkManager.java:1438
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1765
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1775
+#: ../java/src/org/klomp/snark/SnarkManager.java:1489
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1805
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1815
msgid "Magnet"
msgstr "Magnet"
-#: ../java/src/org/klomp/snark/SnarkManager.java:1469
+#: ../java/src/org/klomp/snark/SnarkManager.java:1520
msgid "Unable to connect to I2P!"
msgstr "Misslyckades med att ansluta till I2P"
-#: ../java/src/org/klomp/snark/SnarkManager.java:1475
+#: ../java/src/org/klomp/snark/SnarkManager.java:1526
#, java-format
msgid "Unable to add {0}"
msgstr "Misslyckades med att lägga till {0}"
-#: ../java/src/org/klomp/snark/SnarkManager.java:1619
+#: ../java/src/org/klomp/snark/SnarkManager.java:1670
#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:124
msgid "Opening the I2P tunnel"
msgstr "Öpnat I2P tunnel "
-#: ../java/src/org/klomp/snark/SnarkManager.java:1643
+#: ../java/src/org/klomp/snark/SnarkManager.java:1694
msgid "Opening the I2P tunnel and starting all torrents."
msgstr "Öppnar I2P-tunneln och startar torrents."
-#: ../java/src/org/klomp/snark/SnarkManager.java:1698
+#: ../java/src/org/klomp/snark/SnarkManager.java:1749
msgid "Stopping all torrents and closing the I2P tunnel."
msgstr "Stoppar alla torrents och stänger I2P-tunneln."
-#: ../java/src/org/klomp/snark/SnarkManager.java:1714
+#: ../java/src/org/klomp/snark/SnarkManager.java:1768
msgid "Closing I2P tunnel after notifying trackers."
msgstr "Stänger I2P tunnel eter meddelande till trackers."
-#: ../java/src/org/klomp/snark/SnarkManager.java:1721
-#: ../java/src/org/klomp/snark/SnarkManager.java:1732
+#: ../java/src/org/klomp/snark/SnarkManager.java:1775
+#: ../java/src/org/klomp/snark/SnarkManager.java:1786
msgid "I2P tunnel closed."
msgstr "I2P-tunneln är stängd."
+#: ../java/src/org/klomp/snark/TrackerClient.java:227
+#, java-format
+msgid "No valid trackers for {0} - enable opentrackers or DHT?"
+msgstr "Ingen giltig tracker för {0} - aktiverar öppna trackers eller DHT?"
+
#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:75
#, java-format
msgid "Download torrent file from {0}"
@@ -405,718 +419,741 @@ msgstr "Torrent finns redan i kö: {0}"
msgid "Torrent at {0} was not valid"
msgstr "Torrent vid {0} var inte giltig"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:222
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:223
msgid "I2PSnark - Anonymous BitTorrent Client"
msgstr "I2PSnark - Anonym bittorrentklient"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:235
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:236
msgid "Router is down"
msgstr "Routen är nere"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:250
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:251
msgid "Torrents"
msgstr "Torrents"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:253
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:260
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1236
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:254
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:261
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1267
msgid "I2PSnark"
msgstr "I2PSnark"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:257
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:258
msgid "Refresh page"
msgstr "Ladda om sida"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:262
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:263
msgid "Forum"
msgstr "Forum"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:276
msgid "Click \"Add torrent\" button to fetch torrent"
msgstr "Klicka på \"Lägg till torrent\" för att hämta en trorrent"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:310
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:311
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:312
msgid "clear messages"
msgstr "rensa meddelandena"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:337
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:339
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2219
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2221
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:338
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:340
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2261
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2263
msgid "Status"
msgstr "Status"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:346
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:348
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:347
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:349
msgid "Hide Peers"
msgstr "Göm nerladdare"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:353
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:355
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:354
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:356
msgid "Show Peers"
msgstr "Visa nerladdare"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:362
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:364
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2076
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2091
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:363
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:365
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2116
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2131
msgid "Torrent"
msgstr "Torrent"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:369
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:370
msgid "Estimated time remaining"
msgstr "Uppskattad återstående tid"
#. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:372
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:373
msgid "ETA"
msgstr "UÅT"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:377
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:378
msgid "Downloaded"
msgstr "Nerladdat"
#. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:380
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:381
msgid "RX"
msgstr "RX"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:385
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:386
msgid "Uploaded"
msgstr "Uppladdat"
#. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:388
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:389
msgid "TX"
msgstr "TX"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:394
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:395
msgid "Down Rate"
msgstr "Nerhastighet"
#. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:397
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:398
msgid "RX Rate"
msgstr "RX Rate"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:403
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:404
msgid "Up Rate"
msgstr "Upphastighet"
#. Translators: Please keep short or translate as " "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:406
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:407
msgid "TX Rate"
msgstr "TX Rate"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:429
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:430
msgid "Stop all torrents and the I2P tunnel"
msgstr "Stoppa alla torrents och I2P-tunneln"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:431
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:432
msgid "Stop All"
msgstr "Stoppa alla"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:440
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:441
msgid "Start all torrents and the I2P tunnel"
msgstr "Starta alla torrents och I2P-tunneln"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:442
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:443
msgid "Start All"
msgstr "Starta alla"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:462
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:463
msgid "No torrents loaded."
msgstr "Inga torrents laddade."
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:467
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:468
msgid "Totals"
msgstr "Totalt"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:469
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:470
#, 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:472
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:473
#, java-format
msgid "1 connected peer"
msgid_plural "{0} connected peers"
msgstr[0] "{0} ansluten nerladdare"
msgstr[1] "{0} anslutna nerladdare"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:561
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:479
+#, java-format
+msgid "1 DHT peer"
+msgid_plural "{0} DHT peers"
+msgstr[0] "1 DHT peer"
+msgstr[1] "{0} DHT peers"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:572
#, java-format
msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\""
msgstr "Ogiltig URL: Måste starta med \"http://\", \"{0}\" eller \"{1}\""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:602
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:629
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:614
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:644
#, java-format
msgid "Magnet deleted: {0}"
msgstr "Magnet borttagen: {0}"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:610
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:635
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:622
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:650
#, java-format
msgid "Torrent file deleted: {0}"
msgstr "Torrentfil borttagen: {0}"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:641
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:642
+#, java-format
+msgid "Download deleted: {0}"
+msgstr "Nedladdning borttagen: {0}"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:656
#, java-format
msgid "Data file deleted: {0}"
msgstr "Datafil borttagen: {0}"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:643
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:654
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:658
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:669
#, java-format
msgid "Data file could not be deleted: {0}"
msgstr "Datafil kunde inte tas bort: {0}"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:669
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:678
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:684
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:693
#, java-format
msgid "Directory could not be deleted: {0}"
msgstr "Katalogen kunde inta tas bort: {0}"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:676
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:691
#, java-format
msgid "Directory deleted: {0}"
msgstr "Katalogen bort tagen: {0}"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:722
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:738
msgid "Error creating torrent - you must select a tracker"
msgstr "Misslyckades med att skapa torrent - en tracker måste väljas"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:738
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:755
#, java-format
msgid "Torrent created for \"{0}\""
msgstr "Torrent skapad för \"{0}\""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:740
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:757
#, java-format
msgid ""
"Many I2P trackers require you to register new torrents before seeding - "
"please do so before starting \"{0}\""
-msgstr ""
-"Många I2P trackers kräver att användare registrerar sig för uppladdning av "
-"torrent - gör det innan \"{0}\" startas"
+msgstr "Många I2P trackers kräver att användare registrerar sig för uppladdning av torrent - gör det innan \"{0}\" startas"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:742
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:759
#, java-format
msgid "Error creating a torrent for \"{0}\""
msgstr "Misslyckades med att skapa torrent för \"{0}\""
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:745
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:762
#, java-format
msgid "Cannot create a torrent for the nonexistent data: {0}"
msgstr "Kan ej skapa torrent för data som ej finns: {0}"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:748
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:765
msgid "Error creating torrent - you must enter a file or directory"
msgstr "Misslyckades med att skapa torrent - en fil eller mapp måste anges"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:763
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1731
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:780
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1771
msgid "Delete selected"
msgstr "Ta bort valda"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:763
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1732
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:780
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1772
msgid "Save tracker configuration"
msgstr "Spara tracker konfiguration"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:780
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:797
msgid "Removed"
msgstr "Borttagen"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:809
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1730
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1735
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:826
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1770
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1775
msgid "Add tracker"
msgstr "Lägg till tracker"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:832
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:849
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:852
msgid "Enter valid tracker name and URLs"
msgstr "Ange namn och URL för trackern "
-#. "\n" +
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:837
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1734
+#. "\n" +
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1774
msgid "Restore defaults"
msgstr "Återställ standardvärden"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:840
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:857
msgid "Restored default trackers"
msgstr "Återställ standard trackers "
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:976
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:982
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:989
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:997
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:998
+msgid "Checking"
+msgstr "Kontrollerar "
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1000
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1001
+msgid "Allocating"
+msgstr "Allokerar"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1005
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1011
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1018
msgid "Tracker Error"
msgstr "Tracker-fel"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:979
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:984
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1012
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1017
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1028
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1033
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1039
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1044
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1008
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1013
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1041
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1046
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1057
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1062
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1068
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1073
#, java-format
msgid "1 peer"
msgid_plural "{0} peers"
msgstr[0] "{0} nerladdare"
msgstr[1] "{0} nerladdare"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:992
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:993
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1021
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1022
msgid "Starting"
msgstr "Startar"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1001
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1030
msgid "Seeding"
msgstr "Uppladdning"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1005
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1019
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1020
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2161
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2276
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1034
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1048
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1049
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2203
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2318
msgid "Complete"
msgstr "Färdig"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1024
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1025
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1030
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1031
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1053
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1054
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1059
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1060
msgid "OK"
msgstr "Ok"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1035
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1036
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1041
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1064
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1065
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1070
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1071
msgid "Stalled"
msgstr "Avstannad"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1046
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1047
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1050
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1051
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1075
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1076
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1079
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1080
msgid "No Peers"
msgstr "Inga källor"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1053
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1054
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1082
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1083
msgid "Stopped"
msgstr "Stoppad"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1087
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1116
msgid "Torrent details"
msgstr "Torrentdetaljer"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1116
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1145
msgid "View files"
msgstr "Se filer"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1118
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1147
msgid "Open file"
msgstr "Öppna fil"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1161
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1192
msgid "Stop the torrent"
msgstr "Stoppa torrent"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1163
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1194
msgid "Stop"
msgstr "Stoppa"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1175
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1206
msgid "Start the torrent"
msgstr "Starta torrent"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1177
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1208
msgid "Start"
msgstr "Starta"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1189
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1220
msgid "Remove the torrent from the active list, deleting the .torrent file"
msgstr "Ta bort torrent från den aktiva listan, tar bort .torrent fil"
#. 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 quote must be escaped
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1194
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1225
#, java-format
msgid ""
"Are you sure you want to delete the file \\''{0}.torrent\\'' (downloaded "
"data will not be deleted) ?"
-msgstr ""
-"Är du säker på att du vill ta bort filen \"{0}.torrent\" (nerladdad data "
-"kommer ej tas bort) ?"
+msgstr "Är du säker på att du vill ta bort filen \"{0}.torrent\" (nerladdad data kommer ej tas bort) ?"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1197
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1228
msgid "Remove"
msgstr "Ta bort"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1209
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240
msgid "Delete the .torrent file and the associated data file(s)"
msgstr "Ta bort .torrent filen och tillhörande datafil(er)"
#. 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 quote must be escaped
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1214
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1245
#, java-format
msgid ""
"Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded "
"data?"
-msgstr ""
-"Är du säker på att du vill ta bort torrenten \"{0}\" och all nerladdad data?"
+msgstr "Är du säker på att du vill ta bort torrenten \"{0}\" och all nerladdad data?"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1217
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1698
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1248
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1738
msgid "Delete"
msgstr "Ta bort"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1252
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1283
msgid "Unknown"
msgstr "Okänd"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1264
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1295
msgid "Seed"
msgstr "Källa"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1287
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1318
msgid "Uninteresting (The peer has no pieces we need)"
msgstr "Ointressant (nerladdaren har inga delar vi behöver)"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1289
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1320
msgid "Choked (The peer is not allowing us to request pieces)"
msgstr "Spärra (nerladdaren låter oss inte be dom delar)"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1309
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1340
msgid "Uninterested (We have no pieces the peer needs)"
msgstr "Ointresserad (vi har inga delar nerladdaren behöver)"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1311
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1342
msgid "Choking (We are not allowing the peer to request pieces)"
msgstr "Spärrar (vi låter inte nerladdaren be dom delar)"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1365
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1396
#, java-format
msgid "Details at {0} tracker"
msgstr "Detaljer för {0} tracker"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1381
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1412
msgid "Info"
msgstr "Info"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1409
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1440
msgid "Add Torrent"
msgstr "Lägg till torrent"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1411
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1442
msgid "From URL"
msgstr "Från URL"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1414
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1445
msgid ""
-"Enter the torrent file download URL (I2P only), magnet link, maggot link, or "
-"info hash"
-msgstr ""
-"Ange URL för torrentfilen (enbart I2P), magnet link, maggot länk eller info "
-"hash"
+"Enter the torrent file download URL (I2P only), magnet link, maggot link, or"
+" info hash"
+msgstr "Ange URL för torrentfilen (enbart I2P), magnet link, maggot länk eller info hash"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1419
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1450
msgid "Add torrent"
msgstr "Lägg till torrent"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1422
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1453
#, java-format
msgid "You can also copy .torrent files to: {0}."
msgstr "Du kan även kopiera .torrent filer till: {0}"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1424
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1455
msgid "Removing a .torrent will cause it to stop."
msgstr "Borttagning av .torrent fil kommer stanna den."
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1447
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1478
msgid "Create Torrent"
msgstr "Skapa torrent"
-#. out.write("From file: \n");
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1450
+#. out.write("From file: \n");
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1481
msgid "Data to seed"
msgstr "Data att ladda upp"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1454
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1485
msgid "File or directory to seed (must be within the specified path)"
msgstr "Fil eller mapp att ladda upp (måste finnas på angiven plats)"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1456
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2111
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1487
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2153
msgid "Tracker"
msgstr "Tracker"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1458
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489
msgid "Select a tracker"
msgstr "Välj en tracker"
#. out.write(_("Open trackers and DHT only"));
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1463
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1494
msgid "Open trackers only"
msgstr "Enbart öppna trackers"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1480
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1511
msgid "Create torrent"
msgstr "Skapa torrent"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1503
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1744
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1535
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1784
msgid "Configuration"
msgstr "Inställningar"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1507
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1539
msgid "Data directory"
msgstr "Datamapp"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1509
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1541
msgid "Edit i2psnark.config and restart to change"
-msgstr "Förändra i2psnark.conig och starta om för att ändra"
+msgstr "Förändra i2psnark.config och starta om för att ändra"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1513
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1545
msgid "Files readable by all"
msgstr "Filer läsbara för alla"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1549
msgid "If checked, other users may access the downloaded files"
msgstr "Om vald, kommer andra användare att kunna komma åt nerladdade filer"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1521
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1553
msgid "Auto start"
msgstr "Automatisk start"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1525
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1557
msgid "If checked, automatically start torrents that are added"
msgstr "Om ikryssad, startas automatiskt tillagda torrents"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1529
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1561
msgid "Theme"
msgstr "Tema"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1542
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1574
msgid "Refresh time"
msgstr "Uppdateringsintervall"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1555
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1587
msgid "Never"
msgstr "Aldrig"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1561
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1593
msgid "Startup delay"
msgstr "Fördröjning av uppstart"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1563
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1595
msgid "minutes"
msgstr "minuter"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1587
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1619
msgid "Total uploader limit"
msgstr "Gräns för totalt antal uppladdare"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1590
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1622
msgid "peers"
msgstr "nerladdare"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1594
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1626
msgid "Up bandwidth limit"
msgstr "Gräns för bandbredd uppåt"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1597
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1629
msgid "Half available bandwidth recommended."
msgstr "Hälften av tillgänglig bandbredd rekommenderas."
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1599
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1631
msgid "View or change router bandwidth"
msgstr "Se eller ändra routerns bandbredd"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1603
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1635
msgid "Use open trackers also"
msgstr "Använd öppna trackers med"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1607
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1639
msgid ""
-"If checked, announce torrents to open trackers as well as the tracker listed "
-"in the torrent file"
-msgstr ""
-"Om ikryssad, anmäl torrents till öppna trackers och tracker angiven i "
-"torrentfilen"
+"If checked, announce torrents to open trackers as well as the tracker listed"
+" in the torrent file"
+msgstr "Om ikryssad, anmäl torrents till öppna trackers och tracker angiven i torrentfilen"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1623
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643
+msgid "Enable DHT"
+msgstr "Aktivera DHT"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1647
+msgid "If checked, use DHT"
+msgstr "om vald, använd DHT"
+
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1663
msgid "Inbound Settings"
msgstr "Inkommande inställningar"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1629
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1669
msgid "Outbound Settings"
msgstr "Utgående inställningar"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1637
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1677
msgid "I2CP host"
msgstr "I2CP-värd"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1642
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1682
msgid "I2CP port"
msgstr "I2CP-port"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1657
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697
msgid "I2CP options"
msgstr "I2CP-inställningar"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1662
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1702
msgid "Save configuration"
msgstr "Spara inställningar"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1676
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1716
msgid "Trackers"
msgstr "Trackers"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1681
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1721
msgid "Name"
msgstr "Namn"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1683
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1723
msgid "Website URL"
msgstr "Webbplats URL"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1685
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2314
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1725
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2356
msgid "Open"
msgstr "Öppna"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1687
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1727
msgid "Private"
msgstr "Privat"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1689
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1729
msgid "Announce URL"
msgstr "Tillkännage URLen"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1723
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1763
msgid "Add"
msgstr "Lägg till"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1760
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1800
#, java-format
msgid "Invalid magnet URL {0}"
msgstr "Ogiltig magnet URL {0}"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1794
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1834
#, java-format
msgid "Invalid info hash in magnet URL {0}"
msgstr "Ogiltig infohash i magnet URL {0}"
#. * dummies for translation
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1918
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1958
#, java-format
msgid "1 hop"
msgid_plural "{0} hops"
msgstr[0] "{0} hopp"
msgstr[1] "{0} hopp"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1919
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1959
#, java-format
msgid "1 tunnel"
msgid_plural "{0} tunnels"
msgstr[0] "{0} tunnel"
msgstr[1] "{0} tunnlar"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2098
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2140
msgid "Torrent file"
msgstr "Torrent fil"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2133
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2175
msgid "Magnet link"
msgstr "Magnet länk"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2140
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2182
msgid "Private torrent"
msgstr "Privat torrent"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2149
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2213
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2215
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2191
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2255
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2257
msgid "Size"
msgstr "Storlek"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2156
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2198
msgid "Completion"
msgstr "Färdiställning"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2166
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2208
msgid "Remaining"
msgstr "Kvar"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2173
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2215
msgid "Files"
msgstr "Filer"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2178
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2220
msgid "Pieces"
msgstr "Delar"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2182
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2224
msgid "Piece size"
msgstr "Delstorlek"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2205
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2209
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2259
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2247
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2251
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2301
msgid "Directory"
msgstr "Mapp"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2226
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2228
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2268
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2270
msgid "Priority"
msgstr "Prioritet"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2234
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2276
msgid "Up to higher level directory"
msgstr "Up till högre mappnivå"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2264
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2306
msgid "Torrent not found?"
msgstr "Torrent hittades ej?"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2273
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2315
msgid "File not found in torrent?"
msgstr "Fil hittades ej i torrent?"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2286
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2328
msgid "complete"
msgstr "färdig"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2287
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2329
msgid "remaining"
msgstr "kvar"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2341
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2383
msgid "High"
msgstr "Hög"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2346
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2388
msgid "Normal"
msgstr "Normal"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2351
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2393
msgid "Skip"
msgstr "Hoppa över"
-#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2360
+#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2402
msgid "Save priorities"
msgstr "Spara prioriteter"
diff --git a/apps/i2ptunnel/java/build.xml b/apps/i2ptunnel/java/build.xml
index 0c68ab1c1..5a54e6c56 100644
--- a/apps/i2ptunnel/java/build.xml
+++ b/apps/i2ptunnel/java/build.xml
@@ -179,6 +179,7 @@
+
@@ -202,6 +203,7 @@
+
@@ -213,6 +215,7 @@
+
@@ -230,7 +233,7 @@
-
@@ -248,7 +251,7 @@
-
+
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java
index 04ca75e75..142aaf49b 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java
@@ -13,6 +13,7 @@ import java.util.Locale;
import java.util.Properties;
import java.util.StringTokenizer;
+import net.i2p.I2PAppContext;
import net.i2p.I2PException;
import net.i2p.client.streaming.I2PSocket;
import net.i2p.client.streaming.I2PSocketOptions;
@@ -20,7 +21,6 @@ import net.i2p.data.Base64;
import net.i2p.data.DataHelper;
import net.i2p.data.Destination;
import net.i2p.util.EventDispatcher;
-import net.i2p.util.FileUtil;
import net.i2p.util.Log;
import net.i2p.util.PortMapper;
@@ -58,6 +58,8 @@ import net.i2p.util.PortMapper;
*/
public class I2PTunnelConnectClient extends I2PTunnelHTTPClientBase implements Runnable {
+ public static final String AUTH_REALM = "I2P SSL Proxy";
+
private final static byte[] ERR_DESTINATION_UNKNOWN =
("HTTP/1.1 503 Service Unavailable\r\n"+
"Content-Type: text/html; charset=iso-8859-1\r\n"+
@@ -89,17 +91,6 @@ public class I2PTunnelConnectClient extends I2PTunnelHTTPClientBase implements R
"Your browser is misconfigured. Do not use the proxy to access the router console or other localhost destinations. ")
.getBytes();
- private final static byte[] ERR_AUTH =
- ("HTTP/1.1 407 Proxy Authentication Required\r\n"+
- "Content-Type: text/html; charset=UTF-8\r\n"+
- "Cache-control: no-cache\r\n"+
- "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.5\r\n" + // try to get a UTF-8-encoded response back for the password
- "Proxy-Authenticate: Basic realm=\"I2P SSL Proxy\"\r\n" +
- "\r\n"+
- "
I2P ERROR: PROXY AUTHENTICATION REQUIRED
"+
- "This proxy is configured to require authentication. ")
- .getBytes();
-
private final static byte[] SUCCESS_RESPONSE =
("HTTP/1.1 200 Connection Established\r\n"+
"Proxy-agent: I2P\r\n"+
@@ -165,6 +156,11 @@ public class I2PTunnelConnectClient extends I2PTunnelHTTPClientBase implements R
return super.close(forced);
}
+ /** @since 0.9.4 */
+ protected String getRealm() {
+ return AUTH_REALM;
+ }
+
protected void clientConnectionRun(Socket s) {
InputStream in = null;
OutputStream out = null;
@@ -237,10 +233,10 @@ public class I2PTunnelConnectClient extends I2PTunnelHTTPClientBase implements R
_log.debug(getPrefix(requestId) + "REST :" + restofline + ":");
_log.debug(getPrefix(requestId) + "DEST :" + destination + ":");
}
- } else if (line.toLowerCase(Locale.US).startsWith("proxy-authorization: basic ")) {
+ } else if (line.toLowerCase(Locale.US).startsWith("proxy-authorization: ")) {
// strip Proxy-Authenticate from the response in HTTPResponseOutputStream
// save for auth check below
- authorization = line.substring(27); // "proxy-authorization: basic ".length()
+ authorization = line.substring(21); // "proxy-authorization: ".length()
line = null;
} else if (line.length() > 0) {
// Additional lines - shouldn't be too many. Firefox sends:
@@ -281,30 +277,26 @@ public class I2PTunnelConnectClient extends I2PTunnelHTTPClientBase implements R
}
// Authorization
- if (!authorize(s, requestId, authorization)) {
+ AuthResult result = authorize(s, requestId, method, authorization);
+ if (result != AuthResult.AUTH_GOOD) {
if (_log.shouldLog(Log.WARN)) {
if (authorization != null)
_log.warn(getPrefix(requestId) + "Auth failed, sending 407 again");
else
_log.warn(getPrefix(requestId) + "Auth required, sending 407");
}
- writeErrorMessage(ERR_AUTH, out);
+ out.write(getAuthError(result == AuthResult.AUTH_STALE).getBytes());
s.close();
return;
}
Destination clientDest = _context.namingService().lookup(destination);
if (clientDest == null) {
- String str;
byte[] header;
if (usingWWWProxy)
- str = FileUtil.readTextFile((new File(_errorDir, "dnfp-header.ht")).getAbsolutePath(), 100, true);
+ header = getErrorPage("dnfp-header.ht", ERR_DESTINATION_UNKNOWN);
else
- str = FileUtil.readTextFile((new File(_errorDir, "dnfh-header.ht")).getAbsolutePath(), 100, true);
- if (str != null)
- header = str.getBytes();
- else
- header = ERR_DESTINATION_UNKNOWN;
+ header = getErrorPage("dnfh-header.ht", ERR_DESTINATION_UNKNOWN);
writeErrorMessage(header, out, targetRequest, usingWWWProxy, destination);
s.close();
return;
@@ -341,12 +333,13 @@ public class I2PTunnelConnectClient extends I2PTunnelHTTPClientBase implements R
}
private static class OnTimeout implements Runnable {
- private Socket _socket;
- private OutputStream _out;
- private String _target;
- private boolean _usingProxy;
- private String _wwwProxy;
- private long _requestId;
+ private final Socket _socket;
+ private final OutputStream _out;
+ private final String _target;
+ private final boolean _usingProxy;
+ private final String _wwwProxy;
+ private final long _requestId;
+
public OnTimeout(Socket s, OutputStream out, String target, boolean usingProxy, String wwwProxy, long id) {
_socket = s;
_out = out;
@@ -355,6 +348,7 @@ public class I2PTunnelConnectClient extends I2PTunnelHTTPClientBase implements R
_wwwProxy = wwwProxy;
_requestId = id;
}
+
public void run() {
//if (_log.shouldLog(Log.DEBUG))
// _log.debug("Timeout occured requesting " + _target);
@@ -391,17 +385,12 @@ public class I2PTunnelConnectClient extends I2PTunnelHTTPClientBase implements R
boolean usingWWWProxy, String wwwProxy, long requestId) {
if (out == null)
return;
+ byte[] header;
+ if (usingWWWProxy)
+ header = getErrorPage(I2PAppContext.getGlobalContext(), "dnfp-header.ht", ERR_DESTINATION_UNKNOWN);
+ else
+ header = getErrorPage(I2PAppContext.getGlobalContext(), "dnf-header.ht", ERR_DESTINATION_UNKNOWN);
try {
- String str;
- byte[] header;
- if (usingWWWProxy)
- str = FileUtil.readTextFile((new File(_errorDir, "dnfp-header.ht")).getAbsolutePath(), 100, true);
- else
- str = FileUtil.readTextFile((new File(_errorDir, "dnf-header.ht")).getAbsolutePath(), 100, true);
- if (str != null)
- header = str.getBytes();
- else
- header = ERR_DESTINATION_UNKNOWN;
writeErrorMessage(header, out, targetRequest, usingWWWProxy, wwwProxy);
} catch (IOException ioe) {}
}
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPBidirProxy.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPBidirProxy.java
index 8c188d115..56c2e7550 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPBidirProxy.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPBidirProxy.java
@@ -1,17 +1,9 @@
/**
- * DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
+ * WTFPL
* Version 2, December 2004
*
* Copyright (C) sponge
* Planet Earth
- * Everyone is permitted to copy and distribute verbatim or modified
- * copies of this license document, and changing it is allowed as long
- * as the name is changed.
- *
- * DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
- * TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
- *
- * 0. You just DO WHAT THE FUCK YOU WANT TO.
*
* See...
*
@@ -19,9 +11,8 @@
* and
* http://en.wikipedia.org/wiki/WTFPL
*
- * ...for any additional details and liscense questions.
+ * ...for any additional details and license questions.
*/
-
package net.i2p.i2ptunnel;
// import java.util.ArrayList;
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java
index bc7a47477..518e7dcdc 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java
@@ -3,9 +3,7 @@
*/
package net.i2p.i2ptunnel;
-import java.io.ByteArrayOutputStream;
import java.io.File;
-import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -73,10 +71,14 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
* via address helper links
*/
private final ConcurrentHashMap addressHelpers = new ConcurrentHashMap(8);
+
/**
* Used to protect actions via http://proxy.i2p/
*/
private final String _proxyNonce;
+
+ public static final String AUTH_REALM = "I2P HTTP Proxy";
+
/**
* These are backups if the xxx.ht error page is missing.
*/
@@ -167,15 +169,6 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
"\r\n" +
"
I2P ERROR: REQUEST DENIED
" +
"Your browser is misconfigured. Do not use the proxy to access the router console or other localhost destinations. ").getBytes();
- private final static byte[] ERR_AUTH =
- ("HTTP/1.1 407 Proxy Authentication Required\r\n" +
- "Content-Type: text/html; charset=UTF-8\r\n" +
- "Cache-control: no-cache\r\n" +
- "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.5\r\n" + // try to get a UTF-8-encoded response back for the password
- "Proxy-Authenticate: Basic realm=\"I2P HTTP Proxy\"\r\n" +
- "\r\n" +
- "
I2P ERROR: PROXY AUTHENTICATION REQUIRED
" +
- "This proxy is configured to require authentication. ").getBytes();
/**
* This constructor always starts the tunnel (ignoring the i2cp.delayOpen option).
@@ -300,6 +293,12 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
}
return rv;
}
+
+ /** @since 0.9.4 */
+ protected String getRealm() {
+ return AUTH_REALM;
+ }
+
private static final String HELPER_PARAM = "i2paddresshelper";
public static final String LOCAL_SERVER = "proxy.i2p";
private static final boolean DEFAULT_GZIP = true;
@@ -769,10 +768,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
// hop-by-hop header, and we definitely want to block Windows NTLM after a far-end 407.
// Response to far-end shouldn't happen, as we
// strip Proxy-Authenticate from the response in HTTPResponseOutputStream
- if(lowercaseLine.startsWith("proxy-authorization: basic ")) // save for auth check below
- {
- authorization = line.substring(27); // "proxy-authorization: basic ".length()
- }
+ authorization = line.substring(21); // "proxy-authorization: ".length()
line = null;
continue;
} else if(lowercaseLine.startsWith("icy")) {
@@ -850,7 +846,8 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
}
// Authorization
- if(!authorize(s, requestId, authorization)) {
+ AuthResult result = authorize(s, requestId, method, authorization);
+ if (result != AuthResult.AUTH_GOOD) {
if(_log.shouldLog(Log.WARN)) {
if(authorization != null) {
_log.warn(getPrefix(requestId) + "Auth failed, sending 407 again");
@@ -858,7 +855,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
_log.warn(getPrefix(requestId) + "Auth required, sending 407");
}
}
- out.write(getErrorPage("auth", ERR_AUTH));
+ out.write(getAuthError(result == AuthResult.AUTH_STALE).getBytes());
writeFooter(out);
s.close();
return;
@@ -1095,61 +1092,6 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
return Base32.encode(_dest.calculateHash().getData()) + ".b32.i2p";
}
- /**
- * foo => errordir/foo-header_xx.ht for lang xx, or errordir/foo-header.ht,
- * or the backup byte array on fail.
- *
- * .ht files must be UTF-8 encoded and use \r\n terminators so the
- * HTTP headers are conformant.
- * We can't use FileUtil.readFile() because it strips \r
- *
- * @return non-null
- */
- private byte[] getErrorPage(String base, byte[] backup) {
- return getErrorPage(_context, base, backup);
- }
-
- private static byte[] getErrorPage(I2PAppContext ctx, String base, byte[] backup) {
- File errorDir = new File(ctx.getBaseDir(), "docs");
- String lang = ctx.getProperty("routerconsole.lang", Locale.getDefault().getLanguage());
- if(lang != null && lang.length() > 0 && !lang.equals("en")) {
- File file = new File(errorDir, base + "-header_" + lang + ".ht");
- try {
- return readFile(file);
- } catch(IOException ioe) {
- // try the english version now
- }
- }
- File file = new File(errorDir, base + "-header.ht");
- try {
- return readFile(file);
- } catch(IOException ioe) {
- return backup;
- }
- }
-
- private static byte[] readFile(File file) throws IOException {
- FileInputStream fis = null;
- byte[] buf = new byte[512];
- ByteArrayOutputStream baos = new ByteArrayOutputStream(2048);
- try {
- int len = 0;
- fis = new FileInputStream(file);
- while((len = fis.read(buf)) > 0) {
- baos.write(buf, 0, len);
- }
- return baos.toByteArray();
- } finally {
- try {
- if(fis != null) {
- fis.close();
- }
- } catch(IOException foo) {
- }
- }
- // we won't ever get here
- }
-
/**
* Public only for LocalHTTPServer, not for general use
*/
@@ -1163,12 +1105,12 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
private static class OnTimeout implements Runnable {
- private Socket _socket;
- private OutputStream _out;
- private String _target;
- private boolean _usingProxy;
- private String _wwwProxy;
- private long _requestId;
+ private final Socket _socket;
+ private final OutputStream _out;
+ private final String _target;
+ private final boolean _usingProxy;
+ private final String _wwwProxy;
+ private final long _requestId;
public OnTimeout(Socket s, OutputStream out, String target, boolean usingProxy, String wwwProxy, long id) {
_socket = s;
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientBase.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientBase.java
index f14de68b4..1a8896914 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientBase.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientBase.java
@@ -3,19 +3,26 @@
*/
package net.i2p.i2ptunnel;
+import java.io.ByteArrayOutputStream;
+import java.io.FileInputStream;
+import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
import java.util.ArrayList;
import java.io.File;
+import java.util.HashMap;
import java.util.List;
import java.util.Locale;
+import java.util.Map;
import net.i2p.I2PAppContext;
import net.i2p.client.streaming.I2PSocketManager;
import net.i2p.data.Base64;
+import net.i2p.data.DataHelper;
import net.i2p.util.EventDispatcher;
import net.i2p.util.InternalSocket;
import net.i2p.util.Log;
+import net.i2p.util.PasswordManager;
/**
* Common things for HTTPClient and ConnectClient
@@ -25,6 +32,25 @@ import net.i2p.util.Log;
*/
public abstract class I2PTunnelHTTPClientBase extends I2PTunnelClientBase implements Runnable {
+ private static final int PROXYNONCE_BYTES = 8;
+ private static final int MD5_BYTES = 16;
+ /** 24 */
+ private static final int NONCE_BYTES = DataHelper.DATE_LENGTH + MD5_BYTES;
+ private static final long MAX_NONCE_AGE = 30*24*60*60*1000L;
+
+ private static final String ERR_AUTH1 =
+ "HTTP/1.1 407 Proxy Authentication Required\r\n" +
+ "Content-Type: text/html; charset=UTF-8\r\n" +
+ "Cache-control: no-cache\r\n" +
+ "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.5\r\n" + // try to get a UTF-8-encoded response back for the password
+ "Proxy-Authenticate: ";
+ // put the auth type and realm in between
+ private static final String ERR_AUTH2 =
+ "\r\n" +
+ "\r\n" +
+ "
I2P ERROR: PROXY AUTHENTICATION REQUIRED
" +
+ "This proxy is configured to require authentication.";
+
protected final List _proxyList;
protected final static byte[] ERR_NO_OUTPROXY =
@@ -40,7 +66,7 @@ public abstract class I2PTunnelHTTPClientBase extends I2PTunnelClientBase implem
/** used to assign unique IDs to the threads / clients. no logic or functionality */
protected static volatile long __clientId = 0;
- protected static final File _errorDir = new File(I2PAppContext.getGlobalContext().getBaseDir(), "docs");
+ private final byte[] _proxyNonce;
protected String getPrefix(long requestId) { return "Client[" + _clientId + "/" + requestId + "]: "; }
@@ -63,6 +89,8 @@ public abstract class I2PTunnelHTTPClientBase extends I2PTunnelClientBase implem
I2PTunnel tunnel) throws IllegalArgumentException {
super(localPort, ownDest, l, notifyThis, handlerName, tunnel);
_proxyList = new ArrayList(4);
+ _proxyNonce = new byte[PROXYNONCE_BYTES];
+ _context.random().nextBytes(_proxyNonce);
}
/**
@@ -76,8 +104,12 @@ public abstract class I2PTunnelHTTPClientBase extends I2PTunnelClientBase implem
throws IllegalArgumentException {
super(localPort, l, sktMgr, tunnel, notifyThis, clientId);
_proxyList = new ArrayList(4);
+ _proxyNonce = new byte[PROXYNONCE_BYTES];
+ _context.random().nextBytes(_proxyNonce);
}
+ //////// Authorization stuff
+
/** all auth @since 0.8.2 */
public static final String PROP_AUTH = "proxyAuth";
public static final String PROP_USER = "proxyUsername";
@@ -90,68 +122,349 @@ public abstract class I2PTunnelHTTPClientBase extends I2PTunnelClientBase implem
/** passwords for specific outproxies may be added with outproxyUsername.fooproxy.i2p=user and outproxyPassword.fooproxy.i2p=pw */
public static final String PROP_OUTPROXY_USER_PREFIX = PROP_OUTPROXY_USER + '.';
public static final String PROP_OUTPROXY_PW_PREFIX = PROP_OUTPROXY_PW + '.';
+ /** new style MD5 auth */
+ public static final String PROP_PROXY_DIGEST_PREFIX = "proxy.auth.";
+ public static final String PROP_PROXY_DIGEST_SUFFIX = ".md5";
+ public static final String BASIC_AUTH = "basic";
+ public static final String DIGEST_AUTH = "digest";
+
+ protected abstract String getRealm();
+
+ protected enum AuthResult {AUTH_BAD_REQ, AUTH_BAD, AUTH_STALE, AUTH_GOOD}
/**
- * @param authorization may be null
+ * @since 0.9.4
+ */
+ protected boolean isDigestAuthRequired() {
+ String authRequired = getTunnel().getClientOptions().getProperty(PROP_AUTH);
+ if (authRequired == null)
+ return false;
+ return authRequired.toLowerCase(Locale.US).equals("digest");
+ }
+
+ /**
+ * Authorization
+ * Ref: RFC 2617
+ * If the socket is an InternalSocket, no auth required.
+ *
+ * @param method GET, POST, etc.
+ * @param authorization may be null, the full auth line e.g. "Basic lskjlksjf"
* @return success
*/
- protected boolean authorize(Socket s, long requestId, String authorization) {
- // Authorization
- // Ref: RFC 2617
- // If the socket is an InternalSocket, no auth required.
+ protected AuthResult authorize(Socket s, long requestId, String method, String authorization) {
String authRequired = getTunnel().getClientOptions().getProperty(PROP_AUTH);
- if (Boolean.parseBoolean(authRequired) ||
- (authRequired != null && "basic".equals(authRequired.toLowerCase(Locale.US)))) {
- if (s instanceof InternalSocket) {
- if (_log.shouldLog(Log.INFO))
- _log.info(getPrefix(requestId) + "Internal access, no auth required");
- return true;
- } else if (authorization != null) {
- // hmm safeDecode(foo, true) to use standard alphabet is private in Base64
- byte[] decoded = Base64.decode(authorization.replace("/", "~").replace("+", "="));
- if (decoded != null) {
- // We send Accept-Charset: UTF-8 in the 407 so hopefully it comes back that way inside the B64 ?
- try {
- String dec = new String(decoded, "UTF-8");
- String[] parts = dec.split(":");
- String user = parts[0];
- String pw = parts[1];
- // first try pw for that user
- String configPW = getTunnel().getClientOptions().getProperty(PROP_PW_PREFIX + user);
- if (configPW == null) {
- // if not, look at default user and pw
- String configUser = getTunnel().getClientOptions().getProperty(PROP_USER);
- if (user.equals(configUser))
- configPW = getTunnel().getClientOptions().getProperty(PROP_PW);
- }
- if (configPW != null) {
- if (pw.equals(configPW)) {
- if (_log.shouldLog(Log.INFO))
- _log.info(getPrefix(requestId) + "Good auth - user: " + user + " pw: " + pw);
- return true;
- } else {
- if (_log.shouldLog(Log.WARN))
- _log.warn(getPrefix(requestId) + "Bad auth, pw mismatch - user: " + user + " pw: " + pw + " expected: " + configPW);
- }
- } else {
- if (_log.shouldLog(Log.WARN))
- _log.warn(getPrefix(requestId) + "Bad auth, no stored pw for user: " + user + " pw: " + pw);
- }
- } catch (UnsupportedEncodingException uee) {
- _log.error(getPrefix(requestId) + "No UTF-8 support? B64: " + authorization, uee);
- } catch (ArrayIndexOutOfBoundsException aioobe) {
- // no ':' in response
- if (_log.shouldLog(Log.WARN))
- _log.warn(getPrefix(requestId) + "Bad auth B64: " + authorization, aioobe);
+ if (authRequired == null)
+ return AuthResult.AUTH_GOOD;
+ authRequired = authRequired.toLowerCase(Locale.US);
+ if (authRequired.equals("false"))
+ return AuthResult.AUTH_GOOD;
+ if (s instanceof InternalSocket) {
+ if (_log.shouldLog(Log.INFO))
+ _log.info(getPrefix(requestId) + "Internal access, no auth required");
+ return AuthResult.AUTH_GOOD;
+ }
+ if (authorization == null)
+ return AuthResult.AUTH_BAD;
+ if (_log.shouldLog(Log.INFO))
+ _log.info(getPrefix(requestId) + "Auth: " + authorization);
+ String authLC = authorization.toLowerCase(Locale.US);
+ if (authRequired.equals("true") || authRequired.equals(BASIC_AUTH)) {
+ if (!authLC.startsWith("basic "))
+ return AuthResult.AUTH_BAD;
+ authorization = authorization.substring(6);
+
+ // hmm safeDecode(foo, true) to use standard alphabet is private in Base64
+ byte[] decoded = Base64.decode(authorization.replace("/", "~").replace("+", "="));
+ if (decoded != null) {
+ // We send Accept-Charset: UTF-8 in the 407 so hopefully it comes back that way inside the B64 ?
+ try {
+ String dec = new String(decoded, "UTF-8");
+ String[] parts = dec.split(":");
+ String user = parts[0];
+ String pw = parts[1];
+ // first try pw for that user
+ String configPW = getTunnel().getClientOptions().getProperty(PROP_PW_PREFIX + user);
+ if (configPW == null) {
+ // if not, look at default user and pw
+ String configUser = getTunnel().getClientOptions().getProperty(PROP_USER);
+ if (user.equals(configUser))
+ configPW = getTunnel().getClientOptions().getProperty(PROP_PW);
}
- } else {
+ if (configPW != null) {
+ if (pw.equals(configPW)) {
+ if (_log.shouldLog(Log.INFO))
+ _log.info(getPrefix(requestId) + "Good auth - user: " + user + " pw: " + pw);
+ return AuthResult.AUTH_GOOD;
+ }
+ }
+ _log.logAlways(Log.WARN, "PROXY AUTH FAILURE: user " + user);
+ } catch (UnsupportedEncodingException uee) {
+ _log.error(getPrefix(requestId) + "No UTF-8 support? B64: " + authorization, uee);
+ } catch (ArrayIndexOutOfBoundsException aioobe) {
+ // no ':' in response
if (_log.shouldLog(Log.WARN))
- _log.warn(getPrefix(requestId) + "Bad auth B64: " + authorization);
+ _log.warn(getPrefix(requestId) + "Bad auth B64: " + authorization, aioobe);
+ return AuthResult.AUTH_BAD_REQ;
}
+ return AuthResult.AUTH_BAD;
+ } else {
+ if (_log.shouldLog(Log.WARN))
+ _log.warn(getPrefix(requestId) + "Bad auth B64: " + authorization);
+ return AuthResult.AUTH_BAD_REQ;
}
- return false;
+ } else if (authRequired.equals(DIGEST_AUTH)) {
+ if (!authLC.startsWith("digest "))
+ return AuthResult.AUTH_BAD;
+ authorization = authorization.substring(7);
+ Map args = parseArgs(authorization);
+ AuthResult rv = validateDigest(method, args);
+ return rv;
} else {
- return true;
+ _log.error("Unknown proxy authorization type configured: " + authRequired);
+ return AuthResult.AUTH_BAD_REQ;
}
}
+
+ /**
+ * Verify all of it.
+ * Ref: RFC 2617
+ * @since 0.9.4
+ */
+ private AuthResult validateDigest(String method, Map args) {
+ String user = args.get("username");
+ String realm = args.get("realm");
+ String nonce = args.get("nonce");
+ String qop = args.get("qop");
+ String uri = args.get("uri");
+ String cnonce = args.get("cnonce");
+ String nc = args.get("nc");
+ String response = args.get("response");
+ if (user == null || realm == null || nonce == null || qop == null ||
+ uri == null || cnonce == null || nc == null || response == null) {
+ if (_log.shouldLog(Log.INFO))
+ _log.info("Bad digest request: " + DataHelper.toString(args));
+ return AuthResult.AUTH_BAD_REQ;
+ }
+ // nonce check
+ AuthResult check = verifyNonce(nonce);
+ if (check != AuthResult.AUTH_GOOD) {
+ if (_log.shouldLog(Log.INFO))
+ _log.info("Bad digest nonce: " + check + ' ' + DataHelper.toString(args));
+ return check;
+ }
+ // get H(A1) == stored password
+ String ha1 = getTunnel().getClientOptions().getProperty(PROP_PROXY_DIGEST_PREFIX + user +
+ PROP_PROXY_DIGEST_SUFFIX);
+ if (ha1 == null) {
+ _log.logAlways(Log.WARN, "PROXY AUTH FAILURE: user " + user);
+ return AuthResult.AUTH_BAD;
+ }
+ // get H(A2)
+ String a2 = method + ':' + uri;
+ String ha2 = PasswordManager.md5Hex(a2);
+ // response check
+ String kd = ha1 + ':' + nonce + ':' + nc + ':' + cnonce + ':' + qop + ':' + ha2;
+ String hkd = PasswordManager.md5Hex(kd);
+ if (!response.equals(hkd)) {
+ _log.logAlways(Log.WARN, "PROXY AUTH FAILURE: user " + user);
+ if (_log.shouldLog(Log.INFO))
+ _log.info("Bad digest auth: " + DataHelper.toString(args));
+ return AuthResult.AUTH_BAD;
+ }
+ if (_log.shouldLog(Log.INFO))
+ _log.info("Good digest auth - user: " + user);
+ return AuthResult.AUTH_GOOD;
+ }
+
+ /**
+ * The Base 64 of 24 bytes: (now, md5 of (now, proxy nonce))
+ * @since 0.9.4
+ */
+ private String getNonce() {
+ byte[] b = new byte[DataHelper.DATE_LENGTH + PROXYNONCE_BYTES];
+ byte[] n = new byte[NONCE_BYTES];
+ long now = _context.clock().now();
+ DataHelper.toLong(b, 0, DataHelper.DATE_LENGTH, now);
+ System.arraycopy(_proxyNonce, 0, b, DataHelper.DATE_LENGTH, PROXYNONCE_BYTES);
+ System.arraycopy(b, 0, n, 0, DataHelper.DATE_LENGTH);
+ byte[] md5 = PasswordManager.md5Sum(b);
+ System.arraycopy(md5, 0, n, DataHelper.DATE_LENGTH, MD5_BYTES);
+ return Base64.encode(n);
+ }
+
+ /**
+ * Verify the Base 64 of 24 bytes: (now, md5 of (now, proxy nonce))
+ * @since 0.9.4
+ */
+ private AuthResult verifyNonce(String b64) {
+ byte[] n = Base64.decode(b64);
+ if (n == null || n.length != NONCE_BYTES)
+ return AuthResult.AUTH_BAD;
+ long now = _context.clock().now();
+ long stamp = DataHelper.fromLong(n, 0, DataHelper.DATE_LENGTH);
+ if (now - stamp > MAX_NONCE_AGE)
+ return AuthResult.AUTH_STALE;
+ byte[] b = new byte[DataHelper.DATE_LENGTH + PROXYNONCE_BYTES];
+ System.arraycopy(n, 0, b, 0, DataHelper.DATE_LENGTH);
+ System.arraycopy(_proxyNonce, 0, b, DataHelper.DATE_LENGTH, PROXYNONCE_BYTES);
+ byte[] md5 = PasswordManager.md5Sum(b);
+ if (!DataHelper.eq(md5, 0, n, DataHelper.DATE_LENGTH, MD5_BYTES))
+ return AuthResult.AUTH_BAD;
+ return AuthResult.AUTH_GOOD;
+ }
+
+ /**
+ * What to send if digest auth fails
+ * @since 0.9.4
+ */
+ protected String getAuthError(boolean isStale) {
+ boolean isDigest = isDigestAuthRequired();
+ return
+ ERR_AUTH1 +
+ (isDigest ? "Digest" : "Basic") +
+ " realm=\"" + getRealm() + '"' +
+ (isDigest ? ", nonce=\"" + getNonce() + "\"," +
+ " algorithm=MD5," +
+ " qop=\"auth\"" +
+ (isStale ? ", stale=true" : "")
+ : "") +
+ ERR_AUTH2;
+ }
+
+ /**
+ * Modified from LoadClientAppsJob.
+ * All keys are mapped to lower case.
+ * Ref: RFC 2617
+ *
+ * @param args non-null
+ * @since 0.9.4
+ */
+ private static Map parseArgs(String args) {
+ Map rv = new HashMap(8);
+ char data[] = args.toCharArray();
+ StringBuilder buf = new StringBuilder(32);
+ boolean isQuoted = false;
+ String key = null;
+ for (int i = 0; i < data.length; i++) {
+ switch (data[i]) {
+ case '\"':
+ if (isQuoted) {
+ // keys never quoted
+ if (key != null) {
+ rv.put(key, buf.toString().trim());
+ key = null;
+ }
+ buf.setLength(0);
+ }
+ isQuoted = !isQuoted;
+ break;
+
+ case ' ':
+ case '\r':
+ case '\n':
+ case '\t':
+ case ',':
+ // whitespace - if we're in a quoted section, keep this as part of the quote,
+ // otherwise use it as a delim
+ if (isQuoted) {
+ buf.append(data[i]);
+ } else {
+ if (key != null) {
+ rv.put(key, buf.toString().trim());
+ key = null;
+ }
+ buf.setLength(0);
+ }
+ break;
+
+ case '=':
+ if (isQuoted) {
+ buf.append(data[i]);
+ } else {
+ key = buf.toString().trim().toLowerCase(Locale.US);
+ buf.setLength(0);
+ }
+ break;
+
+ default:
+ buf.append(data[i]);
+ break;
+ }
+ }
+ if (key != null)
+ rv.put(key, buf.toString().trim());
+ return rv;
+ }
+
+ //////// Error page stuff
+
+ /**
+ * foo => errordir/foo-header_xx.ht for lang xx, or errordir/foo-header.ht,
+ * or the backup byte array on fail.
+ *
+ * .ht files must be UTF-8 encoded and use \r\n terminators so the
+ * HTTP headers are conformant.
+ * We can't use FileUtil.readFile() because it strips \r
+ *
+ * @return non-null
+ * @since 0.9.4 moved from I2PTunnelHTTPClient
+ */
+ protected byte[] getErrorPage(String base, byte[] backup) {
+ return getErrorPage(_context, base, backup);
+ }
+
+ /**
+ * foo => errordir/foo-header_xx.ht for lang xx, or errordir/foo-header.ht,
+ * or the backup byte array on fail.
+ *
+ * .ht files must be UTF-8 encoded and use \r\n terminators so the
+ * HTTP headers are conformant.
+ * We can't use FileUtil.readFile() because it strips \r
+ *
+ * @return non-null
+ * @since 0.9.4 moved from I2PTunnelHTTPClient
+ */
+ protected static byte[] getErrorPage(I2PAppContext ctx, String base, byte[] backup) {
+ File errorDir = new File(ctx.getBaseDir(), "docs");
+ String lang = ctx.getProperty("routerconsole.lang", Locale.getDefault().getLanguage());
+ if(lang != null && lang.length() > 0 && !lang.equals("en")) {
+ File file = new File(errorDir, base + "-header_" + lang + ".ht");
+ try {
+ return readFile(file);
+ } catch(IOException ioe) {
+ // try the english version now
+ }
+ }
+ File file = new File(errorDir, base + "-header.ht");
+ try {
+ return readFile(file);
+ } catch(IOException ioe) {
+ return backup;
+ }
+ }
+
+ /**
+ * @since 0.9.4 moved from I2PTunnelHTTPClient
+ */
+ private static byte[] readFile(File file) throws IOException {
+ FileInputStream fis = null;
+ byte[] buf = new byte[2048];
+ ByteArrayOutputStream baos = new ByteArrayOutputStream(2048);
+ try {
+ int len = 0;
+ fis = new FileInputStream(file);
+ while((len = fis.read(buf)) > 0) {
+ baos.write(buf, 0, len);
+ }
+ return baos.toByteArray();
+ } finally {
+ try {
+ if(fis != null) {
+ fis.close();
+ }
+ } catch(IOException foo) {
+ }
+ }
+ // we won't ever get here
+ }
}
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java
index 8420604c9..3a5c001f6 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java
@@ -19,8 +19,10 @@ import net.i2p.client.I2PSession;
import net.i2p.data.Base32;
import net.i2p.data.Destination;
import net.i2p.i2ptunnel.socks.I2PSOCKSTunnel;
+import net.i2p.util.FileUtil;
import net.i2p.util.I2PAppThread;
import net.i2p.util.Log;
+import net.i2p.util.SecureFile;
import net.i2p.util.SecureFileOutputStream;
/**
@@ -43,6 +45,8 @@ public class TunnelController implements Logging {
private boolean _running;
private boolean _starting;
+ public static final String KEY_BACKUP_DIR = "i2ptunnel-keyBackup";
+
/**
* Create a new controller for a tunnel out of the specific config options.
* The config may contain a large number of options - only ones that begin in
@@ -102,8 +106,17 @@ public class TunnelController implements Logging {
Destination dest = client.createDestination(fos);
String destStr = dest.toBase64();
log("Private key created and saved in " + keyFile.getAbsolutePath());
+ log("You should backup this file in a secure place.");
log("New destination: " + destStr);
- log("Base32: " + Base32.encode(dest.calculateHash().getData()) + ".b32.i2p");
+ String b32 = Base32.encode(dest.calculateHash().getData()) + ".b32.i2p";
+ log("Base32: " + b32);
+ File backupDir = new SecureFile(I2PAppContext.getGlobalContext().getConfigDir(), KEY_BACKUP_DIR);
+ if (backupDir.isDirectory() || backupDir.mkdir()) {
+ String name = b32 + '-' + I2PAppContext.getGlobalContext().clock().now() + ".dat";
+ File backup = new File(backupDir, name);
+ if (FileUtil.copy(keyFile, backup, false, true))
+ log("Private key backup saved to " + backup.getAbsolutePath());
+ }
} catch (I2PException ie) {
if (_log.shouldLog(Log.ERROR))
_log.error("Error creating new destination", ie);
@@ -307,7 +320,9 @@ public class TunnelController implements Logging {
I2PSession session = sessions.get(i);
if (_log.shouldLog(Log.INFO))
_log.info("Acquiring session " + session);
- TunnelControllerGroup.getInstance().acquire(this, session);
+ TunnelControllerGroup group = TunnelControllerGroup.getInstance();
+ if (group != null)
+ group.acquire(this, session);
}
_sessions = sessions;
} else {
@@ -326,7 +341,9 @@ public class TunnelController implements Logging {
I2PSession s = _sessions.get(i);
if (_log.shouldLog(Log.INFO))
_log.info("Releasing session " + s);
- TunnelControllerGroup.getInstance().release(this, s);
+ TunnelControllerGroup group = TunnelControllerGroup.getInstance();
+ if (group != null)
+ group.release(this, s);
}
// _sessions.clear() ????
} else {
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelControllerGroup.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelControllerGroup.java
index 600464f87..3262cf711 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelControllerGroup.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelControllerGroup.java
@@ -12,27 +12,35 @@ import java.util.Properties;
import java.util.Set;
import net.i2p.I2PAppContext;
+import net.i2p.app.*;
+import static net.i2p.app.ClientAppState.*;
import net.i2p.client.I2PSession;
import net.i2p.client.I2PSessionException;
import net.i2p.data.DataHelper;
import net.i2p.util.I2PAppThread;
import net.i2p.util.Log;
import net.i2p.util.OrderedProperties;
+import net.i2p.util.SystemVersion;
/**
* Coordinate a set of tunnels within the JVM, loading and storing their config
* to disk, and building new ones as requested.
*
- * Warning - this is a singleton. Todo: fix
+ * This is the entry point from clients.config.
*/
-public class TunnelControllerGroup {
- private Log _log;
- private static TunnelControllerGroup _instance;
+public class TunnelControllerGroup implements ClientApp {
+ private final Log _log;
+ private volatile ClientAppState _state;
+ private final I2PAppContext _context;
+ private final ClientAppManager _mgr;
+ private static volatile TunnelControllerGroup _instance;
static final String DEFAULT_CONFIG_FILE = "i2ptunnel.config";
private final List _controllers;
- private String _configFile = DEFAULT_CONFIG_FILE;
+ private final String _configFile;
+ private static final String REGISTERED_NAME = "i2ptunnel";
+
/**
* Map of I2PSession to a Set of TunnelController objects
* using the session (to prevent closing the session until
@@ -41,48 +49,143 @@ public class TunnelControllerGroup {
*/
private final Map> _sessions;
+ /**
+ * In I2PAppContext will instantiate if necessary and always return non-null.
+ * As of 0.9.4, when in RouterContext, will return null (except in Android)
+ * if the TCG has not yet been started by the router.
+ *
+ * @throws IllegalArgumentException if unable to load from i2ptunnel.config
+ */
public static TunnelControllerGroup getInstance() {
synchronized (TunnelControllerGroup.class) {
- if (_instance == null)
- _instance = new TunnelControllerGroup(DEFAULT_CONFIG_FILE);
+ if (_instance == null) {
+ I2PAppContext ctx = I2PAppContext.getGlobalContext();
+ if (SystemVersion.isAndroid() || !ctx.isRouterContext()) {
+ _instance = new TunnelControllerGroup(ctx, null, null);
+ _instance.startup();
+ } // else wait for the router to start it
+ }
return _instance;
}
}
- private TunnelControllerGroup(String configFile) {
- _log = I2PAppContext.getGlobalContext().logManager().getLog(TunnelControllerGroup.class);
- _controllers = Collections.synchronizedList(new ArrayList());
- _configFile = configFile;
+ /**
+ * Instantiation only. Caller must call startup().
+ * Config file problems will not throw exception until startup().
+ *
+ * @param mgr may be null
+ * @param args one arg, the config file, if not absolute will be relative to the context's config dir,
+ * if empty or null, the default is i2ptunnel.config
+ * @since 0.9.4
+ */
+ public TunnelControllerGroup(I2PAppContext context, ClientAppManager mgr, String[] args) {
+ _state = UNINITIALIZED;
+ _context = context;
+ _mgr = mgr;
+ _log = _context.logManager().getLog(TunnelControllerGroup.class);
+ _controllers = new ArrayList();
+ if (args == null || args.length <= 0)
+ _configFile = DEFAULT_CONFIG_FILE;
+ else if (args.length == 1)
+ _configFile = args[0];
+ else
+ throw new IllegalArgumentException("Usage: TunnelControllerGroup [filename]");
_sessions = new HashMap(4);
- loadControllers(_configFile);
- I2PAppContext.getGlobalContext().addShutdownTask(new Shutdown());
+ synchronized (TunnelControllerGroup.class) {
+ if (_instance == null)
+ _instance = this;
+ }
+ if (_instance != this) {
+ _log.logAlways(Log.WARN, "New TunnelControllerGroup, now you have two");
+ if (_log.shouldLog(Log.WARN))
+ _log.warn("I did it", new Exception());
+ }
+ _state = INITIALIZED;
}
+ /**
+ * @param args one arg, the config file, if not absolute will be relative to the context's config dir,
+ * if no args, the default is i2ptunnel.config
+ * @throws IllegalArgumentException if unable to load from config from file
+ */
public static void main(String args[]) {
synchronized (TunnelControllerGroup.class) {
if (_instance != null) return; // already loaded through the web
-
- if ( (args == null) || (args.length <= 0) ) {
- _instance = new TunnelControllerGroup(DEFAULT_CONFIG_FILE);
- } else if (args.length == 1) {
- _instance = new TunnelControllerGroup(args[0]);
- } else {
- System.err.println("Usage: TunnelControllerGroup [filename]");
- return;
- }
+ _instance = new TunnelControllerGroup(I2PAppContext.getGlobalContext(), null, args);
+ _instance.startup();
}
}
+ /**
+ * ClientApp interface
+ * @throws IllegalArgumentException if unable to load config from file
+ * @since 0.9.4
+ */
+ public void startup() {
+ loadControllers(_configFile);
+ if (_mgr != null)
+ _mgr.register(this);
+ _context.addShutdownTask(new Shutdown());
+ }
+
+ /**
+ * ClientApp interface
+ * @since 0.9.4
+ */
+ public ClientAppState getState() {
+ return _state;
+ }
+
+ /**
+ * ClientApp interface
+ * @since 0.9.4
+ */
+ public String getName() {
+ return REGISTERED_NAME;
+ }
+
+ /**
+ * ClientApp interface
+ * @since 0.9.4
+ */
+ public String getDisplayName() {
+ return REGISTERED_NAME;
+ }
+
+ /**
+ * @since 0.9.4
+ */
+ private void changeState(ClientAppState state) {
+ changeState(state, null);
+ }
+
+ /**
+ * @since 0.9.4
+ */
+ private synchronized void changeState(ClientAppState state, Exception e) {
+ _state = state;
+ if (_mgr != null)
+ _mgr.notify(this, state, null, e);
+ }
+
/**
* Warning - destroys the singleton!
* @since 0.8.8
*/
- private static class Shutdown implements Runnable {
+ private class Shutdown implements Runnable {
public void run() {
shutdown();
}
}
+ /**
+ * ClientApp interface
+ * @since 0.9.4
+ */
+ public void shutdown(String[] args) {
+ shutdown();
+ }
+
/**
* Warning - destroys the singleton!
* Caller must root a new context before calling instance() or main() again.
@@ -91,28 +194,31 @@ public class TunnelControllerGroup {
*
* @since 0.8.8
*/
- public static void shutdown() {
+ public void shutdown() {
+ changeState(STOPPING);
+ if (_mgr != null)
+ _mgr.unregister(this);
+ unloadControllers();
synchronized (TunnelControllerGroup.class) {
- if (_instance == null) return;
- _instance.unloadControllers();
- _instance._log = null;
- _instance = null;
+ if (_instance == this)
+ _instance = null;
}
+/// fixme static
I2PTunnelClientBase.killClientExecutor();
+ changeState(STOPPED);
}
/**
* Load up all of the tunnels configured in the given file (but do not start
* them)
*
+ * DEPRECATED for use outside this class. Use startup() or getInstance().
+ *
+ * @throws IllegalArgumentException if unable to load from file
*/
- public void loadControllers(String configFile) {
+ public synchronized void loadControllers(String configFile) {
+ changeState(STARTING);
Properties cfg = loadConfig(configFile);
- if (cfg == null) {
- if (_log.shouldLog(Log.WARN))
- _log.warn("Unable to load the config from " + configFile);
- return;
- }
int i = 0;
while (true) {
String type = cfg.getProperty("tunnel." + i + ".type");
@@ -127,20 +233,28 @@ public class TunnelControllerGroup {
if (_log.shouldLog(Log.INFO))
_log.info(i + " controllers loaded from " + configFile);
+ changeState(RUNNING);
}
private class StartControllers implements Runnable {
public void run() {
- for (int i = 0; i < _controllers.size(); i++) {
- TunnelController controller = _controllers.get(i);
- if (controller.getStartOnLoad())
- controller.startTunnel();
+ synchronized(TunnelControllerGroup.this) {
+ for (int i = 0; i < _controllers.size(); i++) {
+ TunnelController controller = _controllers.get(i);
+ if (controller.getStartOnLoad())
+ controller.startTunnel();
+ }
}
}
}
-
- public void reloadControllers() {
+ /**
+ * Stop all tunnels, reload config, and restart those configured to do so.
+ * WARNING - Does NOT simply reload the configuration!!! This is probably not what you want.
+ *
+ * @throws IllegalArgumentException if unable to reload config file
+ */
+ public synchronized void reloadControllers() {
unloadControllers();
loadControllers(_configFile);
}
@@ -150,7 +264,7 @@ public class TunnelControllerGroup {
* file or do other silly things)
*
*/
- public void unloadControllers() {
+ public synchronized void unloadControllers() {
stopAllControllers();
_controllers.clear();
if (_log.shouldLog(Log.INFO))
@@ -162,14 +276,14 @@ public class TunnelControllerGroup {
* a config file or start it or anything)
*
*/
- public void addController(TunnelController controller) { _controllers.add(controller); }
+ public synchronized void addController(TunnelController controller) { _controllers.add(controller); }
/**
* Stop and remove the given tunnel
*
* @return list of messages from the controller as it is stopped
*/
- public List removeController(TunnelController controller) {
+ public synchronized List removeController(TunnelController controller) {
if (controller == null) return new ArrayList();
controller.stopTunnel();
List msgs = controller.clearMessages();
@@ -183,7 +297,7 @@ public class TunnelControllerGroup {
*
* @return list of messages the tunnels generate when stopped
*/
- public List stopAllControllers() {
+ public synchronized List stopAllControllers() {
List msgs = new ArrayList();
for (int i = 0; i < _controllers.size(); i++) {
TunnelController controller = _controllers.get(i);
@@ -200,7 +314,7 @@ public class TunnelControllerGroup {
*
* @return list of messages the tunnels generate when started
*/
- public List startAllControllers() {
+ public synchronized List startAllControllers() {
List msgs = new ArrayList();
for (int i = 0; i < _controllers.size(); i++) {
TunnelController controller = _controllers.get(i);
@@ -218,7 +332,7 @@ public class TunnelControllerGroup {
*
* @return list of messages the tunnels generate when restarted
*/
- public List restartAllControllers() {
+ public synchronized List restartAllControllers() {
List msgs = new ArrayList();
for (int i = 0; i < _controllers.size(); i++) {
TunnelController controller = _controllers.get(i);
@@ -235,7 +349,7 @@ public class TunnelControllerGroup {
*
* @return list of messages the tunnels have generated
*/
- public List clearAllMessages() {
+ public synchronized List clearAllMessages() {
List msgs = new ArrayList();
for (int i = 0; i < _controllers.size(); i++) {
TunnelController controller = _controllers.get(i);
@@ -257,8 +371,7 @@ public class TunnelControllerGroup {
* Save the configuration of all known tunnels to the given file
*
*/
- public void saveConfig(String configFile) throws IOException {
- _configFile = configFile;
+ public synchronized void saveConfig(String configFile) throws IOException {
File cfgFile = new File(configFile);
if (!cfgFile.isAbsolute())
cfgFile = new File(I2PAppContext.getGlobalContext().getConfigDir(), configFile);
@@ -279,16 +392,17 @@ public class TunnelControllerGroup {
/**
* Load up the config data from the file
*
- * @return properties loaded or null if there was an error
+ * @return properties loaded
+ * @throws IllegalArgumentException if unable to load from file
*/
- private Properties loadConfig(String configFile) {
+ private synchronized Properties loadConfig(String configFile) {
File cfgFile = new File(configFile);
if (!cfgFile.isAbsolute())
cfgFile = new File(I2PAppContext.getGlobalContext().getConfigDir(), configFile);
if (!cfgFile.exists()) {
if (_log.shouldLog(Log.ERROR))
_log.error("Unable to load the controllers from " + cfgFile.getAbsolutePath());
- return null;
+ throw new IllegalArgumentException("Unable to load the controllers from " + cfgFile.getAbsolutePath());
}
Properties props = new Properties();
@@ -298,7 +412,7 @@ public class TunnelControllerGroup {
} catch (IOException ioe) {
if (_log.shouldLog(Log.ERROR))
_log.error("Error reading the controllers from " + cfgFile.getAbsolutePath(), ioe);
- return null;
+ throw new IllegalArgumentException("Error reading the controllers from " + cfgFile.getAbsolutePath(), ioe);
}
}
@@ -307,7 +421,9 @@ public class TunnelControllerGroup {
*
* @return list of TunnelController objects
*/
- public List getControllers() { return _controllers; }
+ public synchronized List getControllers() {
+ return new ArrayList(_controllers);
+ }
/**
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 a0c38616e..0f4d6636c 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java
@@ -29,8 +29,8 @@ import net.i2p.util.Addresses;
/**
* Ugly little accessor for the edit page
*
- * Warning - This class is not part of the i2ptunnel API, and at some point
- * it will be moved from the jar to the war.
+ * Warning - This class is not part of the i2ptunnel API,
+ * it has been moved from the jar to the war.
* Usage by classes outside of i2ptunnel.war is deprecated.
*/
public class EditBean extends IndexBean {
@@ -38,6 +38,8 @@ public class EditBean extends IndexBean {
public static boolean staticIsClient(int tunnel) {
TunnelControllerGroup group = TunnelControllerGroup.getInstance();
+ if (group == null)
+ return false;
List controllers = group.getControllers();
if (controllers.size() > tunnel) {
TunnelController cur = (TunnelController)controllers.get(tunnel);
@@ -55,6 +57,7 @@ public class EditBean extends IndexBean {
else
return "127.0.0.1";
}
+
public String getTargetPort(int tunnel) {
TunnelController tun = getController(tunnel);
if (tun != null && tun.getTargetPort() != null)
@@ -62,6 +65,7 @@ public class EditBean extends IndexBean {
else
return "";
}
+
public String getSpoofedHost(int tunnel) {
TunnelController tun = getController(tunnel);
if (tun != null && tun.getSpoofedHost() != null)
@@ -69,12 +73,13 @@ public class EditBean extends IndexBean {
else
return "";
}
+
public String getPrivateKeyFile(int tunnel) {
TunnelController tun = getController(tunnel);
if (tun != null && tun.getPrivKeyFile() != null)
return tun.getPrivKeyFile();
if (tunnel < 0)
- tunnel = _group.getControllers().size();
+ tunnel = _group == null ? 999 : _group.getControllers().size();
return "i2ptunnel" + tunnel + "-privKeys.dat";
}
@@ -221,19 +226,7 @@ public class EditBean extends IndexBean {
/** all proxy auth @since 0.8.2 */
public boolean getProxyAuth(int tunnel) {
- return getBooleanProperty(tunnel, I2PTunnelHTTPClientBase.PROP_AUTH) &&
- getProxyUsername(tunnel).length() > 0 &&
- getProxyPassword(tunnel).length() > 0;
- }
-
- public String getProxyUsername(int tunnel) {
- return getProperty(tunnel, I2PTunnelHTTPClientBase.PROP_USER, "");
- }
-
- public String getProxyPassword(int tunnel) {
- if (getProxyUsername(tunnel).length() <= 0)
- return "";
- return getProperty(tunnel, I2PTunnelHTTPClientBase.PROP_PW, "");
+ return getProperty(tunnel, I2PTunnelHTTPClientBase.PROP_AUTH, "false") != "false";
}
public boolean getOutproxyAuth(int tunnel) {
@@ -354,10 +347,17 @@ public class EditBean extends IndexBean {
if (opts == null) return "";
StringBuilder buf = new StringBuilder(64);
int i = 0;
+ boolean isMD5Proxy = "httpclient".equals(tun.getType()) ||
+ "connectclient".equals(tun.getType());
for (Iterator iter = opts.keySet().iterator(); iter.hasNext(); ) {
String key = (String)iter.next();
if (_noShowSet.contains(key))
continue;
+ // leave in for HTTP and Connect so it can get migrated to MD5
+ // hide for SOCKS until migrated to MD5
+ if ((!isMD5Proxy) &&
+ _nonProxyNoShowSet.contains(key))
+ continue;
String val = opts.getProperty(key);
if (i != 0) buf.append(' ');
buf.append(key).append('=').append(val);
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 363c9a60b..692f3585c 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java
@@ -27,6 +27,7 @@ import net.i2p.data.Certificate;
import net.i2p.data.Destination;
import net.i2p.data.PrivateKeyFile;
import net.i2p.data.SessionKey;
+import net.i2p.i2ptunnel.I2PTunnelConnectClient;
import net.i2p.i2ptunnel.I2PTunnelHTTPClient;
import net.i2p.i2ptunnel.I2PTunnelHTTPClientBase;
import net.i2p.i2ptunnel.I2PTunnelIRCClient;
@@ -36,18 +37,21 @@ import net.i2p.util.Addresses;
import net.i2p.util.ConcurrentHashSet;
import net.i2p.util.FileUtil;
import net.i2p.util.Log;
+import net.i2p.util.PasswordManager;
+import net.i2p.util.SecureFile;
/**
* Simple accessor for exposing tunnel info, but also an ugly form handler
*
- * Warning - This class is not part of the i2ptunnel API, and at some point
- * it will be moved from the jar to the war.
+ * Warning - This class is not part of the i2ptunnel API,
+ * it has been moved from the jar to the war.
* Usage by classes outside of i2ptunnel.war is deprecated.
*/
public class IndexBean {
protected final I2PAppContext _context;
protected final Log _log;
protected final TunnelControllerGroup _group;
+ private final String _fatalError;
private String _action;
private int _tunnel;
//private long _prevNonce;
@@ -83,15 +87,14 @@ public class IndexBean {
private int _hashCashValue;
private int _certType;
private String _certSigner;
+ private String _newProxyUser;
+ private String _newProxyPW;
public static final int RUNNING = 1;
public static final int STARTING = 2;
public static final int NOT_RUNNING = 3;
public static final int STANDBY = 4;
- /** deprecated unimplemented, now using routerconsole realm */
- //public static final String PROP_TUNNEL_PASSPHRASE = "i2ptunnel.passphrase";
- public static final String PROP_TUNNEL_PASSPHRASE = "consolePassword";
//static final String PROP_NONCE = IndexBean.class.getName() + ".nonce";
//static final String PROP_NONCE_OLD = PROP_NONCE + '2';
/** 3 wasn't enough for some browsers. They are reloading the page for some reason - maybe HEAD? @since 0.8.1 */
@@ -104,11 +107,23 @@ public class IndexBean {
public static final String DEFAULT_THEME = "light";
public static final String PROP_CSS_DISABLED = "routerconsole.css.disabled";
public static final String PROP_JS_DISABLED = "routerconsole.javascript.disabled";
+ private static final String PROP_PW_ENABLE = "routerconsole.auth.enable";
public IndexBean() {
_context = I2PAppContext.getGlobalContext();
_log = _context.logManager().getLog(IndexBean.class);
- _group = TunnelControllerGroup.getInstance();
+ TunnelControllerGroup tcg;
+ String error;
+ try {
+ tcg = TunnelControllerGroup.getInstance();
+ error = tcg == null ? _("Tunnels are not initialized yet, please reload in two minutes.")
+ : null;
+ } catch (IllegalArgumentException iae) {
+ tcg = null;
+ error = iae.toString();
+ }
+ _group = tcg;
+ _fatalError = error;
_tunnel = -1;
_curNonce = "-1";
addNonce();
@@ -116,6 +131,13 @@ public class IndexBean {
_otherOptions = new ConcurrentHashMap(4);
}
+ /**
+ * @since 0.9.4
+ */
+ public boolean isInitialized() {
+ return _group != null;
+ }
+
public static String getNextNonce() {
synchronized (_nonces) {
return _nonces.get(0);
@@ -145,14 +167,11 @@ public class IndexBean {
}
}
- /** deprecated unimplemented, now using routerconsole realm */
- public void setPassphrase(String phrase) {
- }
-
public void setAction(String action) {
if ( (action == null) || (action.trim().length() <= 0) ) return;
_action = action;
}
+
public void setTunnel(String tunnel) {
if ( (tunnel == null) || (tunnel.trim().length() <= 0) ) return;
try {
@@ -162,17 +181,17 @@ public class IndexBean {
}
}
- /** just check if console password option is set, jetty will do auth */
- private boolean validPassphrase() {
- String pass = _context.getProperty(PROP_TUNNEL_PASSPHRASE);
- return pass != null && pass.trim().length() > 0;
- }
-
private String processAction() {
if ( (_action == null) || (_action.trim().length() <= 0) || ("Cancel".equals(_action)))
return "";
- if ( (!haveNonce(_curNonce)) && (!validPassphrase()) )
- return _("Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit.");
+ if (_group == null)
+ return "Error - tunnels are not initialized yet";
+ // If passwords are turned on, all is assumed good
+ if (!_context.getBooleanProperty(PROP_PW_ENABLE) &&
+ !haveNonce(_curNonce))
+ return _("Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit.")
+ + ' ' +
+ _("If the problem persists, verify that you have cookies enabled in your browser.");
if ("Stop all".equals(_action))
return stopAll();
else if ("Start all".equals(_action))
@@ -200,33 +219,33 @@ public class IndexBean {
else
return "Action " + _action + " unknown";
}
+
private String stopAll() {
- if (_group == null) return "";
List msgs = _group.stopAllControllers();
return getMessages(msgs);
}
+
private String startAll() {
- if (_group == null) return "";
List msgs = _group.startAllControllers();
return getMessages(msgs);
}
+
private String restartAll() {
- if (_group == null) return "";
List msgs = _group.restartAllControllers();
return getMessages(msgs);
}
+
private String reloadConfig() {
- if (_group == null) return "";
-
_group.reloadControllers();
return _("Configuration reloaded for all tunnels");
}
+
private String start() {
if (_tunnel < 0) return "Invalid tunnel";
- List controllers = _group.getControllers();
+ List controllers = _group.getControllers();
if (_tunnel >= controllers.size()) return "Invalid tunnel";
- TunnelController controller = (TunnelController)controllers.get(_tunnel);
+ TunnelController controller = controllers.get(_tunnel);
controller.startTunnelBackground();
// give the messages a chance to make it to the window
try { Thread.sleep(1000); } catch (InterruptedException ie) {}
@@ -237,9 +256,9 @@ public class IndexBean {
private String stop() {
if (_tunnel < 0) return "Invalid tunnel";
- List controllers = _group.getControllers();
+ List controllers = _group.getControllers();
if (_tunnel >= controllers.size()) return "Invalid tunnel";
- TunnelController controller = (TunnelController)controllers.get(_tunnel);
+ TunnelController controller = controllers.get(_tunnel);
controller.stopTunnel();
// give the messages a chance to make it to the window
try { Thread.sleep(1000); } catch (InterruptedException ie) {}
@@ -268,10 +287,10 @@ public class IndexBean {
// if the current tunnel is shared, and of supported type
if (Boolean.parseBoolean(cur.getSharedClient()) && isClient(cur.getType())) {
// all clients use the same I2CP session, and as such, use the same I2CP options
- List controllers = _group.getControllers();
+ List controllers = _group.getControllers();
for (int i = 0; i < controllers.size(); i++) {
- TunnelController c = (TunnelController)controllers.get(i);
+ TunnelController c = controllers.get(i);
// Current tunnel modified by user, skip
if (c == cur) continue;
@@ -355,10 +374,13 @@ public class IndexBean {
name = Long.toString(_context.clock().now());
}
}
- name = "i2ptunnel-deleted-" + name.replace(' ', '_') + "-privkeys.dat";
- File to = new File(_context.getConfigDir(), name);
- if (to.exists())
- to = new File(_context.getConfigDir(), name + '-' + _context.clock().now());
+ name = "i2ptunnel-deleted-" + name.replace(' ', '_') + '-' + _context.clock().now() + "-privkeys.dat";
+ File backupDir = new SecureFile(_context.getConfigDir(), TunnelController.KEY_BACKUP_DIR);
+ File to;
+ if (backupDir.isDirectory() || backupDir.mkdir())
+ to = new File(backupDir, name);
+ else
+ to = new File(_context.getConfigDir(), name);
boolean success = FileUtil.rename(pkf, to);
if (success)
msgs.add("Private key file " + pkf.getAbsolutePath() +
@@ -375,7 +397,7 @@ public class IndexBean {
*/
public String getMessages() {
if (_group == null)
- return "";
+ return _fatalError;
StringBuilder buf = new StringBuilder(512);
if (_action != null) {
@@ -804,21 +826,22 @@ public class IndexBean {
/** all proxy auth @since 0.8.2 */
public void setProxyAuth(String s) {
- _booleanOptions.add(I2PTunnelHTTPClientBase.PROP_AUTH);
+ if (s != null)
+ _otherOptions.put(I2PTunnelHTTPClientBase.PROP_AUTH, I2PTunnelHTTPClientBase.DIGEST_AUTH);
}
public void setProxyUsername(String s) {
if (s != null)
- _otherOptions.put(I2PTunnelHTTPClientBase.PROP_USER, s.trim());
+ _newProxyUser = s.trim();
}
public void setProxyPassword(String s) {
if (s != null)
- _otherOptions.put(I2PTunnelHTTPClientBase.PROP_PW, s.trim());
+ _newProxyPW = s.trim();
}
public void setOutproxyAuth(String s) {
- _booleanOptions.add(I2PTunnelHTTPClientBase.PROP_OUTPROXY_AUTH);
+ _otherOptions.put(I2PTunnelHTTPClientBase.PROP_OUTPROXY_AUTH, I2PTunnelHTTPClientBase.DIGEST_AUTH);
}
public void setOutproxyUsername(String s) {
@@ -1040,6 +1063,45 @@ public class IndexBean {
config.setProperty("proxyList", _proxyList);
}
+ // Proxy auth including migration to MD5
+ if ("httpclient".equals(_type) || "connectclient".equals(_type)) {
+ // Migrate even if auth is disabled
+ // go get the old from custom options that updateConfigGeneric() put in there
+ String puser = "option." + I2PTunnelHTTPClientBase.PROP_USER;
+ String user = config.getProperty(puser);
+ String ppw = "option." + I2PTunnelHTTPClientBase.PROP_PW;
+ String pw = config.getProperty(ppw);
+ if (user != null && pw != null && user.length() > 0 && pw.length() > 0) {
+ String pmd5 = "option." + I2PTunnelHTTPClientBase.PROP_PROXY_DIGEST_PREFIX +
+ user + I2PTunnelHTTPClientBase.PROP_PROXY_DIGEST_SUFFIX;
+ if (config.getProperty(pmd5) == null) {
+ // not in there, migrate
+ String realm = _type.equals("httpclient") ? I2PTunnelHTTPClient.AUTH_REALM
+ : I2PTunnelConnectClient.AUTH_REALM;
+ String hex = PasswordManager.md5Hex(realm, user, pw);
+ if (hex != null) {
+ config.setProperty(pmd5, hex);
+ config.remove(puser);
+ config.remove(ppw);
+ }
+ }
+ }
+ // New user/password
+ String auth = _otherOptions.get(I2PTunnelHTTPClientBase.PROP_AUTH);
+ if (auth != null && !auth.equals("false")) {
+ if (_newProxyUser != null && _newProxyPW != null &&
+ _newProxyUser.length() > 0 && _newProxyPW.length() > 0) {
+ String pmd5 = "option." + I2PTunnelHTTPClientBase.PROP_PROXY_DIGEST_PREFIX +
+ _newProxyUser + I2PTunnelHTTPClientBase.PROP_PROXY_DIGEST_SUFFIX;
+ String realm = _type.equals("httpclient") ? I2PTunnelHTTPClient.AUTH_REALM
+ : I2PTunnelConnectClient.AUTH_REALM;
+ String hex = PasswordManager.md5Hex(realm, _newProxyUser, _newProxyPW);
+ if (hex != null)
+ config.setProperty(pmd5, hex);
+ }
+ }
+ }
+
if ("ircclient".equals(_type) || "client".equals(_type) || "streamrclient".equals(_type)) {
if (_targetDestination != null)
config.setProperty("targetDestination", _targetDestination);
@@ -1084,15 +1146,16 @@ public class IndexBean {
"i2cp.reduceOnIdle", "i2cp.closeOnIdle", "i2cp.newDestOnResume", "persistentClientKey", "i2cp.delayOpen"
};
private static final String _booleanProxyOpts[] = {
- I2PTunnelHTTPClientBase.PROP_AUTH, I2PTunnelHTTPClientBase.PROP_OUTPROXY_AUTH
+ I2PTunnelHTTPClientBase.PROP_OUTPROXY_AUTH
};
private static final String _booleanServerOpts[] = {
"i2cp.reduceOnIdle", "i2cp.encryptLeaseSet", PROP_ENABLE_ACCESS_LIST, PROP_ENABLE_BLACKLIST
};
private static final String _otherClientOpts[] = {
"i2cp.reduceIdleTime", "i2cp.reduceQuantity", "i2cp.closeIdleTime",
- "proxyUsername", "proxyPassword", "outproxyUsername", "outproxyPassword",
- I2PTunnelHTTPClient.PROP_JUMP_SERVERS
+ "outproxyUsername", "outproxyPassword",
+ I2PTunnelHTTPClient.PROP_JUMP_SERVERS,
+ I2PTunnelHTTPClientBase.PROP_AUTH
};
private static final String _otherServerOpts[] = {
"i2cp.reduceIdleTime", "i2cp.reduceQuantity", "i2cp.leaseSetKey", "i2cp.accessList",
@@ -1101,7 +1164,17 @@ public class IndexBean {
PROP_MAX_STREAMS
};
+ /**
+ * do NOT add these to noShoOpts, we must leave them in for HTTPClient and ConnectCLient
+ * so they will get migrated to MD5
+ * TODO migrate socks to MD5
+ */
+ private static final String _otherProxyOpts[] = {
+ "proxyUsername", "proxyPassword"
+ };
+
protected static final Set _noShowSet = new HashSet(64);
+ protected static final Set _nonProxyNoShowSet = new HashSet(4);
static {
_noShowSet.addAll(Arrays.asList(_noShowOpts));
_noShowSet.addAll(Arrays.asList(_booleanClientOpts));
@@ -1109,6 +1182,7 @@ public class IndexBean {
_noShowSet.addAll(Arrays.asList(_booleanServerOpts));
_noShowSet.addAll(Arrays.asList(_otherClientOpts));
_noShowSet.addAll(Arrays.asList(_otherServerOpts));
+ _nonProxyNoShowSet.addAll(Arrays.asList(_otherProxyOpts));
}
private void updateConfigGeneric(Properties config) {
@@ -1139,6 +1213,12 @@ public class IndexBean {
String key = pair.substring(0, eq);
if (_noShowSet.contains(key))
continue;
+ // leave in for HTTP and Connect so it can get migrated to MD5
+ // hide for SOCKS until migrated to MD5
+ if ((!"httpclient".equals(_type)) &&
+ (! "connectclient".equals(_type)) &&
+ _nonProxyNoShowSet.contains(key))
+ continue;
String val = pair.substring(eq+1);
config.setProperty("option." + key, val);
}
@@ -1190,9 +1270,9 @@ public class IndexBean {
protected TunnelController getController(int tunnel) {
if (tunnel < 0) return null;
if (_group == null) return null;
- List controllers = _group.getControllers();
+ List controllers = _group.getControllers();
if (controllers.size() > tunnel)
- return (TunnelController)controllers.get(tunnel);
+ return controllers.get(tunnel);
else
return null;
}
diff --git a/apps/i2ptunnel/java/test/net/i2p/i2ptunnel/I2PTunnelHTTPServerTest.java b/apps/i2ptunnel/java/test/junit/net/i2p/i2ptunnel/I2PTunnelHTTPServerTest.java
similarity index 100%
rename from apps/i2ptunnel/java/test/net/i2p/i2ptunnel/I2PTunnelHTTPServerTest.java
rename to apps/i2ptunnel/java/test/junit/net/i2p/i2ptunnel/I2PTunnelHTTPServerTest.java
diff --git a/apps/i2ptunnel/jsp/editClient.jsp b/apps/i2ptunnel/jsp/editClient.jsp
index d2ca8f7ad..6ee0ae540 100644
--- a/apps/i2ptunnel/jsp/editClient.jsp
+++ b/apps/i2ptunnel/jsp/editClient.jsp
@@ -31,7 +31,11 @@